思路:

一波未平一波又起, 拿到这个需求的时候对我来说还是有挑战的,因为我之前并没有做过这种东西,不过我知道,实现这种需求所用的技术无非就是爬虫,爬虫我还是用过的,以前用JSOUP写过一个爬小说的程序,在我的博客园可以看到: 
https://www.cnblogs.com/yangchaojie/p/9203876.html

这次不同,想要在论坛发消息首先是要登录的,所以必须要一个账号,接着是让爬虫登录,这是最重要的一个步骤,登录后获取Cookie存储,在加好友发消息的时候都要用到Cookie。

在开发过程中,遇到了不少难题,比如一开始的FormHash参数,这个参数一开始不知道哪里获取,最后发现登录后在页面源代码中就有。

FormHash是发送加好友等请求必须的参数,所以在爬虫模拟登录后,进行爬取FormHash值,接着再请求加好友链接。

代码:

登录,获取Cookie:

  1. public static Map<String, String> getCookie(String username, String password, String domain) throws Exception {
  2. SslUtils.ignoreSsl();
  3. Connection conn = Jsoup.connect(Address.getLoginUrl(username, password, domain));
  4. conn.method(Connection.Method.GET);
  5. conn.followRedirects(false);
  6. Connection.Response response;
  7. response = conn.execute();
  8. System.err.println(response.body());
  9. return response.cookies();
  10. }

获取FormHash:

  1. public static String getFormHash(String domain) throws Exception {
  2. SslUtils.ignoreSsl();
  3. Connection conn = Jsoup.connect(Address.getFormHash(domain));
  4. conn.followRedirects(false);
  5. Connection.Response response = conn.execute();
  6. String HTMLRes = response.body();
  7. String hashStr = "formhash=";
  8. int hashIndex = HTMLRes.lastIndexOf(hashStr);
  9. for (Map.Entry<String, String> c : response.cookies().entrySet()) {
  10. logger.info("Cookie:" + c.getKey() + "|" + c.getValue());
  11. }
  12. System.err.println(response.body());
  13. return HTMLRes.substring(hashIndex + hashStr.length(), hashIndex + hashStr.length() + 8); //formhash为8个字节长度
  14. }

发送加好友请求并留言:

  1. /**
  2. * @param cookies
  3. * @param touId 用户ID
  4. * @param msg 留言
  5. * @param log 日志
  6. * @param domain 域名
  7. * @param formHash Hash值
  8. * @throws Exception
  9. */
  10. public static void hello(Map<String, String> cookies, String touId, String msg, TextArea log, String domain, String formHash) throws Exception {
  11. Platform.runLater(new Runnable() {
  12. @Override
  13. public void run() {
  14. try {
  15. log.appendText("HASH值获取:" + formHash + "\n");
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. });
  21. SslUtils.ignoreSsl();
  22. Connection conn = Jsoup.connect(Address.hello(touId, domain));
  23. for (Map.Entry<String, String> entry : cookies.entrySet()) {
  24. conn.cookie(entry.getKey(), entry.getValue());
  25. }
  26. conn.data("referer", Address.referer(touId, domain));
  27. conn.data("addsubmit", "true");
  28. conn.data("handlekey", String.format("a_friend_li_%S", touId));
  29. conn.data("formhash", formHash);
  30. conn.data("note", msg);
  31. conn.data("gid", "1");
  32. Platform.runLater(new Runnable() {
  33. @Override
  34. public void run() {
  35. log.appendText("开始发送:" + msg + "\t" + System.currentTimeMillis() + "\n");
  36. }
  37. });
  38. Document document = conn.post();
  39. Platform.runLater(new Runnable() {
  40. @Override
  41. public void run() {
  42. logger.info(document.text());
  43. if (document.text().contains("已发送") || document.text().contains("验证")) {
  44. log.appendText("已发送" + "\n");
  45. } else {
  46. log.appendText("发送失败!" + "\n");
  47. }
  48. // log.appendText(document.text());
  49. }
  50. });
  51. }

以上是这套流程的核心代码,最后将功能使用JavaFX展现:

完成。

弊端:

这个程序目前是可以实现功能的,但只能对某些防护较为薄弱的DZ论坛使用,而且如果登录遇到验证码,也是不行。

在GUI窗体中存在TextArea日志区运行久了会无法刷新出日志信息,这个问题暂时找不到答案,我也没时间研究这个,毕竟用JavaFX的不多。

Discuz论坛 自动加好友留言程序的更多相关文章

  1. jQuery自动加载更多程序

    1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据,这种方式加快了数据的加载速度,由 ...

  2. jQuery自动加载更多程序(转)

    jQuery自动加载更多程序   1.1.1 摘要 现在,我们经常使用的微博.微信或其他应用都有异步加载功能,简而言之,就是我们在刷微博或微信时,移动到界面的顶端或低端后程序通过异步的方式进行加载数据 ...

  3. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  4. Line云端全自动加好友机器人

    一个 LINE 帐号可以加入 5,000 名好友,让这些 5,000 名好友收到 LINE 的主动提醒,好友会看到我的头像.主页照片.姓名与状态消息等,这种行为称为 LINE 的曝光. 如果我们要针对 ...

  5. php spl_autoload_register 实现自动加载

    spl_autoload_register (PHP 5 >= 5.1.2, PHP 7) spl_autoload_register - 注册给定的函数作为 __autoload 的实现 语法 ...

  6. Web QQ自动强制加好友代码

    也许见过强行聊天的代码:  tencent://Message/?Uin=574201314&websiteName=www.oicqzone.com&Menu=yes 但是你应该不知 ...

  7. QQ自动强制加好友代码html

    鲜为人知的QQ自动强制加好友代码 是的,你也许见过强行聊天的代码: tencent://Message/?Uin=574201314&websiteName=www.oicqzone.com& ...

  8. [转]在BBB启动时自动加载dtbo(或执行脚本、运行程序)

    启动时自动加载dtbo,实际上就是做了一个cape.官方推荐的方法是用eeprom来实现,请参考我的博文<为BBB制作专属自己的cape(一)>和<为BBB制作专属自己的cape(四 ...

  9. Dockfile自动创建discuz论坛和可道云

    将discuz论坛的zip包解压之后用tar包压缩,这样ADD可以直接解压tar包. [root@localhost centos6.9_ssh_discuz]# pwd /opt/dockerfil ...

随机推荐

  1. 深度探索c++对象模型 第二章

    1,c++转换函数:显示转换和隐式转换. 隐式转换为程序员提供了很大的变量.比如整形提升,普通类型转换为类类型(operator int())都为程序带来无尽的方便.试想,如果没有整形提升,一个sho ...

  2. 使用docker部署zabbix

    1 官方地址 官方写的很详细并且是中文的,一步步按照操作就可以 https://www.zabbix.com/documentation/3.4/zh/manual/installation/cont ...

  3. C语言:正负数之间取模运算(转载)

    如果 % 两边的操作数都为正数,则结果为正数或零:如果 % 两边的操作数都是负数,则结果为负数或零.C99 以前,并没有规定如果操作数中有一方为负数,模除的结果会是什么.C99 规定,如果 % 左边的 ...

  4. javascript——原型与原型链

    一.prototype 在JavaScript中,每个函数都有一个prototype属性,这个属性指向函数的原型对象. 例如: function Person(age) { this.age = ag ...

  5. Java中字符串的一些常用操作方法

      package test; public class  maintest {public static void main(String[] args) {String str = "a ...

  6. HDU 3068:最长回文(Manacher算法)

    http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Problem Description   给出一个只由小写英文字符a,b,c...y,z组成的 ...

  7. U盘被写保护大全解

    相信大家的U盘在使用的过程中多或少都有出现过一些问题,写保护,程序写蹦而造成的逻辑错误,或者在使用过程中因电脑而中毒,内部零件损伤等等各种各样倒霉的错误. 简单了解一下是个什么东西吧.U盘写保护其实就 ...

  8. 对于Typora(markdown)的基本使用

    对于刚开始使用该软件,应该在熟悉基本的markdown语法的基础上,再进行快捷键的使用! 标题 (快捷键:ctrl + 数字) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 ###### ...

  9. Python重试模块retrying

    Python重试模块retrying 工作中经常碰到的问题就是,某个方法出现了异常,重试几次.循环重复一个方法是很常见的.比如爬虫中的获取代理,对获取失败的情况进行重试. 刚开始搜的几个博客讲的有点问 ...

  10. 什么是常量?变量? if语句介绍

    1.python 的历史 2004 年 Django 的产生 phyton2与 python3 的区别 Python2:源码不统一,有重复的代码功能 Python3:源码统一,没有有重复的代码功能 2 ...