go 定时任务,解析百度新闻,推送到钉钉群里

package main

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

var (
	redisClient *redis.Client //redis 缓存
	dingdingURL ="https://oapi.dingtalk.com/robot/send?access_token=3bae30973664b5f2dac0e144c5317af02ed748a5c5b4b4032b51733ba636f0a1"
	//百度新闻搜索关键字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
)

func init(){
	redisClient =redis.NewClient(&redis.Options{
		Addr:"127.0.0.1:6379",
		Password:"",
		DB:0,
	})
}
func newsBot() error {
	fmt.Println("开始读取")
	// 获取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)
	})
	pipe.Exec()

	//执行redis pipeline
	//使用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()

	//如果有未发送新闻 请求钉钉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 main() {
	//销毁redisClient
	defer redisClient.Close()

	//创建定时任务
	//每天 8点 13点 18点 自动执行爬虫和机器人  六个参数 分别代表 秒 分 小时 天 月 周    
        //Second uint64
       // Minute uint64
	Hour   uint64
	Day    uint64
	Month  uint64
	Week   uint64
// dingdingNewsBot := toolbox.NewTask("dingding-news-bot", "0 18 8,13,15,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 {} }

  

 

posted on 2022-02-18 16:08  kevin_yang123  阅读(108)  评论(0编辑  收藏  举报