前言:
在开发自动化填表工具时 易语言飓风队长等成熟模块只支持谷歌内核浏览器,却不支持火狐内核
而在实际项目中,很多客户指定使用火狐浏览器(特别是配合ADS指纹浏览器时),这就导致我们无法复用现有的易语言模块。 我就遇到了这个问题 导致单子没完成~~~
所以为了解决这个问题,我开发了 Firefox JS Executor —— 一个轻量级的工具(已打包为exe),让易语言/C++能够无缝调用火狐浏览器执行JS操作,实现自动化填表。
✨ 核心亮点
🔥 1. 自动穿透网页框架
火狐浏览器中很多页面都包含iframe框架,手动处理框架切换非常麻烦。本工具会自动枚举所有框架并执行JS,无论你的目标元素在哪个框架中,都能精准定位并操作。
🚀 2. 极简调用方式
只需要创建一个TCP服务器(端口19730),发送JSON文本即可执行JS,不需要任何复杂的组包拆包,直接明文传输:
{"type":"execute_js","js":"document.title"}
重点说明:本工具关注的是填表功能的实现,而不是网络安全。因为通信对象是本地的127.0.0.1,所以采用最简单的明文传输,没有任何加密和包头,方便各种语言调用。
🎯 3. 跨语言支持
-
易语言:直接用服务器组件发送文本
-
C++:用socket发送字符串
-
任何支持TCP的语言:只要连上19730端口,发送JSON即可
💻 4. 无感调用,隐藏窗口
已打包成exe,可直接静默运行,不显示任何窗口:
运行 (取运行目录 () + “\FirefoxAutoFill.exe”, 假, 1)
// C++调用示例
WinExec("FirefoxAutoFill.exe", SW_HIDE);
🔄 5. 多线程/多进程支持
可以同时启动多个exe客户端,对应多个不同的浏览器实例。每个客户端启动时会发送自己的进程ID(PID),调用端可以通过这个PID精准管理每个客户端。
命令详解
客户端启动时发送的注册信息
{
"type": "register",
"client_id": "a1b2c3d4",
"pid": 12345, // 进程ID,方便识别和管理
"timestamp": 1234567890
}
可发送的命令列表
| 命令类型 | 描述 | 必填参数 | 可选参数 |
|---|---|---|---|
config |
配置并连接浏览器 | geckodriver, port |
request_id |
execute_js |
执行JS代码 | js |
frameid, request_id |
get_frames |
获取所有框架信息 | 无 | request_id |
get_browser_info |
获取浏览器信息 | 无 | request_id |
reconnect |
重新连接其他浏览器 | geckodriver, port |
request_id |
ping |
心跳检测 | 无 | request_id |
disconnect |
断开连接 | 无 | request_id |
request_id 的灵活运用
request_id 字段可以自由发挥,推荐使用线程ID,方便在多线程环境下快速识别响应来自哪个线程:
{
"type": "execute_js",
"js": "return document.title",
"request_id": 1001 // 可以是线程ID、时间戳或自定义标识
}
客户端返回的响应会带上相同的 request_id:
{
"type": "response",
"client_id": "a1b2c3d4",
"pid": 12345, // 附带进程ID,方便识别是哪个客户端
"request_id": 1001, // 原样返回
"success": true,
"result": "百度一下"
}
易语言调用示例
.版本 2
.支持库 spec
.子程序 启动浏览器并执行JS
.局部变量 port, 文本型
.局部变量 线程ID, 整数型
' 启动exe客户端
运行 (取运行目录 () + “\FirefoxAutoFill.exe”, 假, 1)
程序_延时 (2000)
' 获取ADS浏览器端口
port = ads.启动指定浏览器 (“k1agclhy”)
程序_延时 (5000)
' 下发配置连接浏览器(明文传输,直接发送文本)
服务器1.发送数据 (客户, 子文本替换 (#常量2, “端口”, port, , , 真), )
程序_延时 (5000)
' 执行JS
服务器1.发送数据 (客户, 子文本替换 (#常量3, “js代码”, “!!document.querySelector(\” + #引号 + “#chat-submit-button\” + #引号 + “)”, , , 真), )'跳转到百度
//常量2的内容
{
"type": "config",
"geckodriver": "C:\\Users\\Administrator\\AppData\\Roaming\\adspower_global\\cwd_global\\flower_144\\geckodriver.exe",
"port": 端口,
"request_id": 123456
}
//常量3的内容
{
"type": "execute_js",
"js": "js代码",
"request_id": 123457
}
#include <winsock2.h>
#include <windows.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
// 发送JSON到本地的FirefoxAutoFill客户端
void SendJS(const char* jsCode, int requestId) {
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(19730);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sock, (sockaddr*)&server, sizeof(server));
// 直接发送JSON文本,不用任何包头
char cmd[512];
sprintf(cmd, "{\"type\":\"execute_js\",\"js\":\"%s\",\"request_id\":%d}", jsCode, requestId);
send(sock, cmd, strlen(cmd), 0);
// 接收响应
char buffer[4096] = {0};
recv(sock, buffer, sizeof(buffer), 0);
printf("收到: %s\n", buffer);
closesocket(sock);
WSACleanup();
}
int main() {
// 启动exe(隐藏窗口)
WinExec("FirefoxAutoFill.exe", SW_HIDE);
Sleep(2000);
// 执行JS
SendJS("document.title", 1001);
return 0;
}
💡 关于 geckodriver
配合ADS指纹浏览器使用时
ADS的API在启动浏览器时会直接返回geckodriver的完整路径,你只需要把这个路径填入config命令的geckodriver字段即可,无需额外下载配置。
如果不使用指纹浏览器
你需要自行下载geckodriver,下载地址:
-
选择版本:根据你的操作系统选择对应版本(Windows 64位下载win64.zip)
-
配置方法:将下载的geckodriver.exe放到任意目录,然后在config命令中填写完整路径即可
🛠 技术原理
-
基于Selenium + geckodriver 连接火狐浏览器(已打包为exe,无需Python环境)
-
枚举所有框架并执行JS
-
Socket通信(127.0.0.1:19730)接收指令
-
纯文本JSON传输,不组包不加密,简单到极致
-
进程ID + 请求ID双重标识,完美支持多线程
📦 使用步骤
-
将FirefoxAutoFill.exe放在程序目录
-
启动exe客户端
-
创建TCP连接到127.0.0.1:19730
-
直接发送JSON文本(不要加任何长度头或包头)
-
接收JSON响应(同样是不带包头的纯文本)
⚠️ 注意事项
-
不需要任何组包拆包,直接发JSON字符串即可
-
不需要考虑网络安全,因为是本地通信
-
exe文件不需要Python环境,直接运行
-
需要提前安装好geckodriver(ADS用户无需操心)
-
如果页面有多个框架,工具会自动处理,无需额外代码
-
多线程使用时,用request_id区分不同线程的响应
-
可以通过PID管理多个exe进程
🎁 写在最后
这个工具解决了我项目中火狐浏览器自动化的痛点,虽然功能简单(仅支持执行JS),但对于90%的填表需求完全够用。如果你也在为火狐浏览器自动化发愁,不妨试试这个方案。
设计理念就是:填表才是重点,通信越简单越好。所以采用了最直接的明文传输,任何语言只要会TCP发送字符串就能调用。
如果需要更加完善的填表支持(如元素ID查找、事件触发、文件上传、截图等复杂功能),可以找我开发定制版本。


![微博评论爬取回复接口C++源码[2026-03-06更新]-可达鸭小栈](https://www.ikdya.com/wp-content/uploads/2026/03/image-16.png)
![私有化部署源码[2026-03-07更新]-可达鸭小栈](https://www.ikdya.com/wp-content/uploads/2026/03/QQ20260309-160657-1024x655.png)


![计算抖音a_bogus的值 易语言源码[2026-02-28更新]-可达鸭小栈](https://www.ikdya.com/wp-content/uploads/2026/02/QQ20260228-152935.png)










暂无评论内容