Java HttpClient 请求返回 403 状态,而邮递员返回预期的响应

时间:2021-02-09 09:53:23

标签: java httpclient steam steambot

尝试向邮递员提出请求,并得到所需的答复。

用于发出相同请求的 java 代码如下失败,状态为 403。

String url = "https://steamcommunity.com/inventory/76561198865293952/440/2?l=english&count=5000";
String cookiesString = "sessionid=" + generateSessionId() + ";steamCountry=IN%7Ce744269b3c4e531facb33ecaff29eb44";

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);
}

邮递员请求根本不需要任何标头(甚至不需要用户代理,只保留主机,不需要 cookie)即可获得所需的响应。甚至在浏览器中导航到链接也会显示 json 响应。

PostMan request ScreenShot

Postman Request Image with cookies

谢谢。祝您有美好的一天。

2 个答案:

答案 0 :(得分:1)

我很确定您在邮递员中而不是在 java 代码中的 2 个 cookie 负责获得 403 响应。

Postman 是一个 google chrome 插件,因此当使用 chrome 连接时,也许您将 cookie 存储在缓存中。

您还需要将它们添加到 java 代码中。

答案 1 :(得分:0)

首先感谢您的回答和回复。

所以我发现我尝试访问的库存设置为仅对朋友可见,因此响应为 403。因此它适用于设置为公开的库存。

对不起,我应该先检查一下。

我仍然不明白的是邮递员桌面客户端是如何得到预期响应的?我知道 chrome 能够获取库存,因为我使用本应发送的 cookie 进行了活跃的 Steam 登录,但邮递员请求除了 sessionid 和 country 之外没有任何 cookie。如果有人能解释这是如何发生的,那真的对我有帮助。