Не удается опубликовать комментарий к reddit с помощью Postman: ошибка пользователя

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

заголовки:

Authorization: "Bearer access_token"

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

User-Agent: "some u/user"

тело:

api_type: "json"

thing_id: "t3_9e04eo"

text: "some comment"

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

взамен я получаю USER_REQUIRED error:

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

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

что у меня есть пароли:

мой обычный логин:пароль

мой скрипт app_id: app_secret pair

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

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

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 ответов


из имеющейся информации я бы предположил, что вы не предоставили учетные данные пользователя в запросе токена, но запросили Приложения Только Маркер. Этот тип токена, вероятно, не может использоваться для публикации комментариев на 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"
}

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

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