0

Я пытаюсь разместить мой бот телеграмм для многопользовательской игры на GAE, и здесь используется сетевой крючок. Это как моя databasing часть, как:telegram bot продолжает отвечать, а не выполняет следующий код (используется webhook)

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']) 

Часть кода под веб-крючок обработчика:

 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)) 

не проблема в том, что когда я посылаю «/ NewGame» в групповом чате, что ничего не послал обратно ко мне. Если я раскомментируйте следующую строку мой бот продолжает посылать меня "держать ответ эту линию", как сумасшедший .:

#reply("keep replying this line") 

Ответ функции:

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) 

Погрешность:

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 

код для этой линии 66 относится к:

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')))) 

Полностью новичок, любое предложение оценено!

ответ

0

Вы должны проверить, какой код состояния &, какой контент был возвращен вашим веб-узлом.

У вас есть 2 варианта как ответить использовать:

  1. Вызов Телеграмма API
  2. Возвращение JSON в ответ на webhook называют

Как вы не предоставили ему исходный код из reply() трудно сказать, что именно не так.

В любом случае ваш веб-хост должен вернуть код статуса HTTP 200. Если это не Telegram, рассматривайте его как внутреннюю ошибку и пытаетесь отправить сообщение повторно на вас. Вот почему вы получаете повторные звонки, и это «ответит как сумасшедший».

Скорее всего, звонок reply("keep replying this line") является успешным, но затем что-то не так, и Telegram получает неправильный ответ.

Добавить try/except блоки и журналы.

Проверьте свои журналы &, если необходимо, добавьте дополнительную регистрацию. Например, я регистрирую контент ответа HTTP из своего веб-хостинга. Помогает.

+0

Да, оказалось, что указанный мною идентификатор слишком длинный, когда я смотрю журналы! большое спасибо!!! – Lucy

Смежные вопросы