skip to content
声控烤箱 | KazooTTT 博客

Notes(102) RSS feed
preview

31. 使用google sheet + api定时获取油管播放量

Updated:

起因是想要记录一下 milklove 的二搭剧 Whale Store xoxo 在油管上的预告片的播放量的 คุณวาฬร้านชำ (Whale Store xoxo) | GMMTV 2025 - YouTube

于是先搜了一下有没有可以直接使用的开源项目或者接口,然后在 批量统计YouTube视频播放量方法 - 杨哥的出海营销笔记 这篇文章中了解到了可以使用 google sheet 的 apps 脚本 直接获取油管的播放量。

不过这篇文章中的脚本更多的获取当前的播放量,而不是定时获取,因此我在这个脚本的基础上进行了一些修改,来实现定时获取播放量,然后把时间和对应的播放量的信息存到 sheet 中。

最终的效果如图所示。杂货铺播放量记录 - Google 表格

CleanShot 2024-12-15 at 21.38.06@2x.png

操作教程

第一步,在 sheet 中的原始模板是这样的:

链接视频 id时间播放量
https://www.youtube.com/watch?v=Eia_Sh_ZTyQ=MID(A2, FIND(“v=”, A2) + 2, LEN(A2) - FIND(“v=”, A2) - 1)

在第一列写上要监听的油管的链接,然后视频的 id 通过公式直接计算出来。

第二步,点击 extentions - apps script 这里,跳转到脚本配置界面。

CleanShot 2024-12-15 at 21.40.14@2x.png

点击左侧的 services 的加号,添加 YouTube Data API v3,标识符、版本直接默认就可以了。

CleanShot 2024-12-15 at 21.44.17@2x.png

第三步,把代码复制到 Code.gs 中,效果如图:

function onOpenFunc() {
PropertiesService.getScriptProperties().setProperty("accessToken", ScriptApp.getOAuthToken())
}
function getVideoViews(videoid) {
var accessToken = PropertiesService.getScriptProperties().getProperty("accessToken")
// Check if the access token exists
if (!accessToken) {
Logger.log("No access token found.")
return "Error: No access token"
}
try {
var videoStatsResponse = YouTube.Videos.list("statistics", {
id: videoid,
access_token: accessToken,
})
// Check if the response contains the expected data
if (
videoStatsResponse.items &&
videoStatsResponse.items[0] &&
videoStatsResponse.items[0].statistics
) {
return videoStatsResponse.items[0].statistics.viewCount
} else {
Logger.log("No statistics found for video ID: " + videoid)
return "Error: No statistics"
}
} catch (error) {
Logger.log("Error fetching statistics for video ID " + videoid + ": " + error.toString())
return "Error: " + error.toString()
}
}
function recordYouTubeViewCount() {
// 获取活动表格
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
// 获取第二行的 ID
var videoId = sheet.getRange(2, 2).getValue()
// 获取当前时间
var currentTime = new Date()
try {
// 获取播放量
var viewCount = getVideoViews(videoId)
// 获取当前表格的最后一行
var lastRow = sheet.getLastRow()
// 在最后一行之后插入新行,并填写时间和播放量
sheet.insertRowAfter(lastRow)
sheet.getRange(lastRow + 1, 3).setValue(currentTime) // 设置时间
sheet.getRange(lastRow + 1, 4).setValue(viewCount) // 设置播放量
} catch (error) {
// 错误处理
Logger.log("Error processing video " + videoId + ": " + error.toString())
// 如果发生错误,记录错误信息
var lastRow = sheet.getLastRow()
sheet.insertRowAfter(lastRow)
sheet.getRange(lastRow + 1, 3).setValue(currentTime) // 设置时间
sheet.getRange(lastRow + 1, 4).setValue("Error: " + error.toString()) // 设置错误信息
}
}
CleanShot 2024-12-15 at 21.41.33@2x.png

然后如果要验证是否正确,选择 recordYouTubeViewCount,然后点击 run 按钮。不出意外的话会在 sheet 中新增一行记录。

CleanShot 2024-12-15 at 21.42.08@2x.png

第四步,也是最后一步,我们要设置一下 trigger,来实现定时地查询播放量并且写入到 sheet 中。点击左边侧边栏的 trigger 菜单,再点击右下角的 add trigger.

CleanShot 2024-12-15 at 21.47.04@2x.png

设置如下,配置完成后点击 save 按钮。

image.png

点击完之后,可能出现一个验证弹窗,需要你选择自己的 google 账号,然后点击 go to xxx project (unsave), 点击 allow 进行授权。(这里没有保留截图,但或许大概应该能直接看懂?)

然后我们就完成了所有的配置,等待一小时后看是否运行正常即可。

参考和鸣谢

这个脚本是在 批量统计YouTube视频播放量方法 - 杨哥的出海营销笔记 的脚本的基础上改的,感谢作者提供了很详细的教程和代码。

同时也要感谢 google 提供的 api.

32. 2024-12-12

Updated:

之前只用过 deepseek 的 api,这几天的 deepseek 的 chat 用的比较多,发现两者都挺好用的

目前 todo 全部都移到滴答清单里面去记录和更改,这里单纯记录一些想法,不要 all in one

碎片化记录

10:55:这次去看演出要用肩带夹录一个第一人称的记录

10:54:把另外一把键盘带去公司了
感受是打字很舒服 但是打久了累

12:37:活成了做什么都下意识计算收益的样子

13:05:状态怎么样别人能很明显看出来…
还是对自己好点吧,现在这种状态实在太差了

13:18:买了一个新手机壳就能玩很久

13:13:总之先做一个出来
性能差就差,总比没有好

13:36:转发微博

  • 转发 @爱可可 - 爱生活: 【Diagen:一键生成数据图表的智能工具,通过 AI 技术将复杂数据转化为美观的图表,支持多种图表类型,让数据可视化变得简单快捷】‘diagen - Generate beautiful, reflective diagrams from your data with a single command.’ GitHub: github.com/SouthBridgeAI/diagen #数据可视化# #人工智能# #图表生成#

13:35:这下谁能看出 h 和 p 标签记录的啥

13:33://@KITATAIKOI: 跟去年相比产量确实是直接腰斩了,也跟我在思索一些关于精神层面的议题、把精力更多的花在工作上和尝试去改变自己有关。也很庆幸并没有在“向内批判自己”这件事上花太长的时间,我成功地走出了很大一部分源于过去的阴霾。 总之感谢大家的支持与认可,新的一年,咱会再接再厉,努力创作更能让自己满意,同时也更能深入人心的作品的!这样~

  • 转发 @KITATAIKOI: +2024 年终总结 +
    又到了一年一度的% かΘΛ……(省略一大堆感言)今年除工作外一共产图 110 张~~~

14:49://@绯音喵: 有病吗//@婉司姬: 干什么//@矮周迅: 这是真不敢//@王太弱: 我连上一秒的都不敢看//@巴斯小板: 我不想回忆。//@美困外卖: 那年今日就可以看到

  • 转发 @CharlieDurian2 号: 没见过傻逼的可以看看自己几年前发的朋友圈

16:00:要散了

19:50:我怎么就活成这个样子了

20:05:这辈子都不想做前端了

20:02:于是我又打开 boss 直聘
我不会又要去上海吧

20:13:逛商场好解压,身心舒畅

20:12:好想配这种镜框
感觉聪明的人带更聪明
笨的人带更笨

20:50:幻想一下就能笑出声 好好养活

20:50:如果买“保健品”可以让自己开心,适当买点又怎么了

21:04:谁教他把 blender 缩写成 bl 的

21:15://@碎片粘合區:………//@2048 种子选手: 我//@摩斯盖斯: 我磕 cp

  • 转发 @推拿熊: 在现在的时代来说,你愿意持之以恒做一件事情,从早上醒来在想,做了一天后睡觉前也在琢磨,能沉浸其中,不觉得烦,已经是极大的正反馈了

21:27:今天像吃了一顿空气
虽然有活动 但什么都没吃到

22:55:这个号烂的别人给我点赞我都看不到提示😳

23:03:- 转发 @奶制品 -: 人无法同时拥有青春和对青春的感受 18 岁的和 24 岁的 loverrukk 又有了共同的感受

23:03:转发微博

  • 转发 @月照废墟: milklove
    人如何学会语言。
    热带雨

23:44:好喜欢这篇 (「・ω・)「

  • 转发 @月照废墟: milklove
    人如何学会语言。
    热带雨

23:42:浪费时间…

23:56:声生不息的滤镜怎么把人脸搞得蜡黄蜡黄的

23:51:靠一些不切实际的信念感在往下走
但是感觉明年就该清醒了

33. 2024-12-11

Updated:

终于没有那么忙了,上周忙成狗了,加班加的 wakatime 时长直接进入全球前 100 了 ​​​

image.png image.png

上周在忙什么?主要是做 vtk.js 的开发花了很多时间,不然后续的需求查漏补缺我不会做的这么着急。

对于 vtk.js 的掌握程度还是太低了,甚至连 polydata 的变化要怎么写都是临时掌握的。不过好在上周耐心理了一下项目里复杂的数据流转,清晰了很多。

image.png

然后今天主要再写文档,写得头昏眼花的,好容易走神。


react-scan 让页面的 rerender 一眼便知 React Scan,试了下确实好用(比浏览器的开发者工具里面的 rerender 监视器好用),后面项目优化有事做了。

安卓的视频下载软件 GitHub - JunkFood02/Seal: 🦭 Video/Audio Downloader for Android, based on yt-dlp, designed with Material You

好看的个人主页 CAICAI - A Product Manager

image.png

34. 2024-11-30

Updated:

vscode extention 启动时间

按下 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入 “Startup Performance” 并选择该选项。 关注:Finish Activate

kill 端口为 x 的进程

lsof -i :<PORT>
kill -9 <PID>
kill -9 $(lsof -t -i :<PORT>)

35. 2024-11-29

Updated:

qube 如何集成到 github:
GitHub Integration | Mapping your organization into SonarQube - YouTube

Image HTTP code 409 is in use. Delete the container that’s using it and try again.
先删除 container 再删除 volume

沉浸式翻译使用 ollama

如何区分重启和刷新按钮

windows 有没有像 macos 一样的窗口管理工具,loop raycast 之类的

Adobe Express

covnert image to svg (需要登录)

image.png

Canvas vs. SVG - 最佳实践 - 使用手册 - Apache ECharts

[!note] 选择哪种渲染器,我们可以根据软硬件环境、数据量、功能需求综合考虑。

  • 在软硬件环境较好,数据量不大的场景下,两种渲染器都可以适用,并不需要太多纠结。
  • 在环境较差,出现性能问题需要优化的场景下,可以通过试验来确定使用哪种渲染器。比如有这些经验:
    • 在需要创建很多 ECharts 实例且浏览器易崩溃的情况下(可能是因为 Canvas 数量多导致内存占用超出手机承受能力),可以使用 SVG 渲染器来进行改善。大略的说,如果图表运行在低端安卓机,或者我们在使用一些特定图表如 水球图 等,SVG 渲染器可能效果更好。
    • 数据量较大(经验判断 > 1k)、较多交互时,建议选择 Canvas 渲染器。

我什么时候可以做到用 canvas 手搓这种图

image.png

最近可以做的事情:

编辑器图片上传重构
编辑器高度修改

行间高度调整

用 rn 重写移动端
ml 资源整合
vtk、图形学学习
obsidian 插件 ollama generate slug tags

36. 2024-11-28

Updated:

x.com

打开这个禁止硬件加速的选项可以让 VSCode 快很多倍,Cusror 这种基于 VSCode 的也可以,不知道什么原理,应该是针对低端显卡或者集成显卡的机器比较有效?但是我试了一下确实感觉快了一些,我是 M3 的 macbook,大家可以试试看效果怎样?
步骤:
1. 打开命令面板 (Cmnd + Shift + P)
2. 输入 "Preferences: Configure Runtime Arguments"
3. 添加: "disable-hardware-acceleration": true

SonarLint 内存占用高,卡顿


vite-tsconfig-paths 踩坑

error when starting dev server:
ReferenceError: module is not defined in ES module scope
This file is being treated as an ES module because it has a '.js' file extension and 'C:\Users\turbo\Developer\xxx.worktrees\fix\cannot-export\node_modules\.pnpm\[email protected][email protected][email protected][email protected][email protected]_@types+n_f2jvehahdn5lgzw77tv2nbqmma\node_modules\vite-plugin-checker\package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.

Ensure the project either has “type”: “module” set or that the Vite config is renamed to vite.config.mjs / vite.config.mts depending on whether TypeScript is used

确保项目已设置 “type”: “module” 或根据是否使用 TypeScript 将 Vite 配置重命名为 vite.config.mjs / vite.config.mts


Claude MCP can’t connect to SQLite MCP serve

image.png

Reddit - Dive into anything

解决方法:install or reinstall uv

brew install uv

ollma 真好玩

我怎么这么久了才开始玩(谢谢酱紫表的安利)

CleanShot 2024-11-28 at 23.40.12@2x.png

GitHub - ollama/ollama: Get up and running with Llama 3.2, Mistral, Gemma 2, and other large language models.

GitHub - AugustDev/enchanted: Enchanted is iOS and macOS app for chatting with private self hosted language models such as Llama2, Mistral or Vicuna using Ollama.

37. 2024-11-27

Updated:

windsurf 赠送了试用的天数

Pasted image 20241127102521

个人感觉 cursor 的自动补全速度比 windsurf 快和智能很多

volview 也这么多 store,谁能看懂…

Pasted image 20241127182204

src\components\tools\crop\Crop2D.vue

啥意思

Pasted image 20241127182701

安装 canvas 的时候报错:

error C1083: 无法打开包括文件: “cairo.h”: No such file or directory

解决方法:

Installation: Windows · Automattic/node-canvas Wiki · GitHub

39. 个人工具与设备清单

Updated:

软件工具(电脑端)

开发工具

  • Cursor(主力 IDE)
  • JetBrains 全家桶(主要是写 Unity 的时候使用 Rider)

设计工具

  • Canva 使用它制作了不少视频封面
  • Figma
  • MasterGo 类似于 Figma 的国产设计工具

视频剪辑

  • 剪映 (主要使用软件)
  • final cut pro (用到比较复杂的工程的时候才使用)

录屏与截图

  • shottr(Mac 上的截图工具,免费好用)
  • CleanShot(Mac 上的截图工具,需要付费,支持截图、录屏,截图加 border)
  • QuickRecorder(Mac 上的录屏工具,开源,免费)
  • OBS(录屏工具,直播推流工具)

媒体与娱乐

  • Apple Music(主力)
  • 网易云音乐

知识管理

  • Milanote(白板型笔记,用于一个项目的初期输入和梳理)
  • Flomo(用于碎片化的记录)
  • Dinox(用于碎片化的记录,支持语音输入和联动大模型)
  • Obsidian(初期碎片化记录和梳理完成后,会在 Obsidian 中进行整理,完成最终的输出)

资讯收集与阅读

  • n8n 自动化(用于定时监听社交平台或其他信息的更新,然后通过 webhook 推送到其他平台)
  • Raindrop(用于收集网页、内容标记)
  • Follow(用于阅读 RSS 内容)

阅读平台

  • 微信读书(主力,主要阅读线上书城的内容,偶尔导入离线的内容)
  • Apple Books(主要阅读离线的内容)

生产力工具

  • 1Password(和别人拼车的,已经续费 2 年)

AI 助手

  • Claude(编程主力)
  • DeepSeek(编程主力,沉浸式翻译主力 API)
  • ChatGPT(macOS 的客户端体验依旧很好,所以在 macOS 上使用很多)
  • Poe(体验各种大模型)
  • Google Notebook LLM(用于书籍或者文档的深度阅读)

任务管理

  • 滴答清单
  • Mermaid 绘制甘特图、流程图等
  • 飞书多维表格(进行项目管理)

记账工具

  • 飞书多维表格

浏览器

  • Arc(主力)
  • Google Chrome
  • Edge

博客平台

  • Astro 自建博客(随心所欲发布内容的地方)
  • 微信公众号(从自建播客中筛选长内容发布到公众号)
  • Hashnode、Medium(主要输出英文内容)

软件工具(移动端)

图片处理

  • Picsew(手机上的截图工具,支持长截图、截图加壳、截图拼接等等)
  • 美图秀秀(图片编辑)
  • dama (一键给图片敏感数据打码)

健康管理

  • AutoSleep(睡眠追踪)
  • Grow(运动追踪)
  • Keep(运动追踪)

硬件设备

电脑

  • Mac Mini M2 Pro(32GB 内存,512GB 存储)10000+ 买的官方翻新机,是家里的开发主力机
  • MacBook Air M1(16GB 内存,256GB 存储)3000+ 收的二手,个人觉得性价比很高,用于移动办公是绝对够用的
  • 机械师整机(i5,2060,32GB 内存,512GB 存储)为了和朋友玩游戏和使用一些只有 Windows 上的支持的软件购买的

移动设备

  • iPhone 13(256GB 存储)
  • iPad Mini 5 购入多年的老物,电池已经不堪重负,现在主要用于看视频和阅读

智能穿戴

  • Apple Watch S9
  • AirPods Pro 2

影像设备

  • 松下 GX9
  • 松下 GX9 使用镜头: 14-140mm、25mm 定焦、100-300mm(用来用去还是 25 定好用😭)
  • 大疆 Action 5 Pro(运动相机,主要用于记录日常生活碎片)

40. 在vtk.js中stl和json的互相转化

Updated:

stl 如何转为 json

import vtkSTLReader from '@kitware/vtk.js/IO/Geometry/STLReader';
const getStlModelFromPath = async (path: string) => {
const response = await fetch(path);
const stlArrayBuffer = await response.arrayBuffer();
const stlReader = vtkSTLReader.newInstance();
stlReader.parseAsArrayBuffer(stlArrayBuffer);
const polyData = stlReader.getOutputData();
return polyData;
};
const stlPath = '/path/to/your/model.stl';
const polyData = await getStlModelFromPath(stlPath);
const jsonData = polyData.toJSON();

json 如何转为 stl

import modelJSON from './model.json';
const convertPolyDataJSONToStl = (polyDataJSON: string, fileName: string = 'model.stl') => {
const polyData = vtkPolyData.newInstance(polyDataJSON);
const writer = vtkSTLWriter.newInstance();
writer.setInputData(polyData);
const fileContents = writer.getOutputData();
// Create a blob and download link
const blob = new Blob([fileContents], { type: 'application/octet-stream' });
const a = window.document.createElement('a');
a.href = window.URL.createObjectURL(blob);
a.download = fileName;
// Trigger download
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(a.href);
};
convertPolyDataJSONToStl(modelJSON);