加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:22:18 所属栏目:大数据 来源:网络整理
导读:1. 资料 1.1.第三方包 github.com/PuerkitoBio/goquery github.com/go-redis/redis beego框架定时任务包 1.2.接口 百度新闻:美剧关键字 钉钉群BOT文档 2. 初始化项目变量 package mainimport ( "fmt" "log" "github.com/PuerkitoBio/goquery" "github.com/go

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

  • v1 最终完整代码main.go
  • v2 版本支持多关键字,分批发送main.go

5 编译运行

go build main.go
nohup ./main &

最终效果

7 最后

  • 欢迎star我的golang-base64captcha开源项目
  • 如有疑问欢迎email:dejavuzhou@qq.com
  • 或者 comment github gist

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读