Python Telegram bot - 运行几个小时后的KeyError

问题描述 投票:0回答:2

我用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')
python bots telegram keyerror
2个回答
1
投票

错误说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等文件或服务中的错误,以调查之后没有文本的原因。


0
投票

当从KeyError请求值但是字典中不存在键时,会引发dict

所以,在你的情况下,msg字典没有关键text

您应检查代码以确保msg字典包含与密钥text关联的值。或者,如果您希望msg有时不包含密钥text,您应该使用get方法访问字典,该方法永远不会引发KeyError。有关更多信息,请参阅the docs

© www.soinside.com 2019 - 2024. All rights reserved.