Запрос Java HttpClient возвращает статус 403, в то время как postman возвращает предполагаемый ответ

#java #httpclient #steam #steambot

#java #httpclient #Steam #steambot

Вопрос:

Попытался запросить с помощью postman, который дает желаемый ответ.

Код Java, используемый для выполнения того же запроса, как показано ниже, завершается ошибкой со статусом 403.

 String url = "https://steamcommunity.com/inventory/76561198865293952/440/2?l=englishamp;count=5000";
String cookiesString = "sessionid="   generateSessionId()   ";steamCountry=IN|e744269b3c4e531facb33ecaff29eb44";

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest
                .newBuilder()
                .GET()
                .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36")
                .header("Accept", "*/*")
                .header("Cookie", cookiesString)
                .uri(URI.create(url))
                .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.statusCode()); //prints 403
System.out.println(response.body()); // prints       � �� O��%   

 
 /**
* Generates a Steam Session Id.
* @return sessionId.
*/
public static String generateSessionId() {
   return new BigInteger(96, new Random()).toString(16);
}
 

Для запроса Postman вообще не нужны никакие заголовки (даже User-Agent, сохраняется только хост, файлы cookie не требуются), чтобы получить желаемый ответ. Даже переход по ссылке в браузере показывает ответ json.

Скриншот запроса PostMan

Postman запрашивает изображение с файлами cookie

Спасибо. Хорошего дня.

Комментарии:

1. На скриншоте Postman показаны два файла cookie. Взгляните на них. Даже в Chrome я получаю 403, так что это похоже на поведение по умолчанию при неаутентификации.

2. URL-адреса запросов разные, возможно, uri в вашем коде требует какой-либо формы аутентификации, в то время как в postman нет

3. @FreeBird кажется вероятным, что в файлах cookie хранятся данные авторизации / сеанса?

4. @Gavin да, я тоже так подозреваю.

5. Спасибо за ответ, ребята, файлы cookie были потому, что я сделал тот же запрос раньше без файлов cookie, а затем steam установил файлы cookie sessionid и steamCountry. Я использую настольное приложение Postman, а не плагин chrome, оно все еще каким-то образом связано?

Ответ №1:

Я почти уверен, что 2 файла cookie, которые у вас есть в postman, а не в коде Java, отвечают за получение ответа 403.

Postman — это плагин Google Chrome, поэтому при подключении к Chrome, возможно, вы сохранили в кэше файлы cookie.

Вам также необходимо добавить их в код Java.

Комментарии:

1. Итак, я добавил два файла cookie в запрос. Я обновил приведенный выше вопрос с его помощью. По-прежнему имеет тот же ответ. Я даже пытаюсь использовать тот же идентификатор сеанса, что и у postman. Также я знаю, как работает идентификатор сеанса, поскольку я использую его со своим торговым ботом steam, там этот метод вычисления идентификатора сеанса работает нормально.

2. Также добавлено изображение с файлами cookie. Спасибо за ответ.

Ответ №2:

Во-первых, спасибо за все ваши ответы и ответы.

Итак, я обнаружил, что инвентарь, к которому я пытался получить доступ, был установлен видимым только для друзей, поэтому ответ был 403. Таким образом, он работает для инвентаризаций, для которых установлено значение public.

Извините, я должен был сначала проверить это.

Чего я до сих пор не понимаю, так это как клиент postman desktop получил предполагаемый ответ? Я понимаю, что chrome смог получить инвентарь, потому что у меня активный вход в Steam с файлами cookie, которые были бы отправлены, но в запросе postman не было никаких файлов cookie, кроме идентификатора сеанса и страны. Если бы кто-нибудь мог объяснить, как это происходит, это действительно помогло бы мне.