python实现微信接口(itchat)详细介绍
前言
itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如这些。该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具。如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。
sudopipinstallitchat
itchat.auto_login()这种方法将会通过微信扫描二维码登录,但是这种登录的方式确实短时间的登录,并不会保留登录的状态,也就是下次登录时还是需要扫描二维码,如果加上hotReload==True,那么就会保留登录的状态,至少在后面的几次登录过程中不会再次扫描二维码,该参数生成一个静态文件itchat.pkl用于存储登录状态
退出及登录完成后调用的特定的方法
这里主要使用的是灰调函数的方法,登录完成后的方法需要赋值在loginCallback中退出后的方法,需要赋值在exitCallback中.若不设置loginCallback的值,将会自动删除二维码图片并清空命令行显示.
importitchat,time
deflc():
print("FinashLogin!")
defec():
print("exit")
itchat.auto_login(loginCallback=lc,exitCallback=ec)
time.sleep()
itchat.logout()#强制退出登录
send
send(msg="TextMessage",toUserName=None)
参数:
@fil@path_to_file:发送文件
@img@path_to_img:发送图片
@vid@path_to_video:发送视频
toUserName:发送对象,如果留空,将发送给自己.
返回值
TrueorFalse
实例代码
#coding-utf-8
importitchat
itchat.auto_login()
itchat.send("HelloWorld!")
ithcat.send("@fil@%s"%'/tmp/test.text')
ithcat.send("@img@%s"%'/tmp/test.png')
ithcat.send("@vid@%s"%'/tmp/test.mkv')
send_msg
send_msg(msg='TextMessage',toUserName=None),其中的的msg是要发送的文本,toUserName是发送对象,如果留空,将发送给自己,返回值为True或者False
实例代码
importitchat
itchat.auto_login()
itchat.send_msg("helloworld.")
send_file
send_file(fileDir,toUserName=None)fileDir是文件路径,当文件不存在时,将打印无此文件的提醒,返回值为True或者False
实例代码
importitchat
itchat.auto_login()
itchat.send_file("/tmp/test.txt")
send_image
send_image(fileDir,toUserName=None)参数同上
实例代码
importitchat
itchat.auto_login()
itchat.send_img("/tmp/test.txt")
send_video
send_video(fileDir,toUserName=None)参数同上
实例代码
importitchat
itchat.auto_login()
itchat.send_video("/tmp/test.txt")
itchat将根据接受到的消息类型寻找对应的已注册的方法. 如果一个消息类型没有对应的注册方法,该消息将会被舍弃. 在运行过程中也可以动态注册方法,注册方式与结果不变.
注册方法
不带具体对象注册,将注册为普通消息的回复方法.
importitchat
fromitchat.contentimport*
@itchat.msg_register(TEXT)#这里的TEXT表示如果有人发送文本消息,那么就会调用下面的方法
defsimple_reply(msg):
#这个是向发送者发送消息
itchat.send_msg('已经收到了文本消息,消息内容为%s'%msg['Text'],toUserName=msg['FromUserName'])
return"Treveived:%s"%msg["Text"]#返回的给对方的消息,msg["Text"]表示消息的内容
带对象参数注册,对应消息对象将调用该方法,其中isFriendChat表示好友之间,isGroupChat表示群聊,isMapChat表示公众号
importitchat
fromitchat.contentimport*
@itchat.msg_register(TEXT,isFriendChat=True,isGroupChat=True,isMpChat=True)
deftext_reply(msg):
msg.user.send("%s:%s"%(mst.type,msg.text))
向注册方法传入的msg包含微信返回的字典的所有内容.itchat增加Text,Type(也就是参数)键值,方便操作.
itcaht.content中包含所有的消息类型参数,如下表
发送的文件名(图片给出的默认文件名),都存储在msg的FileName键中.
下载方法,接受一个可用的位置参数(包括文件名),并将文件响应的存储.
注意:下载的文件存储在指定的文件中,直接将路径与FileName连接即可,如msg["Text"]('/tmp/weichat'+msg['FileName'])
@itchat.msg_register([PICTURE,RECORDING,ATTACHMENT,VIDEO])
defdownload_files(msg):
#msg.download(msg['FileName'])#这个同样是下载文件的方式
msg['Text'](msg['FileName'])#下载文件
#将下载的文件发送给发送者
itchat.send('@%s@%s'%('img'ifmsg['Type']=='Picture'else'fil',msg["FileName"]),msg["FromUserName"])
isAt判断是否@本号 ActualNickName:实际NickName(昵称) Content:实际Content
importitcaht
fromitchat.contentimportTEXT
@itchat.msg_register(TEXT,isGroupChat=True)
deftext_reply(msg):
if(msg.isAt):#判断是否有人@自己
#如果有人@自己,就发一个消息告诉对方我已经收到了信息
itchat.send_msg("我已经收到了来自{0}的消息,实际内容为{1}".format(msg['ActualNickName'],msg['Text']),toUserName=msg['FromUserName'])
itchat.auto_login()
itchat.run()
{
"FromUserName":"",
"ToUserName":"",
"Content":"",
"StatusNotifyUserName":"",
"ImgWidth":0,
"PlayLength":0,
"RecommendInfo":{},
"StatusNotifyCode":0,
"NewMsgId":"",
"Status":0,
"VoiceLength":0,
"ForwardFlag":0,
"AppMsgType":0,
"Ticket":"",
"AppInfo":{},
"Url":"",
"ImgStatus":0,
"MsgType":0,
"ImgHeight":0,
"MediaId":"",
"MsgId":"",
"FileName":"",
"HasProductId":0,
"FileSize":"",
"CreateTime":0,
"SubMsgType":0
}
MsgType:51 FromUserName:自己ID ToUserName:自己ID StatusNotifyUserName:最近联系的联系人ID Content:#最近联系的联系人 filehelper,xxx@chatroom,wxid_xxx,xxx,... #朋友圈 MomentsUnreadMsgStatus 1454502365 #未读的功能账号消息,群发助手,漂流瓶等
MsgType:1 FromUserName:发送方ID ToUserName:接收方ID Content:消息内容
itchat增加了Text键,键值为下载该图片的方法.
MsgType:3 FromUserName:发送方ID ToUserName:接收方ID MsgId:用于获取图片,用于表示每一条消息 Content:
*itchat增加了Text键,键值为下载该视频的方法.*
MsgType:62 FromUserName:发送方ID ToUserName:接收方ID MsgId:用于获取小视频 Content:
MsgType:1 FromUserName:发送方ID ToUserName:接收方ID Content:http://weixin.qq.com/cgi-bin/redirectforward?args=xxx OriContent:
MsgType:42 FromUserName:发送方ID ToUserName:接收方ID Content:RecommendInfo: { "UserName":"xxx",#ID,这里的是昵称 "Province":"xxx", "City":"xxx", "Scene":17, "QQNum":0, "Content":"", "Alias":"xxx",#微信号 "OpCode":0, "Signature":"", "Ticket":"", "Sex":0,#1:男,2:女 "NickName":"xxx",#昵称 "AttrStatus":4293221, "VerifyFlag":0 }
@itchat.msg_register(itchat.content.CARD,isFriendChat=True) defsimply(msg): printmsg['Text'] printmsg['Content'] itchat.add_friend(userName=msg['Text']['UserName'])#添加推荐的好友 printmsg['RecommendInfo'] printmsg['RecommendInfo']['UserName']
MsgType:34 FromUserName:发送方ID ToUserName:接收方ID MsgId:用于获取语音 Content:
MsgType:47 FromUserName:发送方ID ToUserName:接收方ID Content:
MsgType:49 AppMsgType:5 FromUserName:发送方ID ToUserName:接收方ID Url:链接地址 FileName:链接标题 Content:5 ...
MsgType:49
AppMsgType:3
FromUserName:发送方ID
ToUserName:接收方ID
Url:链接地址
FileName:音乐名
AppInfo:#分享链接的应用
{
Type:0,
AppID:wx485a97c844086dc9
}
Content:
3
0
0
http://ws.stream.qqmusic.qq.com/C100003i9hMt1bgui0.m4a?vkey=6867EF99F3684&guid=ffffffffc104ea2964a111cf3ff3edaf&fromtag=46
http://ws.stream.qqmusic.qq.com/C100003i9hMt1bgui0.m4a?vkey=6867EF99F3684&guid=ffffffffc104ea2964a111cf3ff3edaf&fromtag=46
0
http://imgcache.qq.com/music/photo/album/63/180_albumpic_143163_0.jpg
0
29
摇一摇搜歌
isAt:判断是否@本号 ActualNickName:实际NickName Content:实际Content
MsgType:1 FromUserName:@@xxx ToUserName:@xxx Content: @xxx:
xxx
MsgType:49 AppMsgType:2001 FromUserName:发送方ID ToUserName:接收方ID Content:未知
MsgType:10000 FromUserName:发送方ID ToUserName:自己ID Content: "你已添加了xxx,现在可以开始聊天了。" "如果陌生人主动添加你为朋友,请谨慎核实对方身份。" "收到红包,请在手机上查看"
tchat为三种账号都提供了整体获取方法与搜索方法.
itchat.get_friends()返回完整的好友列表
每个好友为一个字典,其中第一项为本人的账号信息;
传入update=True,将更新好友列表并返回,get_friends(update=True)
search_friends
itchat.get_friends()好友搜索,有以下四种方式
仅获取自己的用户信息
#获取自己的用户信息,返回自己的属性字典 itchat.search_friends()
获取特定UserName的用户信息
#获取特定UserName的用户信息 itchat.search_friends(userName='@abcdefg1234567') ##获取发送信息的好友的详细信息 @itchat.msg_register(itchat.content.TEXT,isFriendChat=True) defreply(msg): printmsg['FromUserName'] printitchat.search_friends(userName=msg['FromUserName'])#详细信息 printitchat.search_friends(userName=msg['FromUserName'])['NickName']#获取昵称
获取备注,微信号,昵称中的任何一项等于name键值的用户.(可以与下一项配置使用.)
比如在我的微信中有一个备注为autolife的人,我可以使用这个方法搜索出详细的信息
#获取任何一项等于name键值的用户 itchat.search_friends(name='autolife')
获取备注,微信号,昵称分别等于相应键值的用户.(可以与上一项配置使用.)
#获取分别对应相应键值的用户 itchat.search_friends(wechatAccount='littlecodersh') #三、四项功能可以一同使用 itchat.search_friends(name='LittleCoder机器人',wechatAccount='littlecodersh')
update_friend
主要用于好友更新
特定用户:传入用户UserName,返回指定用户的最新信息.
用户列表:传入UserName组成的列表,返回用户最新信息组成的列表
memberList=itchat.update_friend('@abcdefg1234567')
get_mps
将返回完整的工作号列表
每个公众号为一个字典,
传入update=True将更新公众号列表,并返回.
search_mps
获取特定UserName的公众号
#获取特定UserName的公众号,返回值为一个字典 itchat.search_mps(userName='@abcdefg1234567')
获取名字中还有特定字符的公众号.
#获取名字中含有特定字符的公众号,返回值为一个字典的列表 itchat.search_mps(name='LittleCoder')
当两项都是勇士,将仅返回特定UserName的公众号.
get_chatrooms:返回完整的群聊列表.
search_chatrooms:群聊搜索.
update_chatroom:获取群聊用户列表或更新该群聊.
群聊在首次获取中不会获取群聊的用户列表,所以需要调用该命令才能获取群聊成员.
传入群聊的UserName,返回特定群聊的详细信息.
传入UserName组成的列表,返回指定用户的最新信息组成的列表.
memberList=itchat.update_chatroom('@@abcdefg1234567',detailedMember=True)
创建群聊,增加/删除群聊用户:
由于之前通过群聊检测是否被好友拉黑的程序,目前这三个方法都被严格限制了使用频率.
删除群聊需要本账号为管理员,否则无效.
将用户加入群聊有直接加入与发送邀请,通过useInvitation设置.
超过40人的群聊无法使用直接加入的加入方式.
memberList=itchat.get_frients()[1:] #创建群聊,topic键值为群聊名称. chatroomUserName=itchat.create_chatroom(memberList,"testchatroom") #删除群聊内的用户 itchat.delete_member_from_chatroom(chatroomUserName,memberList[0]) #增加用户进入群聊. itchat.add_member_into_chatroom(chatroomUserName,memberList[0],useInvitation=False)
itchat.add_friend itchat.new_instance itchat.add_member_into_chatroom itchat.originInstance itchat.auto_login itchat.returnvalues itchat.check_login itchat.run itchat.components itchat.search_chatrooms itchat.config itchat.search_friends itchat.configured_reply itchat.search_mps itchat.content itchat.send itchat.core itchat.send_file itchat.Core itchat.send_image itchat.create_chatroom itchat.send_msg itchat.delete_member_from_chatroom itchat.send_raw_msg itchat.dump_login_status itchat.send_video itchat.get_chatrooms itchat.set_alias itchat.get_contact itchat.set_chatroom_name itchat.get_friends itchat.set_logging itchat.get_head_img itchat.set_pinned itchat.get_mps itchat.show_mobile_login itchat.get_msg itchat.start_receiving itchat.get_QR itchat.storage itchat.get_QRuuid itchat.update_chatroom itchat.instanceList itchat.update_friend itchat.load_login_status itchat.upload_file itchat.log itchat.utils itchat.login itchat.VERSION itchat.logout itchat.web_init itchat.msg_register
下面是博主写的一个程序,该程序的主要功能是监控撤回消息,并且如果有消息撤回就会撤回的消息发送给你,以后再也不用担心看不到好友的撤回的消息了,由于注释写的很详细,因此这里就不在详细的讲解了,直接贴代码
代码
#coding:utf-8
importitchat
fromitchat.contentimportTEXT
fromitchat.contentimport*
importsys
importtime
importre
reload(sys)
sys.setdefaultencoding('utf8')
importos
msg_information={}
face_bug=None#针对表情包的内容
@itchat.msg_register([TEXT,PICTURE,FRIENDS,CARD,MAP,SHARING,RECORDING,ATTACHMENT,VIDEO],isFriendChat=True,isGroupChat=True,isMpChat=True)
defhandle_receive_msg(msg):
globalface_bug
msg_time_rec=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())#接受消息的时间
msg_from=itchat.search_friends(userName=msg['FromUserName'])['NickName']#在好友列表中查询发送信息的好友昵称
msg_time=msg['CreateTime']#信息发送的时间
msg_id=msg['MsgId']#每条信息的id
msg_content=None#储存信息的内容
msg_share_url=None#储存分享的链接,比如分享的文章和音乐
printmsg['Type']
printmsg['MsgId']
ifmsg['Type']=='Text'ormsg['Type']=='Friends':#如果发送的消息是文本或者好友推荐
msg_content=msg['Text']
printmsg_content
#如果发送的消息是附件、视屏、图片、语音
elifmsg['Type']=="Attachment"ormsg['Type']=="Video"\
ormsg['Type']=='Picture'\
ormsg['Type']=='Recording':
msg_content=msg['FileName']#内容就是他们的文件名
msg['Text'](str(msg_content))#下载文件
#printmsg_content
elifmsg['Type']=='Card':#如果消息是推荐的名片
msg_content=msg['RecommendInfo']['NickName']+'的名片'#内容就是推荐人的昵称和性别
ifmsg['RecommendInfo']['Sex']==1:
msg_content+='性别为男'
else:
msg_content+='性别为女'
printmsg_content
elifmsg['Type']=='Map':#如果消息为分享的位置信息
x,y,location=re.search(
""+x.__str__()+"经度->"+y.__str__()#内容为详细的地址
else:
msg_content=r""+location
elifmsg['Type']=='Sharing':#如果消息为分享的音乐或者文章,详细的内容为文章的标题或者是分享的名字
msg_content=msg['Text']
msg_share_url=msg['Url']#记录分享的url
printmsg_share_url
face_bug=msg_content
##将信息存储在字典中,每一个msg_id对应一条信息
msg_information.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
}
}
)
##这个是用于监听是否有消息撤回
@itchat.msg_register(NOTE,isFriendChat=True,isGroupChat=True,isMpChat=True)
definformation(msg):
#这里如果这里的msg['Content']中包含消息撤回和id,就执行下面的语句
if'撤回了一条消息'inmsg['Content']:
old_msg_id=re.search("\(.*?)\<\/msgid\>",msg['Content']).group(1)#在返回的content查找撤回的消息的id
old_msg=msg_information.get(old_msg_id)#得到消息
printold_msg
iflen(old_msg_id)<11:#如果发送的是表情包
itchat.send_file(face_bug,toUserName='filehelper')
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')
#如果是分享的文件被撤回了,那么就将分享的url加在msg_body中发送给文件助手
ifold_msg['msg_type']=="Sharing":
msg_body+="\n就是这个链接➣"+old_msg.get('msg_share_url')
#将撤回消息发送到文件助手
itchat.send_msg(msg_body,toUserName='filehelper')
#有文件的话也要将文件发送回去
ifold_msg["msg_type"]=="Picture"\
orold_msg["msg_type"]=="Recording"\
orold_msg["msg_type"]=="Video"\
orold_msg["msg_type"]=="Attachment":
file='@fil@%s'%(old_msg['msg_content'])
itchat.send(msg=file,toUserName='filehelper')
os.remove(old_msg['msg_content'])
#删除字典旧消息
msg_information.pop(old_msg_id)
itchat.auto_login(hotReload=True)
itchat.run()
以上就是本文关于python实现微信接口(itchat)详细介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:基于Python和Scikit-Learn的机器学习探索等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!