【问题标题】:How retrieve Discord messages to my website?如何将 Discord 消息检索到我的网站?
【发布时间】:2021-06-21 02:31:18
【问题描述】:

我目前有一个 Python/Django 平台和一个 Discord 社区。我想获取频道的消息以将其转换为网站上的通知。

显然我查阅了 Discord 文档,但我真的很难理解。我不想为这个简单的操作创建一个机器人,原则上通过使用带有“messages.read”范围的 OAuth 应用程序是可能的。

我现在可以生成我的令牌了:

def discord_get_token():
 data = {
   'client_id':DISCORD_CLIENT_ID,
   'client_secret':DISCORD_PRIVATE_KEY,
   'grant_type': 'client_credentials',
   'redirect_uri': 'http://127.0.0.1:8000',
   'scope': 'identify connections messages.read'
 }
 headers = {
   'Content-Type': 'application/x-www-form-urlencoded'
 }
 r = requests.post('%s/oauth2/token' % DISCORD_BASE_URI, data=data, headers=headers)
 r.raise_for_status()

 #Token
 print(r.json()['access_token'])
 return r.json()['access_token']

然后使用以下路由 /channels/{channel.id}/messages 调用消息:

def get_channel_messages(id_channel):
 route = "/channels/"+ str(id_channel) +"/messages"
 data,error_message = request_discord('GET',route)

 print(data)

def request_discord(method,url_access,body={}):
   data =''
   #Call token
   error_message = ''
   access_token = discord_get_token()

   #Call request
   headers = {'Content-Type':'application/json','Authorization':'bearer ' + access_token}

   body = body
   if method=="GET":
       result = requests.get(DISCORD_BASE_URI + url_access, headers=headers,data=body)
   else:
       result = requests.post(DISCORD_BASE_URI + url_access, headers=headers,data=body)

   #Check result
   if result.status_code != 200 and result.status_code != 201:
       error_message = "Impossible de d'obtenir un resultat erreur: " + str(result.status_code)
   else:
       data = result.json()

   return data,error_message

返回 401 错误。

与大多数 API 不同,我们生成令牌并调用请求。我注意到 Discord 的工作方式略有不同。

缺少哪些步骤?我必须使用机器人吗?我每次都必须使用 OAuth2 URL 生成器进行手动授权吗?

感谢您的回答!

编辑:

直接使用用户帐户生成令牌:

def discord_get_token():
 data = {
   'grant_type': 'client_credentials',
   'scope': 'messages.read'
 }
 headers = {
   'Content-Type': 'application/x-www-form-urlencoded'
 }
 r = requests.post('%s/oauth2/token' % DISCORD_BASE_URI, data=data,    headers=headers, auth=(DISCORD_CLIENT_ID, DISCORD_PRIVATE_KEY))
 r.raise_for_status()

 #Token
 return r.json()['access_token'] 

【问题讨论】:

  • 如果您在 Discord 上查看 Firefox 网络工具。您会看到您可以使用您的用户帐户令牌来调用 /messages 等端点。您不需要生成访问令牌。你让它变得比它需要的更难。
  • 感谢您的回答@Noah。确实,我一开始就这样做了。但是我在同一个请求上遇到了同样的错误(错误 401 未授权)。所以它并不能真正解决我的问题:/如果我理解正确,我必须调用带有 message.read 范围的 OAuth url 生成器链接,这在任何情况下都是手动操作,不是吗?
  • 我刚刚测试过,它对我有用。为了清楚起见,我发布了我所做的事情。

标签: python django discord


【解决方案1】:
>>> import requests
>>> en = "/channels/{channel.id}/messages"
>>> #channelid
>>> b = "https://discord.com/api/v8"
>>> url = b + "/channels/channelid/messages"
>>> url
'https://discord.com/api/v8/channels/channelid/messages'
>>> headers = {
    "Authorization": "OtokenhereNo"
    }
>>> r = requests.get(url, headers=headers)
>>> r
<Response [200]>

令牌可以是您的真实用户令牌。我相信您收到的是 401 HTTP 代码,因为您正在尝试发送类似 post 的请求而不是 GET。您在令牌前面还有“不记名”,这将不起作用。虽然这似乎是答案,但如果您正在尝试制作实时消息更新系统,我认为您最好使用 Discords websockets API。

【讨论】:

  • 感谢您的回答!我只是复制了直接使用我的客户端 ID 和密钥生成的相同事物令牌,不用担心。然后我删除了标题中的“Bearer”,我检查了我的请求是否在 GET 中。我检查了频道 ID,一切正常。然后我确实喜欢你,直接在python中测试并得到同样的错误。我的系统中缺少一个步骤(我编辑了有关生成令牌的新功能)
  • 也许我的错误是 grant_type ?或者我的应用程序和不和谐服务器之间的链接?
  • 您不应该生成任何令牌,这是您的问题。转到您的 discord PC 应用程序并打开 chrome 浏览器,单击一个频道,查找“科学”请求并复制授权标头令牌。那是你应该使用的令牌。
  • 非常感谢!一切正常!我的结论是这个令牌永远不会过期!您谈到了 websockets,在寻找这一面之前,我们可以在不通过机器人的情况下做到这一点吗?再次非常感谢!
  • 你的结论几乎是正确的。令牌是您的登录凭据的加密/编码。这意味着当您更改密码或与您的登录信息相关的任何内容时,它会发生变化。连接后,websockets API 非常简单。那是另一个问题。如果我的回答是正确的,请将其标记为正确。
猜你喜欢
  • 2021-06-23
  • 2021-07-05
  • 2022-01-03
  • 2019-03-23
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多