如何获取访问令牌?(Reddit API)

21
我想知道是否有可能在Reddit上获得一个用于个人使用的永久访问令牌? 只有我一个人会使用这个应用程序。
对于用户来说,访问令牌在一小时后过期。
根据我所拥有的客户端ID和密钥信息,我尝试获取访问令牌。(消息框显示“错误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());
2个回答

23

目前,您无法获取永久访问令牌。有两种选择接近于此。

第一种是在使用标准OAuth流程时请求“刷新”令牌。这是通过在代码中发送“duration”为“permanent”而执行的操作。该刷新令牌可用于自动检索新的1小时访问令牌,无需用户干预;唯一需要手动操作的步骤是检索刷新令牌的初始步骤。

第二种备选方案仅适用于编写个人使用脚本时,即使用“密码”授权类型。Reddit的“OAuth Quick Start”维基页面中详细描述了步骤,但我会在此总结:

  1. 创建OAuth客户端(在https://www.reddit.com/prefs/apps下)并将类型设置为“script”
  2. 使用POST参数grant_type=password&username=<USERNAME>&password=<PASSWORD>https://www.reddit.com/api/v1/access_token发出请求。将您的客户端ID和密钥作为HTTP基本身份验证发送。<USERNAME>必须注册为您发送的OAuth 2客户端ID的开发人员。

15

通过访问https://www.reddit.com/prefs/apps并创建一个应用程序,可以为Reddit帐户生成client_idclient_secret


screenshot reddit.com/prefs/apps

我隐藏的部分是我的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)

您可以使用当前浏览器的用户代理,这可以通过谷歌搜索“我的用户代理是什么”(以及其他方式)轻松找到。


5
“client_secret”是什么?我只看到了“client_id”。 - Rahul.A.Krishna
2
点击Reddit授权应用程序页面上的“编辑”按钮,以查看client_secret - Jeevan Takhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接