Using API
What-is
何謂「API」?你可以自己看看Wikipedia:API,但簡單的說就是,原本我們從客戶端要存取伺服器端的資料時,如果伺服器端允許你下資料庫查詢,那你就可以用資料庫語言如SQL去查詢資料(不過這是不可能的);或者在伺服器端沒提供你直接存取資料庫,但反正他是網頁,你就把他爬下來(這是最常見的)。但有些伺服器會設計有API,讓前端工程師比較容易取得後端資料,卻不必讓他們接觸到後端資料庫的實作。所以,照這麼說來,功能性上地來說,API就是伺服器端所提供你的一套資料查詢方法。
Twitter Stream API
R Streaming API https://cran.r-project.org/web/packages/streamR/streamR.pdf
R package for twitter stream API http://pablobarbera.com/blog/archives/1.html
Facebook ads API
Facebook Ad Library query system 可查詢韓國瑜的相關臉書廣告
Example: 輕實作:獲取臉書內建隱藏興趣受眾名稱!幫助你快速確認可用的客群清單
Youtube Data API
你也可以參考這篇網友的教學。
1. 使用Google cloud platform並登入
拜訪https://console.cloud.google.com/。然後你會需要用一個Google account啟用你的服務,我建議你用學校給的Google Account,這樣可以讓你之後便於建立OAuth2.0服務。

2. (可跳過)啟用 Google clould platform
可參考該Youtuber的說明來啟用Google Cloud Platform。會需要用到信用卡帳號,但隨時可以停止計費,若超過額度也會在詢問後才開始自動計費。
3. 啟用Youtube Data API
在上方搜尋列搜尋youtube data api後點選Youtube Data API v3,點選ENABLE後即可使用。

4. 建立憑證
通常會預設有一個My First Project,你可以點選Project處建立一個新的Project。建立好後,點選憑證Credentials處,然後點選上方的新增憑證。憑證有兩種,一種是API Key,另一種是OAuth client ID。
API Key這種是,你可以透過一串網址來獲取資料,這串網址不止有你要什麼資料,你還要把你的API Key給附上去。通常可以用這種方式就好。
OAuth Client ID這種是,你程式執行後,他會跳出一個一般我們需要通過OAuth驗證時常會跳出的視窗,點選用你的Gmail帳號驗證後即可通過。R有一個Youtube Client套件tuber,他會需要你用OAuth的方式來驗證。而現在OAuth的申請比較嚴謹,因為這會讓你所開發的程式可以當成正式的App來使用,所以他會審核。但如果你想要他不審核你,那你可以用學校給的G Suite帳號,他可以選擇只在機構內使用,這樣就可以暫時不理會審核的程序。

API Key
申請後會跳出讓你複製API Key的視窗,但未來也可以在底下的管理介面找得到。

OAuth
應用程式類型應選第一個網頁應用程式,名稱自取,就可以建立用戶端了。

5. Using tuber
如果是用已經包裹好的tuber client那就非常方便了,可以用別人幫你包裝好的函式取得video list、video comments等各種訊息。請直接參閱tuber教學。
下面的
app_id
和app_token
是不能用的,你必須取得你自己的。疑難排解:通常第一次做過OAuth後他會在你的電腦存一個json檔,之後就讀取該檔案。所以如果你下次更換
app_id
或app_token
時,再重新執行yt_oauth()
時他可能不會動,這時候你只需要把空字串指定給token他就會重新Update,如同以下的第五行。
library(tuber)
app_id <- "83399712813jeajf;asldfjakl;dfj;kj42-hip73psdmde9vpo41v19korf81060mnl.apps.googleusercontent.com"
app_token <- "LKvCyCBQ;kdsljfal;skfjd;lajycH7uy"
yt_oauth(app_id, app_token)
# yt_oauth(app_id, app_token, token = "")
例如如果你要取某支影片的comments,又要取超過100筆資料,Code如下,但是你應該會發現,他不讓你取超過200筆,這怎麼辦?自己寫Code讀取API,請見以下兩節。
res <- get_comment_threads(c(video_id=vid), max_results = 101)
6. Using API: An Introduction
太依靠別人的Client Packages是有點危險的,這樣你還是不會用API。所以還是要了解一下該怎麼用API。以Youtube data而言大體上就這三種API,Channel、Playlist與Comments。而API就長得像網址一樣,你可以透過指定不同的參數來獲取不同的資料。而API既然是個網址,那編法就是服務方定的,所以不同的服務其API的用法都差很多。唯獨就是以下幾點是共同的
所有查詢參數通通寫成網址
所有的查詢一定會有最大數量,他不會讓你一次全部取走,這樣才不會造成伺服器負擔,也不會造成資料容易被竊取。
那還未取完的資料API會在哪裡,通常可以在你目前所取得的這個資料中找到。
查詢某個Channel(CHANNEL_ID
)有哪些playlist的APIhttps://www.googleapis.com/youtube/v3/channels?part=contentDetails&id=CHANNEL_ID的id&key=YOUR_API_KEY
查詢某playlist(PLAYLIST_ID
)中有哪些Video的APIhttps://www.googleapis.com/youtube/v3/playlistItems?part=snippet,contentDetails,status&playlistId=PLAYLIST_ID&key=YOUR_API_KEY&maxResults=50
查詢某個Video(VIDEO_ID
)之留言的APIhttps://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&videoId=VIDEO_ID&key=YOUR_API_KEY
沒取完的資料怎麼取得?
前面說到那還沒取完的資料要怎麼取?此時要找到回傳資料的nextPageToken
,取代下方的NEXT_PAGETOKEN
,然後把他當成API的一部分繼續搜尋。就只多了最後一個參數而已。https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,contentDetails,status&playlistId=PLAYLIST_ID&key=YOUR_API_KEYAbccato&maxResults=50&pageToken=NEXT_PAGETOKEN
7. Using API by 偷吃步
直接讀這種大服務所釋出的API對部分初學者又有點辛苦(這門課學到這裡多半是能夠自己讀了),所以我們可偷看看tuber套件是怎麼寫的,來學學怎麼存取API。首先要先找到tuber的github repo,開啟其R的目錄就可以看到該套件的所有R檔。假設我現在要抓的是某一個video的comments,那我應該是找get_comments.R
這個檔案,我把比較重要的片段摘錄出來:
querylist <- list(part = part, maxResults =
ifelse(max_results > 100, 100, max_results),
textFormat = text_format,
pageToken = page_token)
querylist <- c(querylist, filter)
res <- tuber_GET("commentThreads", querylist, ...)
接下來,我要改寫自己的querylist。
這邊用到了
tuber_GET()
這個作者自己寫的function,等一下得接續查要怎麼GET()
。往前找可以找到
part = "snippet"
、text_format = "html"
。pageToken
是用來取得下一頁用的,這邊的pageToken
先設為NULL
,因為第一頁不會有。filter
是作者自己設的參數,我要的就是videoId,仿照上一節API的寫法加入videoId=vid
。
於是改寫過後完整的querylist
如下
querylist <- list(part = "snippet",
videoId = vid,
maxResults = 100,
textFormat = "html",
key = api_key,
pageToken = NULL)
接下來是參考tuber.R檔中的tuber_GET()
這個函式:
tuber_GET <- function(path, query, ...) {
yt_check_token()
req <- GET("https://www.googleapis.com", path = paste0("youtube/v3/", path),
query = query, config(token = getOption("google_token")), ...)
tuber_check(req)
res <- content(req)
res
}
我可以結合上面的querylist,再參考前面提到的commentThreads查詢(如下,就只是把commentThreads貼過來而已),就可以把上面的tuber_GET()
合理改寫為
https://www.googleapis.com/youtube/v3/commentThreads?part=snippet,replies&videoId=VIDEO_ID&key=YOUR_API_KEY
req <- GET("https://www.googleapis.com",
path = "youtube/v3/commentThreads",
query = querylist)
8. Your own code
vid <- "2zJkpNnyUx4"
api_key <- "AIzaSyCI11111138xH1pC131vEyWG_2U6K3UIEpA"
querylist <- list(part = "snippet",
videoId = vid,
maxResults = 101,
textFormat = "html",
key = api_key,
pageToken = NULL)
# res <- tuber_GET("commentThreads", querylist)
req <- GET("https://www.googleapis.com",
path = "youtube/v3/commentThreads",
query = querylist)
req$status_code
res <- req %>% content("text") %>% fromJSON()
此時,你若去取res
裡面的參數,可以得到以下結果res$nextPageToken "QURTSl9pM1RFUE02aFNEMWRhUmNDa2pXTWYzM1NRVDVxd19fZlB2YTI0UkZEM3F3LVJfclQ5ZWVFcm51TlMtN0V2eWdsS1kxZWJBX1J5aw=="
你也可以輸出req
中的url
來觀察你最後所下的API,是不是跟上面的API長得很像?‘
req$url
[1] "https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&videoId=2zJkpNnyUx4&maxResults=101&textFormat=html&key=AIzaS11111H1pC1r111c191IOB181v32132132131U1I1E1pA"
>
Last updated
Was this helpful?