Python 如何将不一致的消息检索到我的网站?
我目前有一个Python/Django平台和一个Discord社区。我想获得一个频道的消息,将其转换为网站上的通知 显然,我咨询了Discord医生,但我真的很难理解。我不想为这个简单的操作创建一个bot,原则上使用OAuth应用程序和“messages.read”作用域是可能的 我现在可以生成我的令牌:Python 如何将不一致的消息检索到我的网站?,python,django,discord,Python,Django,Discord,我目前有一个Python/Django平台和一个Discord社区。我想获得一个频道的消息,将其转换为网站上的通知 显然,我咨询了Discord医生,但我真的很难理解。我不想为这个简单的操作创建一个bot,原则上使用OAuth应用程序和“messages.read”作用域是可能的 我现在可以生成我的令牌: def discord_get_token(): data = { 'client_id':DISCORD_CLIENT_ID, 'client_secret':DISCORD_
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不同,我们生成令牌并调用请求。我注意到不和谐的工作方式有点不同
遗漏的步骤是什么?我必须使用机器人吗?我是否每次都必须使用OAuth2URL生成器进行手动授权
谢谢你的回答
编辑:
直接使用用户帐户生成令牌:
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']
导入请求
>>>en=“/channels/{channel.id}/messages”
>>>#信道ID
>>>b=”https://discord.com/api/v8"
>>>url=b+“/channels/channelid/messages”
>>>网址
'https://discord.com/api/v8/channels/channelid/messages'
>>>标题={
“授权”:“OtokenhereNo”
}
>>>r=requests.get(url,headers=headers)
>>>r
令牌可以是您的真实用户令牌。我相信您得到的是401HTTP代码,因为您试图发送类似post的请求,而不是GET。您也有“持有人”前面的令牌将不起作用。虽然这似乎是答案,但如果您正在尝试制作实时消息更新系统,我认为您最好使用Discords websockets API。如果您在使用Discord时查看firefox网络工具。您可以看到,您可以使用您的用户帐户令牌来调用端点,如/messages。您不需要生成访问令牌。你让事情变得更难了。谢谢你的回答@Noah。事实上,我一开始就做了。但是,我在同一个请求上出现了相同的错误(错误401)。所以这并不能真正解决我的问题:/如果我理解正确,我必须调用带有message.read scope的OAuth url生成器链接,这在任何情况下都是一个手动操作,不是吗?我只是测试了一下,它对我有效。为了清晰起见,我发布了我所做的。谢谢你的回答!我只是直接用我的客户ID和密钥复制了同样的东西,不用担心。然后我删除了标题中的“承载者”,检查我的请求是否在GET中。我检查了频道ID,一切正常。然后我像你一样,直接在python中测试,得到相同的错误。我的系统中缺少一个步骤(我编辑了有关生成令牌的新函数),也许我的错误是grant_类型?或者我的应用程序和discord服务器之间的链接?您不应该生成任何令牌,这是您的问题。转到您的discord PC应用程序,打开chrome浏览器,单击频道,查找“科学”请求并复制授权标题令牌。这是您应该使用的代币。非常感谢!一切都很好!我的结论是,这个代币永远不会过期!你提到了websockets,在寻找这一面之前,我们可以不通过机器人来完成吗?再次非常感谢!你的结论几乎是正确的。令牌是对登录凭据的加密/编码。这意味着当您更改密码或任何与您的登录信息相关的信息时,它都会更改。一旦连接起来,websockets API就相当简单了。这是另一个问题。如果我的答案是正确的,请把它标为正确的。
>>> 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]>