# n8n:YT串流數據→Notion
為了初步認識n8n,所以想了一個簡單的題目來實做一下。
最後決定利用n8n結合python,並搭配Notion,來搭造個人的簡易數據資料庫,以YT直播紀錄檔作為抓取資料的目標,針對指定的YTR來觀測一下相關的數據(EX:新增會員數、superchat金額...)
## Step 1:安裝/建立n8n帳戶,並開啟n8n
因為雲端版的要課金,所以我自己是先載了本地版的來玩看看,不過部分功能會受到限制;有興趣的人可以依照自己的需求尋找安裝或是使用n8n的方式。
我個人的安裝是參考:[How to Install and Self-Host n8n For Free](https://www.youtube.com/watch?v=fh5Mmi1fRBc),是不需要docker的版本。
### 簡易流程
第2~4點,需在cmd裡面輸入指令執行。
1. 下載[Node.js](https://nodejs.org/en/download)
2. 確認是否安裝成功
```
node --version
```
3. 安裝n8n
```
npm install n8n -g
```
5. 開啟n8n
```
n8n
```
成功的話,會顯示下圖資訊

1. 打開連結(可以按著Ctrl點選連結,也會在瀏覽器打開)
第一次進入的話,會請使用者建立帳密
**Tips**:容易忘記的人最好要特別記下來,因為是本地端的服務,所以雖然有forget password的按鈕,但實際上不會幫助你找回密碼(By 差點失去帳戶的人

3. 一切順利的話,就會進入workflow主控台

## Step 2:設定Notion API
在開始建立流程前,先把Notion的API設定一下,這樣n8n才知道要把資料更新到哪個Notion的頁面當中。
1. 進入Notion的Integrations頁面,並新增

1. 完成命名,並選取要上傳資料到的workspace為何,最後按Create

2. 在Internal integration secret點選show,並複製API key

1. 回到n8n的頁面,新增Credential,選擇Notion API


3. 填入API key,觀察是否連結成功


1. 回到Notion,開設一個database page,連結到剛剛建立的Integration

## Step 3:建立Python跟n8n的連結
關於如何對YT直播的聊天紀錄檔處理,我是採用在本地跑Python script,再上傳到n8n。
也許有機會可以讓n8n去主動call Python來跑,但我目前還沒有找到相關的方式,也歡迎分享給我~
### 1. 開一個空的workflow,並建立webhook

全新的頁面如下:

點選"+",並選擇webhook

從這邊就可以獲得,python要上傳給n8n的網址路徑了

### 2. 建立Python script處理直播聊天紀錄
有一個open source的library在協助抓直播聊天記錄檔的資料,也就是`chat_downloader`。
不過目前[官方release的版本](https://github.com/xenova/chat-downloader)有點問題,issue中有好心人士fork原始的版本並進行修正了,我後來也是使用[好心人士的版本](https://github.com/Indigo128/chat-downloader)才能順利下載資料,有需要的話,請自行參考安裝。
另外,如果該直播紀錄檔有被關閉聊天紀錄,就沒有辦法取得資訊囉。
#### 簡述重點 (以該workflow尚未published的成果為例)
1. 使用`chat_downloader`把只跟superchat相關的資訊取出,並憑個人需求整理成json格式,並上傳到n8n
```
from chat_downloader import ChatDownloader
# 影片網址
video_url = "https://www.youtube.com/watch?v=<影片ID>"
# 欲上傳到n8n的資料,json格式
stats = {
"video_url": video_url,
"currency": "TWD",
"sc_amoount": 0,
"sc_count": 0,
"new_member": 0,
"old_member": 0
}
downloader = ChatDownloader()
df = downloader.get_chat(video_url, message_groups=['superchat'])
for message in df:
# 憑個人需求設計,在此更新json內容
# 下載.json,方便確認一下資料處理完的內容
file_name = <欲儲存位置>
with open(file_name, 'w', encoding='utf-8') as f:
json.dump(stats, f, ensure_ascii=False, indent=4)
# 卡一個input,讓使用者去執行n8n的workflow
# 如果建立好的n8n是一直在監聽的階段,應該可以省略此步驟
check = input("Listen to Webhook(y/n): ")
# n8n webhook node裡面的網址
n8n_webhook_url = "http://localhost:5678/webhook-test/<path>"
# 執行並發送
if(check == "y"):
try:
response = requests.post(n8n_webhook_url, json=stats)
print(f"狀態碼: {response.status_code}")
print(f"n8n 回傳內容: {response.text}")
if response.status_code == 200:
print("傳送成功!請檢查 n8n 畫面。")
elif response.status_code == 404:
print("錯誤:找不到 Webhook。請確認 n8n 是否正在 'Listen for Test Event'。")
except Exception as e:
print(f"發生錯誤: {e}")
```
1. 執行 .py,並確認workflow已取得資訊

出現input()之後,記得先去執行workflow,表明n8n要開始監聽事件了。
**注意**:在testing的階段只能監聽兩分鐘

確認已在監聽狀態後,輸入y

有打勾就代表執行完成

點選Webhook node,可以確認拿到的資訊是否正確

## Step 4:設計workflow,將資料匯入Notion
Webhook後面的節點可以自由發揮,我自己還有另外抓的資料有:
* 透過影片網址,抓取影片標題及發佈時間
* 直接去找該YTR的相關Query,取得頻道瀏覽總次數及訂閱者數量
* 紀錄上傳該筆資料的時間
最後把所有的資訊整合起來,匯入Notion

### 匯入Notion說明
1. 回到notion的database page,把相關的欄位先設定好。

1. 在workflow裡面新增一個Notion node,選擇`Create a database page`

3. 點選Notion node,設定Credential(API),以及要連結到哪一個database page

1. 在Properties的部分,把INPUT與Notion欄位做對應
* Key Name or ID 的下拉式選單會直接link到Notion的欄位
* 記得INPUT與Notion欄位的type需一致,比如說都是number,都是string
* 成功後執行後,也會顯示上傳到Notion的成果(如箭頭的指向變化)

## Step 5:透過Notion Chart觀察數據
將以上流程看是用手動trigger,或是偵測有新直播紀錄檔就抓網址然後trigger,之類的就可以完成資料的蒐集。(我個人不會一直開著電腦跑流程,所以還是手動trigger的部分,但不得不說也是少很多工了)
最後,推薦可以在Notion額外開一個database page做統整(下稱Summary page),這樣就可以保持原本的database的乾淨(?),不用怕突然改到甚麼。
在Notion裡面可以設定database page的link(紅框),所以就可以把Summary page,link到 database page,專門呈現數據變化。
想要呈現統整甚麼內容,都可以自行發揮滿有趣的XD
比如說大家對於什麼樣的直播內容會斗內最多之類的www

## 小提醒
* YT_superchat_record.json 可直接匯入workflow當中,其中我有把指定YTR相關的key、id之類的空掉,請自行填入
## 感謝觀看!
如果有任何建議或感想,歡迎分享!