大家都可以來挑戰一下!
這是一個串接 API 的娛樂挑戰,同時加深對於 HTTP 通訊協定的觀念,裡面有很多很多彩蛋,當然大部分是有一定年紀的才知道,這次使用 Node.js 來通關 🚀
LV.0
關卡要求
照著文件說明打上 {token},沒有難度
參數部分
token={...}
,當成功解決關卡就會得知 token 內容,代入即可前往下關&hint=1
,看提示用
解法
輸入網址,前往下一關
https://lidemy-http-challenge.herokuapp.com/lv1?token={GOGOGO}
LV.1
關卡要求
得到一份之後會用到的文件
使用 get 方法把自己的 name 傳給 Server
解法
操作網址列帶入參數即可
https://lidemy-http-challenge.herokuapp.com/lv1?token={GOGOGO}&name=oliver
得知 token 為 {HellOWOrld}
LV.2
關卡要求
操作網址列帶入參數 (id 54 ~ 58) 即可
解法
https://lidemy-http-challenge.herokuapp.com/lv2?token={HellOWOrld}&id=56
依據代入試試看,得知 id = 56,token = {5566NO1}
LV.3
查看 LV.1 時得到的API文件
關卡要求
使用 POST 新增書籍,書名是《大腦喜歡這樣學》,ISBN 為 9789863594475,新增完查看 body,再將 id 當作參數傳入網址列
解法
const request = require("request");
const URL = " https://lidemy-http-challenge.herokuapp.com/api";
request.post(
{
url: `${URL}/books`,
form: {
name: "《大腦喜歡這樣學》",
ISBN: 9789863594475,
},
},
(err, res, body) => {
console.log("res:", res);
console.log("body:", body);
}
);
執行後獲得 id 為 1989 ,從網址列傳給 Server
https://lidemy-http-challenge.herokuapp.com/lv3?token={5566NO1}&id=1989
得知 token 為 {LEarnHOWtoLeArn}
之後皆須查看 API 文件,以下省略說明
LV.4
關卡要求
查詢書籍中含有「世界」二字的書,且作者為村上春樹,再將此書 id 當作參數傳給 Server
解法
直接帶入 q 無效,需要使用 encodeURI()
轉換網址
const request = require("request");
let str = "世界";
request.get(
{
uri: encodeURI(
`https://lidemy-http-challenge.herokuapp.com/api/books?q=${str}`
),
},
(err, res, body) => {
console.log(JSON.parse(body));
}
);
得知 id = 79,傳給 Server
https://lidemy-http-challenge.herokuapp.com/lv4?token={LEarnHOWtoLeArn}&id=79
token 為 {HarukiMurakami}
LV.5
關卡要求
刪除一本 id 是 23 的書
解法
使用 delete 方法,得到系統回傳的 token
const request = require("request");
request(
{
method: "DELETE",
uri: "https://lidemy-http-challenge.herokuapp.com/api/books/23",
},
(err, res, body) => {
console.log("刪除成功");
console.log(JSON.parse(body));
}
);
得知 token 為 {CHICKENCUTLET}
LV.6
關卡要求
獲得一組帳號密碼:
- 帳號 : admin
- 密碼 : admin123
登入後,呼叫 /me 的 endpoint,得到一組 email 並傳給 Server
解法
Node.js 可使用 Buffer.from() 進行 base64 編碼,準備好一組字串 base64(username:password)
再將其加入請求的 header 中
const request = require("request");
let account = "admin";
let pwd = "admin123";
let base64Str = Buffer.from(`${account}:${pwd}`).toString("base64");
const options = {
uri: "https://lidemy-http-challenge.herokuapp.com/api/v2/me",
headers: {
Authorization: `Basic ${base64Str}`,
},
};
const callback = (err, res, body) => {
console.log(JSON.parse(body));
};
request.get(options, callback);
執行後得知 email 為 lib@lidemy.com ,使用 query string 傳給 Server
https://lidemy-http-challenge.herokuapp.com/lv6?token={CHICKENCUTLET}&q=lib@lidemy.com
LV.7
關卡要求
刪除 id 是 89 的書籍
解法
與上題差別不大,修改方法以及 API 即可
const request = require("request");
const URL = " https://lidemy-http-challenge.herokuapp.com/api/v2";
let account = "admin";
let pwd = "admin123";
let base64Str = Buffer.from(`${account}:${pwd}`).toString("base64");
const options = {
uri: `${URL}/books/89`,
headers: {
Authorization: `Basic ${base64Str}`,
},
};
const callback = (err, res, body) => {
console.log("刪除成功");
console.log(JSON.parse(body));
};
request.delete(options, callback);
// id = 89, delete
執行後得知 token 為 {HsifnAerok}
LV.8
關卡要求
找到書名含有「我」字,作者為四個字,ISBN 最後一碼為 7 的書,將他的 ISBN 最後一碼改為 3
解法
- 查詢書籍,獲得正確 id 為 72
- 修改書籍
const request = require("request");
let str = "我";
let account = "admin";
let pwd = "admin123";
let base64Str = Buffer.from(`${account}:${pwd}`).toString("base64");
const findOptions = {
uri: encodeURI(
`https://lidemy-http-challenge.herokuapp.com/api/v2/books?q=${str}`
),
headers: {
Authorization: `Basic ${base64Str}`,
},
};
const patchOptions = {
uri: "https://lidemy-http-challenge.herokuapp.com/api/v2/books/72",
contentType: "application/x-www-form-urlencoded",
headers: {
Authorization: `Basic ${base64Str}`,
},
form: {
name: "日日好日:茶道教我的幸福15味【電影書腰版】",
ISBN: 9981835423,
},
};
// id = 72, ISBN: 9981835427
const findOneBook = (err, res, body) => {
const data = JSON.parse(body);
for (let i of data) {
if (i.author.length == 4 && i.ISBN[9] == 7) {
return i;
}
}
};
const patchOneBook = (err, res, body) => {
console.log(JSON.parse(body));
};
// 查詢書籍
request.get(findOptions, findOneBook);
// 修改書籍
request.patch(patchOptions, patchOneBook);
這部分應該還可以寫的更好,重用性更高,日後再回頭來看如何重構
執行後得知 token 為 {NeuN}
LV.9
關卡要求
- 帶上一個 X-Library-Number 的 header,我們圖書館的編號是 20
- 伺服器會用 user agent 檢查是否是從 IE6 送出的 Request,不是的話會擋掉
達成以上兩個要求,拿到系統資訊之後取得 version 欄位內的值,並傳回 Server
解法
- 補上對應的 header : X-Library-Number
- 偽造 IE6 的
User-Agent
, 需查找關鍵字User-Agent
用法
const request = require("request");
let account = "admin";
let pwd = "admin123";
let base64Str = Buffer.from(`${account}:${pwd}`).toString("base64");
const options = {
url: encodeURI("https://lidemy-http-challenge.herokuapp.com/api/v2/sys_info"),
headers: {
Authorization: `Basic ${base64Str}`,
"X-Library-Number": 20,
"User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
},
};
const callback = (err, res, body) => {
console.log(JSON.parse(body));
};
request.get(options, callback);
得知 version 值為 1A4938Jl7 , 使用 query string 傳給 Server
https://lidemy-http-challenge.herokuapp.com/lv9?token={NeuN}&version=1A4938Jl7
得知 token 為 {duZDsG3tvoA}
LV.10
最後一題就普通邏輯遊戲,小時候都玩過,慢慢試
題目要求
出題者會出一個四位數不重複的數字,例如說 9487。
你如果猜 9876,我會跟你說 1A2B,1A 代表 9 位置對數字也對,2B 代表 8 跟 7 你猜對了但位置錯了。
開始吧,把你要猜的數字放在 query string 用 num 當作 key 傳給我
解法
最後得知正確數字為 9613
執行後得知 token 為 {IhateCORS}
挑戰心得
蠻有趣也設計的蠻好的,每一關都有東西要讓你了解,基礎加密、驗證、文件使用方法等,彩蛋也可以回頭再看,還有周杰倫的半島鐵盒(小爆雷),可以邊聽邊寫挑戰 🤣🤣