【python】wxpy--微信接口库

注意!!!只有能够登录网页版微信的账号,才可以正常使用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 异常
    在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值