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

时间:2015-03-10 03:11:54

标签: c# api access-token reddit

我想知道是否有可能在Reddit上获得永久访问令牌供个人使用? 它只会是我使用App。

对于用户,访问令牌在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());

2 个答案:

答案 0 :(得分:12)

截至目前,您无法检索永久访问令牌。你有两个选择。

首先是请求"刷新"使用标准OAuth流时的令牌。这就是你通过发送"持续时间"来做的事情。 as"永久"在你的代码中。刷新令牌可用于在没有用户干预的情况下自动检索新的1小时访问令牌;唯一的手动步骤是初始检索刷新令牌。

第二种替代方法,仅在编写供个人使用的脚本时使用,是使用password授权类型。 reddit的"OAuth Quick Start" wiki page详细介绍了这些步骤,但我将在此总结:

  1. 使用type ="脚本"
  2. 创建OAuth客户端(在https://www.reddit.com/prefs/apps下)
  3. 使用POST参数https://www.reddit.com/api/v1/access_tokengrant_type=password&username=<USERNAME>&password=<PASSWORD>发出请求。将您的客户端ID和密码作为HTTP基本身份验证发送。 <USERNAME>必须注册为您发送的OAuth 2客户端ID的开发者。

答案 1 :(得分:4)

通过转到https://www.reddit.com/prefs/apps并创建应用,可以为reddit帐户生成SELECT * FROM entity e LEFT OUTER JOIN telephone t ON t.id_number = e.id_number LEFT OUTER JOIN email eml ON eml.id_number = e.id_number string myString = "This is my string and it will forever be my string."; string[] words = myString.Split(' '); var myNewString = string.Join(" ", words.Skip(3));


screenshot reddit.com/prefs/apps

我隐藏的部分是我的client_id

然后,您可以使用client_secret等客户端访问reddit,例如用Python:

client_id

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