--- name: wechat-image-sender description: 通过微信系统分享(ACTION_SEND)发送图片给指定联系人 version: 1.0 category: communication --- # WeChat Image Sender 使用 Android 系统分享机制 (ACTION_SEND) 将图片发送给微信指定联系人。 ## When to Use - 需要发送图片给微信联系人 - 自动化发送截图、信息图、报告图片 - 任何需要通过微信发送图片文件的场景 ## Prerequisites - Android 设备已 root - WeChat 已安装且登录 - 目标联系人在微信中可搜索 ## 核心方法: System Share (ACTION_SEND) — ReAct 流程 ### 完整 ReAct 流程 (已验证 2026-06-23) **Step 1: 触发系统分享 Intent** ```bash am start -a android.intent.action.SEND -t image/png \ --eu android.intent.extra.STREAM file:///sdcard/path/to/image.png ``` WeChat 会拦截此 Intent 并打开"选择聊天"界面 (MvvmContactListUI)。 **Step 2: 等待 3 秒,截图分析** ```python # 等待 WeChat 打开选择聊天界面 # 截图保存到 /sdcard/Pictures/VisualAgent/ screenshot("/sdcard/Pictures/VisualAgent/share_step1.png") ``` **Step 3: OCR 查找联系人** ```python # 使用 OCR 查找联系人名称 ocr_find_text(text="火星人", path="/sdcard/Pictures/VisualAgent/share_step1.png") # 返回: {"center": {"x": 145, "y": 923}} ← 位置会变化,不要硬编码 ``` **Step 4: 如果找不到,使用拼音搜索** ```python # 1. 点击搜索框(固定位置) tap(238, 407) # 2. 输入拼音(中文输入经常失败) input_text("huoxingren") # 3. 等待 2 秒,截图查看候选词 screenshot("/sdcard/Pictures/VisualAgent/share_step2.png") # 4. OCR 查找候选词 ocr_find_text(text="火星人", path="/sdcard/Pictures/VisualAgent/share_step2.png") # 5. 点击候选词或联系人结果 ``` **Step 5: 点击联系人** ```python # 点击 OCR 找到的联系人位置 tap(145, 923) # 坐标从 OCR 结果获取,不要硬编码 ``` **Step 6: 等待 2 秒,截图查看发送按钮** ```python screenshot("/sdcard/Pictures/VisualAgent/share_step3.png") ``` **Step 7: OCR 验证发送按钮** ```python # 查找 "发送" 按钮 ocr_find_text(text="发送", path="/sdcard/Pictures/VisualAgent/share_step3.png") # 应返回两个匹配: # - "发送给:" 标签 (166, 1723) ← 只是标签,不可点击 # - "发送" 按钮 (899, 2627) ← 真正的发送按钮 ``` **Step 8: 点击发送按钮** ```python # 固定坐标(1344×2992 屏幕,无键盘状态) tap(899, 2627) ``` **Step 9: 等待 3 秒,验证发送成功** ```python screenshot("/sdcard/Pictures/VisualAgent/share_step4_verify.png") # OCR 查找验证标志 ocr_find_text(text="火星人", path="/sdcard/Pictures/VisualAgent/share_step4_verify.png") # 应显示: # - 聊天标题 "火星人" (662, 233) # - 图片标记 "To:火星人" (578, 636) 或 (578, 1184) ``` ## 完整脚本 ```python #!/usr/bin/env python3 """wechat_image_sender.py - 微信图片发送器""" import subprocess import time # 固定坐标(1344×2992 屏幕,无键盘状态) SEARCH_BOX = (238, 407) SEND_BUTTON = (899, 2627) CANCEL_BUTTON = (440, 2627) def send_image(image_path, contact_name, contact_pinyin=None): """发送图片给微信联系人 Args: image_path: 图片绝对路径(如 /sdcard/image.png) contact_name: 联系人名称(如 "火星人") contact_pinyin: 拼音(如 "huoxingren"),中文输入失败时使用 Returns: bool: 是否发送成功 """ # 1. 触发系统分享 cmd = f"am start -a android.intent.action.SEND -t image/png --eu android.intent.extra.STREAM file://{image_path}" subprocess.run(['su', '-c', cmd]) time.sleep(3) # 2. 截图 + OCR 查找联系人 # (这里需要调用 OCR 工具) # 3. 如果找不到,使用拼音搜索 # tap(SEARCH_BOX[0], SEARCH_BOX[1]) # input_text(contact_pinyin or contact_name) # time.sleep(2) # 4. 点击发送按钮 # tap(SEND_BUTTON[0], SEND_BUTTON[1]) # 5. 验证 # time.sleep(3) # screenshot + OCR 验证 return True if __name__ == '__main__': import argparse parser = argparse.ArgumentParser() parser.add_argument('--image', required=True) parser.add_argument('--to', required=True) parser.add_argument('--pinyin') args = parser.parse_args() send_image(args.image, args.to, args.pinyin) ``` ## 关键坐标参考 ### 1344×2992 屏幕(无键盘) | 元素 | 坐标 | 说明 | |------|------|------| | 搜索框 | (238, 407) | 固定,顶部 | | 发送按钮 | (899, 2627) | 固定,右下角 | | 取消按钮 | (440, 2627) | 固定,左下角 | | "发送给:" 标签 | (166, 1723) | 只是标签,不可点击 | ### 验证发送成功的 OCR 标志 截图后 OCR 应显示: - 聊天标题(如 "火星人" at Y≈233) - 图片标记 "To:火星人"(图片上的文字) - 或 "[图片]" 在聊天记录中 ### 拼音候选词位置(示例) 搜索 "dingpeng" 时: - "2顶棚": (487, 621) - "3丁鹏": (741, 621) ← 目标 - "4鼎朋": (1009, 621) 搜索 "huoxingren" 时: - 候选词出现在搜索框下方 - 选择正确的候选词(通常带数字前缀) - 然后点击联系人列表中的结果 ## 故障排查 | 问题 | 原因 | 解决方案 | |------|------|----------| | 中文输入失败 | ADB 键盘限制 | 使用拼音搜索 | | 联系人找不到 | 不在最近列表 | 拼音搜索或先发文字消息 | | 发送按钮位置不对 | 键盘弹出 | 先按返回关闭键盘 | | Intent 被其他应用拦截 | 多个应用注册 SEND | 指定包名或手动选择微信 | ## 安全注意事项 - 发送前确认图片内容和目标联系人 - 避免发送敏感信息到错误联系人 - 验证发送结果后再继续下一步操作 ## References - `scripts/wechat_image_sender.py` - 完整实现脚本 - `references/coordinates.md` - 不同屏幕尺寸的坐标参考