首页 » 网站建设 » itchatphp技巧_树莓派实战微信机械人itchat实现

itchatphp技巧_树莓派实战微信机械人itchat实现

访客 2024-11-20 0

扫一扫用手机浏览

文章目录 [+]

什么是树莓派?树莓派是一个信用卡大小的单板打算机,ARM架构CPU,低功耗,可以7×24跑Linux做事器,连接各种扩展硬件,以是发挥想象力,就能做很多故意思的事情。

需求

你有没有想过,拥有一个微信机器人,可以自动回答、AI谈天、定时发送景象预报、掌握摄像头等等。
利用树莓派+开源库itchat,就能实现上述所有需求。
为什么强调要用树莓派呢?由于它能7×24在线,可以把itchat客户端当作一个一直服的server。
特殊解释:本文仅供学习用,请勿用于任何商业和其它用场。

itchatphp技巧_树莓派实战微信机械人itchat实现

itchat简介

itchat是一个开源的微信个人号接口,利用不到三十行的代码,就可以完成一个能够处理所有信息的微信机器人。
github地址:https://github.com/littlecodersh/ItChat

itchatphp技巧_树莓派实战微信机械人itchat实现
(图片来自网络侵删)

你一定对事理感到好奇。
实在可以概括为一句话:itchat实质上是一个微信网页版客户端,它实现了微信网页版的协议/语义,通过http来通信。
详细源码可以看components包里的文件。

下面分点先容如何实现有趣的功能。

功能实现1、自动回答

首先得注册处理函数,即对不同类型的做处理。
微信分为文本、图片、语音、视频、好友申请等,可通过itchat的Python语法糖来注册不同类型的处理函数,有点类似Java里的表明。
如果是文本,可以识别个中的关键字,不同的关键字对应不同的逻辑处理。
默认是处理单聊的,也可以处理群聊的。
运行程序后,会弹出一个二维码,扫码即可登录,然后itchat程序就跑起来了。
其余需把稳,发给自己是没用的,变通的办法是发给文件传输助手filehelper,效果等同于发给自己。
下面给出一个demo,并加以注释。

import itchat, timefrom itchat.content import # 注册处理函数,回答文本、舆图、名片、备注、分享类型的@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])def text_reply(msg): # 回答以下:类型,内容文本 itchat.send('%s: %s' % (msg.type, msg.text)) # 根据不同的关键字,回答不同的 if '你好' in msg.text: itchat.send('你好啊') elif '拜拜' in msg.text: itchat.send('下次聊')# 注册处理函数,当收到图片、语音、附件、视频类型的时,下载内容@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])def download_files(msg): # 下载文件 msg.download(msg.fileName) typeSymbol = { PICTURE: 'img', VIDEO: 'vid', }.get(msg.type, 'fil') return '@%s@%s' % (typeSymbol, msg.fileName)# 注册处理函数,处理好友申请@itchat.msg_register(FRIENDS)def add_friend(msg): # 自动通过对方的好友申请 msg.user.verify() # 然后发送问候语 msg.user.send('Nice to meet you!')# 上面几个都是单聊,加上isGroupChat=True就能处理群聊@itchat.msg_register(TEXT, isGroupChat=True)def text_reply(msg): # 当在群聊被at时才回答,一样平常都会加上此条件,否则可能回答群内所有 if msg.isAt: # 回答时,也at对应的人 msg.user.send(u'@%s\u2005I received: %s' % ( msg.actualNickName, msg.text))# 会弹出一个二维码,扫码即可登录itchat.auto_login(True)# 运行itchat客户端,debug=True会打印日志itchat.run(True)2、AI谈天

有了第1步的根本,要实现AI谈天,就须要引入其余的AI本地库、或者在线API了,利用在线API更大略,只须要掌握传参、解析相应即可。
楼主利用了一个叫青云客的API,可免费利用(自己大略试用的条件下,非商用),带关键字命令的AI对话还是不错的,如果是自由对话,那大概率序言不搭后语。

# 调API来进行AI谈天,只有一个文本参数def ai_chat(msg): url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg=%s' % msg response = requests.get(url) return response.json()["content"].replace('{br}', '\n') # 相应里的换行是{br},更换为微信可识别的\n换行3、定时发送景象预报

有了第2步的根本,要获取景象预报信息,只须要在AI谈天的要求里传某地景象即可,比如:上海景象、北京景象。
当然,你也可以通过爬景象预报网页的字段,得到更详尽的景象预报信息,此处就不多谈论了。
定时发景象预报,要办理2个关键问题。

一是如何实行定时任务。
此处选用Python库apscheduler。
当然,也可以写一个Python脚本,然后通过操作系统的crontab在指定的韶光实行该脚本,不过还有更优雅的办法,在Python主程序内启动定时任务。
可以利用Python库apscheduler来实现定时任务的调度,类似于Java的ScheduledThreadPool。
二是如何发送到指定的群。
itchat已经供应了便捷的API来根据群名搜索详细的群。

from apscheduler.schedulers.blocking import BlockingScheduler# 发送景象预报信息到群里def weather_report(): msg = ai_chat('上海景象') # 获取所有群聊 itchat.get_chatrooms(update=True) # 根据群名,搜索详细的群 chatrooms = itchat.search_chatrooms(name='<此处改为实际的群名>') chatroom = itchat.update_chatroom(chatrooms[0]['UserName']) # 发送,到指定的群 itchat.send_msg(msg=msg,toUserName=chatroom['UserName'])if __name__ == '__main__': itchat.auto_login(hotReload=True) # itchat启动后是否壅塞,此处改为否(默认为是),相称于itchat在新启动的线程中运行,不壅塞主程序 itchat.run(blockThread=False) # 定时任务 scheduler = BlockingScheduler() # 指定在每天早上9点调用weather_report函数 scheduler.add_job(weather_report, 'cron', day_of_week='', hour=9, minute=0, second=0) scheduler.start()4、掌握摄像头,拍照、视频看看家里

树莓派4B有2个USB 3.0高速接口、2个USB 2.0接口,只须要个中一个连接上USB摄像头即可,一样平常2.0接口即可,3.0接口留给外接硬盘。
想要通过摄像头看到家里,要办理的关键问题是,利用什么拍照软件?利用什么视频谈天软件?

拍照

可以利用fswebcam来拍照,可以指定图像分辨率,也可以不指定,默认的分辨率较低。
安装:sudo apt install fswebcam

img_file = '%d.jpg' % timestamp # 调用fswebcam拍照 os.system('fswebcam %s' % img_file) # 发送照片至自己的文件传输助手,由于常日发给自己会失落败 itchat.send_image(img_file, toUserName='filehelper')

发起视频

楼主考试测验了几个常见的免费视频谈天软件,都无法支持,紧张缘故原由是树莓派是ARM CPU架构,主流软件基本上只在amd64、x86 CPU架构下发行。
比如QQ、Skype、网页版Jitsi Meet等都无法发起视频谈天。
终极,楼主创造了一个较为完美的办理方案,便是利用linphone:

发起视频:在树莓派上安装并打开linphone程序,也在手机上安装并打开linphone app。
这样通过微信就可以让树莓派上的linphone发起视频通话,手机端就能接到电话了。
挂断视频:须要通过微信机器人,在树莓派上主动退出linphone,否则后续不能连续发起视频。
下载最新的linphone可能无法正常事情,得利用sudo apt install linphone来安装旧的稳定版。

# 先退出linphone(如当前有在运行),再启动linphone os.system('linphonecsh exit; linphonecsh init -V -c .linphonerc') time.sleep(1) # 利用linphone命令行拨打视频通话 os.system('linphonecsh generic "call <更换成实际的linphone账号,需注册>"')完全代码

以下是楼主写的几个实用的例子,并加以注释。
完全代码已上传至github:https://github.com/topcoding/wechat_robot除了上面提到的几个功能实现,还增加了健身打卡、睡觉打卡的功能。
现在,微信机器人的功能已经越来越丰富了。

# -- coding: utf-8 --import itchatimport sqlite3import osimport timeimport requestsfrom apscheduler.schedulers.blocking import BlockingSchedulerPUNCH_TYPE_WORKOUT = 1PUNCH_TYPE_SLEEP = 2ai_chat_switch = TrueAI_CHATROOM_WHITELIST = ['<更换成实际的群名>']def save_db(punch_type, owner, timestamp = None): conn = sqlite3.connect('punch-card.db') cursor = conn.cursor() if timestamp is None: punch_time = (int) (time.time()) else: punch_time = timestamp cursor.execute("insert into punch_card(punch_type, owner, updated_at) values(%d, '%s', %d)" % (punch_type, owner, punch_time)) conn.commit() conn.close()@itchat.msg_register(itchat.content.TEXT)def text_reply(msg): print(msg) timestamp = (int) (time.time()) global ai_chat_switch if msg.text == '健身打卡': save_db(PUNCH_TYPE_WORKOUT, msg.User.NickName, timestamp) itchat.send('%s,您好,您于%s健身打卡成功' % (msg.User.NickName, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())), toUserName='filehelper') elif msg.text == '睡觉打卡': save_db(PUNCH_TYPE_SLEEP, msg.User.NickName, timestamp) itchat.send('%s,您好,您于%s睡觉打卡成功' % (msg.User.NickName, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())), toUserName='filehelper') elif msg.text == '拍照': img_file = '%d.jpg' % timestamp os.system('fswebcam %s' % img_file) itchat.send_image(img_file, toUserName='filehelper') elif msg.text == '看看家里': os.system('linphonecsh exit; linphonecsh init -V -c .linphonerc') time.sleep(1) os.system('linphonecsh generic "call <更换成实际的linphone账号,需注册>"') elif msg.text == '挂断视频': os.system('linphonecsh exit') elif msg.text == '群聊': ai_chat_switch = True elif msg.text == '群聊取消': ai_chat_switch = False else: # do nothing pass@itchat.msg_register('Text', isGroupChat = True)def group_reply(msg): if ai_chat_switch and msg['isAt'] and msg['User']['NickName'] in AI_CHATROOM_WHITELIST: print(msg) return u'@%s\u2005%s' % (msg['ActualNickName'], ai_chat(msg))def ai_chat(msg): url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg=%s' % msg response = requests.get(url) return response.json()["content"].replace('{br}', '\n')def weather_report(): msg = ai_chat('上海景象') itchat.get_chatrooms(update=True) chatrooms = itchat.search_chatrooms(name='<更换成实际的群名>') chatroom = itchat.update_chatroom(chatrooms[0]['UserName']) itchat.send_msg(msg=msg,toUserName=chatroom['UserName'])if __name__ == '__main__': itchat.auto_login(hotReload=True) itchat.run(blockThread=False) scheduler = BlockingScheduler() scheduler.add_job(weather_report, 'cron', day_of_week='', hour=9, minute=0, second=0) scheduler.start()折叠 更多例子

可以参考itchat供应的教程文档:https://github.com/littlecodersh/ItChat/tree/master/docs/tutorial

标签:

相关文章

phprapapi技巧_开源高效API治理对象RAP

紧张功能API设计RAP的API设计功能供应了一个直不雅观的界面,许可用户定义API的端点、支持的HTTP方法(如GET、POST...

网站建设 2024-12-13 阅读0 评论0