0

我正在尝试使用 java 和 OkHttp 将声音上传到 myinstants.com。
我使用 Chrome 开发工具查看发出的请求并尝试使用 OkHttp 重新创建它们,但我在登录部分失败了。

Chrome 开发工具告诉我这是表单帖子,内容类型为 application/x-www-form-urlencoded。 在此处输入图像描述

我尝试使用以下代码复制帖子:

RequestBody loginBody = new FormBody.Builder()
        .add("csrfmiddlewaretoken", token) //this token is comes from inside the <input> tag that is retrieved in the HTML of a normal get request to https://myinstants.com/accounts/login and is diffrent every time you load the page
        .add("login", username)
        .add("password", password)
        .add("remember", "on")
        .add("next", "/new/")
        .build();

Request login = new Request.Builder()
        .url("https://www.myinstants.com/accounts/login/?next=/new/")
        .addHeader("cookie", CookieHandler.getCookie()) // cookie that is generated from the "set-cookie" response headers of the get request to https://myinstants.com/accounts/login
        .addHeader("content-type", "application/x-www-form-urlencoded")
        .post(loginBody)
        .build();

Response response = new OkHttpClient().newCall(login).execute();

根据 chrome 开发工具,上述 post 请求的响应应该有几个 set-cookie 响应标头,但它们对我来说不存在。
我不认为问题出在我正在使用的 cookie 上,因为与 chrome 开发工具中的内容进行比较时,cookie 完全匹配(除了您每次访问网站时的一些新内容),所以我认为问题在于表格帖子。任何想法我做错了什么?

4

2 回答 2

0

如果某些服务器看到您从浏览器外部发出请求,则它们会阻止这些请求。

通常有效(但并非总是)的方法是尝试欺骗服务器,使其认为您正在使用浏览器。您可以通过设置“User-Agent”标头来做到这一点。

为此,请打开浏览器的开发工具 (F12),访问“网络”选项卡并向任何站点发出请求。然后,查看“User-Agent”值的“Request Headers”部分。只需复制它并与您的请求一起发送即可。

如果这一切都失败了,则该站点可能具有基于 Javascript 的 bot 保护。在这种网站中,登录页面包含一个 javascript,该 javascript 在登录过程之前触发并生成一个随机令牌,您需要将其与凭据一起发送才能成功登录。由于您在没有浏览器的情况下访问,因此您无法运行 JavaScript,因此您无法生成此令牌。

如果是这种情况,您能做的最好的事情就是使用以编程方式控制的真实浏览器。对于 Java,您可以使用 Selenium,但我个人更喜欢使用来自 NodeJS 的 Puppeteer。从本质上讲,它们是相同的东西,一个用于远程控制修改版 chromium/chrome 浏览器的 API。

但是使用 Puppeteer 比使用 Java 更灵活,因为您不需要在 Java 和 Javsacritp 对象之间进行转换,反之亦然。

于 2021-03-24T12:39:06.027 回答
-1

我不知道可能出了什么问题,而且我现在没有时间测试您的代码。但作为建议,您可以尝试使用另一个库进行上传,看看它是否有效。

我推荐 Apache Fluent API: https ://mvnrepository.com/artifact/org.apache.httpcomponents/fluent-hc

于 2020-08-28T20:48:04.500 回答