Получение плохого ответа с использованием JRAW

Я пытаюсь прочитать данные из Reddit, используя java. Я использую JRAW.

Вот мой код:

public class Main {
    public static void main(String args[]) {
        System.out.println('a');
        String username = "dummyName";
        UserAgent userAgent = new UserAgent("crawl", "com.example.crawl", "v0.1", username);
        Credentials credentials = Credentials.script(username, <password>,<clientID>, <client-secret>);
        NetworkAdapter adapter = new OkHttpNetworkAdapter(userAgent);
        RedditClient reddit = OAuthHelper.automatic(adapter, credentials);
        Account me = reddit.me().about();
        System.out.println(me.getName());
        SubmissionReference submission = reddit.submission("https://www.reddit.com/r/diabetes/comments/9rlkdm/shady_insurance_work_around_to_pay_for_my_dexcom/");
        RootCommentNode rcn = submission.comments();
        System.out.println(rcn.getDepth());
        System.out.println();
//        Submission submission1 = submission.inspect();
//        System.out.println(submission1.getSelfText());
//        System.out.println(submission1.getUrl());
//        System.out.println(submission1.getTitle());
//        System.out.println(submission1.getAuthor());
//        System.out.println(submission1.getCreated());
        System.out.println("-----------------------------------------------------------------");
    }
}

На данный момент я делаю два запроса, первый - reddit.me().about();, а второй - reddit.submission("https://www.reddit.com/r/diabetes/comments/9rlkdm/ shady_insurance_work_around_to_pay_for_my_dexcom/");.

Результат:

a
[1 ->] GET https://oauth.reddit.com/api/v1/me?raw_json=1
[<- 1] 200 application/json: '{"is_employee": false, "seen_layout_switch": true, "has_visited_new_profile": false, "pref_no_profanity": true, "has_external_account": false, "pref_geopopular": "GL(...)
dummyName
[2 ->] GET https://oauth.reddit.com/comments/https%3A%2F%2Fwww.reddit.com%2Fr%2Fdiabetes%2Fcomments%2F9rlkdm%2Fshady_insurance_work_around_to_pay_for_my_dexcom%2F?sort=confidence&sr_detail=false&(...)
[<- 2] 400 application/json: '{"message": "Bad Request", "error": 400}'
Exception in thread "main" net.dean.jraw.ApiException: API returned error: 400 (Bad Request), relevant parameters: []
    at net.dean.jraw.models.internal.ObjectBasedApiExceptionStub.create(ObjectBasedApiExceptionStub.java:57)
    at net.dean.jraw.models.internal.ObjectBasedApiExceptionStub.create(ObjectBasedApiExceptionStub.java:33)
    at net.dean.jraw.RedditClient.request(RedditClient.kt:186)
    at net.dean.jraw.RedditClient.request(RedditClient.kt:219)
    at net.dean.jraw.RedditClient.request(RedditClient.kt:255)
    at net.dean.jraw.references.SubmissionReference.comments(SubmissionReference.kt:50)
    at net.dean.jraw.references.SubmissionReference.comments(SubmissionReference.kt:28)
    at Main.main(Main.java:36)
Caused by: net.dean.jraw.http.NetworkException: HTTP request created unsuccessful response: GET https://oauth.reddit.com/comments/https%3A%2F%2Fwww.reddit.com%2Fr%2Fdiabetes%2Fcomments%2F9rlkdm%2Fshady_insurance_work_around_to_pay_for_my_dexcom%2F?sort=confidence&sr_detail=false&raw_json=1 -> 400
    ... 6 more

Возможно, мой первый запрос дает мне ответ с моим именем пользователя, но во втором ответе я получаю ошибку 400 неверного запроса.

Чтобы проверить, правильно ли работают мой идентификатор клиента и секрет клиента, я сделал тот же запрос, используя python PRAW библиотека.

import praw
from praw.models import MoreComments

reddit = praw.Reddit(client_id=<same-as-in-java>, client_secret=<same-as-in-java>,
                    password=<same-as-in-java>, user_agent='crawl',
                    username="dummyName")


submission = reddit.submission(
    url='https://www.reddit.com/r/redditdev/comments/1x70wl/how_to_get_all_replies_to_a_comment/')

print(submission.selftext)
print(submission.url)
print(submission.title)
print(submission.author)
print(submission.created_utc)
print('-----------------------------------------------------------------')

Это дает желаемый результат без каких-либо ошибок, поэтому детали секрета клиента должны работать.

Единственное сомнение, которое у меня есть, это создание пользовательского агента в java UserAgent userAgent = new UserAgent("crawl", "com.example.crawl", "v0.1", username);.

Я перешел по следующей ссылке.

Что именно означает target platform, the unique ID or the version. Я старался сохранить тот же формат, что и в ссылке. Также используя то же имя пользователя, что и в других местах. С другой стороны, user_agent в python представлял собой строку crawl.

Подскажите, может я что-то упускаю и в чем может быть дело?

Спасибо

P.S. Я хочу сделать это в java. не питон.


person guroosh    schedule 29.01.2019    source источник
comment
URL-адреса, используемые при отправке, различаются в обоих ваших примерах (не уверен, что вы пытались использовать один и тот же). Кроме того, javadoc показывает, что для отправки вам нужно использовать идентификатор (что бы это ни значило, я не знаю о Reddit): jitpack.io/com/github/mattbdean/JRAW/v1.0.0/javadoc/index.html. И PRAW не был написан одним и тем же автором, поэтому нет оснований полагать, что они будут использовать одни и те же аргументы для своих методов.   -  person Adonis    schedule 29.01.2019
comment
Я пробовал несколько URL-адресов для обоих кодов, так что это не проблема. Да, они написаны разными авторами, но основаны на одном и том же api, но я понимаю ваше точка. Спасибо   -  person guroosh    schedule 29.01.2019
comment
Решено: в JRAW для отправки требуется идентификатор, который находится в URL-адресе. В приведенных выше примерах идентификаторы 9rlkdm и 1x70wl соответственно. P.s: В PRAW могут работать как id, так и url. Спасибо.   -  person guroosh    schedule 29.01.2019


Ответы (1)


Поскольку ваш первый запрос работает, учетные данные верны. В JRAW не указывайте весь URL-адрес, а только идентификатор в функции отправки.

Изменить это

SubmissionReference submission = reddit.submission("https://www.reddit.com/r/diabetes/comments/9rlkdm/shady_insurance_work_around_to_pay_for_my_dexcom/");

к этому

SubmissionReference submission = reddit.submission("9rlkdm");

где идентификатор — это случайная строка после /comment/ в URL-адресе.

Надеюсь это поможет.

person guroosh    schedule 29.01.2019