Using API

What-is

何謂「API」?你可以自己看看Wikipedia:API,但簡單的說就是,原本我們從客戶端要存取伺服器端的資料時,如果伺服器端允許你下資料庫查詢,那你就可以用資料庫語言如SQL去查詢資料(不過這是不可能的);或者在伺服器端沒提供你直接存取資料庫,但反正他是網頁,你就把他爬下來(這是最常見的)。但有些伺服器會設計有API,讓前端工程師比較容易取得後端資料,卻不必讓他們接觸到後端資料庫的實作。所以,照這麼說來,功能性上地來說,API就是伺服器端所提供你的一套資料查詢方法

Twitter Stream API

Facebook ads API

Youtube Data API

你也可以參考這篇網友的教學。

1. 使用Google cloud platform並登入

拜訪https://console.cloud.google.com/。然後你會需要用一個Google account啟用你的服務,我建議你用學校給的Google Account,這樣可以讓你之後便於建立OAuth2.0服務。

成功啟用Google Cloud Platform的畫面

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_idapp_token是不能用的,你必須取得你自己的。

  • 疑難排解:通常第一次做過OAuth後他會在你的電腦存一個json檔,之後就讀取該檔案。所以如果你下次更換app_idapp_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的用法都差很多。唯獨就是以下幾點是共同的

  1. 所有查詢參數通通寫成網址

  2. 所有的查詢一定會有最大數量,他不會讓你一次全部取走,這樣才不會造成伺服器負擔,也不會造成資料容易被竊取。

  3. 那還未取完的資料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?