我创建了一个电报机器人,发送浏览器网页的截图。我使用python-selenium包来连接浏览器和电报- bot,但是每次我的bot在5分钟后停止工作,这里是完整的日志。
ERROR:telegram.ext.dispatcher:No error handlers are registered, logging exception.
Traceback (most recent call last):
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\connectionpool.py", line 402, in _make_request
six.raise_from(e, None)
File "<string>", line 2, in raise_from
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\connectionpool.py", line 398, in _make_request
httplib_response = conn.getresponse()
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 1374, in getresponse
response.begin()
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 318, in begin
version, status, reason = self._read_status()
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 279, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\socket.py", line 705, in readinto
return self._sock.recv_into(b)
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\ssl.py", line 1273, in recv_into
return self.read(nbytes, buffer)
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\ssl.py", line 1129, in read
return self._sslobj.read(len, buffer)
TimeoutError: The read operation timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\utils\request.py", line 259, in _request_wrapper
resp = self._con_pool.request(*args, **kwargs)
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\request.py", line 68, in request
return self.request_encode_body(method, url, fields=fields,
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\request.py", line 148, in request_encode_body
return self.urlopen(method, url, **extra_kw)
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\poolmanager.py", line 244, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\connectionpool.py", line 665, in urlopen
retries = retries.increment(method, url, error=e, _pool=self,
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\util\retry.py", line 347, in increment
raise six.reraise(type(error), error, _stacktrace)
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\packages\six.py", line 686, in reraise
raise value
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\connectionpool.py", line 614, in urlopen
httplib_response = self._make_request(conn, method, url,
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\connectionpool.py", line 404, in _make_request
self._raise_timeout(err=e, url=url, timeout_value=read_timeout,
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\vendor\ptb_urllib3\urllib3\connectionpool.py", line 321, in _raise_timeout
raise exc_cls(*args)
telegram.vendor.ptb_urllib3.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='api.telegram.org', port=443): Read timed out. (read timeout=5.0)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\ext\utils\promise.py", line 96, in run
self._result = self.pooled_function(*self.args, **self.kwargs)
File "C:\Users\Evilreborn\Desktop\tmp\test.py", line 53, in status
context.bot.send_chat_action(
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\bot.py", line 130, in decorator
result = func(*args, **kwargs)
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\bot.py", line 2023, in send_chat_action
result = self._post('sendChatAction', data, timeout=timeout, api_kwargs=api_kwargs)
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\bot.py", line 295, in _post
return self.request.post(
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\utils\request.py", line 356, in post
result = self._request_wrapper(
File "C:\Users\Evilreborn\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\utils\request.py", line 261, in _request_wrapper
raise TimedOut() from error
telegram.error.TimedOut: Timed out
变量USER_ID包含我的userid,这样其他人就不能使用bot了。
我的节目:
from selenium import webdriver
import os
from telegram.ext import Updater
from telegram.ext import CommandHandler
from telegram import ChatAction
BOT_TOKEN = 504XXXXXX:AAGXXXXXXXXXXXXXXXXXXXXXXX
USER_ID = 123456
options = webdriver.ChromeOptions()
browser = webdriver.Chrome(options=options)
updater = Updater(token=BOT_TOKEN, use_context=True)
dp = updater.dispatcher
def status(update, context):
user = update.message.from_user
if user["id"] == int(USER_ID):
browser.save_screenshot("snapshot.png")
context.bot.send_chat_action(
chat_id=USER_ID, action=ChatAction.UPLOAD_PHOTO, timeout=100)
context.bot.send_photo(
chat_id=USER_ID, photo=open("snapshot.png", "rb"), timeout=100
)
os.remove("snapshot.png")
else:
update.message.reply_text(
"You are not authorized to use this bot"
)
def main():
browser.get("https://google.com")
dp.add_handler(CommandHandler("status", status, run_async=True))
updater.start_polling(timeout=100)
#updater.idle()
if __name__ == "__main__":
main()
使用的包:
python_telegram_bot==13.7
selenium==3.141.0
到目前为止我尝试过的是:
timeout
,但问题仍然存在。if user["id"] == int(USER_ID):
块context.bot.send_chat_action(chat_id=USER_ID, action=ChatAction.UPLOAD_PHOTO, timeout=100)
删除了发生错误但仍面临相同问题的行。当我发送"/status“时,机器人会崩溃(从启动到5分钟后)。如果我在不到5分钟的时间内继续发送"/status“,它就会平稳地运行,但是如果没有活动5分钟,它就会开始发送这个错误。
问题不在于互联网的连接。因为我认为这可能是个问题,所以在Azure平台上创建了一个虚拟机/RDP/VPS,并在16‘t的RAM上进行了测试,但仍然没有工作。另外,我也尝试过增加context.bot.send_chat_action
的超时,但是它没有起作用。
还有一件事我已经观察到了,在收到这个错误后,如果我发送/status
,它会工作(即使在5分钟之后),如果我在5分钟后再次发送,它不会工作,所以它以另一种方式工作,一次它抛出错误,下一次它工作。
我在过去的8天里都有这个问题,如果有人能帮我,请帮忙。
谢谢你把宝贵的时间花在我的问题上,谢谢你
发布于 2022-02-07 07:11:21
您增加了对context.bot.send_photo
调用的超时,但跟踪表明对context.bot.send_chat_action
的调用发生了超时。如果您经常出现超时问题,我建议您尝试并稳定您的互联网连接。也请看一下处理网络异常上的wiki页面。
免责声明:我目前是python-telegram-bot
的维护者
https://stackoverflow.com/questions/71013655
复制相似问题