前言
Lidemy HTTP Challenge
是 Huli 在程式導師計畫中推出來讓我們練習的小遊戲,用來加深對於 HTTP 通訊協定的觀念。在第三期還沒正式開始之前,我就已經先玩過一次了,不過當時是使用 POSTMAN 通關,這次我打算使用 Node.js 搭配 Request 套件通關。
LV.0
只是教學關卡,按照說明文建操作即可。
參數部份
token={...}
,當成功解決關卡就會得知 token 內容,代入即可前往下關。&hint=1
,看提示用
因此輸入下列網址,前往下一關。
1 | https://lidemy-http-challenge.herokuapp.com/lv1?token={GOGOGO} |
LV.1
- 得到一份之後會用到的 API 文件
關卡要求
使用 get 方法把自己的 namr 傳給 Server 。
解法
操作網址列帶入參數即可。
1 | https://lidemy-http-challenge.herokuapp.com/lv1?token={GOGOGO}&name=Alvan |
得知
token
為{HellOWOrld}
LV.2
關卡要求
有本書的 id 是兩位數,介於 54 ~ 58 之間,找到是哪一本之後,把書的 id 傳給 Server 。
解法
操作網址列帶入參數 (id: 54 ~ 58 間) 即可。
1 | https://lidemy-http-challenge.herokuapp.com/lv2?token={HellOWOrld}&id=56 |
用硬 A 法得知
token
為{5566NO1}
LV.3
查看 LV.1 時得到的API 文件
關卡要求
新增一本書名是《大腦喜歡這樣學》,ISBN 為 9789863594475 ,接著把 id 傳給 Server
解法
1 | request.post({ |
執行後獲得 id
為 1989 ,從網址列傳給 Server。
1 | https://lidemy-http-challenge.herokuapp.com/lv3?token={5566NO1}&id=1989 |
得知
token
為{LEarnHOWtoLeArn}
LV.4
之後的關卡大多都需要查看 API 文件,就不贅述了。
關卡要求
搜尋書名有:「世界」兩字,而且是村上春樹寫的,接著把 id 傳給 Server
解法
直接代入參數 q
查詢是無效的,本題關鍵點在於使用 encodeURI()
轉換網址。
1 | let str = '世界'; |
執行後獲得 id
為 79 ,從網址列傳給 Server。
1 | https://lidemy-http-challenge.herokuapp.com/lv4?token={LEarnHOWtoLeArn}&id=79 |
得知
token
為{HarukiMurakami}
LV.5
關卡要求
刪除一本 id 是 23 的書
解法
使用 delete 方法,得到系統回傳的 token
1 | request.delete('https://lidemy-http-challenge.herokuapp.com/api/books/23', function (error, response, body) { |
得知
token
為{CHICKENCUTLET}
LV.6
獲得新的 API 文件,往後都使用這一份。
關卡要求
獲得一組帳號密碼:
- 帳號:admin
- 密碼:admin123
登入後,呼叫 /me 的 endpoint,得到一組 email 並傳給 Server
解法
由文件可知,必須準備好一組字串,內容為 base64(username:password)
。
所以要對帳號以及密碼進行 base64 編碼, Node.js 可使用 Buffer.from()
進行 base64 編碼。
得到 base64 編碼後,將其加入請求的 header 中。
- 關鍵字
http basic authorization
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19var request = require('request');
let account = 'admin';
let pwd = 'admin123';
let base64Str = Buffer.from(`${account}:${pwd}`).toString('base64');
//console.log(base64Str);
var options = {
url: 'https://lidemy-http-challenge.herokuapp.com/api/v2/me',
headers: {
'Authorization': `Basic ${base64Str}`
}
};
function callback(error, response, body) {
console.log(error);
console.log(JSON.parse(body));
}
request.get(options, callback);
執行後得知 email
為 lib@lidemy.com ,使用 query string
傳給 Server 。
得知
token
為{SECurityIsImPORTant}
LV.7
關卡要求
刪除 id 是 89 的書籍
解法
與上題差別不大,修改方法以及 API 即可
1 | var request = require('request'); |
執行後得知
token
為{HsifnAerok}
LV.8
關卡要求
修改某書內名稱有個「我」且作者的名字是四個字, 輸入錯的 ISBN 最後一碼為 7 ,只要把最後一碼改成 3 就行了。
解法
- 查詢書籍,獲得正確 id 為 72
- 修改書籍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44var request = require('request');
let account = 'admin';
let pwd = 'admin123';
let base64Str = Buffer.from(`${account}:${pwd}`).toString('base64');
//console.log(base64Str);
function findBook(queryStr) {
let encodeUri = encodeURI(`https://lidemy-http-challenge.herokuapp.com/api/v2/books?q=${queryStr}`);
var options = {
url: encodeUri,
headers: {
'Authorization': `Basic ${base64Str}`
}
};
function callback(error, response, body) {
console.log(JSON.parse(body));
}
request.get(options, callback);
}
function updateISBN(content) {
var options = {
url: 'https://lidemy-http-challenge.herokuapp.com/api/v2/books/72',
contentType: 'application/x-www-form-urlencoded',
headers: {
'Authorization': `Basic ${base64Str}`
},
form: {
name: '日日好日:茶道教我的幸福15味【電影書腰版】',
ISBN: content
}
};
function callback(error, response, body) {
console.log(error);
console.log(JSON.parse(body));
}
request.patch(options, callback);
}
// 找出符合的書籍
findBook('我');
// 修改資料
updateISBN(9981835423);
執行後得知
token
為{NeuN}
LV.9
關卡要求
根據敘述,需要符合兩個條件才能使用這個 API
- 帶上一個
X-Library-Number
的 header,我們圖書館的編號是 20 - 伺服器會用 user agent 檢查是否是從 IE6 送出的 Request,不是的話會擋掉
拿到系統資訊之後取得 version 欄位內的值,並傳回 Server
解法
- 補上對應的 header
- 偽造 IE6 的
User-Agent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19var request = require('request');
let account = 'admin';
let pwd = 'admin123';
let base64Str = Buffer.from(`${account}:${pwd}`).toString('base64');
//console.log(base64Str);
let encodeUri = encodeURI(`https://lidemy-http-challenge.herokuapp.com/api/v2/sys_info`);
var options = {
url: encodeUri,
headers: {
'Authorization': `Basic ${base64Str}`,
'X-Library-Number': 20,
'User-Agent': 'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)',
}
};
function callback(error, response, body) {
console.log(JSON.parse(body));
}
request.get(options, callback);
執行後得知 version
值為 1A4938Jl7 , 使用 query string
傳給 Server 。
1 | 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 傳給 Server 。
解法
就慢慢嘗試,這是邏輯問題
1 | https://lidemy-http-challenge.herokuapp.com/lv10?token={duZDsG3tvoA}&num=9876 |
最後得知正確數字為 9613
執行後得知
token
為{IhateCORS}
後記
到這邊基礎的 1 ~ 10 關已經全破了,然而後面還有 5 關比較進階的關卡可以挑戰,寫到這邊篇幅已經很長了,下一篇再繼續寫攻略。