原理: 使用fiddler分析豆瓣登录和发表评论的http请求,然后在客户端构造相同的参数发起请求,通过模拟登录拿到cookies,然后再用cookies去发表评论,简直一气呵成
过程中碰到了验证码问题,接入第三方打码平台即可解决,实现自动循环发表评论
模拟登录获取cookies
找到豆瓣的登录页面:https://accounts.douban.com/login
输入自己的用户名 密码 然后查看抓包查看请求
抓包小提示:使用idea写的程序会发现里面的网络请求不会被fiddler抓到
另外https不设置证书也是不能抓到包的
参考:
http://jja1982.iteye.com/blog/796821
https://blog.csdn.net/wang704987562/article/details/54618498
然后在代码中设置
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyPort", "8888");
查看网络请求信息
这边使用okhttp来封装网络请求
实际中发现个问题,登录成功后会自动跳转到豆瓣首页,通过fiddler查看的话其实会发现有两个网络请求,但其实我们只需要一个就够了,不然第二个请求那里是拿不到cookies的,所以这边要禁止重定向
okHttpAccount = new OkHttpClient.Builder()
// 禁止重定向
.followRedirects(false)
.followSslRedirects(false)
// .cookieJar(new LocalCookieJar())
.build();
requestBody = new FormBody.Builder()
.add("source", "None")
.add("redir", "https://accounts.douban.com/login")
.add("form_email", "13000000000")
.add("form_password", "12356789")
.add("login", "登录")
.add("captcha-solution", captcha)
.add("captcha-id", captchaId)
Request request = new Request.Builder()
.url(loginAddress)
.post(requestBody)
.addHeader("User-Agent", User_Agent)
// .addHeader("Host", "accounts.douban.com")
// .addHeader("Origin", "https://www.douban.com")
// .addHeader("Content-Type", "application/x-www-form-urlencoded")
// .addHeader("Accept-Encoding", "gzip, deflate, br")
// .addHeader("Accept-Language", "zh-CN,zh;q=0.9")
// .addHeader("Cache-Control", "max-age=0")
// .addHeader("Connection", "keep-alive")
// .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
.build();
Response response = okHttpAccount.newCall(request).execute();
List<String> cookieList = response.headers("Set-Cookie");
StringBuffer stringBuffer = new StringBuffer();
for (String s : cookieList) {
stringBuffer.append(s);
}
String cookies = stringBuffer.toString();
这样就拿到cookies了
获取CK
事实上光有cookies还是不够的,在评论的时候其实还需要一个参数:ck
鬼知道什么参数,反正乖乖去拿就对了
只要用上一步拿到的cookies去访问豆瓣首页即可,记得把cookies设置进去
Request request = new Request.Builder()
.get()
.url("https://www.douban.com/")
.header("Cookie", cookies)
.build();
发表评论
打开一个小组页面,手工去发表一次评论,然后查看抓包信息
然后继续用okhttp构造请求
requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("ck", bean.getCk())
.addFormDataPart("rv_comment", content)
.addFormDataPart("start", "0")
.addFormDataPart("submit_btn", "发送")
.addFormDataPart("captcha-solution", captchaCode)
.addFormDataPart("captcha-id", captchaId)
.build();
Request request = new Request.Builder()
.url("https://www.douban.com/group/topic/" + groupId + "/add_comment")
.post(requestBody)
.addHeader("Cookie", bean.getCookies())
// 这边偷个懒,boundary是用来分隔参数用的一个标记,只要保证和参数不同就行了,可以用MD5生成
.addHeader("Content-Type", "boundary=----WebKitFormBoundaryk0k2SfcBeOex1BzG")
.build();
那么查看下效果
##最后用javafx搭建出UI框架收工
##后记-- 鞋湿了
当你这么做之后很快就会被发现
没错,常在河边走,被封号了
毕竟 我是个诚实的机器人,评论中已经暴露了身份