找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8336|回复: 0

[杂谈] Python+itchat实现微信机器人,轻松搞定查看撤回消息、消息群发、清除好友...

[复制链接]
发表于 2021-5-9 20:43:04 | 显示全部楼层 |阅读模式 来自 湖北省
之前介绍过基于酷 Q 的 QQ 机器人,参考酷 Q 机器人+vps+python 实现功能强大的 QQ 机器人。今天给大家介绍一款功能原理类似的微信机器人。该微信机器人是基于 itchat python 库实现的,主要原理是**微信号收到的信息,并模拟微信用户发送信息。基础功能除了收发信息以外,还支持发文件、图片、好友验证等功能。可以在这些功能的基础上实现自动聊天、消息群发、查看撤回消息等高级功能,用在营销、推广、用户管理等各个方面。
接下来,将通过实现查看撤回消息这个小功能来介绍下 itchat 的使用方法。
如果希望机器人长期在线运行,建议将微信机器人跑在 vps 上,这样只要你把机器人部署好了就不用去管它了。推荐使用 vultr 的基础款云服务器,月付 5 美元,均采用千兆带宽、SSD 硬盘,稳定性有保障,按小时计费,随用随停,且支持支付宝付款。而且 vultr 现在还有注册送 100 美元的活动,参考:VULTR 2020 年优惠,新用户直接送 100 美元,附额外领 3 美元教程
推荐阅读:月付不到 3 刀的便宜 VPS 主机最全盘点
月付 3-7 刀,质量口碑保证,网络线路优秀的 vps 盘点

功能实现很简单只需要运行一个 python 脚本就可以了,脚本如下
  • # -*-encoding:utf-8-*-
  • # -*-encoding:utf-8-*-
  • import os
  • import re
  • import shutil
  • import time
  • import itchat
  • from itchat.content import *
  • # 说明:可以撤回的有文本文字、语音、视频、图片、位置、名片、分享、附件
  • # {msg_idmsg_from,msg_to,msg_time,msg_time_rec,msg_type,msg_content,msg_share_url)}
  • msg_dict = {}
  • # 文件存储临时目录
  • rev_tmp_dir = "D:/python/weixin/temp"
  • if not os.path.exists(rev_tmp_dir): os.mkdir(rev_tmp_dir)
  • # 表情有一个问题 | 接受信息和接受 note 的 msg_id 不一致 巧合解决方案
  • face_bug = None
  • # 将接收到的消息存放在字典中,当接收到新消息时对字典中超时的消息进行清理 | 不接受不具有撤回功能的信息
  • # [TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO, FRIENDS, NOTE]
  • @itchat.msg_register([TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO])
  • def handler_receive_msg(msg):
  •    global face_bug
  •    # 获取的是本地时间戳并格式化本地时间戳 e: 2017-04-21 21:30:08
  •    msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  •    # 消息 ID
  •    msg_id = msg['MsgId'
  •    # 消息时间
  •    msg_time = msg['CreateTime'
  •    # 消息发送人昵称 | 这里也可以使用 RemarkName 备注 但是自己或者没有备注的人为 None
  •    msg_from = (itchat.search_friends(userName=msg['FromUserName']))["NickName"
  •    # 消息内容
  •    msg_content = None
  •    # 分享的链接
  •    msg_share_url = None
  •    if msg['Type' == 'Text' \
  •            or msg['Type' == 'Friends':
  •        msg_content = msg['Text'
  •    elif msg['Type' == 'Recording' \
  •            or msg['Type' == 'Attachment' \
  •            or msg['Type' == 'Video' \
  •            or msg['Type' == 'Picture':
  •        msg_content = r"" + msg['FileName'
  •        # 保存文件
  •        msg['Text'](rev_tmp_dir + msg['FileName'])
  •    elif msg['Type' == 'Card':
  •        msg_content = msg['RecommendInfo']['NickName' + r" 的名片"
  •    elif msg['Type' == 'Map':
  •        x, y, location = re.search("" + x.__str__() + " 经度->" + y.__str__()
  •        else:
  •            msg_content = r"" + location
  •    elif msg['Type' == 'Sharing':
  •        msg_content = msg['Text'
  •        msg_share_url = msg['Url'
  •    face_bug = msg_content
  •    # 更新字典
  •    msg_dict.update(
  •        {
  •            msg_id: {
  •                "msg_from": msg_from, "msg_time": msg_time, "msg_time_rec": msg_time_rec,
  •                "msg_type": msg["Type"],
  •                "msg_content": msg_content, "msg_share_url": msg_share_url
  •            }
  •        }
  •    )
  • # 收到 note 通知类消息,判断是不是撤回并进行相应操作
  • @itchat.msg_register([NOTE])
  • def send_msg_helper(msg):
  •    global face_bug
  •    if re.search(r"\<\!\[cdata\[.*撤回了一条消息\]\]\>", msg['Content']) is not None:
  •        # 获取消息的 id
  •        old_msg_id = re.search("\(.*?)\<\>", msg['Content']).group(1)
  •        old_msg = msg_dict.get(old_msg_id, {})
  •        if len(old_msg_id) < 11:
  •            itchat.send_file(rev_tmp_dir + face_bug, toUserName='filehelper')
  •            os.remove(rev_tmp_dir + face_bug)
  •        else:
  •            msg_body = "告诉你一个秘密~" + "\n" \
  •                       + old_msg.get('msg_from') + " 撤回了 " + old_msg.get("msg_type") + " 消息" + "\n" \
  •                       + old_msg.get('msg_time_rec') + "\n" \
  •                       + "撤回了什么 ⇣" + "\n" \
  •                       + r"" + old_msg.get('msg_content')
  •            # 如果是分享存在链接
  •            if old_msg['msg_type' == "Sharing": msg_body += "\n 就是这个链接➣ " + old_msg.get('msg_share_url')
  •            # 将撤回消息发送到文件助手
  •            itchat.send(msg_body, toUserName='filehelper')
  •            # 有文件的话也要将文件发送回去
  •            if old_msg["msg_type" == "Picture" \
  •                    or old_msg["msg_type" == "Recording" \
  •                    or old_msg["msg_type" == "Video" \
  •                    or old_msg["msg_type" == "Attachment":
  •                file = '@fil@%s' % (rev_tmp_dir + old_msg['msg_content'])
  •                itchat.send(msg=file, toUserName='filehelper')
  •                os.remove(rev_tmp_dir + old_msg['msg_content'])
  •            # 删除字典旧消息
  •            msg_dict.pop(old_msg_id)
  • if __name__ == '__main__':
  •    itchat.auto_login(hotReload=True,enableCmdQR=2)
  •    itchat.run()

运行该 python 脚本,在终端会弹出一个二维码,通过微信扫码就可以登录了。
另外如果二维码的格式坏了,可以换个 shell 工具试试。
实现效果如下



发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-5-25 20:39 , Processed in 0.043025 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表