注意!!!只有能够登录网页版微信的账号,才可以正常使用wxpy库。
官方文档:https://wxpy.readthedocs.io/zh/latest/index.html
推荐最近比较热门的微信机器人项目:https://github.com/miloira/wxhook
# import os
# os.environ["WXHOOK_LOG_LEVEL"] = "INFO" # 修改日志输出级别
# os.environ["WXHOOK_LOG_FORMAT"] = "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{message}</level>" # 修改日志输出格式
from wxhook import Bot
from wxhook import events
from wxhook.model import Event
def on_login(bot: Bot, event: Event):
print("登录成功之后会触发这个函数")
def on_start(bot: Bot):
print("微信客户端打开之后会触发这个函数")
def on_stop(bot: Bot):
print("关闭微信客户端之前会触发这个函数")
def on_before_message(bot: Bot, event: Event):
print("消息事件处理之前")
def on_after_message(bot: Bot, event: Event):
print("消息事件处理之后")
bot = Bot(
# faked_version="3.9.10.19", # 解除微信低版本限制
on_login=on_login,
on_start=on_start,
on_stop=on_stop,
on_before_message=on_before_message,
on_after_message=on_after_message
)
# 消息回调地址
# bot.set_webhook_url("http://127.0.0.1:8000")
@bot.handle(events.TEXT_MESSAGE)
def on_message(bot: Bot, event: Event):
bot.send_text("filehelper", "hello world!")
bot.run()
文章地址:https://blog.csdn.net/qq_44647926/article/details/140111888
机器人对象
—登录和初始化
from wxpy import *
def login():
print('状态:登录成功 ',end='')
def login_out():
print('微信已退出!')
bot=Bot(login_callback=login,logout_callback=login_out,cache_path='login.pkl',qr_path='login_qr.png')
print('当前用户:'+bot.self.name)
bot.auto_mark_read()#自动清除手机端消息红点提示
bot.enable_puid(path='wxpy_puid.pkl')#启用puid属性 具有稳定性的标识
聊天对象
—接受好友添加
@bot.register(msg_types=FRIENDS)
def auto_accept(msg):
if '自定义消息' in msg.text:
new_friend=msg.card.accept()
#或new_friend=bot.accept_friend(msg.card)
new_friend.send('已添加成功了哦!')
—获取用户信息
my_chats=bot.chats().search('A招商代理~欣怡')[0]#按关键字搜索好友
print(my_chats.nick_name) #原始昵称
print(my_chats.name) #获取好友名称
my_chats.set_remark_name('小姐姐')#设置好友备注
print(my_chats.remark_name) #获取好友备注
print(my_chats.sex) #获取性别 1为男 2为女
print(my_chats.province) #获取省份名
print(my_chats.city) #获取城市名
print(my_chats.signature) #获取个性签名
print(my_chats.is_friend) #检测是否是好友
with open(my_chats.name+'.jpg','wb') as f:
f.write(my_chats.get_avatar())#获取头像
print('用户:'+my_chats+' 头像已保存!')
输出:
>>状态:登录成功 当前用户:写诗喂狗
>><Friend: 多多>
>>A招商代理~欣怡
>>小姐姐
>>2
>>上海
>>崇明
>>当初的愿望实现了吗
>><Friend: 小姐姐>
>>用户:小姐姐 头像已保存!
—操作聊天对象
friend=bot.friends().search('多多')[0]#按关键字搜索好友
friend.pin() #置顶聊天对象
friend.unpin() #取消置顶
friend.mark_as_read() #消除该聊天对象未读红点
friend.add(verify_content='验证消息') #添加当前用户为好友
friend.accept() #接受当前用户添加
群聊对象
—创建群聊
bot.create_group(users,topic=None)
参数:
- users – 用户列表 (不含自己,至少 2 位)
- topic – 群名称
返回:
- 若建群成功,返回一个新的群聊对象
返回类型:
- wxpy.Group
—获取群聊信息
my_groups=bot.groups().search('华夏校园成长群')[0]#关键字搜索群聊
print(my_groups.name) #获取群聊名
print(my_groups.owner.name) #获取群主名
print(my_groups.is_owner) #检测机器人是否是群主
print(my_groups.self.name) #获取机器人自己的名称
print(my_groups.members) #获取群聊所有成员名
输出:
>>华夏校园成长群
>>杨震
>>False
>>写诗喂狗
>>[<Member: 杨震>, <Member: 话别>, <Member: LGE-Decade>, <Member: 写诗喂狗>, <Member: 你是天使吗>, <Member: 希望再爱你一生>, <Member: 陈勇刚>, <Member: 浅唱つ繁花似雨>, <Member: 孤麋鹿>, <Member: 陈佳磊>, <Member: 辉强>, <Member: 霏晖>, <Member: Light>, <Member: Rebecca>, <Member: Amy>]
—群聊操作
my_groups=bot.groups().search(groupname)[0] #搜索群
#groupname是字符串类型
my_groups.update_group(members_details=True) #更新群聊的信息
#更新群成员的地区、性别、签名信息
my_groups.add_members(users, use_invitation=False)#向群聊中加入用户
#users可以是一个对象也可以是一个列表
my_groups.remove_members(members) #从群聊中移除用户
#members可以是一个对象也可以是一个列表
my_groups.rename_group(name) #修改群聊名称
#name是字符串类型
—群成员操作
my_groups=bot.groups().search('华夏校园成长群')[0]#关键字搜索群聊
member=my_groups.members.search('Light')[0] #获取成员对象
member.remove() #群主移除群成员
print(member.name) #获取成员名称
print(member.display_name) #获取成员在群里的名称
发送消息
—发送文本消息
friend.send_msg('文本消息')
—发送图片消息
friend.send_image('1.png',media_id=None)#media_id=None省略发送过程
—发送文件
friend.send_file('cs.py',media_id=None)#media_id=None省略发送过程
—发送视频
friend.send_video('1.mp4',media_id=None)#media_id=None省略发送过程
—发送名片
friend.send_raw_msg(
# 名片的原始消息类型
raw_type=42,
# 注意 `username` 在这里应为微信 ID,且被发送的名片必须为自己的好友
raw_content='<msg username="微信号" nickname="昵称"/>'
)
—发送原始数据
friend.send_raw_msg(
# 名片的原始消息类型
raw_type=42,
# 注意 `username` 在这里应为微信 ID,且被发送的名片必须为自己的好友
raw_content='<msg username="wxpy_bot" nickname="wxpy 机器人"/>'
)
参数:
- raw_type (int) – 原始的整数消息类型
- raw_content (str) – 原始的消息内容
- uri (str) – 请求路径,默认为 ‘/webwxsendmsg’
- msg_ext (dict) – 消息的扩展属性 (会被更新到 Msg 键中)
消息处理
—消息回复
装饰器
@bot.register(chats=None, msg_types=None, except_self=True, run_async=True, enabled=True)
被装饰的函数中使用return '回复内容'
和msg.reply('回复内容')
等效
参数:
- chats – 消息所在的聊天对象:单个或列表形式的多个聊天对象或聊天类型,为空时匹配所有聊天对象
- msg_types – 消息的类型:单个或列表形式的多个消息类型,为空时匹配所有消息类型 (SYSTEM 类消息除外)
- except_self – 排除由自己发送的消息
- run_async – 是否异步执行所配置的函数:可提高响应速度
- enabled – 当前配置的默认开启状态,可事后动态开启或关闭
msg_types
消息类型可选参数:
# 文本
TEXT = 'Text'
# 位置
MAP = 'Map'
# 名片
CARD = 'Card'
# 提示
NOTE = 'Note'
# 分享
SHARING = 'Sharing'
# 图片
PICTURE = 'Picture'
# 语音
RECORDING = 'Recording'
# 文件
ATTACHMENT = 'Attachment'
# 视频
VIDEO = 'Video'
# 好友请求
FRIENDS = 'Friends'
# 系统
SYSTEM = 'System'
friends=bot.friends()
@bot.register(friends)
def reply(msg):
msg.reply('回复的内容')
embed()
—基本属性
friends=bot.friends()
@bot.register(friends)
def reply(msg):
print(msg.type)#获取消息类型
print(msg.bot)#获取消息发送者
print(msg.id)#获取消息的唯一ID
embed()
#给机器人发送任意信息后
输出:
>>Text
>><Bot: 写诗喂狗>
>>2028300233675110636
—内容数据
@bot.register(friends)
def reply(msg):
print(msg.text) #消息文本内容
msg.get_file(save_path=msg.file_name)#保存文件
print(msg.file_name) #获取文件名
print(msg.file_size) #获取文件大小
print(msg.media_id) #获取媒体文件ID
print(msg.raw) #获取文件原始数据
embed()
输出:
>>None
>>190618-220331.png
>>
>>{'MsgId': '1957284160852580052', 'FromUserName': '@d167feda5970b4fcd530317af31d772f4528ca73637d2b804104a7ef01dee5f9', 'ToUserName': '@484d6acf1c391ff77040aaa96443069c70e49f7e2c04d8f2319c25a17a210984', 'MsgType': 3, 'Content': '@76637937c215aa3a8b650558e92eb237c121210366184637a8d664712b8694db3257ba863fae934c7fb3124485e251556def2352dd61b44f1ef8c4d43da3ce09ac51a59caf08be7f54c93b989769ef42d64e37633b2e0986dd5de634fb53077cbc06ca76c09243d00f73a3a63d95c3fdfea24ff942a4c1319d8a61d1af75f3a3893d3b3b1666f46e33b5ae01e3155efeb85a56df03a9a9153353a01c4ec0ce4d000495dbcc472e072adc591ee8bd587ce3e82b48f4bdc17e708c79536c2345c67ba94aa8b67385504bbdfeede6d244788ee4df3e19c5712c6d6f9d6390da93c1c470d96d786f6caef51e601d2dee8df8a47fee34f1d9d287c8ec30264b53befe2b5b92652361e1bff72e36ec9935e663960193eb00396680274bd664c7449ec686dcdbaf5a470d782e1914a20dbd30eb1939a87d486fbddc72f6135ec68e370f8283bafb73356a11fce573adc2023781c8824fd35ceeec6c2c2c37b28bc5038a27f6de6be55b36ab16842fa2886b38cebd930427d20d89aed19d5fc85f18e12f99c3fc0f3d53462e2370544fc27b15b8b2a3710a825dfb4ec210fcfd2af5e24b8f6904ebfa0974abb3b2eaeac4c5088090c210ad8910328a62daa53d3567e5dee2280458c37ffc8d6c675f3d78bcef0e5496816f146b47dbd99c519fa9060cceda9da0a8999e9a1e8e4778d81dcde714cbe1a469c58f9c33e7f93d4fd6c80cff04cc27dc211c4d8afd68b80a4a1a8459847236521b3f044660bf584360ea151d7b73ba9aae11993eaf65dc40bdf3a42abd3b404654606550b959f0fc8ab63aa6b1c2d6181fec2dfeeb03f8f63a2445b1637d584a38b1627a7c72a2ec559263ab5e3b5eb16152353298af7d4b4750337c2f43a0376a7f5bb4bb9c775d0ab8ccadd6078f7b7527118836e778a8a6dc8958429c5dc87a1f77ee9b5e207638022bbbb358a32e326486978909ea828c9b3a9bd0b9e4ce6d3f613037272dcd4622f9ec', 'Status': 3, 'ImgStatus': 2, 'CreateTime': 1560866606, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '190618-220331.png', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 80, 'ImgWidth': 120, 'SubMsgType': 0, 'NewMsgId': 1957284160852580052, 'OriContent': '', 'EncryFileName': '', 'Type': 'Picture', 'Text': <function get_download_fn.<locals>.download_fn at 0x00000131A155B0D0>}
—用户相关
@bot.register(friends)
def reply(msg):
print(msg.chat) #消息所在的聊天对话
#对于自己发送的消息,为消息的接收者
#对于别人发送的消息,为消息的发送者
print(msg.sender) #消息的发送者
print(msg.reciver) #消息的接受者
print(msg.member) #消息的实际发送者
print(msg.card) #好友请求中的请求用户 名片消息中的推荐用户
embed()
—群聊相关
groups=bot.groups()
@bot.register(groups)
def reply(msg):
print(msg.is_at)#群聊中被@时返回True
embed()
—时间相关
@bot.register(friends)
def reply(msg):
print(msg.create_time)#服务端发送数据
print(msg.recive_time)#本地接收时间
print(msg.latency) #消息延时秒数
embed()
输出:
>>2019-06-18 22:18:30
—其他属性
@bot.register(friends)
def reply(msg):
print(msg.url) #分享消息的url
print(msg.location)#获取位置信息
embed()
输出:
>>http://apis.map.qq.com/uri/v1/geocoder?coord=30.467726,114.413124
>>{'x': 30.467726, 'y': 118.413124, 'scale': 16, 'label': '位置名', 'maptype': 0, 'poiname': '[位置]', 'poiid': ''}
@bot.register(friends)
def reply(msg):
print(msg.img_height) #图片高度
print(msg.img_width) #图片宽度
print(msg.play_length) #视频长度
print(msg.voice_lentgth)#语音长度
embed()
输出:
>>120
>>120
—回复方法
msg.reply(...)
Message.reply_image(...)
Message.reply_file(...)
Message.reply_video(...)
Message.reply_msg(...)
Message.reply_raw_msg(...)
—消息转发
friend=bot.friends().search('多多')[0]
@bot.register(friend)
def reply(msg):
#将收到的消息转发回去
msg.forward(friend,prefix='这是前缀消息',suffix='这是后缀消息')
embed()
参数:
- chat (Chat) – 接收转发消息的聊天对象
- prefix (str) – 转发时增加的 前缀 文本,原消息为文本时会自动换行
- suffix (str) – 转发时增加的 后缀 文本,原消息为文本时会自动换行
- raise_for_unsupported (bool) – 为 True 时,将为不支持的消息类型抛出
NotImplementedError 异常