Golang -- openwechat发送消息、自动回复

news2024/11/25 22:54:18

开篇

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

代码结构

在这里插入图片描述

项目入口

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

启动微信

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
	}
}

微信消息处理模块

在启动微信时,我们设置了微信消息处理函数
在这里插入图片描述
我们查看这个 MessageHandler 可以发现其实是一个自定义的 func 类型,接收 Message 指针类型并做处理
在这里插入图片描述
所以 我们需要创建的 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()
}

效果

启动程序后会弹出二维码,手机微信扫描之后登录桌面微信。
在这里插入图片描述
自动发送消息。
在这里插入图片描述
自动回复的功能。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS设置元素内边距(padding)、外边距(margin)

设置元素内边距padding 所有的 HTML 元素基本都是以矩形为基础。 每个 HTML 元素周围的矩形空间由三个重要的属性来控制: padding(内边距) margin(外边距) border(边框) padding控制着元素内容…

产品经理需要懂的专业术语有哪些?

不同的行业都有着不同的专业术语,掌握专业术语不仅是个人专业能力的体现,还可以进一步促进工作中的交流,提高工作效率。 1、工作类 BRD:商业文档,包含了商业几乎,产品背景,可行性说明&#xff…

Redis底层数据结构简介

目录 1、Redis存储结构 2、数据结构 2.1、简单动态字符串(SDS) 2.2.1、SDS数据结构 2.2.2、编码 2.2.3、SDS与C字符串对比 2.2、链表(Linkedlist) 2.2.1、链表数据结构(双向链表) 2.2.2、特性 2.3、跳表(Skiplist) 2.3.1、数据结构 2.3.2、特点 2.3.3、增删查操作…

宝元机床联网

一、设备信息确认 宝元数控在台湾也是做的比较早的数控系统品牌,13年被研华并购。 1、确认型号 宝元的数控面板关机情况下是没办法判断型号的,要在开机的一瞬间确认。 此系统为:M520 注:目前接触宝元系统基本上都含网口。 2、…

maven依赖设置

之前说过了可以通过依赖的方式将一个大程序分为多个小的模块,模块之间可以利用依赖链接在一起。 但是如果有多个依赖的情况下会怎么样呢? A依赖于B、C,而B、C又有各自的依赖,那么A是否依赖于B、C的依赖呢? 答案是是的…

OpenResty中Lua变量的使用

全局变量 在 OpenResty 里面,只有在 init_by_lua* 和 init_worker_by_lua* 阶段才能定义真正的全局变量。 这是因为其他阶段里面,OpenResty 会设置一个隔离的全局变量表,以免在处理过程污染了其他请求。 即使在上述两个可以定义全局变量的阶…

全息(CSDN_0009_20220919)

文章编号:CSDN_0009_20220919 目录 全息的广义概念 发展历程 全息摄影 全息投影 全息影像 全息应用 全息投影 全息的广义概念 反映物体在空间存在时的整个情况的全部信息。 特指一种技术,可以让从物体发射的衍射光能够被重现,其位置和…

uniapp获取微信openid - 微信提现 - 登录授权 - AndroidStudio离线打包微信登陆

效果图 主要步骤 (详细步骤有配图) 登录微信开放平台,获取AppID + AppSecrethttps://open.weixin.qq.com/

mysql:浅显易懂——存储引擎

mysql:浅显易懂——存储引擎 最近学到了存储引擎(尚硅谷的康老师视屏)。 首先存储引擎并不是什么高大上的东西,可以直接理解为,表类型 所以存储引擎是针对表的描述。 那么如何学习?——就学mysqll中不同的表类型。和不同类型的…

【初阶数据结构】——二叉树OJ练习

文章目录前言1. 单值二叉树思路分析思路1. 遍历对比思路2. 递归代码实现2. 判断两棵二叉树是否相同思路分析代码实现3. 另一棵树的子树思路分析代码实现4. 返回二叉树结点的前序遍历数组思路分析代码实现5. 对称二叉树思路分析代码展示前言 上一篇文章我们刚刚学完二叉树初阶的…

使用nginx的rtmp模块搭建RTMP和HLS流媒体服务器

使用nginx的rtmp模块搭建RTMP和HLS流媒体服务器 文章目录使用nginx的rtmp模块搭建RTMP和HLS流媒体服务器环境搭建参数配置验证结果前面文章中已经介绍了《使用nginx搭建rtmp流媒体服务器》和《使用nginx搭建HLS服务器》,其实nginx的RTMP模块本身就支持接收RTMP推流、…

【jQuery】实现文件上传和loading效果

一、 jQuery实现文件上传1. 定义UI结构<!-- 导入 jQuery --><script src"./lib/jquery.js"></script><!-- 文件选择框 --><input type"file" id"file1" /><!-- 上传文件按钮 --><button id"btnUplo…

我们是存算一体化

从最初的计算和存储分离,随着技术的发展,存算一体化越来越被大家重视,成为了下一个发展浪潮。其实对于海量数据场景来说,我们更认为数据应该是存算协同的关系。存算一体化才是最高效的技术之一,但是目前真正的存算一体,或者说革命性地突破冯•诺伊曼架构的存算一体还未实…

考虑电能交互的冷热电区域多微网系统双层多场景协同优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

力扣sql基础篇(十)

力扣sql基础篇(十) 1 矩形面积 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 纵坐标相同或者横坐标的两个点是不可能成为矩形的 # 使用inner join连接两个表的时候 考虑需不需要去重,如何去重也是很重要的(会有重复的两条数据,只是顺序不一样) S…

振弦采集模块配置工具VMTool通用串口调试模块

振弦采集模块配置工具VMTool通用串口调试模块 VMTool 扩展功能 双击主界面右侧扩展工具条可实现扩展功能区的显示与隐藏切换。 扩展功能包括串口调试、MODBUS、实时曲线及数据存储等几个功能模块。 扩展功能区显示效果如下。 串口调试模块直接使用当前已连接的 COM 端口&#…

redis集群启动

文章目录一、添加配置文件二、启动服务和集群三、集群操作四、故障恢复一、添加配置文件 一共8个文件 创建6个redisXXX.conf文件 6个文件的内容和下面的一样&#xff0c;但是要修改端口数值。例如&#xff1a;把下面的6379全部改为6380# 路径为redis.conf的绝对路径 include…

易基因2022年度DNA甲基化研究高分项目文章精选

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。回顾刚刚过去的2022年&#xff0c;易基因参与的DNA甲基化研究在细胞分化与发育、疾病发生发展及标志物筛选、环境因素暴露与响应等应用场景成果层出不穷&#xff0c;小编选取其中三个研究方…

挖掘HTTP请求走私漏洞

利用Burp插件挖掘HTTP请求走私 HTTP请求走私通常遗留在漏洞发现赏金项目中。但通过正确的插件&#xff0c;您 可以在下一个赏金项目中自动化地完成挖掘HTTP请求走私漏洞的过程。 了解HTTP请求走私 现代网站经常部署多个代理服务器用于转发用户请求到托管Web应用程序的真实服务…

linux free命令

free是指查看当前系统内存的使用情况&#xff0c;它显示系统中剩余及已用的物理内存和交换内存&#xff0c;以及共享内存和被核心使用的缓冲区。 选项&#xff1a; -b&#xff1a;以字节为单位显示。 -k&#xff1a;以K字节为单位显示。 -m&#xff1a;以兆字节为单位显示。 参…