SKILL.md 5.83 KB

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

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 秒,截图分析

# 等待 WeChat 打开选择聊天界面
# 截图保存到 /sdcard/Pictures/VisualAgent/
screenshot("/sdcard/Pictures/VisualAgent/share_step1.png")

Step 3: OCR 查找联系人

# 使用 OCR 查找联系人名称
ocr_find_text(text="火星人", path="/sdcard/Pictures/VisualAgent/share_step1.png")
# 返回: {"center": {"x": 145, "y": 923}}  ← 位置会变化,不要硬编码

Step 4: 如果找不到,使用拼音搜索

# 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: 点击联系人

# 点击 OCR 找到的联系人位置
tap(145, 923)  # 坐标从 OCR 结果获取,不要硬编码

Step 6: 等待 2 秒,截图查看发送按钮

screenshot("/sdcard/Pictures/VisualAgent/share_step3.png")

Step 7: OCR 验证发送按钮

# 查找 "发送" 按钮
ocr_find_text(text="发送", path="/sdcard/Pictures/VisualAgent/share_step3.png")
# 应返回两个匹配:
# - "发送给:" 标签 (166, 1723) ← 只是标签,不可点击
# - "发送" 按钮 (899, 2627) ← 真正的发送按钮

Step 8: 点击发送按钮

# 固定坐标(1344×2992 屏幕,无键盘状态)
tap(899, 2627)

Step 9: 等待 3 秒,验证发送成功

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)

完整脚本

#!/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 - 不同屏幕尺寸的坐标参考