140 lines
4.1 KiB
JavaScript
140 lines
4.1 KiB
JavaScript
/**
|
||
* QQ经典农场 挂机脚本 - 入口文件
|
||
*
|
||
* 模块结构:
|
||
* src/config.js - 配置常量与枚举
|
||
* src/utils.js - 通用工具函数
|
||
* src/proto.js - Protobuf 加载与类型管理
|
||
* src/core/ - 核心逻辑 (FarmBot, Network, FarmManager, FriendManager)
|
||
* src/decode.js - PB解码/验证工具模式
|
||
*/
|
||
|
||
const { CONFIG } = require('./src/config');
|
||
const { loadProto } = require('./src/proto');
|
||
const { FarmBot } = require('./src/core/FarmBot');
|
||
const { verifyMode, decodeMode } = require('./src/decode');
|
||
const { emitRuntimeHint, sleep } = require('./src/utils');
|
||
|
||
// ============ 帮助信息 ============
|
||
function showHelp() {
|
||
console.log(`
|
||
QQ经典农场 挂机脚本 (重构版)
|
||
====================
|
||
|
||
用法:
|
||
node client.js --code <登录code> [--wx] [--interval <秒>] [--friend-interval <秒>]
|
||
node client.js --verify
|
||
node client.js --decode <数据> [--hex] [--gate] [--type <消息类型>]
|
||
|
||
参数:
|
||
--code 小程序 login() 返回的临时凭证 (必需)
|
||
--wx 使用微信登录 (默认为QQ小程序)
|
||
--interval 自己农场巡查完成后等待秒数, 默认10秒, 最低10秒
|
||
--friend-interval 好友巡查完成后等待秒数, 默认1秒, 最低1秒
|
||
--verify 验证proto定义
|
||
--decode 解码PB数据 (运行 --decode 无参数查看详细帮助)
|
||
|
||
功能:
|
||
- 自动收获成熟作物 → 购买种子 → 种植 → 施肥
|
||
- 自动除草、除虫、浇水
|
||
- 自动铲除枯死作物
|
||
- 自动巡查好友农场: 帮忙浇水/除草/除虫 + 偷菜
|
||
- 自动领取任务奖励 (支持分享翻倍)
|
||
- 每分钟自动出售仓库果实
|
||
- 启动时读取 share.txt 处理邀请码 (仅微信)
|
||
- 心跳保活
|
||
`);
|
||
}
|
||
|
||
// ============ 参数解析 ============
|
||
function parseArgs(args) {
|
||
const options = {
|
||
code: '',
|
||
deleteAccountMode: false,
|
||
name: '',
|
||
certId: '',
|
||
certType: 0,
|
||
};
|
||
|
||
for (let i = 0; i < args.length; i++) {
|
||
if (args[i] === '--code' && args[i + 1]) {
|
||
options.code = args[++i];
|
||
}
|
||
if (args[i] === '--wx') {
|
||
CONFIG.platform = 'wx';
|
||
}
|
||
if (args[i] === '--interval' && args[i + 1]) {
|
||
const sec = parseInt(args[++i]);
|
||
CONFIG.farmCheckInterval = Math.max(sec, 1) * 1000;
|
||
}
|
||
if (args[i] === '--friend-interval' && args[i + 1]) {
|
||
const sec = parseInt(args[++i]);
|
||
CONFIG.friendCheckInterval = Math.max(sec, 1) * 1000; // 最低1秒
|
||
}
|
||
}
|
||
return options;
|
||
}
|
||
|
||
// ============ 主函数 ============
|
||
async function main() {
|
||
const args = process.argv.slice(2);
|
||
|
||
// 加载 proto 定义
|
||
await loadProto();
|
||
|
||
// 验证模式
|
||
if (args.includes('--verify')) {
|
||
await verifyMode();
|
||
return;
|
||
}
|
||
|
||
// 解码模式
|
||
if (args.includes('--decode')) {
|
||
await decodeMode(args);
|
||
return;
|
||
}
|
||
|
||
// 正常运行模式
|
||
const options = parseArgs(args);
|
||
|
||
if (!options.code) {
|
||
showHelp();
|
||
return;
|
||
}
|
||
|
||
// 更新 CONFIG 中的 code (注意: FarmBot 构造函数会合并 CONFIG 和传入的 config)
|
||
// 这里我们可以直接修改全局 CONFIG,或者传入 options
|
||
// 为了兼容旧代码习惯,我们修改全局 CONFIG
|
||
// 但 FarmBot 建议传入 config
|
||
const botConfig = {
|
||
code: options.code,
|
||
// 其他参数已通过 modify global CONFIG 生效,或者也可以显式传入
|
||
};
|
||
|
||
console.log('正在启动 FarmBot...');
|
||
const bot = new FarmBot(botConfig);
|
||
|
||
// 优雅退出
|
||
process.on('SIGINT', () => {
|
||
console.log('\n正在停止...');
|
||
bot.stop();
|
||
process.exit(0);
|
||
});
|
||
|
||
try {
|
||
await bot.start();
|
||
|
||
// 保持进程运行 (如果 start() 返回后没有挂起的操作)
|
||
// FarmBot 内部启动了 interval,所以进程应该会保持运行
|
||
|
||
} catch (error) {
|
||
console.error('Bot 运行出错:', error);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
main().catch(err => {
|
||
console.error('未捕获的异常:', err);
|
||
process.exit(1);
|
||
});
|