用 YouTube 做一台免費線上電視:Ten TV 十電視,一天從點子到上線

實驗 發布 2026-11-08 · · 閱讀 7 分鐘

YouTube 什麼都有,但每一支都要你自己選。我想要的是以前電視那種:打開就在播、轉台就好、大家看到同一個進度。從早上一個問句到晚上開放搜尋收錄,十個頻道、遙控器、提案投票、停留統計,全部在一天內由一個 AI 代理做完。這篇交代怎麼拆、踩了哪些坑、我猜錯了兩次,以及為什麼決定只做十台。

一台復古電視放在深色房間裡,螢幕亮著,前方一支銅色遙控器,氣氛安靜

起點是一個早上的問句:YouTube 是隨選的,每一支都要自己挑;播放清單能把同主題串起來,但還是「我的清單、從頭播」。有沒有辦法做得像以前的電視——上來挑一台,一路看下去,節目表還會自己長?

晚上十一點,Ten TV 十電視 開放搜尋收錄。中間十期,程式全由一個 Claude Opus 代理寫,我負責拆需求、看真機截圖、推翻它或被它推翻。這篇不講程式碼,講決策、坑,和一天內能把一個產品推到哪裡。

照例交代作法:這是 AI 協作實驗。每一期都要求代理自己用瀏覽器驗完再回報,沒驗的要明講。

「像電視」的關鍵只有一件事

不是自動播下一支——YouTube 早就會了。是所有人看到同一個進度,而且轉台進去是播到一半的。

做法叫 pseudo-live(假直播):每台每天一張節目表(影片序列加每支秒數),伺服器用自己的時鐘算出「現在該播第幾支、第幾秒」,前端用 YouTube 官方播放器從那一秒起播。不碰影片檔、廣告照播、完全合乎條款。影片播完不自己接下一支,而是重新問伺服器,進度才不會漂。

這個決定定下來之後,其他全是加法。

清單怎麼自己長:三層

  1. 供稿源:每台綁十幾個 YouTube 頻道,定時抓新片。原本要用 YouTube 免費的 RSS,結果當天上午 RSS 全面回 404,連 Google 自家頻道也是;代理改走 Data API 抓上傳清單,每次 1 單位配額,下午 RSS 自己恢復,程式兩條路都會走。
  2. 規則過濾:用 API 補每支影片的長度與「可否嵌入」,直接淘汰不能嵌入、Shorts、直播、台灣看不到、年齡限制的。
  3. 編輯台:每台一段「編輯方針」,候選影片的標題與描述丟給 Claude Haiku 判收不收。第一輪 900 支候選,規則砍 236、Claude 砍 233。抽樣看理由——「業配」「中國拍攝不符地域」「純聊天 Podcast」——判得比我預期準。

標題和描述是外人寫的字,所以進模型前要過防注入檢查,輸出只接受固定格式的 JSON。

十期,每一期一個真問題

期 做了什麼 那一期的坑
1 三台、日表、瀏覽器實播 nim 的 PHP 沒裝 SQLite,改 MySQL
2 擴到十台,加「直播流」與「滾動隊列」兩種模式 新聞要即時,日表不適用;新聞台直接嵌各家 24 小時直播,斷線自動換家
3 十台介紹、「你想看哪一台」提案與 +1 honeypot 欄位不能叫 website/email,瀏覽器會自動填
4 遙控器介面、暫停、字幕、廣告後對時 「點前三台會跳到中間台」——見下節
5 真機截圖後把遙控器壓扁一半、改台序 模擬器看起來剛好,真機太大
6 熱門台(YouTube 台灣榜)放第一台,來源翻倍,兩台合併 schema 註解裡一個分號讓排程失敗兩輪
7 停留統計:每台進台次數、中位停留、三秒內轉走率 轉台時兩筆事件同一毫秒送出,到達順序會反,改用序號
8 改名 Ten TV、網址搬家、舊網址 301、黑底改版 舊頁面的 POST 被 301 變 GET
9 GPT 生 logo 去背版邊緣發光糊掉,改實色底重生才乾淨
10 開放收錄、伺服器端輸出介紹、sitemap、IndexNow 十台介紹原本是 JS 載入,爬蟲看不到

我猜錯了兩次

第一次:手機上點前三台,台號列會跳到中間。我判斷是「捲到畫面中央那格決定台號」的經典坑,交代代理「先查證再修」。它實測後回報:台號一直是對的,錯的是捲動量——用了從外層容器量起的位移,桌機多加了 461 像素,前三台被捲出畫面,看起來像跳台。我的假設不成立。

第二次:「CH 上下好像剛好相反」。我請它分鍵、鍵盤、手勢三層實測。結果邏輯三層都對,反的是按鍵位置——前一期瘦身時把 CH▼ 擺到了左邊,使用者照習慣按左邊那顆。

兩次都是同一個教訓:回報 bug 時「先查證再修」四個字要寫進交辦。代理如果照我的假設直接改,兩次都會改錯地方,而且看起來像修好了。

真機永遠贏模擬

第四期代理用內嵌 390 寬的框模擬手機,截圖一切正常。我用 iPhone 一開,遙控器占了半個螢幕,節目資訊被擠到看不見。第五期壓到 148 像素高,數字鍵改成單行「1 熱門」,一屏看完不用捲。

後來每一期都要求同時交桌機與手機截圖,但也明講:手機尺寸是模擬的,真機由我看。沒驗的就寫沒驗,比假裝驗過省很多事。

YouTube 給的三條邊界

  • 廣告躲不掉。片頭、片中、直播插播全照上傳者設定,收入歸上傳者,我們一毛拿不到;不能擋、不能蓋,也不能換 nocookie 網域躲——那反而讓有 Premium 的觀眾看到廣告。廣告會讓進度漂,所以每 15 秒比對一次,差超過 8 秒就追回伺服器時間。
  • 約一到兩成影片不給嵌入,而且可能播到一半被設成不可嵌入(當天真的遇到一支 TVBS 新聞)。播放器回錯誤碼就標壞片、換下一支。
  • 播放器自己的控制層關不乾淨。小尺寸嵌入時上方標題與右下 logo 是強制顯示的,條款也不准遮。能做的只有減少跳秒,讓它少冒出來。

成本:零

  • YouTube Data API 每日免費 10,000 單位,十台跑下來一天約 300–650;沒有付費方案,超過只能申請。
  • Claude 過濾走訂閱額度的 Haiku,一天幾百支影片不到一塊錢。
  • 伺服器寄生既有 VM,影片由 YouTube 直接傳給觀眾,觀眾變多不花錢。
  • 兩輪 logo 共四張,NT$0.83。

為什麼只做十台

遙控器 0 到 9 一個鍵到台,這是「電視」跟「播放清單」最大的手感差異;超過十台就得按兩位數。更重要的是,我要驗證的假設是「不用選」,台一多就回到 YouTube 首頁的選擇焦慮。同樣的來源量,十台每台十四個來源,比二十台每台七個好得多——重播是這種產品最快讓人走的原因。

想變化不加台數,真電視的老辦法還在:同一台分時段編排、留一個位置給本週提案票選第一名。這兩條等停留統計跑滿兩週再決定。

沒做完的

  • 停留統計的資料表現在是空的,第一份週報要等真實觀眾滿七天。
  • 手機觸控滑動、有片頭廣告時的對時,都還沒在真機上完整驗過。
  • Google 還沒爬過這個網址,要去 Search Console 按一次「要求建立索引」。

打開 satsumacreative.tw/tentv,按開機,轉台。覺得缺哪一台,頁面最下面可以提案。


延伸閱讀