Как отправлять новости с помощью чат-бота Discord с использованием API на Python?

#python #api #python-requests #discord #chatbot

Вопрос:

Я создаю чат-бота discord с использованием python, где мой бот отправляет новости с помощью API, но я не могу этого сделать.

Мой код:-

 import requests
def get_news():                           #========================================News
  url = "https://google-news1.p.rapidapi.com/top-headlines"
  load_dotenv()
  querystring = {"country":"INDIA","lang":"en","limit":"50","media":"true"}

  headers = {
      'x-rapidapi-key': "os.getenv('NEWS_API')",
      'x-rapidapi-host': "google-news1.p.rapidapi.com"
      }

  response = requests.request("GET", url, headers=headers, params=querystring)
  json_data=json.loads(response.text)
  return json_data

@client.event
async def on_message(message):
    if message.content.startswith('|news'):    #====================================News
      data=get_news()
      list1=message.content.split(" ")
      try:
        num=int(list1[1])
      except:
        num=5
        i = 1
        for item in data['article']:
           if not(item['description']):
              continue
           await message.channel.send(str(i) ". " item['url'])
           if i == num:
               break
           i  = 1
 

Я использую API от https://rapidapi.com/ubillarnet/api/google-news1/

Но я столкнулся с некоторой ошибкой

Моя ошибка:-

 $ python -u "d:Codepython projectsDiscord_Chat_BOTmain.py"
We have logged in as Buddy#9784
Ignoring exception in on_message
Traceback (most recent call last):
  File "C:UserssohamAppDataRoamingPythonPython39site-packagesdiscordclient.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "d:Codepython projectsDiscord_Chat_BOTmain.py", line 218, in on_message
    for item in data['article']:
KeyError: 'article'
 

Пожалуйста, помогите мне исправить эту ошибку

Комментарии:

1. Не могли бы вы добавить print(json_data) прямо перед return json_data входом get_news() и повторить, чтобы мы могли подтвердить его ценность?

2. Когда я печатаю это, это дает мне {'message': 'You are not subscribed to this API.'} . Но я подписался на него в rapidapi.com

3. Ваш синтаксис apikey для получения NEWS_API из os env in headers может быть неверным. Мое предложение состоит в том, чтобы сделать 1 из 2 вещей. 1) Явно введите свой x-rapidapi-key in headers или 2) создайте переменную, например news_api = os.getenv('NEWS_API') , и затем x-rapidapi-key: news_api, .

Ответ №1:

Я думаю, что причина в следующем:

 headers = {
      'x-rapidapi-key': "os.getenv('NEWS_API')",
      'x-rapidapi-host': "google-news1.p.rapidapi.com"
      }
 

Вы буквально отправляете текст "os.getenv('NEWS_API')" в качестве ключа, вместо того, чтобы запускать os.getenv('NEWS_API') и отправлять значение в качестве ключа. Поскольку строка "os.getenv('NEWS_API')" не является допустимым ключом, у вас нет разрешения.

Вместо этого удалите кавычки, чтобы отправить фактический ключ:

 headers = {
      'x-rapidapi-key': os.getenv('NEWS_API'),
      'x-rapidapi-host': "google-news1.p.rapidapi.com"
      }