我用Python写了一个Telegram bot,它运行在我的Raspberry Pi(Raspbian)上。机器人运行几个小时后,我最终看到一个错误。
在我发布完整代码之前,有人可以帮我理解错误吗?在我需要重新启动它之前,我想无限期地运行机器人,或者至少运行多天。
错误如下:
Traceback (most recent call last):
File "/home/pi/Schreibtisch/StreamrPreisBot/telepot/loop.py", line 37, in run_forever
self._handle(msg)
File "/home/pi/Schreibtisch/StreamrPreisBot/streamrinfobot.py", line 32, in handle
command = msg['text']
KeyError: 'text'
编辑:使用以下代码:
def handle(msg):
chat_id = msg['chat']['id']
command = msg['text']
这个代码可能会解决问题吗?
def handle(msg):
chat_id = msg['chat']['id']
command = msg.get('text')
错误说text
dict中没有msg
键。也许这是一些没有文字的特殊电报信息,或者你的代码中有一个错误,在某些情况下会删除text
密钥。你可以用
command = msg.get('text')
在没有文字时获得None
。要么
command = msg.get('text', '')
在没有文本时获得空字符串(即''
)。
您还可以使用text
运算符检查msg
中是否存在in
:
if 'text' not in msg:
logger.error('bad message received!')
return
如果您希望服务始终处于运行状态,则应添加一些自动重启机制。
喜欢在Python中重启后重启:
while True:
try:
logger.info("Starting bot")
run_bot()
except Exception:
logger.exception("Something bad happened. Restarting")
我还建议记录Sentry等文件或服务中的错误,以调查之后没有文本的原因。
当从KeyError
请求值但是字典中不存在键时,会引发dict
。
所以,在你的情况下,msg
字典没有关键text
。
您应检查代码以确保msg
字典包含与密钥text
关联的值。或者,如果您希望msg
有时不包含密钥text
,您应该使用get
方法访问字典,该方法永远不会引发KeyError
。有关更多信息,请参阅the docs。