前言
说明:
机器人的框架找了很久,由于很多框架都不能使用了或者封号率极高,最后选择了wewechaty,wechaty是可以使用ipad协议,主要是以node写的,因为打算机器人接入爬虫项目,所以特意用了python版本,对于python版网上教程太少且模糊且时间过于久远,所做以此文为采坑记录。
前期准备:
token:
padlocal (新用户可以免费领取七天)百度智能云:千帆模型 (不需要接入文心一言的可以绕过)
可能用到的网站:
wechaty中文文档 :node版本可以查看相关语法与使用,大致python差不多
python-wechaty:python文档没有node版本齐全 大致也能搭建
快速搭建
提示:本文默认都对Docker的基本使用有所了解的基础下进行
总体来说分为两步:
1.Docker启动Padlocal网关服务的容器(固定)
2.Docker启动自己的python服务的容器连接启动的网关服务(自己的机器人代码)
第一步:
新建SH文件 start.sh
export WECHATY_LOG="verbose" export WECHATY_PUPPET="wechaty-puppet-padlocal" export WECHATY_PUPPET_PADLOCAL_TOKEN="puppet_padlocal_51d6b6a6a60546a7b33a5041c1e44a72" export WECHATY_PUPPET_SERVER_PORT="8004" export WECHATY_TOKEN="0c7b8f97-f3cc-40a5-a537-d492fd689801" sed -i s/token=.*/token=$WECHATY_TOKEN/g .env docker run -ti \ --name wechaty_puppet_service_token_gateway \ --rm \ -e WECHATY_LOG \ -e WECHATY_PUPPET \ -e WECHATY_PUPPET_PADLOCAL_TOKEN \ -e WECHATY_PUPPET_SERVER_PORT \ -e WECHATY_TOKEN \ -p "$WECHATY_PUPPET_SERVER_PORT:$WECHATY_PUPPET_SERVER_PORT" \ wechaty/wechaty:0.65
主要参数说明:
WECHATY_PUPPET
:协议标识 这里我们使用wechaty-puppet-padlocal作为ipd协议
WECHATY_PUPPET_PADLOCAL_TOKEN
:上文中提到的申请的token,必填必正常否则无法使用
WECHATY_PUPPET_SERVER_PORT
:端口号,需要服务器开放该端口,供python服务调用
WECHATY_TOKEN
:随机生成UUID,避免服务被他人窃取 可用import uuid;print(uuid.uuid4())或者在线生成uuid其余参数可以不变
运行该文件,启动Padlocal网关,启动后如提示信息为微信登录图片,可复制到浏览器扫码登录。
第二步:
新增python项目,bot.py文件,以下为官方示例删减后代码,主要图一个方便理解
import asyncio, os from wechaty import Wechaty class MyBot(Wechaty): async def on_message(self, msg): from_contact = msg.talker() text = msg.text() room = msg.room() if text == 'ding': conversation = from_contact if room is None else room await conversation.ready() await conversation.say('dong') os.environ['TOKEN'] = "1fe5f846-3cfb-401d-b20c-XXXXX" os.environ['WECHATY_PUPPET_SERVICE_ENDPOINT'] = "127.0.0.1:9001" bot = MyBot() #bot.on('scan', lambda status, qrcode, data: print( # 'Scan QR Code to login: {}\nhttps://wechaty.js.org/qrcode/{}'.format(status, qrcode))) #bot.on('login', lambda user: print('User {} logged in'.format(user))) #bot.on('message', lambda message: print('Message: {}'.format(message)))
主要说一下作用:收到消息为ding的消息,回复dong
msg.talker()
获取消息的发送者
msg.text()
获取消息内容
msg.room()
群里消息,如果消息不是来自群聊, 则返回None 特别注意:如果是群里对象msg.talker()也会有值,值为当前群里发送消息的人
conversation.ready()
当所有数据加载完成时发出(如果是个人使用主体为talker()回复,如是群使用主体为room())
conversation.say()
发送消息(同上如果是个人使用主体为talker()回复,如是群使用主体为room()),
如果是群聊发送指定人则填入第二个参数即可,第二个参数为:msg.talker().contact_id
os.environ['TOKEN']
填入之前生成的随机数uuid
os.environ['WECHATY_PUPPET_SERVICE_ENDPOINT']
刚部署的服务器地址 端口需要与之前第一步设定的一致
bot.on
方法监听事件:
例如scan事件:当需要扫码登录时触发,还有比如login登录成功后触发,room-join加入群聊触发更多详情可建文档
还需要注意的几个重要方法:
1.
msg.is_self()
是否自己(机器人)发出的消息,机器人发的消息也会进入当前函数2.
msg.type()
判断消息类型,注意:比如加入群聊或者退出群里都会进入当期函数
本地运行的话就可以实现一个简单的机器人,向其发送ding则会收到dong的回复
至此,微信机器人搭建,可根据个性需求回复个性内容。
如需要部署到服务器还需要构建docker镜像,以下为懒人办法创建Dockerfille,Makefile,requirements.txt,如以下目录
Dockerfille
WORKDIR /bot COPY requirements.txt requirements.txt COPY Makefile Makefile RUN make install COPY . . CMD [ "make", "run"]
基于python3.8的环境
Makefile
P=$(shell pwd) .PHONY: build build: docker build -t py-wechaty-template-bot:latest . .PHONY: dockerrun dockerrun: docker run -it -d -v $(P):/bot --name bot -p 8005:8005 py-wechaty-template-bot:latest .PHONY: bot bot: make build make dockerrun .PHONY: install install: pip install -r requirements.txt .PHONY: run run: python bot.py
注意端口不能与之前的服务端口重复
requirements.txt
wechaty wechaty-plugin-contrib quart python-dotenv docker apscheduler dataclasses-json urllib3 == 1.26 pymysql
特别注意:
urllib3最好安装1.26版本本人经过几次失败后总结
在当前目录运行 make bot 即可部署上服务器
文心一言
第一步开通服务
打开千帆模型,选中左侧菜单计费管理,选择开通服务
选中预置服务 勾选前三个 点击下一步
根据提示直到开通成功
选择左边应用接入,创建应用,输入应用名称描述、创建
记住API Key和Secret Key 鉴权接口需要
第二步调用api
获取鉴权的token
鉴权文档
使用ERNIE-Bot模型 文档地址:https://cloud.baidu.com/doc/WENXINWORKSHOP/s/jlil56u11
重点说一下messages参数格式
messages是一个聊天上下文信息,一个成员代表单轮对对话,数组长度必须为奇数
例如:
messages=[ { "role": "user", "content": "你好" }, { "role": "assistant", "content": "你好!" }, { "role": "user", "content": "你叫什么名字" } ]
role
:user: 表示用户 assistant: 表示对话助手
content
:对话内容每次为奇数也就是代表用户最后的提问,如果长度为1那么就是一次新的回话
接下来封装api,结合微信机器人就可以打造自动回复的微信机器人了