每日定时推送自己的更文统计

826 阅读3分钟

我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!

前言

参与掘金活动时,总会忘记自己发布了多少文章,为了让自己每日更精确明白自己的更文数据,计划设计一个辅助统计工具,每日推送至自己的飞书群中。

实践

总体设计

image.png

    1. 在一个定时服务中固定每天执行统计任务
    1. 先拉取批量拉取文章并统计文章数量
    1. 将统计数据定时推送至飞书机器人

创建飞书机器人

先在飞书中,创建一个属于自己的群。我创建了一个 「日常记录群」,主要用于平时会紧急需要的内容复制黏贴和一些日常的 TODO 计划。再给群添加一个自定义机器人叫做「更文统计」

image.png

更文统计

更文统计主要涉及接口:

func DealData() {
    AugustCount := 0
    // 批量获取飞书文章
    list := BatchGetArticle("0")
    for _, value := range list {
        id := value["artcle_id"].(string)
        // 获取详细的文章内容
        result := ArticleDetail(id)
        articleInfo := result["article_info"].(map[string]interface{})
        text := articleInfo["mark_content"].(string)

        if strings.Contains(text, " 携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」") {
            AugustCount++
        }
    }

    // 统计完后发送 webhook
    text := "八月更文挑战:\n 已更新:" + string(AugustCount)
    SendFeishu(text)
}

func BatchGetArticle(cur string) []map[string]interface{} {
    var listResult juejinResult
    data := []byte(`{"cursor": "` + cur + `","sort_type": 2,"user_id": "3984285871118728"}`)
    result, err := postJson(listUrl, data)
    if err != nil {
        errors.New("请求失败")
    }
    err = json.Unmarshal(result, listResult)
    if listResult.ErrNo == 0 {
        return listResult.Data
    }
    return nil
}

func ArticleDetail(artcleId string) map[string]interface{} {
    var detailResult DetailResult
    data := []byte(`{"article_id": "` + artcleId + `"}`)
    result, err := postJson(detailUrl, data)
    if err != nil {
        errors.New("请求失败")
    }
    err = json.Unmarshal(result, detailResult)
    if detailResult.ErrNo == 0 {
        return detailResult.Data
    }
    return nil
}

定时任务

后端主要使用的是 Go 语言开发,要完成定时任务主要使用第三方包 cron。

github.com/robfig/cron/v3

cron 库和 与Linux 中crontab命令相似,支持用 5 个空格分隔的域来表示时间。

* * * * *
  • Minutes:分钟,取值范围[0-59],支持特殊字符* / , -
  • Hours:小时,取值范围[0-23],支持特殊字符* / , -
  • Day of month:每月的第几天,取值范围[1-31],支持特殊字符* / , - ?
  • Month:月,取值范围[1-12]或者使用月份名字缩写[JAN-DEC],支持特殊字符* / , -
  • Day of week:周历,取值范围[0-6]或名字缩写[JUN-SAT],支持特殊字符* / , - ?

定时任务实现

func main(){
    fmt.Println("-----定时任务-----")
    // 定时任务
    c := cron.New(cron.WithSeconds())
    c.AddFunc("* 8 * * *", func() {
       fmt.Println("开始指定定时任务")
       st.DealData()
    })
    c.Start()
    // 阻塞 ,或使用其他延迟时间函数
    select {}
}

AddFunc()方法向管理器中添加定时任务.参数1 表示实践规则,参数2是一个无参的函数。设置每天准时8点更新统计的数据,然后推送到飞书中。测试成功后就可以部署到自己的服务器上。

image.png

参考资料: