使用n8n构建自动化哈希解密机器人

前言

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

image-20250718144946214

新规定说白了就是除非充值最高金额,否则你的api只能使用10天,对新规定笔者不得已重新设计解密机器人实现方案.

经过一系列的测试,笔者最终决定使用如下方案实现.该方案优点是完全可以私有化部署

消息监听 使用青龙面板的定时任务功能,设置固定时间拉取wx消息(此方式效率较慢,可使用其他方式代替)
数据处理 使用n8n工作流实现消息的接收和网站的自动化登录,查询功能.最后通过wx框架将结果推送给用户
WxPad wx08算法框架,主要提供消息轮询和消息推送等接口
Redis 主要用来维护执行工作流时产生的页面状态等临时数据

方案实现

注: 该文章只作为一个设计方案参考,具体的工作流文件和框架不会提供.

为方便理解,先从Wxpad开始.至于什么是Wxpad可以这么理解.某些大手子把wx的ipad,pc,移动端等通讯协议进行了逆向并封装成了api接口,这样我们就可以通过调用api接口的方式实现操作wx的目的.下面是该框架搭建起来大致的样子(不同版本会有些许的不同)

image-20250718151859510

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

image-20250718151956354

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

image-20250718152652331

image-20250718152710648

其中消息轮询支持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地址.后面会讲到

image-20250718153024159

笔者这里设置的是每3秒轮询一次消息

下面来看n8n的工作流实现

image-20250718153902127

笔者这里使用了两个工作流来实现

其中xxx解密是主工作流.负责参数接收,登录,查询,结果提取和消息推送功能

解析页面存储隐藏表单故名思意就是用来解析响应内容并提取和存储__VIEWSTATE等页面状态内容

先来看下整个主工作流流程图

image-20250718154333098

辅工作流

image-20250718160803140

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

数据接收部分

image-20250718154601742

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

image-20250718154849116

网站操作逻辑部分

image-20250718155029414

此部分主要涵盖了登录,查询,验证码识别.这里有几个需要注意的地方.

一是要保证页面状态信息(__VIEWSTATE等)的更新,否则会导致请求失败.解决方式就是每操作一步后调用子工作流进行表单同步

二是在使用http发送请求时尽量使用JSON原始格式.笔者在测试时发现网站会校验某些字段,字段很多不好排查所以直接写死

image-20250718155636475

最后就是验证码识别,笔者这里使用的ddddocr-api,直接调用api即可

数据提取和推送部分

image-20250718160000407

这部分没什么需要特别注意的.注意查询结果的分支处理即可

效果

整体实现效果就是只需给机器人发送需要解密的哈希,之后等待解析结果即可

image-20250718160518546

最后

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

散会!