前言

之前写的文章( 写一个新的Python微信机器人)里提到的机器人文档更新有点慢,主要我是想以文章的形式来说一说插件的功能,还能展示下效果,但是一直都忙的很。

闲言闲语

因为做公众号的原因,微信加了很多陌生人好友,有的加了也不说话,有的可能已经把你删除了你也不知道。偶尔给别人发消息可能还会出现下面的红色警告。

如果能批量检测一遍好友的状态,那就不用担心这种问题了,也能知道你是不是还在他(她)的好友列表。当然如果只是想确认某个人是否是你的好友,你可以通过以下方式来测试:

  • 转账但不支付,对方无感知
  • 建群,不发消息对方就无感知
  • 发消息,很多机器人就通过批量发消息来检测
更好的方式

从编程的角度实现,同样也可以通过上面三种方式来检测,PC端的电脑无法实现转账,所以只能用后面两种方式。这样实现其实有点太麻烦且不安全,频繁建群和频繁发消息都可能收到微信的警告。

如果有一个可以频繁调用的接口来检测好友就好了。经过研究,微信其实有接口可以直接检测好友的状态,只是界面没有按钮可以调用,检测返回的结果有以下几种:

  • 好友
  • 对方已将你删除
  • 该用户不存在(自己注销了)
  • 对方拒绝接收你的消息(将你拉黑了)
  • 对方账号违反了《微信个人账号使用规范》(被封号了)

也可能还有其他情况,只是我的好友列表里没有出现这种情况,使用的时候可以看接口返回的提示是啥。

实现

机器人里已经将这个方法封装成了Python函数,函数原型:def CheckFriendStatus(wxid:str) -> str

单个好友检测

如果你想检测某个好友,又恰好知道它的wxid,那你可以这样写代码:

import wxfunc

print(wxfunc.CheckFriendStatus("wxid_xxxxxx"))
  • 1.
  • 2.
  • 3.

wxfunc为exe导出的模块,通过exe运行的Python脚本可以直接导入这个模块,例如将这个脚本保存为check.py,然后通过.\pywxrobot.exe check.py就能运行这个Python代码。

批量好友检测

如果你想对全部好友做单向好友检测的话,除了需要调用这个检测接口,还需要可以获取到所有好友,当然也封装好了,函数原型: def GetContactList() -> dict。完整的脚本代码如下:

import time
import os
import wxfunc
from typing import List


def main():
    filter_list = [
        "medianote", # 语音记事本
        "floatbottle", # 漂流瓶
        "fmessage", # 朋友推荐消息
        "filehelper", # 文件传输助手
        "qmessage", # QQ离线消息
        "qqmail", # QQ邮箱提醒
    ]

    contacts:List[dict] = dict(wxfunc.GetContactList())["friend"]
    path = os.path.abspath("检测好友结果.csv")
    t0 = time.time()
    with open(path, 'w', encoding='utf-8') as f:
        f.write("wxid,微信号,昵称,结果\n")
        for contact in contacts:
            wxid = contact["wxid"]
            if wxid in filter_list:
                continue
            nickname = contact.get("昵称", "")
            wxh = contact.get("微信号", "")
            result = wxfunc.CheckFriendStatus(wxid)
            print(wxid, nickname, result)
            if "好友" in result:
                continue
            f.write(f'{wxid},{wxh},{nickname},{result}\n')
            time.sleep(0.1)
    print(f"好友检测完成,检测结果文件(csv): {path}, 耗时: {time.time()-t0}")


if __name__ == "__main__":
    main()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

获取的好友列表还有有一些官方账号,例如文件传输助手、漂流瓶这些,需要把这些过滤掉节省点时间(没过滤也不会报错)。

这里只sleep了0.1秒,如果你想保险一点,可以多sleep些时间,我测试0.1秒也没问题。这个代码已经上传到github的插件里,下载完成后,可以通过.\pywxrobot.exe pyrobot\other_plugins\foreach_check_friends_status.py来执行,我还加了一个bat脚本来做这个操作,双击检测好友列表.bat也可以。

检测的过程中可能会出现下面的提示,不用管,这个只有你这边有提示,对方是看不到的。

然后就是等待它把你的整个好友列表都扫一遍,具体需要的时间和好友数量相关。例如我有一千个好友,平均下来一个3秒。

检测完成后,会将不是好友的保存到csv表格里,打开csv表格就能看到了。不扫不知道,一检测具体有五十个不是好友,占了微信好友的5%。