2016-11-14 82 views
0

我剛剛從pyTelegramBotAPIpython-telegram-bot重寫了我的電報機器人。有一個想法是公開一個監控網址,我們可以在一段時間內用一些應用程序ping一下,看看機器人是否還在運行(在內部,它會測試機器人的一些功能,如數據庫等)。問題是,是否可以使用嵌入的HTTPServer.HTTPServer創建這樣的請求點?到目前爲止,我找不到辦法做到這一點。如果我重用通用example.com/botTOKEN方法,我需要注意json有效負載,並且在發生故障時我無法發回HTTP錯誤響應代碼。在python-telegram-bot中添加自定義請求映射嵌入式HTTPServer.HTTPServer

謝謝。

Update1:所以,我遵循@Marat提供的代碼片段。這是我如何掌握處理程序對象:

# since the webhook server is started in an extra thread, it's not available immediately 
while updater.httpd is None: 
    pass 
handler = updater.httpd.RequestHandlerClass 

回答

1

是的,你可以。我希望這個例子可以幫助:

import SimpleHTTPServer 
import SocketServer 


class myServer(SimpleHTTPServer.SimpleHTTPRequestHandler): 

    def do_GET(self): 
     """Serve a GET request.""" 
     # do something here 
     self.finish(
      "Hello world! Request path: " + self.path 
     ) 

    def finish(self, value, status=200, ctype="text/html"): 
     try: 
      self.send_response(status) 
      self.send_header("Content-type", ctype) 
      self.send_header("Content-Length", str(len(value))) 
      self.end_headers() 
      self.wfile.write(str(value)) 
     finally: 
      self.wfile.close() 


httpd = SocketServer.TCPServer(("", 80), myServer) 

httpd.serve_forever() 

欲瞭解更多信息,看看SimpleHTTPRequestHandler

UPD的源代碼:WebhookHandler代碼可能是一個更好的例子

如果你想重用現有的實例,你可以做猴子修補:

# wrapper for original do_GET 
def patch(get_func): 
    def wrapper(self): 
     if self.path == '/test_url': 
      # do something 
      message = "Successful" # or not :(
      self.send_response(200) 
      self.send_header("Content-type", 'text/plain') 
      self.send_header("Content-Length", str(len(message))) 
      self.end_headers() 
      self.wfile.write(message) 
     else: 
      return get_func(self) 

    return wrapper 

# assume `server` is an instance of WebhookHandler 
server.do_GET = patch(server.do_GET) # monkeypatching 

UPD2:在仔細查看BaseServer的代碼後,我發現它爲每個請求創建了一個新的請求處理程序實例。這意味着修補實例將不起作用,我們需要修補類本身。這是它是如何工作的:

# ... somewhere in the code far far away 

from telegram.ext import Updater 
from telegram.utils import webhookhandler as wh 

# IMPORTANT: do it before making an instance of updater 
# IMPORTANT #2: this is considered dirty hack. Don't repeat it at home! 
if not wh.WebhookHandler._fuse: 
    # note we're patching handler class itself, not an instance 
    wh.WebhookHandler.do_GET = patch(wh.WebhookHandler.do_GET) # use patch() from above 
    wh.WebhookHandler._fuse = True 

updater = Updater(token='TOKEN') 
+0

很酷。但我想使用由webhook安裝程序激活的同一個服務器實例,以運行我的bot的一些方法(也提供了通過webhook發送的命令)。但是,您的示例暗示的是不同的服務器實例。在這種情況下,我不會駐留在相同的電報機器人程序(我相信)... – d56

+0

作爲一個骯髒的解決方案,你可以猴子補丁實例。我會用例子很快更新答案 – Marat

+0

真棒!非常感謝 – d56