我对使用Discord API与Discord接口感兴趣。我会将他们的文档描述为"稀疏,"但也许我不是在寻找合适的地方。我的大多数信息来自此页面:
https://discordapp.com/developers/docs/topics/oauth2
我已经设置了我的Discord公会和应用程序(甚至是机器人,这可能是不必要的)。我的具体计划是允许用户授予我的网站权限,将其添加到私人Discord公会/服务器。我的网站上有一个引用此网址的超链接:
这部分似乎运作良好。用户批准该请求。然后用“"代码”将用户发送回我的网站。查询字符串中的键值对。我认为这段代码就是所谓的"授权码。"那么如何使用此授权码将用户添加到我的公会?我在Discord网站上找到了这个页面:
https://discordapp.com/developers/docs/resources/guild#add-guild-member
从该页面我可以看到我需要启动此URL的PUT:
https://discordapp.com/api/guilds/ {guild.id} /构件/ {user.id}
但我不知道{user.id}。我只有一个授权码。
它还说," ...如果您拥有guilds.join范围内用户的有效oauth2访问令牌。"我没有访问令牌。同样,我只有一个授权码。
所以在我看来,我需要以某种方式交换此授权码以获取访问令牌和用户ID。有人能告诉我该怎么做吗?我一直在尝试使用以下网址,但我不知道用什么方法(GET,POST等)或发送它的参数:
https://discordapp.com/api/oauth2/token
因为我想了解其工作方式的内在性,所以我更倾向于知道如何使用普通的Web请求(例如HttpWebRequest和WebClient,而不是使用某些OAuth库)
我决定阅读(有选择地)这个RFC:
https://tools.ietf.org/html/rfc6749#section-4.1.3
我已将我认为最合适的部分联系起来。似乎正确的过程是向以下URL和参数发送POST请求:
https://discordapp.com/api/oauth2/token
grant_type = authorization_code&安培;代码= [AuthorizationCode]&安培; REDIRECT_URI = [RedirectURI]&安培; CLIENT_ID = [客户端ID]
这似乎也符合Peter G的答案。不幸的是,此请求因401(未授权)错误而失败。所以我认为这是一个死路一条。我曾多次尝试过,但希望有一个解决方案。我收到了这个回复机构:
{"错误":" invalid_client"}
我收到了这些标题:
连接:关闭
Pragma:no-cache
严格 - 运输 - 安全:max-age = 31536000; includeSubDomains
Alt-Svc:清除
CF-RAY:[RedactedJustInCase]
内容长度:27
Cache-Control:no-store
Content-Type:application / json
日期:2017年4月7日星期五01:12:19 GMT
Set-Cookie:__ cfduid = [RedactedJustInCase];到期=周六,07年4月18日 格林尼治标准时间01:12:19;路径= /;域= .discordapp.com;仅Http
服务器:cloudflare-nginx
Via:1.1 google
答案 0 :(得分:2)
就获取OAuth令牌而言,您几乎就在那里。您只需使用您链接的文档https://discordapp.com/api/oauth2/token上列出的其他网址即可。使用以下参数对其发帖:https://discordapp.com/api/oauth2/token?client_id=[ClientID]&grant_type=authorization_code&code=[AuthorizationCode]&redirect_uri=[RedirectURI]&client_secret=[Secret]其中AuthorizationCode
是第一个网址的返回,Secret
是您首次注册应用时获得的客户端密码。
这应该会在响应正文中返回客户端令牌(以及令牌到期需要多长时间)。至于获取User对象,您需要将范围identify
添加到第一个请求,以便您可以使用该标记来调用https://discordapp.com/developers/docs/resources/user#get-current-user(如果链接中断,它会GET users/@me
})。该API将以JSON格式返回User对象。
最后,您可以使用您刚刚获得的用户对象通过PUT-ing将用户添加到https://discordapp.com/api/guilds/[guild.id]/members/[user.id]。
在获取客户端令牌(获取用户对象并将用户置于公会中)之后使用API时,您需要使用Bearer身份验证方案将令牌放在授权标头下的HTTP请求中。基本上,这意味着标题应设置为"Bearer TOKEN_HERE"
。您还应该使用内容类型" application / x-www-form-urlencoded"如果你还没有使用它。
如果您在此处不了解任何内容,我强烈建议您阅读源RFC中的oauth(不要担心,这两部分很简短):getting an auth code, getting a token,authenticating with Bearer scheme。当你不使用图书馆时,他们会休息。