【问题标题】:Getting info from Twitch's API to check if a streamer is online for a discord bot从 Twitch 的 API 获取信息以检查流媒体是否在线以获取不和谐机器人
【发布时间】:2021-07-03 17:29:09
【问题描述】:

我正在尝试制作一个 Discord 机器人,以在您键入“$live”时检查 Twitch 上的流媒体是否在线,但我无法让它工作。我正在使用 Discord.py。我的主要问题是使用标头调用 API 来提供我的授权。此外,使用我目前编写的代码,它会发送此错误。我的主要问题是,我怎样才能提供授权密钥,这样它既不会给出下面的错误,也不会说需要 OAuth。蒂亚!

忽略 on_message 中的异常 回溯(最近一次通话最后): _run_event 中的文件“/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/client.py”,第 343 行 等待 coro(*args, **kwargs) 文件“main.py”,第 19 行,on_message 响应 = requests.get(url, headers=headers) 文件“/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/api.py”,第 76 行,在 get 返回请求('get', url, params=params, **kwargs) 文件“/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/api.py”,第 61 行,在请求中 返回 session.request(method=method, url=url, **kwargs) 文件“/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/sessions.py”,第 528 行,在请求中 prep = self.prepare_request(req) 文件“/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/sessions.py”,第 456 行,在 prepare_request p.准备( 准备中的文件“/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/models.py”,第 317 行 self.prepare_headers(标题) 文件“/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/models.py”,第 449 行,在 prepare_headers 对于 headers.items() 中的标题: AttributeError: 'set' 对象没有属性 'items'

代码如下。

import discord 
import os
import requests

client = discord.Client()
url = 'https://api.twitch.tv/helix/search/channels?query=whyoscar'
headers = {'client_id:' '*******************', 'Authorization:' 'Bearer **********************'}

@client.event
async def  on_ready():
  print('We have logged in as {0.user}'.format(client))

@client.event 
async def on_message(message):
  if message.author == client.user:
    return
  
  if message.content.startswith('$live'):
    response = requests.get(url, headers=headers)
    details = response.json()
    await message.channel.send(details)

client.run(os.getenv('TOKEN'))

【问题讨论】:

    标签: python discord.py twitch


    【解决方案1】:

    答案是,您想像这样定义您的标头:url = 'https://api.twitch.tv/helix/search/channels?query=<channel you want to search for>&first=1' headers = {"client-id": os.getenv('CLIENT_ID_TOKEN'), "Authorization": os.getenv('ACCESS_TOKEN')} 然后将它们放入 response = requests.get(url, headers=headers) 中,然后以 JSON 格式获取响应并检查 is_live=true 的响应。就是这样!

    【讨论】:

      【解决方案2】:

      如果您使用 OAuth 访问 Twitch API,那么流程应该是这样的:

      authURL = 'https://id.twitch.tv/oauth2/token'
      client_ID = 'xxx'
      secret = 'xxx'
      
      AutParams = {'client_id': client_ID,
                   'client_secret': secret,
                   'grant_type': 'client_credentials'
                   }
      
      AutCall = requests.post(url=authURL, params=AutParams)
      access_token = AutCall.json()['access_token']
      
      head = {
          'Client-ID' : client_ID,
          'Authorization' :  "Bearer " + access_token
          }
      

      【讨论】:

        【解决方案3】:

        根据 Twitch 论坛上的this post,您需要的是用户令牌,而不是应用程序令牌。

        Twitch API 文档说

        需要 OAuth 或应用访问令牌

        ...但它没有指定令牌必须是用户令牌。

        无论如何,去TwitchTokenGenerator,选择机器人聊天令牌,用你的Twitch信息登录,它应该可以工作了。

        【讨论】:

        • 好的,我这样做并修复了我原来的错误的格​​式问题,现在它显示“{'error': 'Unauthorized', 'status': 401, 'message': 'Client ID 和 OAuth 令牌不匹配'}" 为什么?
        • 我今天也遇到了同样的错误。但在晚上早些时候,一切正常。我不确定问题是什么,但您的实现似乎是正确的。
        猜你喜欢
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        相关资源
        最近更新 更多