是的,你可以。我希望這個例子可以幫助:
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')
很酷。但我想使用由webhook安裝程序激活的同一個服務器實例,以運行我的bot的一些方法(也提供了通過webhook發送的命令)。但是,您的示例暗示的是不同的服務器實例。在這種情況下,我不會駐留在相同的電報機器人程序(我相信)... – d56
作爲一個骯髒的解決方案,你可以猴子補丁實例。我會用例子很快更新答案 – Marat
真棒!非常感謝 – d56