Discuz论坛 自动加好友留言程序
思路:
一波未平一波又起, 拿到这个需求的时候对我来说还是有挑战的,因为我之前并没有做过这种东西,不过我知道,实现这种需求所用的技术无非就是爬虫,爬虫我还是用过的,以前用JSOUP写过一个爬小说的程序,在我的博客园可以看到:
https://www.cnblogs.com/yangchaojie/p/9203876.html
这次不同,想要在论坛发消息首先是要登录的,所以必须要一个账号,接着是让爬虫登录,这是最重要的一个步骤,登录后获取Cookie存储,在加好友发消息的时候都要用到Cookie。
在开发过程中,遇到了不少难题,比如一开始的FormHash参数,这个参数一开始不知道哪里获取,最后发现登录后在页面源代码中就有。

FormHash是发送加好友等请求必须的参数,所以在爬虫模拟登录后,进行爬取FormHash值,接着再请求加好友链接。
代码:
登录,获取Cookie:
public static Map<String, String> getCookie(String username, String password, String domain) throws Exception {
SslUtils.ignoreSsl();
Connection conn = Jsoup.connect(Address.getLoginUrl(username, password, domain));
conn.method(Connection.Method.GET);
conn.followRedirects(false);
Connection.Response response;
response = conn.execute();
System.err.println(response.body());
return response.cookies();
}
获取FormHash:
public static String getFormHash(String domain) throws Exception {
SslUtils.ignoreSsl();
Connection conn = Jsoup.connect(Address.getFormHash(domain));
conn.followRedirects(false);
Connection.Response response = conn.execute();
String HTMLRes = response.body();
String hashStr = "formhash=";
int hashIndex = HTMLRes.lastIndexOf(hashStr);
for (Map.Entry<String, String> c : response.cookies().entrySet()) {
logger.info("Cookie:" + c.getKey() + "|" + c.getValue());
}
System.err.println(response.body());
return HTMLRes.substring(hashIndex + hashStr.length(), hashIndex + hashStr.length() + 8); //formhash为8个字节长度
}
发送加好友请求并留言:
/**
* @param cookies
* @param touId 用户ID
* @param msg 留言
* @param log 日志
* @param domain 域名
* @param formHash Hash值
* @throws Exception
*/
public static void hello(Map<String, String> cookies, String touId, String msg, TextArea log, String domain, String formHash) throws Exception {
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
log.appendText("HASH值获取:" + formHash + "\n");
} catch (Exception e) {
e.printStackTrace();
}
}
});
SslUtils.ignoreSsl();
Connection conn = Jsoup.connect(Address.hello(touId, domain));
for (Map.Entry<String, String> entry : cookies.entrySet()) {
conn.cookie(entry.getKey(), entry.getValue());
}
conn.data("referer", Address.referer(touId, domain));
conn.data("addsubmit", "true");
conn.data("handlekey", String.format("a_friend_li_%S", touId));
conn.data("formhash", formHash);
conn.data("note", msg);
conn.data("gid", "1");
Platform.runLater(new Runnable() {
@Override
public void run() {
log.appendText("开始发送:" + msg + "\t" + System.currentTimeMillis() + "\n");
}
});
Document document = conn.post();
Platform.runLater(new Runnable() {
@Override
public void run() {
logger.info(document.text());
if (document.text().contains("已发送") || document.text().contains("验证")) {
log.appendText("已发送" + "\n");
} else {
log.appendText("发送失败!" + "\n");
}
// log.appendText(document.text());
}
});
}
以上是这套流程的核心代码,最后将功能使用JavaFX展现:

完成。
弊端:
这个程序目前是可以实现功能的,但只能对某些防护较为薄弱的DZ论坛使用,而且如果登录遇到验证码,也是不行。
在GUI窗体中存在TextArea日志区运行久了会无法刷新出日志信息,这个问题暂时找不到答案,我也没时间研究这个,毕竟用JavaFX的不多。
Discuz论坛 自动加好友留言程序的更多相关文章
- jQuery自动加载更多程序
1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据,这种方式加快了数据的加载速度,由 ...
- jQuery自动加载更多程序(转)
jQuery自动加载更多程序 1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据 ...
- centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课
centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数 ...
- Line云端全自动加好友机器人
一个 LINE 帐号可以加入 5,000 名好友,让这些 5,000 名好友收到 LINE 的主动提醒,好友会看到我的头像.主页照片.姓名与状态消息等,这种行为称为 LINE 的曝光. 如果我们要针对 ...
- php spl_autoload_register 实现自动加载
spl_autoload_register (PHP 5 >= 5.1.2, PHP 7) spl_autoload_register - 注册给定的函数作为 __autoload 的实现 语法 ...
- Web QQ自动强制加好友代码
也许见过强行聊天的代码: tencent://Message/?Uin=574201314&websiteName=www.oicqzone.com&Menu=yes 但是你应该不知 ...
- QQ自动强制加好友代码html
鲜为人知的QQ自动强制加好友代码 是的,你也许见过强行聊天的代码: tencent://Message/?Uin=574201314&websiteName=www.oicqzone.com& ...
- [转]在BBB启动时自动加载dtbo(或执行脚本、运行程序)
启动时自动加载dtbo,实际上就是做了一个cape.官方推荐的方法是用eeprom来实现,请参考我的博文<为BBB制作专属自己的cape(一)>和<为BBB制作专属自己的cape(四 ...
- Dockfile自动创建discuz论坛和可道云
将discuz论坛的zip包解压之后用tar包压缩,这样ADD可以直接解压tar包. [root@localhost centos6.9_ssh_discuz]# pwd /opt/dockerfil ...
随机推荐
- POJ 2728:Desert King(最优比率生成树)
http://poj.org/problem?id=2728 题意:有n个点,有三个属性代表每个点在平面上的位置,和它的高度.点与点之间有一个花费:两点的高度差:还有一个长度:两点的距离.现在要让你在 ...
- easyui 使用jquery动态添加组件样式问题
可以使用$.parser.parse();这个方法进行处理: 例如: $.parser.parse(); 表示对整个页面重新渲染,渲染完就可以看到easyui原来的样式了: var targe ...
- Java学习笔记之---流程控制语句
Java学习笔记之---流程控制语句 (一)循环语句 (1)if语句 if(布尔表达式){ //如果布尔表达式为true将执行的语句 } if(i%2!=0){ System.out.println( ...
- 管Q某犇借的对拍
#include<iostream> #include<windows.h> using namespace std; int main() { while(1) { syst ...
- shell_链接命令ln与nohup命令使用方法
ln命令是一个链接命令,工作中用的比较多的就是对一个文件或者是目录建立起软连接.软连接的概念类似于windows下的快捷方式.比如,在win下,我们经常在安装完word.ppt等office程序后,在 ...
- <float.h>中DBL_TRUE_MIN的定义和作用
搬运自己2016年11月22日于SegmentFault发表的文章.链接:https://segmentfault.com/a/1190000007565915 在学习C Prime Plus的过程中 ...
- 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程
本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...
- 关于RedirectAttributes 重定向带参数请求问题
@RequestMapping("/delete") public String delete(String id, RedirectAttributes redirectAttr ...
- php 自己封装一个调用第三方接口的函数
①在php.ini中开启php_curl扩展(必须开启) ②建议在php.ini中开启php_openssl扩展(本身不是curl必须的,是调用一些第三方接口需要的 ③如果以上操作重启apache后, ...
- Java创建线程的两个方法
Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...