19.3.4 发送信息
itchat提供了几个发送不同类型信息的函数,没有发送语音的原因是网页版没有这个接口,可供调用 的函数如表19.1所示。
函数名 | 作用 |
send_msg() | 发送文字信息 |
send_file() | 发送文件 |
send_video() | 发送视频 |
send_image() | 发送图片 |
使用代码示例如下:
import itchat import time def after(): user_info = itchat.search_friends(name='培杰') if len(user_info) > 0: # 拿到用户名 user_name = user_info[0]['UserName'] # 发送文字信息 itchat.send_msg('培杰你好啊!', user_name) # 发送图片 time.sleep(10) itchat.send_image('cat.jpg', user_name) # 发送文件 time.sleep(10) itchat.send_file('19_2.py', user_name) # 发送视频 time.sleep(10) itchat.send_video('sport.mp4', user_name) if __name__ == '__main__': itchat.auto_login(loginCallback=after) itchat.run()
代码执行结果如下:
19.2.4 监听信息
除了主动发送信息外,还可以对信息进行监控,支持对多种类型的信息进行监控,类型如表19.2所示。 另外,有多个注册信息监听,后注册的信息优先级高于先注册信息,带参数信息高于不带参数信息。
信息类型 | 解释 |
itchat.content.TEXT | 文本内容 |
itchat.content.MAP | 位置文本 |
itchat.content.Card | 名片 |
itchat.content.Note | 通知文本 |
itchat.content.Sharing | 分享名称 |
itchat.content.RECORDING | 录音 |
itchat.PICTURE | 图片/表情 |
itchat.content.VOICE | 录音 |
itchat.content.ATTACHMENT | 附件 |
itchat.content.VIDEO | 短视频 |
itchat.content.FRIENDS | 好友邀请 |
itchat.content.SYSTEM | 系统信息 |
一个监听到文字信息并响应信息的代码示例如下:
import itchat @itchat.msg_register(itchat.content.TEXT) def reply_msg(msg): if msg['Content'] == u'你好': itchat.send_msg(msg['User']['NickName'] + "你好啊!", msg['FromUserName']) if __name__ == '__main__': itchat.auto_login() itchat.run()
代码执行结果如下:
19.2.5 群聊
在微信网页端改版后,创建群聊、拉人进群和删除群聊这几个接口都用不了,现在利用itchat能做的有:查找群聊,往群聊发送信息,以及监控群聊信息,使用代码示例如下:
import itchat import time @itchat.msg_register(itchat.content.TEXT, isGroupChat=True) def reply_msg(msg): print("收到一条群信息:", msg['ActualNickName'], msg['Content']) def after_login(): # 获得完整的群聊列表 print("完整的群聊列表如下:") print(itchat.get_chatrooms()) # 查找特定群聊 time.sleep(10) # 通过群聊名查找 chat_rooms = itchat.search_chatrooms(name='小猪的Python学习交流群') if len(chat_rooms) > 0: itchat.send_msg('测试', chat_rooms[0]['UserName']) if __name__ == '__main__': itchat.auto_login(loginCallback=after_login) itchat.run()
代码执行结果如下:
完整的群聊列表如下: [<Chatroom: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@@60dc5027bbbb83d532aa633b8d126szcf497a98ceea5c098d2c65f0932139b88', 'NickName': '湖北人在深圳90后', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=625714901&username=@@60dc502769a783d532aa633b8d126190f497a98ceea5c098d2c65f0932139b88&skey=@crypt_2d4a1972_ea00536c8ac4e35fae1c2a1c48dfe40d', 'ContactFlag': 3, 'MemberCount': 82, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'HBRZSZ90H', 'PYQuanPin': 'hubeirenzaishenzhen90hou', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 0, 'Province': '', 'City': '', 'Alias': '', 'SnsFlag': 0, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0, 'IsAdmin': None, 'Self': <User: {'MemberList': <ContactList: []>, 'UserName': '@29b9cb6386352503319f411754e7424e383ae09e50a224feca754a4516db6a13', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '', 'EncryChatRoomId': '', 'Alias': '', 'Signature': '(´v`o)♡', 'NickName': 'Robot Pig', 'RemarkPYQuanPin': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=275167114&username=@29b9cb6386352503319f411754e7424e383ae09e50a224feca754a4516db6a13&skey=@crypt_2d4a1972_ea00536c8ac4e35fae1c2a1c48dfe40d', 'UniFriend': 0, 'Sex': 2, 'AppAccountFlag': 0, 'VerifyFlag': 0, 'ChatRoomId': 0, 'HideInputBarFlag': 0, 'AttrStatus': 0, 'SnsFlag': 1, 'MemberCount': 0, 'OwnerUin': 0, 'ContactFlag': 0, 'Uin': 3454488193, 'StarFriend': 0, 'Statues': 0, 'WebWxPluginSwitch': 0, 'HeadImgFlag': 1}>}> 内容过多省略... ] 收到一条群信息: 培杰 123 收到一条群信息: 培杰 你好
聊天记录截图:
另外,群聊除了通过群名搜索外还可以通过username来查找,或者两者搭配使用; 在msg里有一个isAt字段,可用于判断是否被人@了。
19.2.6 公众号
使用方式和群聊的非常类似,搜索公众号方法search_mps,监听公众号信息添加isMpChat=True元素,使用代码示例如下:
import itchat @itchat.msg_register(itchat.content.TEXT, isMpChat=True) def reply_msg(msg): print("收到一条公众号信息:", msg['User']['NickName'], msg['Content']) def login_after(): mps = itchat.search_mps(name='CoderPig') if len(mps) > 0: print(mps) itchat.send_msg('人生苦短', toUserName=mps[0]['UserName']) if __name__ == '__main__': itchat.auto_login(loginCallback=login_after) itchat.run()
代码执行结果如下:
[<MassivePlatform: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@07585e92f75be7320e49627cf0c3ad43', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=610904174&username=@07585e92f75be7320e49627cf0c3ad43&skey=@crypt_2d4a1972_bc443bf966f94fa11f2db8f812e456cf', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '一枚咸鱼Android开发,会点Python,分享点学习经验,总结,鸡汤,读书笔记,生活技巧', 'VerifyFlag': 8, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 0, 'Province': '广东', 'City': '深圳', 'Alias': '', 'SnsFlag': 0, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'gh_', 'EncryChatRoomId': '', 'IsOwner': 0}>] 收到一条公众号信息: CoderPig 我用Python
聊天记录截图:
19.3 实用示例:定时发送消息
定时发送信息这个操作在日常生活中非常实用,比如给别人发生日或者节日祝福,晚上12点准时发,如果有早睡习惯的要熬到12点就很难受了,我们可以利用itchat编写一个简单的定时发送信息脚本。这里我们用到一个apscheduler定时调度任务模块,在命令行键入pip install apscheduler即可完成安装。这里并不会详细讲解,有兴趣的可移步到官方文档自行查阅:apscheduler.readthedocs.io/en/latest/u…定时发送消息的代码示例如下:
import itchat from apscheduler.schedulers.blocking import BlockingScheduler import time # 发送信息 def send_msg(): user_info = itchat.search_friends(name='培杰') if len(user_info) > 0: user_name = user_info[0]['UserName'] itchat.send_msg('生日快乐哦!', toUserName=user_name) def after_login(): sched.add_job(send_msg, 'cron', year=2018, month=7, day=28, hour=16, minute=5, second=30) sched.start() def after_logout(): sched.shutdown() if __name__ == '__main__': sched = BlockingScheduler() itchat.auto_login(loginCallback=after_login, exitCallback=after_login) itchat.run()
代码执行结果如下:
19.4 实用示例:集成图灵API制作聊天机器人
图灵机器人官网:www.tuling123.com/member/robo…注册一个账号后,点击创建机器人,会弹出如图所示的面板,按需配置下即可。
普通账户可以创建5个机器人,每天有5000次的免费调用机会。点击新创建好的机器人, 会进入如图所示的界面,我们只需要保存下apikey,调用接口用的秘钥。
点击底下的api使用文档,或者直接打开 www.kancloud.cn/turing/web_…
{ "reqType":0, "perception": { "inputText": { "text": "附近的酒店" }, "inputImage": { "url": "imageUrl" }, "selfInfo": { "location": { "city": "北京", "province": "北京", "street": "信息路" } } }, "userInfo": { "apiKey": "", "userId": "" } }
我们可以利用Postman模拟下请求,试试接口是否可用,先设下请求头:
Content-Type:application/json Host:openapi.tuling123.com User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3486.0 Safari/537.36
接着是提交数据:
{ "reqType":0, "perception": { "inputText": { "text": "你好" } }, "userInfo": { "apiKey": "7e9377d760274b3499f6dec8eed37bbb", "userId": "123" } }
看下返回结果:
{ "emotion": { "robotEmotion": { "a": 0, "d": 0, "emotionId": 0, "p": 0 }, "userEmotion": { "a": 0, "d": 0, "emotionId": 0, "p": 0 } }, "intent": { "actionName": "", "code": 10004, "intentName": "" }, "results": [ { "groupType": 1, "resultType": "text", "values": { "text": "我很好,你也要好好的" } } ] }
返回结果里的text明显就是我们想要的东西,整个过程了解了,接着我们来编写代码,流程如下:
(1)监听微信信息。 (2)接收到信息,获取信息内容。 (3)调用接口,获取请求结果,提取返回的text。 (4)把提取到的text返回给发送信息的人。