分享

python实现微信自动回复机器人+查看别人撤回的消息(部署到云服务器)

 python_lover 2020-01-15

前言

  • 首先你的微信号能够登录网页版微信,才能打造你的专属个人微信号机器人,点击跳转网页版微信登录页面

  • 类似的文章网上也都有,其实我也是受到别的文章的一些启发,因为不是每个人都想实现同样的功能的,直接套用别人的代码不严谨而且bug太多,于是就想自己动手从零开始实现一个属于自己的微信机器人,不过呢,也大同小异吧。

  • 算下来前前后后加上写这篇博客花了大概一周的时间,因为都是用零零散散的时间进行开发以及测试然后修改bug再加功能再开发,这么一个循环,从一开始的只能回复消息、到现在能够:回复特定群聊消息、特殊群聊特殊处理、回复表情包、查看所有别人撤回的消息以及操控微信机器人等等等等。

好的,废话不多说,接下来就开始吧。

一、准备

  1. python3.7(重中之重,后面会解释)

  2. itchat(直接用pip命令安装即可)

  3. jupyter notebook(随意,用你最喜欢的编译器即可,不过最后还是要把代码放在一个py文件里)

  4. NLP实现一个聊天机器人(限于本人没学过自然语言处理,并且空闲时间也不多,其实就是因为太难了。。那就只能先调用别人的接口啦)

二、开始

ps:详情请看代码注释,若不想分函数来看也可以直接看完整代码

  • 定义获取好友的昵称和好友的备注函数

def get_friendname():friends_name={} #存储好友的微信昵称和备注friends=itchat.get_friends(update=True) #返回的是一个存储所有好友信息的列表,每个好友的信息都是用一个字典来存放for friend in friends[1:]: #第一个为自己,所以这里排除了自己friends_name.update({friend['UserName']:{'nickname':friend['NickName'],'remarkname':friend['RemarkName']}})return friends_name
  • 定义群聊信息的函数
    ps:这个获取群聊信息的函数只能读取到你保存到通讯录中的群聊,那些没有保存到通讯录中的是显示不出来的,不过不影响获取群聊信息,它只是没有显示而已,后面添加特定群聊就算是没有保存通讯录的都是可以添加的,一样可以回复特定群聊。

def get_username():chatrooms=itchat.get_chatrooms(update=True) #返回的是一个所有群聊的信息的列表,每个群聊信息都是用一个字典来存放user_name=[] #接收特定群聊@本人的消息,并回复;存放特定群聊的usernameall_user_name=[] #存放全部群聊的usernamevip=[] #存放特定群聊的名称if os.path.exists('./vip.txt'):with open('./vip.txt','r',encoding='utf-8') as f:for i in f.read().split('\n')[:-1]:vip.append(i)for chatroom in chatrooms:all_user_name.append(chatroom['UserName'])if chatroom['NickName'] in vip:user_name.append(chatroom['UserName'])return all_user_name,user_name,vip
  • 定义获取聊天机器人返回信息的函数点击跳转在线聊天机器人

def get_response(msg):url=''#看到请求url好像涉及到一些sessionid、userid等信息,可能直接复制会用不了什么的,所以你们直接去分析一下网页即可拿到啦,把content参数format成msg即可headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}r=requests.get(url,headers=headers)response=re.findall('"body":{"fontStyle":0,"fontColor":0,"content":"(.*?)","emoticons":{}}}',r.text)[1].replace('\\r\\n','')return response
  • 定义获取聊天机器人词穷时要回复消息的函数

def get_words():words=[]if os.path.exists('./words.txt'):with open('./words.txt','r',encoding='utf-8') as f:for i in f.read().split('\n')[:-1]:words.append(i)return words
  • 定义注册消息函数(重头戏)

# 包括文本(表情符号)、位置、名片、通知、分享、图片(表情包)、语音、文件、视频@itchat.msg_register([TEXT,MAP,CARD,SHARING,PICTURE,RECORDING,ATTACHMENT,VIDEO],isFriendChat=True,isGroupChat=True) #监听个人消息和群聊消息def download_reply_msg(msg):global flag,sj,isrun,use_info #flag判断要不要进入斗图模式,sj控制斗图的时间长短,isrun判断是否启动自动回复机器人(默认运行中),通过向传输助手发指令来控制,use_info说明文档all_user_name,user_name,vip=get_username()#每次接受消息时要拿到当前规定的群聊和特定群聊信息,后面用来分别做处理words=get_words() #拿到当前自定义回复消息的信息now_time=int(time.time()) #记录获取这条消息的时间,后面处理撤回消息的时候用到b=[] #用来记录已经过了可以撤回的时间的消息if len(msg_dict) != 0:for key,value in msg_dict.items():if (now_time - value['time']) >= 125: #经过验证发现消息2分钟之内才能撤回,这里为了保险起见加多5秒钟b.append(key)for eachkey in list(msg_dict.keys()):if eachkey in b: #要是过了撤回时间的消息是文件类型的就把它们删除,避免增加不必要的磁盘空间,盘大的请随意if 'file' in msg_dict[eachkey].keys():os.remove(msg_dict[eachkey]['file'])msg_dict.pop(eachkey)#---------------------------------------------------------#下面开始存储各类消息,主要是用来查看别人撤回的消息,后面会用到if msg['Type'] in [MAP,SHARING]: #地图或者分享old_id=msg['MsgId']link=msg['Url']msg_dict.update({old_id:{'type':msg['Type'],'data':link,'time':now_time}})elif msg['Type'] in [PICTURE,RECORDING,ATTACHMENT,VIDEO]:if msg['ToUserName'] != 'filehelper': # 避免给文件传输助手发文件也传入字典,没必要而且传入字典只是为了防止撤回,况且它是没有撤回的old_id=msg['MsgId']file='./保存的文件/'+ msg['MsgId'] + '.' + msg['FileName'].split('.')[-1]msg['Text'](file)msg_dict.update({old_id:{'type':msg['Type'],'file':file,'time':now_time}})else:file='./保存的文件/'+ msg['FileName']msg['Text'](file)elif msg['Type'] == CARD: #名片old_id=msg['MsgId']link=re.findall('bigheadimgurl="(.*)" smallheadimgurl',str(msg))[0]msg_content = '来自' + msg['RecommendInfo']['Province'] +msg['RecommendInfo']['City'] + '的'+ msg['RecommendInfo']['NickName'] + '的名片'    #内容就是推荐人的昵称和性别if msg['RecommendInfo']['Sex'] == 1:msg_content += ',男的'else:msg_content += ',女的'msg_dict.update({old_id:{'type':msg['Type'],'head':link,'data':msg_content,'time':now_time}})elif msg['Type'] == TEXT: #文本old_id=msg['MsgId']text=msg['Text']msg_dict.update({old_id:{'type':msg['Type'],'data':text,'time':now_time}})#---------------------------------------------------------#下面是自动回复消息的(一切回复逻辑都在这里)if msg['ToUserName'] != 'filehelper': # 避免给文件传输助手发消息也自动回复if isrun == '运行中......': #操控机器人的,想停就停,想启动就启动,不用关掉程序,而且不影响查看撤回消息的功能if msg['FromUserName'] in all_user_name:if msg['FromUserName'] in user_name: #当消息来自特定群聊时,下面代码才会执行if sj is not None:if int(time.time()) - sj >= 900: #斗图时间:15分钟flag=0sj=Noneif (msg['isAt'] is True)&(msg['Type'] == TEXT):myname='@' + re.findall("'Self'.*?'DisplayName': '(.*?)', 'KeyWord'",str(msg))[0] if re.findall("'Self'.*?'DisplayName': '(.*?)', 'KeyWord'",str(msg))[0] != '' else '这里填你自己的微信昵称'if '帅哥来斗图' in msg['Text']:flag=1sj=int(time.time())num=random.choice(os.listdir('./表情包'))msg.user.send('@img@./表情包/{}'.format(num))

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多