2016-08-27 1 views
2

Я новичок в Python и новичок в Stack Overflow, извините за свои ошибки ...Почему, если id = '0' в "InlineQueryResultArticle", выбранный элемент не вызывает код "on_chosen_inline_result"?

Я использую Telepot для написания бота для Telegram.
При работе со встроенными результатами я могу только сделать код в on_chosen_inline_result выполнить для каждой статьи, которую я выбираю, кроме первого созданного.

def on_inline_query(msg): 
    query_id, from_id, query_string = telepot.glance(msg, flavor='inline_query') 
    tastiera_inline = InlineKeyboardMarkup(*some_keyboard*) 

    articles = [] 

    if query_string: 

     found_conte = fun.get_conta(titolo=query_string) 
     if found_conte == 1: 
      return 
     for conta_inline in found_conte: 
      articles.append(InlineQueryResultArticle(
       id=str(conta_inline['id']), 
       title=conta_inline['titolo'], 
       input_message_content=InputTextMessageContent(*some_content*), 
       reply_markup=tastiera_inline, 
       description=conta_inline['testo'], 
       thumb_url=*some_url*, 
      )) 

    else: 
     if fun.get_conta('all') == 1: 
      return 
     for conta_inline in fun.get_conta('all'): 
      articles.append(InlineQueryResultArticle(
       id=str(conta_inline['id']), 
       title=conta_inline['titolo'], 
      input_message_content=InputTextMessageContent(*some_content*), 
      reply_markup=tastiera_inline, 
      description=conta_inline['testo'], 
      thumb_url=*some_url*, 
     )) 

    bot.answerInlineQuery(query_id, articles) 


def on_chosen_inline_result(msg): 

    print(msg) 


bot = telepot.Bot(TOKEN) 

bot.message_loop({'chat': on_chat_message, 
       'inline_query': on_inline_query, 
       'chosen_inline_result': on_chosen_inline_result 
       }, 
      run_forever='Listening ...') 

print(msg) работает отлично для каждой статьи я выбираю из списка ответов на запрос инлайн для первого созданного исключения. Я действительно смущен ...

Что действительно сбивает с толку, так это то, что я не думаю, что имею контроль над тем, что происходит, когда я выбираю статью из списка в Telegram, поэтому кажется странным, что иногда это вызывает on_chosen_inline_result код и другие моменты нет.

EDIT: Похоже, что если id='0' в InlineQueryResultArticle выбранный результат не вызывает код внутри on_chosen_inline_result, но я не 100% уверен, что это является причиной, и я действительно не знаю, почему, в любом случае ..

PS: Я не знаю, сколько кода необходимо для понимания проблемы без копирования всего здесь. Я могу, конечно, изменить вопрос и добавить дополнительный код, если это необходимо.

+0

Что означает слово «улов» означает в _I можно только поймать 'chosen_inline_result' если ..._? –

+0

Я имею в виду, что код в 'on_chosen_inline_result' выполняется только в том случае, если у меня есть несколько объектов в db, используемых для создания статей. –

+0

Код 'on_chosen_inline_result()' очень прост, поэтому я не думаю, что проблема есть. Я заметил возможную проблему в 'on_inline_query()' - она ​​не всегда возвращает список статей. Если 'get_conta()' возвращает 1, то он возвращает список статей, но в противном случае он ничего не возвращает и поэтому возвращает 'None' по умолчанию. –

ответ

1

Из моего собственного теста кажется, что ваше подозрение верное. Я пробовал различные строки идентификаторов и выбрали каждый из них в свою очередь:

  • 00 → Да (chosen_inline_result нечестным)
  • $0 → Да
  • 0 → Нет
  • 1 → Да

Как автор телепотока, я не могу представить нигде идентификатор результата 0 может быть отфильтрован непреднамеренно , Поэтому я предполагаю, что это проблема Telegram.

Как показано выше, легко обойти. Вы можете добавить почти любого персонажа спереди, чтобы вернуть chosen_inline_result.

В случае, если кто-то интересно, вот мой код тестирования:

import sys 
import threading 
import telepot 
from telepot.namedtuple import InlineQueryResultArticle, InputTextMessageContent 

def on_inline_query(msg): 
    def compute(): 
     query_id, from_id, query_string = telepot.glance(msg, flavor='inline_query') 
     print('%s: Computing for: %s' % (threading.current_thread().name, query_string)) 

     articles = [InlineQueryResultArticle(
         id='00', title='ID=00', 
         input_message_content=InputTextMessageContent(
          message_text='ID=00')), 
        InlineQueryResultArticle(
         id='$0', title='ID=$0', 
         input_message_content=InputTextMessageContent(
          message_text='ID=$0')), 
        InlineQueryResultArticle(
         id='0', title='ID=0', 
         input_message_content=InputTextMessageContent(
          message_text='ID=0')), 
        InlineQueryResultArticle(
         id='1', title='ID=1', 
         input_message_content=InputTextMessageContent(
          message_text='ID=1')),] 

     return dict(results=articles) 

    answerer.answer(msg, compute) 

def on_chosen_inline_result(msg): 
    result_id, from_id, query_string = telepot.glance(msg, flavor='chosen_inline_result') 
    print('Chosen Inline Result:', result_id, from_id, query_string) 

TOKEN = sys.argv[1] # get token from command-line 

bot = telepot.Bot(TOKEN) 
answerer = telepot.helper.Answerer(bot) 

bot.message_loop({'inline_query': on_inline_query, 
        'chosen_inline_result': on_chosen_inline_result}, 
       run_forever='Listening ...') 
+0

Просто запуск идентификаторов от '1' вместо '0' также выполняет задание. Большое спасибо. –