我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!
前言
参与掘金活动时,总会忘记自己发布了多少文章,为了让自己每日更精确明白自己的更文数据,计划设计一个辅助统计工具,每日推送至自己的飞书群中。
实践
总体设计
-
- 在一个定时服务中固定每天执行统计任务
-
- 先拉取批量拉取文章并统计文章数量
-
- 将统计数据定时推送至飞书机器人
创建飞书机器人
先在飞书中,创建一个属于自己的群。我创建了一个 「日常记录群」,主要用于平时会紧急需要的内容复制黏贴和一些日常的 TODO 计划。再给群添加一个自定义机器人叫做「更文统计」
更文统计
更文统计主要涉及接口:
- 批量获取文章列表:api.juejin.cn/content_api…
- 获取文章详细内容:api.juejin.cn/content_api… 获取文章列表然后再获取没篇文章的详细内容,再根据文章的内容匹配 title 然后统计数量
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点更新统计的数据,然后推送到飞书中。测试成功后就可以部署到自己的服务器上。
参考资料: