如何获取访问令牌? (Reddit API)
Posted
技术标签:
【中文标题】如何获取访问令牌? (Reddit API)【英文标题】:How to get access token? (Reddit API) 【发布时间】:2015-05-11 09:47:47 【问题描述】:我想知道是否可以在 Reddit 上获得个人使用的永久访问令牌? 只有我在使用该应用程序。
对于用户,访问令牌会在 1 小时后过期。
我使用以下关于我的客户端 ID 和密码的信息,开始尝试获取访问令牌。 (MessageBox 显示“错误 401”)
如果用户将获得令牌,则必须在浏览器中单击“允许”。这里描述得很好。 https://github.com/reddit/reddit/wiki/OAuth2 这不是我所追求的。我追求个人使用,仅通过代码访问令牌。这可能吗?
String requestUrl = "https://ssl.reddit.com/api/v1/access_token";
RestSharp.RestClient rc = new RestSharp.RestClient();
RestSharp.RestRequest request = new RestSharp.RestRequest(requestUrl, RestSharp.Method.POST);
request.AddHeader("Content-Type", "application/json");
//request.AddHeader("Authorization", ""); //???
request.AddHeader("x-li-format", "json");
request.AddParameter("client_id", "abcdefg");
request.AddParameter("client_secret", "abc123-456");
request.AddParameter("grant_type", "abc123-456");
request.AddParameter("scope", "identity");
request.AddParameter("state", "adhasegw"); //whatever value
request.AddParameter("duration", "permanent");
request.AddParameter("redirect_uri", "http://mywebsite.co");
request.RequestFormat = RestSharp.DataFormat.Json;
RestSharp.RestResponse restResponse = (RestSharp.RestResponse)rc.Execute(request);
RestSharp.ResponseStatus responseStatus = restResponse.ResponseStatus;
MessageBox.Show(restResponse.Content.ToString() + "," + responseStatus.ToString());
【问题讨论】:
【参考方案1】:截至目前,您无法检索永久访问令牌。您有 2 个接近的选项。
第一个是在使用标准 OAuth 流程时请求“刷新”令牌。这就是您通过在代码中将“持续时间”作为“永久”发送来执行的操作。刷新令牌可用于自动检索新的 1 小时访问令牌,无需用户干预;唯一的手动步骤是对刷新令牌的初始检索。
仅在编写供个人使用的脚本时适用的第二种选择是使用password
授权类型。这些步骤在reddit的"OAuth Quick Start" wiki page上有更详细的描述,但我会在这里总结一下:
-
使用 type = "script" 创建 OAuth 客户端(在 https://www.reddit.com/prefs/apps 下)
使用 POST 参数
grant_type=password&username=<USERNAME>&password=<PASSWORD>
向 https://www.reddit.com/api/v1/access_token
发出请求。将您的客户端 ID 和密码作为 HTTP 基本身份验证发送。 <USERNAME>
必须注册为您发送的 OAuth 2 客户端 ID 的开发者。
【讨论】:
【参考方案2】:可以通过转到https://www.reddit.com/prefs/apps 并创建一个应用程序为reddit 帐户生成client_id
和client_secret
:
我隐藏的部分是我的client_id
。
然后你可以使用像praw
这样的客户端来访问reddit,例如使用 Python:
import praw
r = praw.Reddit(client_id='insert id here',
client_secret='insert secret here',
user_agent='insert user agent')
page = r.subreddit('aww')
top_posts = page.hot(limit=None)
for post in top_posts:
print(post.title, post.ups)
您可以使用当前浏览器的用户代理,可以通过谷歌搜索“我的用户代理是什么”(以及其他方式)轻松找到。
【讨论】:
client_secret
是什么?我看到你只有client_id
。
在Reddit的授权申请页面点击“编辑”查看client_secret
以上是关于如何获取访问令牌? (Reddit API)的主要内容,如果未能解决你的问题,请参考以下文章
如何获取虚拟谷歌访问令牌来测试 oauth google api
用户在springboot中调用注册休息API时如何获取oAuth2访问令牌?