0

ユーザーから文字列を取得し(インラインモード)、データを送り返すインラインボットがあります。これは私のコードです:

# -*- coding: utf-8 -*-
import sys
import time
import telepot

from telepot.loop import MessageLoop
from telepot.namedtuple import *
from pprint import pprint
from elasticsearch import Elasticsearch
from mongoengine import connect

from model import *
from setting import *

bot = telepot.Bot(TOKEN)
es = Elasticsearch()
connect('poem')

content_type, chat_type, chat_id = None, None, None

def handle(msg):
    global content_type, chat_type, chat_id
    content_type, chat_type, chat_id = telepot.glance(msg)
    pprint(msg)


def on_inline_query(msg):
    query_id, from_id, query_string = telepot.glance(msg, flavor='inline_query')
    print ('Inline Query:', msg)
    response = es.search(
        index="poem",
        body={
            "query": {
                "match": {"text": query_string},
            }
        }
    )
    articles = []
    for index, hit in enumerate(response['hits']['hits']):
        poem = GanjoorPoemModel.objects(id=hit['_source']['poem_id']).first()
        header = u"%s\n%s" % (hit['_source']['poet'], hit['_source']['book'])
        if len(poem.sub_book):
            for sub in poem.sub_book:
                header += u"\n%s" % sub
        header += u"\n----\n"
        link = poem.link
        text = header + poem.text
        if len(text) > 4096:
            temp = poem.text[:(4096-len(header)-len(link)-10)] + "\n" + link
            text = header + temp
        print "A", str(poem.link)
        # text = text.encode('utf-8', 'ignore').decode('utf-8')
        iqra = InlineQueryResultArticle(
            id=str(index) + "_" + hit['_source']['poem_id'],
            title=u"%s-%s" %(hit['_source']['poet'], hit['_source']['book']),
            input_message_content=InputTextMessageContent(
                message_text=text
            ),
            description=hit['_source']['text'],
            thumb_url='https://appreview.ir/wp-content/uploads/com.example.mohammad.books_.png'
        )
        articles.append(iqra)
    bot.answerInlineQuery(query_id, articles, cache_time=5)

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)

MessageLoop(bot, {'inline_query': on_inline_query,
                  'chosen_inline_result': on_chosen_inline_result}).run_as_thread()
print ('Listening ...')

# Keep the program running.
while 1:
    time.sleep(10)

上記のコードで、ボットに単語 ( などپروانه) を送信すると、次のエラーが発生します。

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/telepot/loop.py", line 37, in run_forever
    self._handle(msg)
  File "/usr/local/lib/python2.7/dist-packages/telepot/helper.py", line 1031, in route
    return fn(msg, *args, **kwargs)
  File "bot.py", line 63, in on_inline_query
    bot.answerInlineQuery(query_id, articles, cache_time=5)
  File "/usr/local/lib/python2.7/dist-packages/telepot/__init__.py", line 868, in answerInlineQuery
    return self._api_request('answerInlineQuery', _rectify(p))
  File "/usr/local/lib/python2.7/dist-packages/telepot/__init__.py", line 435, in _api_request
    return api.request((self._token, method, params, files), **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/telepot/api.py", line 137, in request
    return _parse(r)
  File "/usr/local/lib/python2.7/dist-packages/telepot/api.py", line 116, in _parse
    raise exception.BadHTTPResponse(response.status, text, response)
BadHTTPResponse: Status 413 - First 500 characters are shown below:

bot.answerInlineQuery(query_id, articles, cache_time=5)を変更bot.answerInlineQuery(query_id, articles[:-4], cache_time=5)すると、この問題は表示されず、ボットはデータを送り返します。使用するbot.answerInlineQuery(query_id, articles[:-3], cache_time=5)と、再びエラーが発生します。そして、私がbot.answerInlineQuery(query_id, articles[6], cache_time=5)(の新しいアイテムを正確に意味するarticles)を使用すると、例外は発生しません。おそらく、この新しく追加されたアイテムには問題がないことを意味します。どこが間違っていますか?タイムアウトはありますか?articlesまたはオブジェクト全体に制限はありますか? message_text配列の項目のすべてarticlesが 4096 文字未満です。コードを変更して、テキストとして 1 文字のみの 1000 個のアイテムurllib3を送信しようとすると、このエラーが再び発生するため、これは制限だと思います。articles

4

0 に答える 0