Python 如何将不一致的消息检索到我的网站?

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_

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

显然,我咨询了Discord医生,但我真的很难理解。我不想为这个简单的操作创建一个bot,原则上使用OAuth应用程序和“messages.read”作用域是可能的

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

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]>