實作youtube直播聊天訊息爬蟲

前陣子因為工作需要,研究了一下如何取得 youtube 聊天室訊息,今天就稍微分享一下過程跟心得吧

Intro

本文範例程式碼:Github: youtubeLiveChatCrawler

一開始我想得很簡單,就是取得 youtube 直播影片的聊天室訊息內容而已,youtube 那麼大間,官方 API 肯定有這東西,於是直接搜尋 youtube Live Stream API,找到了開發者文件,心裡想著就是事情搞定一半了,沒問題,穩嘞

結果事情真的沒有像我想的那麼簡單,最終還是參考了其他人爬蟲的 openSource 才成功,主要就是 chat downloader

重點

  1. 直播主需要建立直播活動,並選擇啟用聊天室,這樣直播活動 live 的時候才會有聊天室,在直播期間,透過官方的 API 的確是可以取得聊天紀錄,但結束後就不能用了
  2. 直播結束之後,直播影片存檔有一個設定是是否要顯示聊天歷史,要打勾。
  3. 爬蟲的原理是在直播結束之後,從影片網址取得的 HTML 當中去解析出來 continuationapiKey
    • 網址:https://www.youtube.com/watch?v={0}
    • continuation: 我的理解是一個 token,透過這一個 token 可以取得下一份資料
    • apiKey: 之後要資料會需要這個 apiKey
  4. 取得 continuation 就可以開始請求聊天訊息,第一次請求聊天訊息仍舊採用 HttpGet,
    • 網址:https://www.youtube.com/live_chat_replay?continuation={0}
  5. 後續取得聊天室訊息,則是用 HttpPost 請求 (continuation 則是透過 BODY 送過去)
    • 網址:https://www.youtube.com/youtubei/v1/live_chat/get_live_chat_replay?key={0}
  6. 聊天訊息其實是放在 HTML 裡面的 javascript 內,而不是直接去抓網頁上DOM的顯示,也因此需要對 youtube 回傳的聊天資料格式稍微了解一下,像是斗內的話會是甚麼格式、貼圖、加入頻道會員等等,因為我只需要聊天的內容,其他的東西都被省略就沒有仔細研究了

大致上重點就是這些,實際的邏輯就請直接參考文章開頭提供的原始碼吧

雖然最後也沒有用到,但還是提供給有需要的人吧

備註

  1. 專案一開始針對的是.netFrameWork,後來想的是希望做成小工具的方式來 open Source,所以為了跨平台也能用,採用了 .NET6 Core,有需要可以自行研究 dotnet publish
  2. 測試的部分因為希望能夠模擬 httpClient 的回應資料,採用了MockHttp for HttpClient,當初會看到這個也是因為搜尋 stackoverflow 看到作者自己的回應,嘗試了一下挺好用
  3. output 的部分其實可以抽象做 Console 或者是 FileOutput,後續可能會也可能不會重構,但最主要的目的是抓訊息,這部分已經完成,本專案大概就是一個 POC 性質,所以我想其實也沒必要再弄其他的畫蛇添足了