资讯专栏INFORMATION COLUMN

golang80行代码钉钉群机器人舆情监控

weakish / 851人阅读

1. 资料
1.1.第三方包

github.com/PuerkitoBio/goquery

github.com/go-redis/redis

beego框架定时任务包

1.2.接口

百度新闻:美剧关键字

钉钉群BOT文档

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 + " 
 " + 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 最终代码

v1 最终完整代码main.go

v2 版本支持多关键字,分批发送main.go

5 编译运行
go build main.go
nohup ./main &

最终效果

7 最后

欢迎star我的golang-base64captcha开源项目

如有疑问欢迎email:dejavuzhou@qq.com

或者 comment github gist

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/36503.html

相关文章

  • yii2-dingtalk 钉群器人

    摘要:说明群机器人是钉钉群的高级扩展功能。目前,大部分机器人在添加后,还需要进行配置,才可正常使用配置说明详见操作流程中的帮助链接。安装配置在使用本扩展之前,你需要去群机器人获取相关信息。 说明 群机器人是钉钉群的高级扩展功能。群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。目前,大部分机器人在添加后,还需要进行Webhook配置,才可正常使用(配置说明详见操作流程中的帮助...

    caikeal 评论0 收藏0
  • 2小时快速搭建后端接口报警系统(基于阿里云日志服务分析nginx访问日志)

    摘要:目标后端任一接口一分钟内响应超过一定的量,马上收到报警提示报警及慢接口有详细列表可以查看低成本。相关报警请求的详细信息列表慢响应分析 目标 后端任一接口一分钟内5xx响应超过一定的量,马上收到报警提示 报警及慢接口有详细列表可以查看 低成本。几年前公司的日志报警系统是自研的,开发成本比较高,也没有达到阿里云日志服务这种产品化程度 机器部署情况 阿里云EC服务器 功能概述 阿里云日...

    lemanli 评论0 收藏0
  • github 代码commit器人

    摘要:灵感曾经有一次在上看到使用自动保存的历史记录到文件的项目感觉这个项目做的很新颖而精致进而做一个在上自动记录每日新闻和猫眼电影知识储备或者的语法提出的有用信息自己做爬虫也会使用到等数据结构熟悉的基本命令熟悉和配置登陆语言等包包发送服务器信息 灵感 曾经有一次在GitHub上看到使用golang自动保存trending的历史记录到markdown文件的项目,感觉这个项目做的很新颖而精致.进...

    qujian 评论0 收藏0
  • 从零开始打造专属钉钉器人

    摘要:目前钉钉机器人支持方式,仍属于内侧阶段。方式是指被动接受通知,钉钉群中添加的群机器人默认都是该模式。截止撰写文章时,钉钉的机器人文档不可访问,所以会在下面介绍下。本文同步发表于作者博客从零开始打造专属钉钉机器人 官方定义如下: 群机器人是钉钉群的高级扩展功能。群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。目前,大部分机器人在添加后,还需要进行Webhook配置,才可...

    fyber 评论0 收藏0
  • 枯木:天猫双11项目组织协同

    摘要:摘要第二届研发效能嘉年华峰会,云效邀请天猫技术部高级技术专家吴建和枯木带来题为天猫双项目组织协同的演讲。所有的这些双项目的组织形式会依赖集团已有的产品线,例如资金平台支付交易链路物流等等这类平台,所有这些项目都会涉及到比较大的组织上的协同。 摘要: 2018第二届研发效能嘉年华峰会,云效邀请天猫技术部高级技术专家吴建和(枯木)带来题为天猫双11项目组织协同的演讲。主要内容是从四个方面进...

    Ryan_Li 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<