Golang开发定时钉钉小机器人(基于gin+gorm)

本文记录了一位开发者使用Gin框架和Golang开发钉钉机器人的全过程,包括开发背景、思路、实现功能及遇到的问题与解决方案。开发者通过Gorm、Docker、GolangCron等工具,实现了注册登录、定时任务、@功能,并克服了数据库存储汉字、Docker部署等问题。
摘要由CSDN通过智能技术生成

钉钉小机器人开发

一:开发背景

学习完了Gin框架,看了学长的发的Golang进阶视频,大概掌握了Gin的知识,但是一直没有时间去练手。再加上在学校505机房里面学习的时候,二期的学长总是不查考勤,甚至三期的一些同学也会忘记考勤,加上大家确实需要一个定时定点@特定的人去做某一件事情,所以我就想着开发一个小机器人,小的话可以在自己的部门使用,大的话,甚至可以在整个小组使用。同时也是自己的一个作品练习,帮助自己理清思路,同时能够把整个项目的开发过程详细的保留下来,可以让以后的三月新人去拿着练习使用。

二:开发思路(知识储备)

基础 : Gin框架基础 +Gin进阶项目Bullbell,Mysql基础知识 +zap日志库+validator校验 + viper + jwt登录认证 + GolangCron定时包

提升: GORM操作数据库(我当时不会手写sql语句,因为我mysql学的很皮毛)+ docker部署

三:实现功能

  • 注册登录,每个人拥有自己的独立账号

  • 添加多个群的机器人

  • 可以@所有人,也可以选择性的@群里面的某个特定人

  • 自定义消息(图片和表情暂时不能发送)

  • 可以多条任务同时进行

  • 多种定时方式,可以实现每周的具体的某天的时间点,或者是每隔一个小时,一分钟提醒一次

  • 可以取消定时任务

四:使用(功能)详细说明

钉钉机器人V1使用说明_sunriseYJP的博客-CSDN博客

五:开发过程中的问题(可以跳过)

问题一 : 钉钉机器人如何定时,以什么样的规则做定时任务?

引用golang现成的第三方库,这个库功能十分齐全,可以定时,具体可以参考【Go】Cron定时任务库ZibeSun的博客-CSDN博客cron定时任务

问题二 : 如何通过机器人的token或者机器人的姓名去启动机器人?

机器人的token就是机器人的账号,我们需要在钉钉群里添加智能群助手后可以直接查看,然后通过“加签”的方式进行加密。我们在添加机器人的时候,我们把机器人的完整信息直接添加到数据库里面,后面的话,直接通过机器人的姓名就可以启动机器人。

问题三 :数据库中一直无法储存汉字?

这个问题是个小问题,我们在main函数中使用gorm的自动建表,注意添加一个utf8即可

 mysql.GLOAB_DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").AutoMigrate(&model.User{},&model.Robot{},&model.Tele{},&model.Task{})

问题四:dubug调试后面一直出现许多无用的步骤如何解决?

可以调试的时候直接 Alt+F9 跳过即可

问题五 :docker如何部署服务?

参考博客Docker部署golang项目_sunriseYJP的博客-CSDN博客

问题六 : golang函数传参中可变参数和切片相互转化

问题七:类型断言和空接口参数的互相结合

问题八:定时任务的删除

自己的前期的一个思路 :定时任务是通过一个协程来进行的,每次发布一个定时任务都需要访问一次send路由,每次的send路由都会结束,但是定时任务的协程还是会继续运行的,我需要找到这个协程,然后关闭这个协程。

后面找了半天终于在一篇博客上看到了原来这个Cron库有自带的关闭定时任务的功能,但是好多博客里面都没写,导致我还想自己写一个方法来关闭协程。

那么定时任务到底如何关闭这个定时任务呢?我们可以使用Cron库自带的remove函数来移除这个任务,每一个任务我们在创建的时候都可以指定一个int类型的id,但是我们通过id来关闭可能会很麻烦,我们可以把这个id存在数据库里面,然后把给这个id起一个简单的名字,我们拿着这个名字就可以去关闭这个定时任务了。

最初我们想把这个定时任务放在路由的上下文中,但是gin框架的设定是每个路由都是重新分配*gin.Context导致无法通过上下文传递定时任务。后面我把定时任务单独放在了send路由里面,这样的话也是不行的。首先是当我们没做一个定时任务,都会有一个新的定时对象,一个对象对应一个定时任务,而我们要做的是应该是一个定时对象对应多个定时任务。其次是我们在send路由里面的定时任务在remove_task路由里面也是无法拿到的,因为每个路由都是重新开始,重新分配的,无法拿到其他路由里面的变量。

所以后面我把定时器单独放在contab包里面,在启动路由的时候,send路由和removeTask都会对一个全局公共的定时器进行操作,我们只用声明一个定时对象,一个定时任务对象里面会有好多个定时任务。

至此,定时任务的删除算是结束了。

问题九:docker中启动go程序后发送消息一直报错x509: certificate signed by unknown authority

这个问题是出现在docker上的,我之前看的是李文周的docker部署视频,部署的时候,他用了最小的镜像scratch,这个镜像是问题一般是没有问题的,但是钉钉小机器人发送消息是要使用浏览器的,这个镜像是空白的,里面是空的,没有证书,不用这个scratchj镜像就可以了。

当时这个问题确实是难受死了,我最初是想着安装一个证书,结果安装证书很麻烦,我也不知道怎么安装,找了半天才发现可能是镜像的问题,于是我就把镜像换了,换了之后就可以了。

问题十:import cycle not allowed

Golang中解决"import cycle not allowed"的2种方法AlbertGou的博客-CSDN博客go 循环依赖

六:后期完善(更新,维护)

现在已经可以使用,后面再逐渐添加新的功能

  • 删除机器人
  • 添加一键打字功能等等
  • 添加图片和表情发送
  • 添加前端页面
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于golang gin微信点餐小程序的设计与实现需要考虑以下几个方面: 1. 架构设计:可以使用MVC(Model-View-Controller)架构,将代码按功能模块划分成不同的包,便于管理和维护。 2. 数据库设计:根据需求,设计适当的数据库结构,存储菜单信息、用户信息、订单信息等。可以使用关系型数据库如MySQL或非关系型数据库如MongoDB。 3. 用户认证与授权:使用微信小程序的登录功能进行用户认证,获取用户的OpenID等信息。为了保护用户数据安全,可以使用JWT(JSON Web Token)生成访问令牌,并设置权限控制,确保只有授权的用户能够访问相关接口。 4. 页面设计与交互:根据需求设计小程序的首页、菜单页、购物车、订单页等页面,合理安排页面布局和交互逻辑。可以使用小程序自带的模板或自定义组件进行页面开发。 5. 菜单管理:实现菜单的增删改查功能,包括菜品的图片、名称、价格、描述等信息。为了提高用户体验,可以增加搜索和排序等功能。 6. 购物车与订单管理:用户选择菜品后,将菜品添加到购物车,并生成相应的订单。可以实现购物车的增删改查功能,以及订单的支付、取消等功能。 7. 接口设计与实现:根据需求设计合适的API接口,包括菜单管理接口、用户认证接口、购物车接口、订单接口等。使用golanggin框架实现这些接口,并进行参数校验、错误处理等。 8. 部署与测试:将小程序部署到服务器上,并进行测试,确保功能正常运行。可以使用Postman等工具对API接口进行测试,模拟用户操作验证功能是否正确。 基于以上几个方面的设计与实现,可以打造一个基于golang gin的微信点餐小程序,实现用户点餐、下单和支付的功能,提供便捷的餐饮服务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值