# YouTube Search Engine 實作 ###### tags: `實作` `AJAX` `javascript` [實作頁面連結](https://allenw0815.github.io/mission/mission_33/index.html) ![](https://i.imgur.com/TQPMM18.png) ### Flowchart 1. HTML CSS 不多 2. 如何串接 YT 的 API 取得搜尋的相關資料 3. JS 讓資料在 input 點擊時顯示搜尋資料 4. 判斷有無上下頁來生成按鈕 ### YouTube API 取得 透過此平台( [Google cloud club Platform](https://cloud.google.com/?hl=zh-tw) )取得服務,建立憑證取得金鑰以及啟用下圖的 API ,這邊理解金鑰為辨認請求端身分以及做限制 ( 每日配額或影片嵌入權限之類的 ),圖三為每個金鑰的配額度,而不同的請求會消耗掉不同額度的配額,參考( [YouTube Data API (v3) - Quota Calculator](https://developers.google.com/youtube/v3/determine_quota_cost) ),也就是說我在頁面中搜尋個一百次達到配額上限後,之後的回應就會是 403 拒絕回復了。 ![](https://i.imgur.com/tsy1Ph3.png) --- ![](https://i.imgur.com/cqz39RF.png) --- ![](https://i.imgur.com/nHTQKjw.png) >JS流程 1. call API 得到資料,帶有各參數來取得資料 ```javascript= let key = "AIzaSyC3Uae2cxrss-MgXU3XyoXXh6As_4ffE4Y" let key2 = "AIzaSyAR5RPNsaVqHdtlYeNjtQQm12R8KSzsnHY" // 啟用兩組因配額用完 $('.submit').click(function(){ let q = $('input').val() videoSearch(key2,q,5) }) function videoSearch (key, q, limit) { $.get('https://www.googleapis.com/youtube/v3/search', { part: "snippet,id", q: q, //搜尋內容 type: "video", key: key, // 金鑰 maxResults: limit,//筆數 }, function(data){ // 換頁用 let nextPageToken = data.nextPageToken let prevPageToken = data.prevPageToken data.items.forEach((item)={ // display... 畫面內容生成 }) $('.result ul').html(display) // 生畫面 let btns = createBtn(nextPageToken,prevPageToken,q) //造按鈕 $('.pages').html(btns) //生按鈕 $('#prev').on('click',prevPage) $('#next').on('click',nextPage) }) } ``` 2. 換頁面按鈕的部分,在資料中有換頁的 token 可使用,取得後傳入此 function 內紀錄在 data-key 屬性裡面,q 搜尋結果也傳進來 ( 這樣當 input.value 更換時沒有案搜尋都不會改變資料 ) ```javascript= function createBtn(nextPageToken,prevPageToken,q){ let output = '' // 讓第一頁只有下一頁的一個按鈕之判斷 if(!prevPageToken){ output = ` <button class="switch" id="next" data-token=${nextPageToken} data-query=${q} onclick="nextPage()"> <i class="fas fa-arrow-circle-right"></i> </button> ` }else{ output = ` <button class="switch" id="prev" data-token=${prevPageToken} data-query=${q} onclick="prevPage()"> <i class="fas fa-arrow-circle-left"></i> </button> <button class="switch" id="next" data-token=${nextPageToken} data-query=${q} onclick="nextPage()"> <i class="fas fa-arrow-circle-right"></i> </button> ` } return output } ``` 這邊只差在多了一個帶入參數,上下頁取不同 token 即可 ```javascript= function nextPage(){ let token = $('#next').data('token') let q = $('#next').data('query') $.get('https://www.googleapis.com/youtube/v3/search', { part: "snippet,id", q: q, type: "video", key: key, pageToken: token, //唯一差別在這邊多傳入了此參數 maxResults: limit, }, function(data){ // 換頁用 let nextPageToken = data.nextPageToken let prevPageToken = data.prevPageToken data.items.forEach((item)={ // display... 畫面內容生成 }) $('.result ul').html(display) // 再生下一頁畫面 let btns = createBtn(nextPageToken,prevPageToken,q) //造按鈕 $('.pages').html(btns) //生按鈕 $('#prev').on('click',prevPage) $('#next').on('click',nextPage) }) } ``` ### 紀錄 * 要用JavaScript操縱網頁的DOM元素時,必須等網頁完全載入後才可安全地進行操作,而要確保網頁載入,可使用 JQ ( 一 ) & JS ( 二 ) ```javascript= $( document ).ready(function() { // 在這撰寫javascript程式碼 }); ``` ```javascript= window.onload = function() { // 在這撰寫javascript程式碼 }; ``` * 最後這個光箱函式庫來播放影片,沒有多研究,引入後只套 class 而已。 [fresco.js](https://www.frescojs.com ### 小記 整個專案只做到拿到資料、顯示畫面、換頁、光箱播放,除此之外有需多文件跟有的沒有的設定很複雜,上網查也有許多不同的做法,而且有許多小問題會出現,像是配額這部分原本不知道,出錯後找了半天才發現,有些影片回無法撥放有些卻可以,好像是影片的類型也有區別的樣子,好難啊幹! 等之後強一點再補充吧。