From 6a3ab216724797b59c4c1fada742db63cd19d2a7 Mon Sep 17 00:00:00 2001 From: fnvtk Date: Mon, 18 May 2026 20:15:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0rawSql/getContactStat?= =?UTF-8?q?s/getContactsFull/getGroupsFull=E8=B0=83=E8=AF=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=2020260518?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdk/agent/hook/wechat_hook_v2.js | 77 ++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/sdk/agent/hook/wechat_hook_v2.js b/sdk/agent/hook/wechat_hook_v2.js index f5376676a0..43063ecfc5 100644 --- a/sdk/agent/hook/wechat_hook_v2.js +++ b/sdk/agent/hook/wechat_hook_v2.js @@ -1428,8 +1428,85 @@ rpc.exports = { } }, + // ==================== 调试/统计接口 ==================== + rawSql: function (params) { + var sql = (params && params.sql) || ''; + if (!sql) return { success: false, error: '缺少 sql 参数' }; + try { + return Java.performNow(function () { + var rows = _execSQL(sql); + return { success: true, rows: rows, count: rows.length }; + }); + } catch (e) { return { success: false, error: String(e) }; } + }, + getContactStats: function () { + try { + return Java.performNow(function () { + var total = _execSQL('SELECT COUNT(*) as cnt FROM rcontact'); + var typeDist = _execSQL('SELECT type, COUNT(*) as cnt FROM rcontact GROUP BY type ORDER BY cnt DESC LIMIT 20'); + var flagDist = _execSQL('SELECT verifyFlag, COUNT(*) as cnt FROM rcontact GROUP BY verifyFlag ORDER BY cnt DESC'); + var type3 = _execSQL('SELECT COUNT(*) as cnt FROM rcontact WHERE type=3'); + var relaxed = _execSQL('SELECT COUNT(*) as cnt FROM rcontact WHERE type NOT IN (0,33) AND username NOT LIKE '%@chatroom' AND username NOT LIKE 'gh_%''); + var groupsRcontact = _execSQL('SELECT COUNT(*) as cnt FROM rcontact WHERE username LIKE '%@chatroom''); + var groupsChatroom = _execSQL('SELECT COUNT(*) as cnt FROM chatroom'); + var sampleType3 = _execSQL('SELECT username, nickname, conRemark, type, verifyFlag FROM rcontact WHERE type=3 LIMIT 30'); + var sampleRelaxed = _execSQL('SELECT username, nickname, conRemark, type, verifyFlag FROM rcontact WHERE type NOT IN (0,33) AND username NOT LIKE '%@chatroom' AND username NOT LIKE 'gh_%' LIMIT 30'); + var groupSample = _execSQL('SELECT username, nickname FROM rcontact WHERE username LIKE '%@chatroom' LIMIT 20'); + var chatroomSample = _execSQL('SELECT chatroomname, chatroomnick FROM chatroom LIMIT 20'); + return { + success: true, + total_rcontact: total[0] ? total[0].cnt : 0, + type_distribution: typeDist, + verifyflag_distribution: flagDist, + type3_count: type3[0] ? type3[0].cnt : 0, + relaxed_count: relaxed[0] ? relaxed[0].cnt : 0, + groups_in_rcontact: groupsRcontact[0] ? groupsRcontact[0].cnt : 0, + groups_in_chatroom: groupsChatroom[0] ? groupsChatroom[0].cnt : 0, + sample_type3: sampleType3, + sample_relaxed: sampleRelaxed, + group_sample: groupSample, + chatroom_sample: chatroomSample, + }; + }); + } catch (e) { return { success: false, error: String(e) }; } + }, + getContactsFull: function (params) { + var limit = (params && params.limit) || 500; + var offset = (params && params.offset) || 0; + var filterType = (params && params.filter_type); + try { + return Java.performNow(function () { + var sql; + if (filterType !== undefined && filterType !== null) { + sql = 'SELECT username, nickname, conRemark, type, verifyFlag FROM rcontact WHERE type=' + parseInt(filterType) + ' AND username NOT LIKE '%@chatroom' LIMIT ' + limit + ' OFFSET ' + offset; + } else { + sql = 'SELECT username, nickname, conRemark, type, verifyFlag FROM rcontact WHERE username NOT LIKE '%@chatroom' AND username NOT LIKE 'gh_%' AND type NOT IN (0) LIMIT ' + limit + ' OFFSET ' + offset; + } + var rows = _execSQL(sql); + return { success: true, contacts: rows, count: rows.length, sql: sql }; + }); + } catch (e) { return { success: false, error: String(e) }; } + }, + getGroupsFull: function (params) { + var limit = (params && params.limit) || 500; + try { + return Java.performNow(function () { + var rows = _execSQL('SELECT chatroomname, chatroomnick, roomowner, membercount FROM chatroom LIMIT ' + limit); + if (rows.length > 0 && !rows[0].error) { + return { success: true, source: 'chatroom_table', groups: rows.map(function (r) { + return { group_id: r.chatroomname, name: r.chatroomnick || r.chatroomname, owner: r.roomowner, member_count: r.membercount }; + }), count: rows.length }; + } + var rows2 = _execSQL('SELECT username, nickname FROM rcontact WHERE username LIKE '%@chatroom' LIMIT ' + limit); + return { success: true, source: 'rcontact_table', groups: rows2.map(function (r) { + return { group_id: r.username, name: r.nickname }; + }), count: rows2.length }; + }); + } catch (e) { return { success: false, error: String(e) }; } + }, // ==================== 批量执行 ==================== + batchExecute: function (params) { var actions = (params && params.actions) || []; if (actions.length === 0) return { success: false, error: '缺少 actions' };