开篇
马上就要到农历新年了,不妨写一段代码准时为好友们送上祝福。
该 Demo 使用开源项目 openwechat ,实现获取好友列表、为好友发送消息、图片或文件,接收来自好友或群组的消息并设置自动回复等功能。
openwechat Github地址
openwechat 文档地址
代码结构
项目入口
代码很简单,就是调用一下微信的启动方法即可
启动微信
package bootstrapimport ("os"wechat "wechatbot/handler""wechatbot/task""github.com/eatmoreapple/openwechat"log "github.com/sirupsen/logrus"
)func StartWebChat() {//清除旧的token文件os.Remove("token.json")//初始化桌面微信bot := openwechat.DefaultBot(openwechat.Desktop)//设置微信消息处理模块,自动回复bot.MessageHandler = wechat.Handler//显示登陆二维码bot.UUIDCallback = openwechat.PrintlnQrcodeUrlreloadStorage := openwechat.NewJsonFileHotReloadStorage("token.json")err := bot.HotLogin(reloadStorage)if err != nil {if err = bot.Login(); err != nil {log.Fatal(err)return}}// 获取登陆用户信息self, err := bot.GetCurrentUser()if err != nil {log.Fatal(err)return}// 获取好友列表friends, err := self.Friends()if err != nil {log.Fatal(err)return} else {// 初始化定时任务 nytask := task.NewYearMessageDomain{Content: "零时的钟声响彻天涯,新年的列车准时出发.它驮去难忘的岁月,迎来了又一轮火红的年华.祝你新年快乐,鹏程万里!",Imguris: []string{"E:\\新年快乐.jpg"},Receivers: []string{"xxxxx1","xxxxx2"},Blacklist: []string{"xxxxx3"},Friends: friends}nytask.InitTask()}//阻塞进程 等待桌面微信退出err = bot.Block()if err != nil {log.Fatal(err)return}
}
微信消息处理模块
在启动微信时,我们设置了微信消息处理函数
我们查看这个 MessageHandler 可以发现其实是一个自定义的 func 类型,接收 Message 指针类型并做处理
所以 我们需要创建的 wechat.Handler 必须是和 MessageHandler 具有相同参数和返回值的方法。
package wechatimport ("strings""github.com/eatmoreapple/openwechat"log "github.com/sirupsen/logrus"
)func Handler(msg *openwechat.Message) {err := handle(msg)if err != nil {log.Errorf("handle error: %s\n", err.Error())return}
}func handle(msg *openwechat.Message) error {if !msg.IsText() {//只处理回复文本消息return nil}return ReplyText(msg)
}func ReplyText(msg *openwechat.Message) error {sender, err := msg.Sender()if err == nil {if sender.IsFriend() { //判断如果是好友发来的消息,则处理msgContent := msg.Content//如果好友发来了新年好 或者 新年快乐,回复新年好if strings.Contains(msgContent, "新年") && (strings.Contains(msgContent, "好") || strings.Contains(msgContent, "快乐")) {msg.ReplyText("新年好呀")}}} else {log.Fatal(err)}return nil
}
定时任务
定时任务使用的是 robfig/cron 的框架,
robfig/cron 文档地址
创建一个 NewYearMessageDomain 结构体,里面包含以下属性:
1、要发送的文本消息
2、要发送的图片地址
3、设置的接收人列表,可以为空就会发送给所有好友
4、设置的黑名单列表
5、openwechat 好友信息列表
package taskimport ("fmt""os""time""github.com/eatmoreapple/openwechat""github.com/robfig/cron/v3"
)type NewYearMessageDomain struct {Content string //文本消息Imguris []string //图片地址Receivers []string //接收人Blacklist []string //黑名单Friends openwechat.Friends //好友列表
}// 判断切片中是否存在某个元素
func (nymd *NewYearMessageDomain) find(slice []string, val string) bool {for i := range slice {if slice[i] == val {return true}}return false
}//初始化定时任务的方法
func (nymd *NewYearMessageDomain) InitTask() {//设置定时任务crontab := cron.New(cron.WithSeconds()) //精确到秒//定义定时器调用的任务函数task := func() {for i := range nymd.Friends {friend := nymd.Friends[i]//好友在黑名单里 不发送消息if nymd.find(nymd.Blacklist, friend.NickName) {continue}//如果设置了发送好友列表 则判断是否在列表中,否则直接发送if (len(nymd.Receivers) > 0 && nymd.find(nymd.Receivers, friend.NickName)) || len(nymd.Receivers) == 0 {if len(nymd.Content) > 0 {//发送祝福语friend.SendText(nymd.Content)}if len(nymd.Imguris) > 0 {//设置了图片路径 发送图片for i := range nymd.Imguris {fileInfos, err := os.Open(nymd.Imguris[i])defer fileInfos.Close()if err == nil {time.Sleep(time.Millisecond * 50) //频繁发送可能会被微信限制friend.SendImage(fileInfos)} else {fmt.Println(err)}}}}}}//设置cron表达式 指定时间spec := "0 0 0 21 1 2023"// 添加定时任务crontab.AddFunc(spec, task)// 启动定时器crontab.Start()
}
效果
启动程序后会弹出二维码,手机微信扫描之后登录桌面微信。
自动发送消息。
自动回复的功能。