Бот Telegram не возвращает запросы API - PullRequest
0 голосов
/ 24 марта 2020

Я новичок в создании чат-ботов.

import telebot

bot = telebot.TeleBot('123345677789')

def sendMessage(message, text):
   bot.send_message(message.chat.id, text)

@bot.message_handler(func=lambda msg: msg.text is not None)
def reply_to_message(message):
    if 'hello' in message.text.lower():
        sendMessage(message, 'Hello! How are you doing today?')
    else:
        bot.reply_to(message,'try hi or hello')

@bot.message_handler(func=lambda msg: msg.text is not None)
def getresponse(user_input):
    if 'virus' in user_input.text.lower():
        url = "https://covid-19-coronavirus-statistics.p.rapidapi.com/v1/stats"
        querystring = {"country":"USA"}
        headers = {
            'x-rapidapi-host': "covid-19-coronavirus-statistics.p.rapidapi.com",
            'x-rapidapi-key': "ea33a4fd9cmshd4ead0c7290"}
        response = requests.request("GET", url, headers=headers, params=querystring)
        bot.reply_to(user_input,response.text)
    else:
        bot.reply_to(user_input,'type virus')

Я пытался заставить API вернуть данные. Но всякий раз, когда я пытаюсь отправить запросы, бот ничего мне не напоминает. Любая помощь приветствуется.

Спасибо!

1 Ответ

1 голос
/ 21 апреля 2020

Проблема в том, что у вас одинаковый фильтр для обеих функций, поэтому первая функция всегда будет иметь приоритет и отвечать на ваши сообщения. Возможны следующие варианты: объединить обе функции, удалить первую функцию, перейти от сообщения к команде одной из ваших функций или вы можете попробовать использовать register_next_step_handler (), так что вам всегда нужно приветствовать бота, прежде чем запрашивать информацию (звучит как излишнее для меня) .

Хорошо, давайте go со слиянием:

import telebot
import requests

bot = telebot.TeleBot(tgtoken)

def sendMessage(message, text):
    bot.send_message(message.chat.id, text)

@bot.message_handler(func=lambda msg: msg.text is not None)
def getresponse(user_input):
    if user_input.text.lower() in ["hello", "hi"]:
        sendMessage(user_input, 'Hello! How are you doing today?')
    elif 'virus' in user_input.text.lower():
        url = "https://covid-19-coronavirus-statistics.p.rapidapi.com/v1/stats"
        querystring = {"country":"Denmark"}
        headers = {
            'x-rapidapi-host': "covid-19-coronavirus-statistics.p.rapidapi.com",
            'x-rapidapi-key': rapidapitoken}
        response = requests.request("GET", url, headers=headers, params=querystring)
        if not response.json()["error"]:
            bot.reply_to(user_input,str(response.json()["data"]))
        else:
            bot.reply_to(user_input,"Error: {!s} , StatusCode: {!s}, Message: {!s}".format(response.json()["error"], response.json()["statusCode"], response.json()["message"]))
    else:
        bot.reply_to(user_input,'type hi, hello, or virus')

bot.polling()

И все. Хорошо, я обманул, я использовал Данию, а не США, потому что информация Дании мала по сравнению с США Но это был не вопрос, riiiiight? Что ж, лучший способ решить эту проблему - отправить минимально необходимую информацию, потому что в противном случае вы достигнете двух ограничений: максимум символов в сообщении и слишком много запросов, если вы разделите сообщение.

PS: Может быть, код, когда вы показываете, что ошибка, которую вы получаете при получении информации из API, не идеальна, я не смог ее протестировать.

...