【发布时间】: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 生成器链接,这在任何情况下都是手动操作,不是吗?
-
我刚刚测试过,它对我有用。为了清楚起见,我发布了我所做的事情。