开篇

马上就要到农历新年了,不妨写一段代码准时为好友们送上祝福。
Demo 使用开源项目 openwechat ,实现获取好友列表、为好友发送消息、图片或文件,接收来自好友或群组的消息并设置自动回复等功能。
openwechat Github地址openwechat 文档地址

代码结构

微信信息自动回复java 微信自动回复 github_微信

项目入口

代码很简单,就是调用一下微信的启动方法即可

启动微信

package bootstrap

import (
	"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.PrintlnQrcodeUrl

	reloadStorage := 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
	}
}

微信消息处理模块

在启动微信时,我们设置了微信消息处理函数

微信信息自动回复java 微信自动回复 github_微信_02


我们查看这个 MessageHandler 可以发现其实是一个自定义的 func 类型,接收 Message 指针类型并做处理

微信信息自动回复java 微信自动回复 github_golang_03


所以 我们需要创建的 wechat.Handler 必须是和 MessageHandler 具有相同参数和返回值的方法。

package wechat

import (
	"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 task

import (
	"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()
}

效果

启动程序后会弹出二维码,手机微信扫描之后登录桌面微信。

微信信息自动回复java 微信自动回复 github_微信_04


自动发送消息。

微信信息自动回复java 微信自动回复 github_微信_05


自动回复的功能。

微信信息自动回复java 微信自动回复 github_golang_06