Board logo

標題: 有無高手師兄可以幫忙 : Max retries exceeded with url [打印本頁]

作者: wood_0220    時間: 2021-8-9 14:10     標題: 有無高手師兄可以幫忙 : Max retries exceeded with url

大家好, 最近用寫左個bot, 宜家有d connection issue 問題想問下高手, 坊間真係搵唔到答案:
以下係我個bot 的code:
  1. def papa_BT_scan(context: telegram.ext.CallbackContext):
  2.     ws_nonFG_bot_web_scraping.papa_bt_scan(context)

  3. #Server Start
  4. #===========================================================
  5. def server_start(update: telegram.Update, context: telegram.ext.CallbackContext):
  6.     print("Telegram_bot_nonFG Started.")
  7.     context.bot.send_message(chat_id=update.message.chat_id,text=':)')
  8.     context.job_queue.run_daily(papa_BT_scan,datetime.time(hour=18, minute=00, tzinfo=pytz.timezone('Asia/Hong_Kong')),context=update.message.chat_id)
  9.    

  10. if __name__ == "__main__":

  11.     REQUEST_KWARGS = {'proxy_url': 'socks5h://127.0.0.1:9150' }
  12.     u = Updater('<myToken>', use_context=True,request_kwargs=REQUEST_KWARGS)
  13.   

  14.     start_handler = CommandHandler('s', server_start,pass_job_queue=True)
  15.     u.dispatcher.add_handler(start_handler)
  16.    
  17.     u.job_queue.start()
  18.     u.start_polling()
  19.     u.idle()
複製代碼
一開始個陣其實個bot 完全無問題行到, 但過左陣之後(1-2個鐘之後), 就會throw exception:
Error while getting Updates: urllib3 HTTPError SOCKSHTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot1924749319:<mytoken>/getUpdates (Caused by ConnectTimeoutError(<telegram.vendor.ptb_urllib3.urllib3.contrib.socks.SOCKSHTTPSConnection object at 0x116208c90>, 'Connection to api.telegram.org timed out. (connect timeout=5.0)'))
No error handlers are registered, logging exception.
Traceback (most recent call last):
  File "/Library/anaconda3/lib/python3.7/site-packages/socks.py", line 809, in connect
    negotiate(self, dest_addr, dest_port)
  File "/Library/anaconda3/lib/python3.7/site-packages/socks.py", line 444, in _negotiate_SOCKS5
    self, CONNECT, dest_addr)
  File "/Library/anaconda3/lib/python3.7/site-packages/socks.py", line 524, in _SOCKS5_request
    resp = self._readall(reader, 3)
  File "/Library/anaconda3/lib/python3.7/site-packages/socks.py", line 276, in _readall
    d = file.read(count - len(data))
  File "/Library/anaconda3/lib/python3.7/socket.py", line 589, in readinto
    return self._sock.recv_into(b)
socket.timeout: timed out

During handling of the above exception, another exception occurred:


我上網睇過好多同類問題都好似無答案, 暫時試過用Proxy Server / VPN(ExpressVPN) , 但問題依然存在.

好想希望各位高手巴打可以幫幫我
作者: Yucie    時間: 2021-8-9 17:05

大家好, 最近用寫左個bot, 宜家有d connection issue 問題想問下高手, 坊間真係搵唔到答案:
以下係我個bot  ...
wood_0220 發表於 2021-8-9 14:10


你係唔係部PC 行緊好多PROGRAM  不斷抓WEBSITE, 整到個SOCKET 壞壞地, 或者你不斷CONNECT 時間太密個SERVER BAN 你.
1. 試搵一部剩機只行呢個PROGRAM (最好用WIN 7 試, 用WMWARE 裝來試都得)
2. 如果係因為CONNECT 過密被BAN 一段時間, 用SLEEP  減少CONNECT 次數
作者: wood_0220    時間: 2021-8-9 17:18

你係唔係部PC 行緊好多PROGRAM  不斷抓WEBSITE, 整到個SOCKET 壞壞地, 或者你不斷CONNECT 時間太密個SERV ...
Yucie 發表於 2021-8-9 17:05


確實係部機係專用黎web scraping, 但其實個密度都係講度1日有20個web scraping request(不同網站,不是唯一網址).
1. 我部機係Mac Mini Server, 如果突然轉到win 7 , 好似有d囷難...
2. 其實如果我係CODE 入面加d sleep 等selenium 減d GET url, 會唔會對件事有幫助?
作者: wood_0220    時間: 2021-8-9 18:55

我想問多句,一個environment 入面,可唔可以同時間開兩個或以上的telegram bot 在terminal 上運行?
作者: Yucie    時間: 2021-8-9 20:25

確實係部機係專用黎web scraping, 但其實個密度都係講度1日有20個web scraping request(不同網站,不是唯 ...
wood_0220 發表於 2021-8-9 17:18


我窮人無MAC 實體機, 頂多用WMWARE 裝過MAC OS.
MAC 機增加CONNECTION 方法
你可以試試用呢個方法增加CONNECTION. 我MAC 機唔多熟, 睇下有無其他師兄幫到你

或者你可以一個做個LOOP 先完成一個SITE 再抓下一個SITE DATA.

其實你搵selenium抓website data 既話, 一張圖/一個object 就一個connection, 如果你同一時間爆幾個site.  connection 就自然滿載. 我唔知你熟唔熟分析website, 好似你之前問果個car 28 site問題, 你直接用python 既httplib2 library 抓data, 就只抓頁面發生一個connection. 如果你用selenium 抓data 就發生n 個connection. 所以最快最直接就先分析完個site 再進行抓data. 如果無辨法之下, 我先用selenium 抓data.
作者: wood_0220    時間: 2021-8-9 23:10

我窮人無MAC 實體機, 頂多用WMWARE 裝過MAC OS.

你可以試試用呢個方法增加CONNECTION. 我MAC 機唔多熟,  ...
Yucie 發表於 2021-8-9 20:25


明白你的意思了,thanks. 謝謝寶貴的意見
作者: super_hkg    時間: 2021-8-9 23:24

u.start_polling()
https://python-telegram-bot.read ... am.ext.updater.html

poll_interval default 係0秒,秒秒poll 蛇都死

試下
u.start_polling(poll_interval=10)

如果爭多D 都冇乜問題,可以再set 大d
作者: wood_0220    時間: 2021-8-11 09:08

本帖最後由 wood_0220 於 2021-8-11 09:12 編輯
u.start_polling()


poll_interval default 係0秒,秒秒poll 蛇都死

試下
u.start_polling(poll_interval ...
super_hkg 發表於 2021-8-9 23:24


我試左以下情況:
Test 1: u.start_polling(poll_interval=20) -> Failed with same error
Test 2: u.start_polling(poll_interval=20, timeout=20) -> Failed with same error too...

我真係做到有D想放棄, 試左好多日都係唔work .....
作者: Yucie    時間: 2021-8-11 14:33

我試左以下情況:
Test 1: u.start_polling(poll_interval=20) -> Failed with same error
Test 2: u.star ...
wood_0220 發表於 2021-8-11 09:08


裝個WINSHARK MON 住個TRAFFIC CONNECTION
WINSHARK 下載頁
睇下背景係唔係平時已經一堆CONNECTION

P.S 你有只RUN 過呢個PROGRAM 無事, 有無同其他PROGRAM 炒車
作者: wood_0220    時間: 2021-8-11 16:51

裝個WINSHARK MON 住個TRAFFIC CONNECTION

睇下背景係唔係平時已經一堆CONNECTION

P.S 你有只RUN 過呢 ...
Yucie 發表於 2021-8-11 14:33


Thanks Yucie. 我會進一步試試你的提議方案.
BTW, 我試緊super_hkg 師兄的solution, 但我嘗試加入timeout parameters 而並是非poll_interval, 宜家觀察中, 好似暫時都無有exceptions, 好緊張....

現在使用:
u.start_polling(timeout=600)
作者: 537923    時間: 2021-8-12 03:13

你個socks5h://127.0.0.1:9150係由邊個提供?連去邊?
你個telegram api只係通知用?
你個telegram api一定要行proxy?
你每秒call緊幾多次telegram api?
telegram可以改用webhooks黎收message(要有public ip & port)

我覺得最大可能係你個socks5 proxy server有問題
作者: wood_0220    時間: 2021-8-12 12:26

你個socks5h://127.0.0.1:9150係由邊個提供?連去邊?
你個telegram api只係通知用?
你個telegram api一定要 ...
537923 發表於 2021-8-12 03:13



你個socks5h://127.0.0.1:9150係由邊個提供?連去邊? -> Tor Browser  https://www.torproject.org/download/languages/
你個telegram api只係通知用? ->  Yes
你個telegram api一定要行proxy? 唔係, 純粹之前佢一直timeout , 用黎POC, 如果可以的話我都唔想用
你每秒call緊幾多次telegram api? -> Daily 每日一次
telegram可以改用webhooks黎收message(要有public ip & port)
作者: 537923    時間: 2021-8-12 13:43

telegram api如果只係send_message, 唔收message可以唔開start_polling
error既原因係tor proxy唔stable, 成日會connect唔到

如果poll_interval 0, timeout 10
6 * 60 *24 = 8640 request /day for polling 經 tor
其中一個connect唔到已經會出error

option 1 (斬腳趾): 唔開start_polling, 只發不收
option 2 (都有機會出事): telegram api唔行tor, 相對穩定
option 3 (最好就): try catch start_polling, error handling, 無限復活
作者: wood_0220    時間: 2021-8-12 14:35

本帖最後由 wood_0220 於 2021-8-12 14:37 編輯

感謝上面師兄的資料,真係對我好有用.

最新更新, 我宜家無用到Tor 再POC緊 (用緊下面的新code)...
宜家係無再出"Max retries exceeded with url"
我尋晚試左係行得晒所有jobs (14:20,16:00,18:00,22:00) , 但到左今日 我發現好似2點個job 無行到.... (但個bot係無事, 一路都仲行緊)

個人感覺: 其實我之前個bot死應該係無落timeout=600 在start_polling() 入面, 雖然唔知咁樣的setting 岩唔岩, 宜家雖然無事, 但又唔知點解job queue 入面的job 到左第二日自己又唔識行... 其實係唔係仲要SET埋poll_interval?
  1. from telegram.ext import Updater, CommandHandler
  2. import logging, datetime, pytz
  3. import ws_nonFG_bot_web_scraping

  4. logging.basicConfig(level=logging.INFO,
  5.                     format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  6. logger = logging.getLogger()


  7. def start(update, context):


  8.     context.job_queue.run_daily(papa_BT_scan,datetime.time(hour=14, minute=20, tzinfo=pytz.timezone('Asia/Hong_Kong')),days=(0, 1, 2, 3, 4, 5, 6), context=update.message.chat_id)

  9.     context.job_queue.run_daily(papa_BT_scan,datetime.time(hour=16, minute=00, tzinfo=pytz.timezone('Asia/Hong_Kong')),days=(0, 1, 2, 3, 4, 5, 6), context=update.message.chat_id)

  10.     context.job_queue.run_daily(papa_BT_scan,datetime.time(hour=18, minute=00, tzinfo=pytz.timezone('Asia/Hong_Kong')),days=(0, 1, 2, 3, 4, 5, 6), context=update.message.chat_id)

  11.     context.job_queue.run_daily(papa_BT_scan,datetime.time(hour=22, minute=00, tzinfo=pytz.timezone('Asia/Hong_Kong')),days=(0, 1, 2, 3, 4, 5, 6), context=update.message.chat_id)
  12.    
  13.    
  14. def msg(context):
  15.     context.bot.send_message(chat_id=context.job.context, text='text')

  16. def error(update, context):
  17.     """Log Errors caused by Updates."""
  18.     logger.warning('Update "%s" caused error "%s"', update, context.error)

  19. def papa_BT_scan(context):
  20.     ws_nonFG_bot_web_scraping.papa_bt_scan(context)


  21. def main():
  22.     updater = Updater( '<Token>' , use_context=True)
  23.     dp = updater.dispatcher
  24.     dp.add_handler(CommandHandler("s", start, pass_job_queue=True))
  25.     dp.add_error_handler(error)

  26.     listjob = dp.job_queue.jobs()
  27.     print(listjob)
  28.     updater.start_polling(timeout=600)
  29.     updater.idle()

  30. if __name__ == '__main__':
  31.     main()
複製代碼

作者: super_hkg    時間: 2021-8-12 17:08

最懶的方法:
  1. from time import sleep
  2. if __name__ == '__main__':
  3.     While True:
  4.         try:
  5.             main()
  6.         except:
  7.             sleep(10)
  8.             pass
複製代碼
其實如果可以睇埋 #1 "During handling of the above exception, another exception occurred:" 下面既error 會快D 搞到

同埋urlib3 並唔係完美,如果connection 果part 係自己寫既,一定要落try except,如果只係telegram api問題,我之前係用telepot ,算係好穩定
作者: wood_0220    時間: 2021-8-12 17:18

最懶的方法:其實如果可以睇埋 #1 "During handling of the above exception, another exception occurred:" ...
super_hkg 發表於 2021-8-12 17:08


其實宜家已經好似solve 到#1 error 的問題 (當加左timeout=600 在start_polling之後)
宜家問題變左係今日set 完在job queue 的job, 去到聽日的時候自己就唔識trigger 黎行....
唔知係唔係我d parameters 的問題... (詳情就係#14 的code)

萬分感謝你呀super_hkg
作者: super_hkg    時間: 2021-8-12 17:57

其實宜家已經好似solve 到#1 error 的問題 (當加左timeout=600 在start_polling之後)
宜家問題變左係今日 ...
wood_0220 發表於 2021-8-12 17:18


https://medium.com/analytics-vid ... -tasks-932edd61c534

def morning(context: CallbackContext):
???

照入面做應該得,我冇試過唔肯定





歡迎光臨 電腦領域 HKEPC Hardware (https://www.hkepc.com/forum/) Powered by Discuz! 7.2