WeChatには多くの連絡先が登録されているが、中にはすでに自分を削除していたり、アカウントが停止されていたりするケースがある。通常はメッセージ送信時に赤字の警告が表示されて初めて気づくが、事前に確認できればよりスムーズなコミュニケーションが可能になる。
このような問題に対応するため、WeChatクライアント内部の非公開APIを利用して、相手に一切通知を送らずに友達関係の状態を確認する方法が存在する。このAPIはGUI上では直接操作できないが、プログラムから呼び出すことで以下のステータスを取得できる:
- 正常な友達関係
- 相手があなたを削除済み
- ユーザーがアカウントを削除(存在しない)
- メッセージ拒否(ブロック済み)
- アカウントが利用規約違反により凍結
実装方法
この機能は、特定のWeChatロボットツールが提供するPythonモジュールを通じて利用可能である。以下のように単一ユーザーのステータスを確認できる:
import wxfunc
status = wxfunc.CheckFriendStatus("wxid_xxxxxx")
print(status)
このスクリプトは、専用の実行ファイル(例: pywxrobot.exe)経由で実行される必要がある。モジュール名wxfuncはその実行環境によってエクスポートされたものである。
全友達リストの一括チェック
すべての友達に対してステータス確認を行うには、まず連絡先リストを取得し、システムアカウントを除外した上で個別にチェックする必要がある。以下にその実装例を示す:
import time
import os
import wxfunc
from typing import List, Dict
def main():
system_ids = {
"medianote", # 音声メモ
"floatbottle", # ドリフトボトル
"fmessage", # 友達推薦
"filehelper", # ファイル転送アシスタント
"qmessage", # QQオフラインメッセージ
"qqmail" # QQメール通知
}
contact_data: Dict = wxfunc.GetContactList()
friends: List[Dict] = contact_data.get("friend", [])
output_path = os.path.abspath("friend_status_report.csv")
start_time = time.time()
with open(output_path, 'w', encoding='utf-8') as report:
report.write("wxid,WeChatID,Nickname,Status\n")
for friend in friends:
wxid = friend["wxid"]
if wxid in system_ids:
continue
nickname = friend.get("昵称", "")
wechat_id = friend.get("微信号", "")
status = wxfunc.CheckFriendStatus(wxid)
print(f"{wxid} | {nickname} | {status}")
if "好友" not in status:
report.write(f'{wxid},{wechat_id},{nickname},{status}\n')
time.sleep(0.1) # API負荷軽減のための遅延
elapsed = time.time() - start_time
print(f"チェック完了。結果ファイル: {output_path}, 所要時間: {elapsed:.2f}秒")
if __name__ == "__main__":
main()
このスクリプトは、システム関連の特殊アカウントを除外し、通常の友達のみを対象にステータスを確認する。確認結果のうち「正常な友達」以外のケースのみをCSVファイルに出力する。実行時には0.1秒のインターバルを設けており、これにより過度なAPIコールを回避している。必要に応じてこの値を増やすことも可能である。
実行後、生成されたCSVファイルを開くと、削除済み・ブロック済み・アカウント停止などの異常ステータスを持つ連絡先の一覧を確認できる。実際の検証では、約1000人の友達リスト中5%程度(約50人)が何らかの異常ステータスであったことが確認された。