前言
在前段时间某哈希解密大站更新了他们的付费API使用规则,更新的说明如下

新规定说白了就是除非充值最高金额,否则你的api只能使用10天,对新规定笔者不得已重新设计解密机器人实现方案.
经过一系列的测试,笔者最终决定使用如下方案实现.该方案优点是完全可以私有化部署
消息监听 |
使用青龙面板的定时任务功能,设置固定时间拉取wx消息(此方式效率较慢,可使用其他方式代替) |
数据处理 |
使用n8n工作流实现消息的接收和网站的自动化登录,查询功能.最后通过wx框架将结果推送给用户 |
WxPad |
wx08算法框架,主要提供消息轮询和消息推送等接口 |
Redis |
主要用来维护执行工作流时产生的页面状态等临时数据 |
方案实现
注: 该文章只作为一个设计方案参考,具体的工作流文件和框架不会提供.
为方便理解,先从Wxpad开始.至于什么是Wxpad可以这么理解.某些大手子把wx的ipad,pc,移动端等通讯协议进行了逆向并封装成了api接口,这样我们就可以通过调用api接口的方式实现操作wx的目的.下面是该框架搭建起来大致的样子(不同版本会有些许的不同)

框架中提供了各种各样的接口,可根据实际需要进行调用

这里我们主要用到两个接口一个消息轮询,一个文本消息发送


其中消息轮询支持http和ws两种协议,笔者这里使用的为http方式
下面来看青龙面板的定时任务(关于如何青龙面板如何使用可自行百度)
我们需要写一个python或者nodejs脚本实现定时的去请求wxpad消息轮询接口,来抓取最新的消息
笔者这里使用python实现,hash_bot.py
关键代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| SYNC_MSG_URL = f"http://192.168.0.5:8848/message/HttpSyncMsg?key={API_KEY}" SELF_HOSTED_API_URL = "http://192.168.0.5:5678/webhook/727d2c8e-b1a9-46e3-baee-2e76183f3319"
def send_message(to_user, content): print(f"Sending message to {to_user}: {content}") payload = { "MsgItem": [ { "AtWxIDList": [], "ImageContent": "", "MsgType": 0, "TextContent": content, "ToUserName": to_user } ] } try: response = requests.post(SEND_MSG_URL, json=payload) return response.status_code == 200 except Exception as e: print(f"Error sending message: {e}") return False
def process_hash(hash_value, touser): """ 提交哈希值和用户信息到工作流,无需处理响应 """ payload = {'hash': hash_value, 'touser': touser} try: requests.post(SELF_HOSTED_API_URL, data=payload) except requests.RequestException as e: print(f"请求工作流时发生错误: {e}") return f"提交哈希值时发生错误: {e}" except Exception as e: print(f"提交哈希值时发生未知错误: {e}") return f"提交哈希值时发生未知错误: SYNC_MSG_URL = f"http://192.168.0.5:8848/message/HttpSyncMsg?key={API_KEY}" SELF_HOSTED_API_URL = "http://192.168.0.5:5678/webhook/727d2c8e-b1a9-46e3-baee-2e76183f3319"
def send_message(to_user, content): print(f"Sending message to {to_user}: {content}") payload = { "MsgItem": [ { "AtWxIDList": [], "ImageContent": "", "MsgType": 0, "TextContent": content, "ToUserName": to_user } ] } try: response = requests.post(SEND_MSG_URL, json=payload) return response.status_code == 200 except Exception as e: print(f"Error sending message: {e}") return False
def process_hash(hash_value, touser): """ 提交哈希值和用户信息到工作流,无需处理响应 """ payload = {'hash': hash_value, 'touser': touser} try: requests.post(SELF_HOSTED_API_URL, data=payload) except requests.RequestException as e: print(f"请求工作流时发生错误: {e}") return f"提交哈希值时发生错误: {e}" except Exception as e: print(f"提交哈希值时发生未知错误: {e}") return f"提交哈希值时发生未知错误: {e}"
|
SELF_HOSTED_API_URL
为n8n工作流发布出来的webhook地址.后面会讲到

笔者这里设置的是每3秒轮询一次消息
下面来看n8n的工作流实现

笔者这里使用了两个工作流来实现
其中xxx解密
是主工作流.负责参数接收,登录,查询,结果提取和消息推送功能
解析页面存储隐藏表单
故名思意就是用来解析响应内容并提取和存储__VIEWSTATE
等页面状态内容
先来看下整个主工作流流程图

辅工作流

整个工作流大约用了50个节点实现,下面说几个关键的地方
数据接收部分

前面提到的webhook地址
就由webhook
触发器提供

网站操作逻辑部分

此部分主要涵盖了登录,查询,验证码识别.这里有几个需要注意的地方.
一是要保证页面状态信息(__VIEWSTATE
等)的更新,否则会导致请求失败.解决方式就是每操作一步后调用子工作流进行表单同步
二是在使用http发送请求时尽量使用JSON
原始格式.笔者在测试时发现网站会校验某些字段,字段很多不好排查所以直接写死

最后就是验证码识别,笔者这里使用的ddddocr-api
,直接调用api即可
数据提取和推送部分

这部分没什么需要特别注意的.注意查询结果的分支处理即可
效果
整体实现效果就是只需给机器人发送需要解密的哈希,之后等待解析结果即可

最后
文章中涉及的所有内容均为笔者个人使用,未提供公开代查等情况.如果某站工作人员看到,还望手下留情.
散会!