Не можете оставить комментарий на Reddit с помощью Почтальон: ошибка USER_REQUIRED - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь оставить комментарий с помощью Почтальона. Я отправляю следующую информацию:

Заголовки:

Authorization: "Bearer access_token"

Content-Type: " application/x-www-form-urlencoded"

User-Agent: "some u/user"

Body:

api_type: "json"

thing_id: "t3_9e04eo"

text: "some comment"

Я отправляю этот запрос POST на https://oauth.reddit.com/api/comment.

В ответ я получаю USER_REQUIRED error:

1019 *

{
    "json": {
        "errors": [
            [
                "USER_REQUIRED",
                "Please log in to do that.",
                null
            ]
        ]
    }
}

Почему это? Я передал access_token, и он был принят как правильный (в противном случае, если я сознательно передам неправильный токен, я получу 401 Несанкционированную ошибку).

Какие у меня пароли:

Мое обычное имя пользователя: пара паролей

app_id моего скрипта: пара app_secret

Мой access_token мне дали в обмен на мою пару app_id: app_secret.

Я также пытался сделать это на Java, используя HttpURLConnection class:

import org.apache.tomcat.util.codec.binary.Base64;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Scanner;

public class RedditParser {
        public static void main(String[] args)  {
            RedditParser redditParser = new RedditParser();
            redditParser.postAComment("sds", "fdfdf");
        } 

        public  void postAComment(String postID, String commentBody)  { 

             try  { 
                 String postLink = "https://oauth.reddit.com/api/comment"; 

                  URL loginURL = new URL(postLink); 
                  HttpURLConnection connection = (HttpURLConnection) loginURL.openConnection();
                  JSONObject requestJSON = new JSONObject();
                  requestJSON.put("api_type", "json");
                  requestJSON.put("thing_id", "t3_9e04eo");
                  requestJSON.put("text", "a test comment");

                  connection.setDoOutput(true);

                  connection.setRequestProperty("Authorization", "Bearer " +getAccessToken());  //getAccessToken returns correct(!) token; it's not the cause of the error
                  connection.setRequestProperty("User-Agent", "script by /u/someuser");
                  connection.setRequestProperty("Content-Type", "application/json");

                  OutputStream os = connection.getOutputStream();
                  os.write(requestJSON.toString().getBytes("UTF-8"));
                  os.close();

                  connection.connect();

                  System.out.println("Done comment");

                  InputStream input = connection.getInputStream();
                  String inputString = new Scanner(input, "UTF-8").useDelimiter("\\Z").next();
                  JSONObject jsonObject = new JSONObject(inputString);
                  System.out.println(inputString);
            }

            catch (Exception e)  {

                 System.out.println(e);
            }

       }
}
​

Но я все еще получаю сообщение об ошибке:

Done comment
{"jquery": [[0, 1, "refresh", []], [0, 2, "attr", "find"], [2, 3, "call", [".error.USER_REQUIRED"]], [3, 4, "attr", "show"], [4, 5, "call", []], [5, 6, "attr", "text"], [6, 7, "call", ["Please log in to do that."]], [7, 8, "attr", "end"], [8, 9, "call", []]], "success": false}

Что еще мне нужно добавить в запрос, чтобы избавиться от ошибки?

1 Ответ

0 голосов
/ 06 сентября 2018

Исходя из имеющейся информации, я предполагаю, что вы не указали учетные данные пользователя в запросе токена, а запросили Application Only Token . Этот тип токена, вероятно, нельзя использовать для публикации комментариев на Reddit по понятным причинам.

Чтобы выполнить действия для определенного пользователя, вам необходимо запросить токен доступа, подобный следующему:

reddit@reddit-VirtualBox:~$ curl -X POST -d 'grant_type=password&username=reddit_bot&password=snoo' --user 'p-jcoLKBynTLew:gko_LXELoV07ZBNUXrvWZfzE3aI' https://www.reddit.com/api/v1/access_token
{
    "access_token": "J1qK1c18UUGJFAzz9xnH56584l4", 
    "expires_in": 3600, 
    "scope": "*", 
    "token_type": "bearer"
}

То есть предоставить учетные данные пользователя в виде данных формы и использовать учетные данные приложения для обычной проверки подлинности.

В целом, возможно, проще использовать один из API-упаковщиков , которые уже доступны для reddit. Для Java в Reddit Wiki упоминаются JRAW и RedditJerk * ​​1015 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...