说实话,我写这个脚本的初衷特别简单——我女朋友老说我记不住我们在一起多少天了,每次她问我“今天是我们在一起第几天?”我都要掰着手指头算,还经常算错,然后她就会翻白眼,说“你是不是不重视我?”
后来我就想,干脆写个程序自动算,再配合抖音视频发布,每天定时发一条纪念视频,这样既准确,又浪漫,还能让她闭嘴,一举三得。
一开始我用Python写,跑得也挺好,但后来发现Python每次启动要加载一堆库,内存占用也不小,我寻思着,既然服务器是Go写的,不如用Golang重写一遍,轻量、快速、部署方便,而且Go的并发模型做定时任务简直不要太爽。
于是就有了这篇文章,我会手把手带你用Go写一个“在一起365发抖音视频”的自动发布系统,不扯没用的理论,直接上代码和思路。
为什么选Go来做这件事?
你可能要问,Python不是更简单吗?是的,Python简单,但有几个痛点:
- 部署麻烦:你要装Python环境,装依赖,还要处理版本冲突
- 性能一般:虽然对我们这个小脚本影响不大,但如果你要同时处理多个账号的视频生成和发布,Go的优势就出来了
- 编译成单文件:Go编译完就是一个二进制文件,扔到服务器上就能跑,连个依赖都不用装
Go的time包处理日期计算非常直观,你看这个:
import "time"
func daysBetween(start, end time.Time) int {
return int(end.Sub(start).Hours() / 24)
}
一行搞定天数计算,代码我没完全按原文写全,但意思到了就行。
核心功能拆解:日期计算
“在一起365发抖音视频”这件事,核心就是算天数,你需要一个起始日,然后每天算一次从那天到今天的差值。
具体实现其实不复杂:
- 定义一个起始日期,比如
2023-01-01 - 每天获取当前时间
- 计算两个日期之间的天数差
- 如果天数差是365的整数倍(1年、2年……),就生成视频发布内容
但这里有个坑:闰年,2月29号的问题,好在Go的time包已经处理好了,你不用操心。
用表格整理一下日期计算的边界情况
| 情况 | 日期示例 | Go处理方式 |
|---|---|---|
| 正常年份 | 2023-01-01到2024-01-01 | Sub()返回精确的Duration |
| 闰年 | 2020-01-01到2021-01-01 | 自动识别2月29天 |
| 起始日跨闰年 | 2019-03-01到2020-03-01 | 正确计算366天 |
| 起始日2月29 | 2020-02-29到2021-02-28 | 返回365天(因为到2月28日) |
你看,Go帮你兜底了,哪怕是2月29号这种恶心人的日子,它也能算明白。 生成逻辑
天数算出来了,接下来就是生成抖音视频内容,这里我设计了一个简单的方案:
- 写一段文案模板,把天数放进去
- 用图片合成视频(图片可以是你们的合照,或者纯文字背景)
- 调用FFmpeg生成视频文件
- 通过抖音开放平台的API发布
文案模板大概是这样的:
“今天是我们在第365天的日子,从第一天到现在,风风雨雨都一起走过,未来还有无数个365天,我都在。”
你自己可以改,但重点是:用Go拼接字符串、替换占位符、调用系统命令执行FFmpeg。
代码片段展示
func generateVideoContent(days int) string {
template := "今天是我们在一起第%d天的日子,从第一天到现在,风风雨雨都一起走过,未来还有无数个365天,我都在。"
return fmt.Sprintf(template, days)
}
然后调用FFmpeg:

cmd := exec.Command("ffmpeg", "-i", "input.jpg", "-vf", "drawtext=text='"+videoContent+"'", "output.mp4")
err := cmd.Run()
这里的文字样式和位置你可以调,网上有很多FFmpeg的drawtext参数教程,我就不展开了,不然这篇文章写不完。
定时任务与自动化
写脚本肯定不能每天手动跑,我们需要一个定时触发机制。
在Go里,可以用time.Ticker或者time.Sleep来实现每天的定时任务,但更优雅的方式是用robfig/cron这个库——业界公认的Go定时任务解决方案。
安装很简单:
go get github.com/robfig/cron/v3
然后你就可以这样写:
c := cron.New()
c.AddFunc("@daily", func() {
// 每天执行一次生成视频并发布
publishDailyVideo()
})
c.Start()
这里@daily是cron表达式的一种简化写法,表示每天午夜执行,你也可以改成@every 24h,或者更精确的0 8 * * *(每天早上8点)。
与抖音API对接
这个部分稍微有点麻烦,因为抖音的开放平台API需要申请权限,还要做OAuth2.0认证,步骤是固定的:
- 注册抖音开放平台账号
- 创建应用,拿到
client_id和client_secret - 获取用户授权,拿到
access_token - 调用视频上传接口,POST视频文件
- 调用视频发布接口,设置标题和描述
Go里发HTTP请求很简单,用net/http包:
func postToDouyin(videoPath string, accessToken string) error {
// 构造multipart/form-data请求
buf := new(bytes.Buffer)
writer := multipart.NewWriter(buf)
part, _ := writer.CreateFormFile("video", "video.mp4")
file, _ := os.Open(videoPath)
io.Copy(part, file)
writer.Close()
req, _ := http.NewRequest("POST", "https://open.douyin.com/video/upload/", buf)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("access-token", accessToken)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
这段代码我写的时候也没跑过,大概逻辑是对的,具体参数可能要和抖音官方文档核对一下。
实际部署中的坑
我部署这个服务的时候踩了几个坑,写出来你注意一下:
- FFmpeg版本问题:有些服务器自带的老版本FFmpeg不支持drawtext滤镜,需要手动编译安装新版本
- 中文字体:绘制的文字如果有中文,系统必须安装中文字体,Ubuntu下用
apt install fonts-noto-cjk解决 - 抖音API限流:每天只能发固定数量的视频,多了会被封,一天一条完全够用
- Access Token过期:抖音的token有效期一般是7天,需要定期刷新,写个定时任务每天检查一次
还有一个事儿:如果你服务器在海外,访问抖音API可能会有网络延迟甚至被墙,别问我怎么知道的。
优化与扩展
这个系统其实还能做得更丰富:
- 支持多平台发布:抖音、快手、小红书一起发
- 视频模板支持:不同的纪念日用不同的模板
- 图片自动选择:从相册里随机选一张当天的图片
- 文字情感分析:根据相处状态生成不同的文案
不过这些属于锦上添花了。“在一起365发抖音视频”这件事,核心就是把爱意用技术表达出来,用Go写,只是我顺手。
你也可以用Python、Node.js、甚至Bash脚本来做,但既然你点进来了,说明你对Go有兴趣,那就试试看呗。
最后说点真正重要的
我写这个脚本的时候,女朋友在我旁边看着,她问我:“你干嘛呢?”
我说:“写个程序,每天自动发我们在一起多少天的视频。”
她沉默了一会儿,说:“那你写慢点,别太快写完。”
我愣住了,然后意识到,她想要的不是那个数字,也不是那些视频,她想要的是我每天都能想起她,每天都能为这件事花点时间。
后来我把定时任务改成了手动触发,每天早起,算一遍今天是多少天,写一句不一样的话,然后跑一次脚本,虽然效率低了,但感觉对了。
别问我为什么不用自动化了,有些事,自动了反而就没意思了。
代码我放在GitHub上,你要是也想给你的另一半写一个,直接拿去改,记得把起始日期改成你们的纪念日。
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.hljbesthome.com/keji/1118.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《在一起365发抖音视频,用Golang写一个自动记录爱情的脚本》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:说实话,我写这个脚本的初衷特别简单——我女朋友老说我记不住我们在一起多少天了,每次她问我“今天是我们在一起第几天?”我都要掰着手指头算,...