使用Java将声音上传到myinstants.com

问题描述

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

Chrome开发者工具告诉我这是表单发布,内容类型为application / x-www-form-urlencoded。

enter image description here

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

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 dev工具,上述发布请求的响应应具有几个set-cookie响应标头,但对我来说不存在。
我认为问题不在于我使用的Cookie,因为与chrome开发工具中的Cookie进行比较时,该Cookie完全符合要求(每次访问该网站时都有一些新事物除外),因此我认为问题出在表格发布上。有什么想法我做错了吗?

解决方法

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

通常(但并非总是如此)是尝试欺骗服务器让您认为您正在使用浏览器。您可以通过设置“User-Agent”标题来做到这一点。

为此,请打开浏览器的开发工具 (F12),访问“网络”选项卡并向任何站点发出请求。然后,查看“用户代理”值的“请求标头”部分。只需将其复制并与您的请求一起发送即可。

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

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

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

,

我不知道可能是什么问题,现在没有时间测试您的代码。但是建议,您可以尝试使用另一个库进行上传,然后查看是否可以正常运行。

我建议使用Apache Fluent API: https://mvnrepository.com/artifact/org.apache.httpcomponents/fluent-hc