golang钉钉群机器人订阅自定义主题百度新闻

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

1. 资料

1.1.第三方包
1.2.接口

2. 初始化项目变量

package main

import (
    "fmt"
    "log"
    "github.com/PuerkitoBio/goquery"
    "github.com/go-redis/redis"
    "net/http"
    "bytes"
    "github.com/astaxie/beego/toolbox"
)

var (
    redisClient *redis.Client //redis 缓存
        //钉钉群机器人webhook地址
    dingdingURL = "https://oapi.dingtalk.com/robot/send?access_token=dingding_talk_group_bot_webhook_token"
        //百度新闻搜索关键字URL
    baiduNewsUrlWithSearchKeyword = "http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=%E7%89%A9%E8%81%94%E7%BD%91"
)

const (
    newsFeed = "news_feed"//爬取到的百度新闻redis key
    newsPost = "news_post"//已发送的百度新闻redis key
    newsList = "iot_news" //储存了的百度新闻redis key
)
//实例化redis缓存
func init() {
    redisClient = redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379",
        Password: "ddfrfgtre4353252", // redis password
        DB:       0,                            // redis 数据库ID
    })
}

在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。点击“完成添加”。

点击“复制”按钮,即可获得这个机器人对应的Webhook地址,赋值给 dingdingURl

3 func newsBot

3.1 使用goquery和网页元素选择器语法提取有用信息
func newsBot() error {
    // 获取html doc
    doc, err := goquery.NewDocument(baiduNewsUrlWithSearchKeyword)
    if err != nil {
        return nil
    }
        //使用redis pipeline 减少redis连接数
    pipe := redisClient.Pipeline()
    // 使用selector xpath 语法获取有用信息
        // 储存新闻到redis中 newsList
        // 储存新闻ur到redis-set 建newfeed 为以后是用sdiff 找出没有发送的新闻


    doc.Find("div.result").Each(func(i int, s *goquery.Selection) {
        // For each item found, get the band and title
        URL, _ := s.Find("h3 > a").Attr("href")
        Source := s.Find("p.c-author").Text()
        Title := s.Find("h3 > a").Text()
        markdown := fmt.Sprintf("- [%s](%s) _%s_", Title, URL, Source)
        pipe.HSet(newsList, URL, markdown)
        pipe.SAdd(newsFeed, URL)
    })
        //执行redis pipeline
    pipe.Exec()
3.2 排除以发送的新闻,拼接markdown字符串
        //使用redis sdiff找出没有发送的新闻url
    unSendNewsUrls := redisClient.SDiff(newsFeed, newsPost).Val()
        //新闻按dingding文档markdonw 规范拼接
        
    content := ""
    for _, url := range unSendNewsUrls {
        md := redisClient.HGet(newsList, url).Val()
        content = content + " \n " + md
                //记录已发送新闻的url地址
        pipe.SAdd(newsPost, url)
    }
    pipe.Exec()
3.3 调用钉钉群机器人接口
        //如果有未发送新闻 请求钉钉webhook
    if content != "" {
        formt := `
        {
            "msgtype": "markdown",
            "markdown": {
                "title":"IOT每日新闻",
                "text": "%s"
            }
        }`
        body := fmt.Sprintf(formt, content)
        jsonValue := []byte(body)
                //发送消息到钉钉群使用webhook
                //钉钉文档 https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.karFPe&treeId=257&articleId=105735&docType=1
        resp, err := http.Post(dingdingURL, "application/json", bytes.NewBuffer(jsonValue))
        if (err != nil) {
            return err
        }
        log.Println(resp)
    }
    return nil
}

func newsBot函数完成

4. 设置定时任务

func main() {
        //销毁redisClient
    defer redisClient.Close()

    //创建定时任务
        //每天 8点 13点 18点 自动执行爬虫和机器人
        // 
    dingdingNewsBot := toolbox.NewTask("dingding-news-bot", "0 0 8,13,18 * * *", newsBot)
    //dingdingNewsBot := toolbox.NewTask("dingding-news-bot", "0 40 */1 * * *", newsBot)
    //err := dingdingNewsBot.Run()
    //检测定时任务
    // if err != nil {
    //     log.Fatal(err)
    // }
    //添加定时任务
    toolbox.AddTask("dingding-news-bot", dingdingNewsBot)
    //启动定时任务
    toolbox.StartTask()
    defer toolbox.StopTask()
    select {}
}

spec 格式是参照

5 最终代码

5 编译运行

go build main.go
nohup ./main &

最终效果
dingding-webhook-bot

7 最后

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
安全 机器人 API
简单几步,钉钉机器人秒变通义千问对话机器人
通过阿里云计算巢AppFlow平台,无需编码,只需简单几步,即可将钉钉机器人转化为通义千问对话机器人。首先在灵积模型服务平台获取API Key,然后在AppFlow中配置连接器,授权并保存Webhook Url。在钉钉中创建自定义机器人,选择Outgoing功能,填写签名和Webhook地址。最后,@机器人即可开始对话。此外,还提供了通过钉钉开放平台创建机器人的步骤。AppFlow简化了集成过程,加速了企业自动化服务流程。
|
5月前
|
数据管理 机器人 BI
数据管理DMS产品使用合集之如何让报表自动更新推送到钉钉机器人
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
75 3
|
5月前
|
运维 机器人 开发者
使用阿里云百炼通过appflow模板,组合钉钉机器人搭建个人知识库评测与感想
尝试构建个人助手机制,用阿里云百炼+AppFlow+钉钉机器人,花费两午休时间解决配置问题。百炼appid复制时多出空格致错,文档未提及,耗时排查。应用创建时模型选项限于max, plus, turbo,性价比高的qwen-long未上线。期望尽快修复bug和上线新模型以降低成本。附故障排查截图。
178 1
|
6月前
|
存储 数据建模 索引
来自钉钉群的问题——Elasticsearch 如何实现文件名自定义排序?
来自钉钉群的问题——Elasticsearch 如何实现文件名自定义排序?
52 0
|
6月前
|
Serverless Go API
Serverless 应用引擎产品使用之在阿里云Serverless中,我想在钉钉机器人中使用函数计算的签名认证如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
监控 安全 机器人
SpringBoot 实现自定义钉钉机器人
SpringBoot 实现自定义钉钉机器人
|
存储 弹性计算 安全
成功案例-钉钉 | 学习笔记
快速学习 成功案例-钉钉
397 0
|
移动开发 物联网 Go
SAP Business ByDesign 和支付宝与钉钉集成的一个原型开发案例
SAP Business ByDesign 和支付宝与钉钉集成的一个原型开发案例
SAP Business ByDesign 和支付宝与钉钉集成的一个原型开发案例
|
移动开发 物联网 智能硬件
SAP Business ByDesign 和支付宝与钉钉集成的一个原型开发案例
SAP Business ByDesign 和支付宝与钉钉集成的一个原型开发案例
252 0
SAP Business ByDesign 和支付宝与钉钉集成的一个原型开发案例