152 lines
8.9 KiB
Python
152 lines
8.9 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
奥创 SDK 通信协议(客服通信接口总目录 · EnumMsgType 指令类 Task)↔ 工作手机 SDK action 覆盖矩阵。
|
||
|
||
目的:对照奥创 proto 的服务端→设备「指令类任务」(1070-1270),核对本 SDK 是否已具备
|
||
可下发的等价 action(ACTION_TO_RPC + ACTION_ALIASES catalog)。锁定真实缺口,禁止漏项。
|
||
|
||
用法: python3 sdk/scripts/aochuang_protocol_coverage.py [--md 输出.md]
|
||
真机铁律:本脚本仅做「能力覆盖」静态核对,不代表真机已验收。
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
import argparse
|
||
import re
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(__file__).resolve().parents[2]
|
||
HE = ROOT / "sdk/agent/hook/hook_executor.py"
|
||
|
||
# 奥创协议「服务端/PC → 设备」指令类任务枚举 → 本 SDK 期望 action(None = 缺口)
|
||
# 依据 资料/工作手机客服通信接口总目录(带通信协议)SDK.doc EnumMsgType
|
||
PROTO_TASKS: dict[str, tuple[str, str | None]] = {
|
||
"TalkToFriendTask(1070)": ("给好友发消息", "send_message"),
|
||
"PostSNSNewsTask(1071)": ("发朋友圈", "post_moments"),
|
||
"AddFriendsTask(1072)": ("主动添加好友", "add_friend"),
|
||
"DeleteSNSNewsTask(1074)": ("删除朋友圈", "delete_moments"),
|
||
"AcceptFriendAddRequestTask(1075)": ("接受好友请求", "accept_friend"),
|
||
"WeChatGroupSendTask(1076)": ("群发消息", "mass_send"),
|
||
"WeChatMaintenanceTask(1077)": ("养号任务", "start_nurture"),
|
||
"RequestTalkDetailTask(1078)": ("请求图片/视频详情", "get_message_raw_xml"),
|
||
"PullWeChatQrCodeTask(1079)": ("上传当前微信二维码", "generate_my_qr_code"),
|
||
"TriggerFriendPushTask(1080)": ("推送好友列表", "get_contacts"),
|
||
"TriggerCirclePushTask(1081)": ("推送朋友圈列表", "get_moments"),
|
||
"CircleCommentDeleteTask(1082)": ("朋友圈评论删除", "delete_moment_comment"),
|
||
"CircleCommentReplyTask(1084)": ("朋友圈评论回复", "reply_moment_comment"),
|
||
"TriggerMessageReadTask(1086)": ("聊天窗口置已读", "mark_conversation_read"),
|
||
"RevokeMessageTask(1087)": ("消息撤回", "revoke_message"),
|
||
"ForwardMessageTask(1088)": ("转发消息", "forward_message"),
|
||
"TriggerHistoryMsgPushTask(1089)": ("推送历史聊天记录", "get_recent_messages"),
|
||
"PullChatRoomQrCodeTask(1090)": ("获取群二维码", "generate_group_qr_code"),
|
||
"SendMultiPictureTask(1091)": ("发送多张图片", "send_multi_image"),
|
||
"ForwardMultiMessageTask(1092)": ("转发多条消息", "forward_multiple"),
|
||
"PostFriendDetectTask(1095)": ("清粉任务", "detect_zombie_fans"),
|
||
"PostStopFriendDetectTask(1096)": ("终止清粉", "stop_detect_zombie_fans"),
|
||
"PostMomentsPraiseTask(1098)": ("朋友圈点赞", "like_moments"),
|
||
"PostStopMomentsPraiseTask(1099)": ("停止朋友圈点赞", "stop_moments_praise"),
|
||
"PostStopWeChatMaintenanceTask(1100)": ("养号停止", "stop_nurture"),
|
||
"ModifyFriendMemoTask(1101)": ("修改备注", "set_friend_remark"),
|
||
"AddFriendWithSceneTask(1102)": ("场景加好友", "add_friend_with_scene"),
|
||
"TakeLuckyMoneyTask(1200)": ("领取红包/转账", "receive_red_packet"),
|
||
"PullFriendCircleTask(1201)": ("获取指定好友朋友圈", "get_friend_moments"),
|
||
"PullCircleDetailTask(1202)": ("获取朋友圈图片", "get_moment_detail"),
|
||
"CircleLikeTask(1203)": ("单条朋友圈点赞", "like_moments"),
|
||
"TriggerChatroomPushTask(1210)": ("推送群聊列表", "get_groups"),
|
||
"RequestChatRoomInfoTask(1211)": ("群聊详情", "get_group_info"),
|
||
"RequestContactsInfoTask(1212)": ("联系人详情", "get_contact_info"),
|
||
"ChatRoomActionTask(1213)": ("群聊管理", "set_group_name"),
|
||
"AddFriendInChatRoomTask(1214)": ("群内加好友", "add_friend_in_room"),
|
||
"AddFriendFromPhonebookTask(1215)": ("通讯录加好友", "add_friend_from_phonebook"),
|
||
"DeleteFriendTask(1216)": ("删除好友", "delete_friend"),
|
||
"SendLuckyMoneyTask(1217)": ("发红包", "send_red_packet"),
|
||
"RequestTalkContentTask(1218)": ("获取消息原始xml", "get_message_raw_xml"),
|
||
"ForwardMessageByContentTask(1220)": ("转发消息内容", "forward_message"),
|
||
"ChatRoomInviteApproveTask(1221)": ("群主确认入群申请", "approve_group_invite"),
|
||
"WechatLogoutTask(1222)": ("微信登出", "logout"),
|
||
"PhoneActionTask(1223)": ("手机操作(重启等)", "phone_action"),
|
||
"ContactLabelTask(1224)": ("设置联系人标签", "set_contact_label"),
|
||
"ContactLabelDeleteTask(1225)": ("删除联系人标签", "delete_label"),
|
||
"VoiceTransTextTask(1226)": ("语音转文字", "voice_to_text"),
|
||
"FindContactTask(1227)": ("查找微信联系人", "search_contacts"),
|
||
"AgreeJoinChatRoomTask(1229)": ("同意加入群聊", "agree_join_group"),
|
||
"ClearAllChatMsgTask(1230)": ("清空聊天记录", "clear_chat_history"),
|
||
"SendFriendVerifyTask(1231)": ("聊天界面发送朋友验证", "send_friend_verify"),
|
||
"TriggerConversationPushTask(1232)": ("会话列表推送", "get_conversations"),
|
||
"WechatSettingTask(1233)": ("微信设置(昵称/头像)", "set_nickname"),
|
||
"PullFriendAddReqListTask(1234)": ("加好友请求列表", "get_friend_requests"),
|
||
"TriggerBizContactPushTask(1235)": ("公众号列表", "get_official_accounts"),
|
||
"AddFriendNameCardTask(1236)": ("名片加好友", "add_friend_by_card"),
|
||
"TriggerChatMsgIdsPushTask(1251)": ("时间段内 msgSvrId", "get_msg_ids_by_time"),
|
||
"RequestTalkMsgTask(1252)": ("按 msgSvrId 取消息", "get_message_by_id"),
|
||
"SearchBizContactTask(1254)": ("搜索公众号/小程序", "search_official_account"),
|
||
"PhoneStateTask(1256)": ("手机状态(电量/存储)", "get_device_info"),
|
||
"WeChatLocationTask(1258)": ("微信查手机位置", "get_wechat_location"),
|
||
"RemittanceTask(1260)": ("转账", "send_transfer"),
|
||
"WalletBalanceTask(1262)": ("钱包余额", "get_wallet_balance"),
|
||
"QueryHbDetailTask(1265)": ("查询红包详情", "query_red_packet"),
|
||
"JoinGroupByQrTask(1267)": ("扫二维码进群", "join_group_by_qr"),
|
||
"SendJielongTask(1268)": ("发接龙消息", "send_jielong"),
|
||
"ContactSetLabelTask(1270)": ("设置用户标签", "set_contact_label"),
|
||
"WechatLogoutTask(cmd)": ("账号登出命令", "logout"),
|
||
"PhoneActionTask(cmd-reboot)": ("重启手机等命令", "phone_action"),
|
||
"UpgradeDeviceAppNotice(cmd)": ("软件升级通知", "check_for_update"),
|
||
}
|
||
|
||
|
||
def load_sdk_catalog() -> set[str]:
|
||
text = HE.read_text(encoding="utf-8", errors="ignore")
|
||
a = text.split("ACTION_TO_RPC:", 1)[1].split("ACTION_ALIASES:", 1)[0]
|
||
b = text.split("ACTION_ALIASES:", 1)[1].split("\n\n", 1)[0]
|
||
rpc = set(re.findall(r'"([a-z_]+)"\s*:', a))
|
||
alias = set(re.findall(r'"([a-z_]+)"\s*:', b))
|
||
return rpc | alias
|
||
|
||
|
||
def main() -> int:
|
||
ap = argparse.ArgumentParser()
|
||
ap.add_argument("--md", default="")
|
||
args = ap.parse_args()
|
||
|
||
catalog = load_sdk_catalog()
|
||
covered, gaps = [], []
|
||
for task, (cn, action) in PROTO_TASKS.items():
|
||
if action and action in catalog:
|
||
covered.append((task, cn, action))
|
||
elif action and action not in catalog:
|
||
gaps.append((task, cn, f"{action}(映射缺失)"))
|
||
else:
|
||
gaps.append((task, cn, "无对应 action"))
|
||
|
||
total = len(PROTO_TASKS)
|
||
lines = [
|
||
"# 奥创协议 ↔ 工作手机 SDK action 覆盖矩阵",
|
||
"",
|
||
f"> 真源:`资料/工作手机客服通信接口总目录(带通信协议)SDK.doc` · 自动生成 `sdk/scripts/aochuang_protocol_coverage.py`",
|
||
f"> 指令类任务 **{total}** 项 · 已覆盖 **{len(covered)}** · 缺口 **{len(gaps)}** · 覆盖率 **{len(covered)*100//total}%**",
|
||
"> 真机铁律:覆盖=能力映射就绪;真机 E2E 另见验收清单,禁止无证据标功能 ✅",
|
||
"",
|
||
"## 一、已覆盖",
|
||
"",
|
||
"| 协议任务 | 中文 | SDK action |",
|
||
"|:---|:---|:---|",
|
||
]
|
||
for t, cn, a in covered:
|
||
lines.append(f"| {t} | {cn} | `{a}` |")
|
||
lines += ["", "## 二、缺口(待补 action)", "", "| 协议任务 | 中文 | 现状 |", "|:---|:---|:---|"]
|
||
for t, cn, a in gaps:
|
||
lines.append(f"| {t} | {cn} | {a} |")
|
||
|
||
md = "\n".join(lines) + "\n"
|
||
if args.md:
|
||
Path(args.md).write_text(md, encoding="utf-8")
|
||
print(f"已写入 {args.md}")
|
||
print(f"覆盖 {len(covered)}/{total} · 缺口 {len(gaps)}")
|
||
for t, cn, _ in gaps:
|
||
print(f" GAP {t} {cn}")
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|