0

Ich versuche, meinen Telegramm-Bot für ein Multiplayer-Spiel auf GAE zu hosten, und Web-Hook wird hier verwendet. Dies ist, wie mein databasing Teil ist wie:Telegramm Bot antwortet weiter, anstatt folgenden Code auszuführen (Webhook wird verwendet)

class Game(ndb.Model): 
    chat_id = ndb.IntegerProperty(required = True) 
    mission_num = ndb.IntegerProperty(default =1) 
    round_num = ndb.IntegerProperty(default =1) 

class Player(ndb.Model): 
    user_id = ndb.IntegerProperty(required=True) 
    player_role = ndb.StringProperty (
    choices = ['spy','resistance']) 

Der Teil des Codes unter Handler Web Haken:

 if text.startswith('/'): 
     if text == '/start': 
      reply('Bot enabled') 
      setEnabled(chat_id, True) 
     elif text == '/stop': 
      reply('Bot disabled') 
      setEnabled(chat_id, False) 
     elif text == '/newgame': 
      if chat_type == 'group': 
       existing_game = Game.query (Game.chat_id == chat_id).get() 
       if existing_game: 
        reply ("game is alr intitiated liao") 
       else: 
        ##create a new game here 
        #still stuck here 
        ##========================## 
        #reply("keep replying this line") 
        ##========================## 
        new_game = Game (
         chat_id = chat_id, 
         id = chat_id 
         )  
        curr_game_key = new_game.put() 

        new_player = Player (
         parent = curr_game_key, 
         user_id = fr_user_id, 
         id = fr_user_id) 
        new_player.put() 
        reply("waiting for more friends to join") 
      else: 
       reply('game must be conducted within a group chat! jio more friends!') 
     else: 
      reply('What command?') 
    else: 
     if getEnabled(chat_id): 
      reply('I got your message! (but I do not know how to answer)') 
     else: 
      logging.info('not enabled for chat_id {}'.format(chat_id)) 

Das Problem ist, dass, wenn ich ‚/ newgame‘ in einem Gruppenchat senden, ist nichts zurück zu mir gesendet. Wenn ich die folgende Zeile mein bot Kommentar- hält mich zu senden "halten diese Zeile zu antworten" wie verrückt .:

#reply("keep replying this line") 

Die Antwortfunktion:

def reply(msg=None, img=None): 
     if msg: 
      resp = urllib2.urlopen(BASE_URL + 'sendMessage', urllib.urlencode({ 
       'chat_id': str(chat_id), 
       'text': msg.encode('utf-8'), 
       'disable_web_page_preview': 'true', 
       'reply_to_message_id': str(message_id), 
      })).read() 
     elif img: 
      resp = multipart.post_multipart(BASE_URL + 'sendPhoto', [ 
       ('chat_id', str(chat_id)), 
       ('reply_to_message_id', str(message_id)), 
      ], [ 
       ('photo', 'image.jpg', img), 
      ]) 
     else: 
      logging.error('no msg or img specified') 
      resp = None 

     logging.info('send response:') 
     logging.info(resp) 

Der Fehler:

Internal Server Error 
The server has either erred or is incapable of performing the requested operation. 

Traceback (most recent call last): 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "/base/data/home/apps/s~orbitaltest2/1.393734187774164753/main.py", line 66, in get 
    self.response.write(json.dumps(json.load(urllib2.urlopen(BASE_URL + 'getUpdates')))) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 127, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 410, in open 
    response = meth(req, response) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 523, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 448, in error 
    return self._call_chain(*args) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 382, in _call_chain 
    result = func(*args) 
    File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 531, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
HTTPError: HTTP Error 409: Conflict 

Code für den Handler, zu dem die Linie 66 gehört:

class GetUpdatesHandler(webapp2.RequestHandler): 
    def get(self): 
     urlfetch.set_default_fetch_deadline(60) 
     self.response.write(json.dumps(json.load(urllib2.urlopen(BASE_URL + 'getUpdates')))) 

Total Neuling, jeder Vorschlag wird geschätzt!

Antwort

0

Sie sollten überprüfen, welchen Statuscode & welcher Inhalt von Ihrem Webhook zurückgegeben wird.

Sie haben 2 Möglichkeiten, wie zu benutzen, um zu antworten:

  1. Anruf Telegramm API
  2. Return JSON als Antwort rufen Webhook

Wie Sie es nicht Quellcode reply() zur Verfügung gestellt haben Es ist schwer zu sagen, was genau falsch ist.

Wie auch immer, Ihr Webhook sollte den HTTP-Statuscode 200 zurückgeben. Wenn es nicht Telegramm behandelt, wird es als interner Fehler behandelt und versucht, Ihnen eine Nachricht erneut zu senden. Das ist der Grund, warum Sie immer wieder Anrufe bekommen und es "wie verrückt antworten".

Höchstwahrscheinlich ist der Anruf reply("keep replying this line") erfolgreich aber dann stimmt etwas nicht und Telegram bekommt eine falsche Antwort.

Hinzufügen try/except Blöcke und Protokoll Ausnahmen.

Überprüfen Sie Ihre Protokolle & legen Sie zusätzliche Protokollierung bei Bedarf. Zum Beispiel protokolliere ich HTTP-Response-Inhalte von meinem Webhook. Es hilft.

+0

ja entpuppt sich die angegebene ID ist zu lang, wenn ich auf die Protokolle schaue! Danke vielmals!!! – Lucy