HTTP_Game攻略(一)

前言

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

關卡要求

使用 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
2
3
4
5
6
7
8
9
10
11
12
request.post({
url:'https://lidemy-http-challenge.herokuapp.com/api/books',
form:
{
name:'《大腦喜歡這樣學》',
ISBN: 9789863594475
}
},
function(err,httpResponse,body){
console.log('httpResponse', httpResponse);
console.log('body:', body);
});

執行後獲得 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
2
3
4
5
let str = '世界';
let uri = encodeURI(`https://lidemy-http-challenge.herokuapp.com/api/books?q=${str}`);
request.get(uri, function (error, response, body) {
console.log(JSON.parse(body));
});

執行後獲得 id 為 79 ,從網址列傳給 Server。

1
https://lidemy-http-challenge.herokuapp.com/lv4?token={LEarnHOWtoLeArn}&id=79

得知 token{HarukiMurakami}

LV.5

關卡要求

刪除一本 id 是 23 的書

解法

使用 delete 方法,得到系統回傳的 token

1
2
3
request.delete('https://lidemy-http-challenge.herokuapp.com/api/books/23', function (error, response, body) {
console.log(JSON.parse(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
    19
    var 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);

執行後得知 emaillib@lidemy.com ,使用 query string 傳給 Server 。

得知 token{SECurityIsImPORTant}

LV.7

關卡要求

刪除 id 是 89 的書籍

解法

與上題差別不大,修改方法以及 API 即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var 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/books/89',
headers: {
'Authorization': `Basic ${base64Str}`
}
};

function callback(error, response, body) {
console.log(error);
console.log(JSON.parse(body));
}

request.delete(options, callback);

執行後得知 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
    44
    var 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
    19
    var 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 關比較進階的關卡可以挑戰,寫到這邊篇幅已經很長了,下一篇再繼續寫攻略。

0%