2016-11-14 4 views
0

pyTelegramBotAPIからpython-telegram-botに電報ボットを書き換えました。監視URLを公開して、ボットがまだ実行中であるかどうかを確認するためにアプリケーションを使ってしばらくpingを実行できるようにするという考えがありました(内部的には、データベースなどのボットの機能をテストします)。問題は、埋め込みコードHTTPServer.HTTPServerを使用してそのような要求ポイントを作成することが可能かどうかです。これまでのところ、私はそれを行う方法を見つけることができませんでした。私が一般的なexample.com/botTOKENメソッドを再利用する場合、私はjsonペイロードに注意を払う必要があり、失敗した場合にHTTPエラー応答コードを返すことはできません。python-telegram-botのカスタムリクエストマッピングをHTTPServer.HTTPServerに埋め込みます。

ありがとうございます。

更新1:@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の設定で起動された同じサーバーインスタンスを使用して、ボットの一部のメソッド(webhookを経由してくるコマンドも提供しています)を実行したいと考えています。あなたの例が意味することは、しかし、別のサーバーインスタンスです。その場合、私は同じテレグラムボットプロセス(私は信じて)に住んでいないでしょう... – d56

+0

汚れたソリューションとして、あなたは猿のパッチのインスタンスをすることができます。私はすぐに答えを更新するつもりです – Marat

+0

素晴らしい!多くのありがとう – d56

関連する問題