在Day 28:Flask計畫.IP 與 PORT 之門中,你們拆開風扇後發現裡面居然藏著一塊電路板!原來,這就是你們在找的隱藏的電路板。你們終於可以用電路板來欺騙門禁系統,讓門禁系統以為你們是合法的使用者,這樣你們就可以逃出密室,看到大漂亮了!
你們發現這個門禁系統的 Flask 容器
沒有設定密碼或驗證機制,所以你們打算用Docker
直接訪問它的 Web 介面
,然後用 POST 請求
來傳送開門指令。但事情沒有那麼簡單,因為你們想了幾個方法,但不是沒有權限,就是不知道IP
和PORT
,結果卡住了。接著毛帽哥想到,可以用「requests
發送HTTP請求
」。
「但是用這個方法感覺要試很多次欸……」你皺眉,很懷疑這個方法,「IP位置
是4個範圍0~255的數字組成,PORT號碼
是0~65535的數字組成,那不是要跑很久?」
「對啊,還有可能被防火牆之類的擋下來」眼鏡仔附和,「可能是覺得反正我們會試很久,所以才乾脆不做安全措施吧。真是殺傷力不大,侮辱性極強……」
「沒辦法了,只能試試看了。」毛帽哥說,「我們可以用Python的itertools模組
來產生所有組合,再用Multiprocessing模組
來加速運算,然後用Pool 類別同時發送多個HTTP請求,來提高效率。」
關於「 Python itertools 模組的窮舉排列組合」,可以參考 開心學程式(2019) 寫的這篇文章
關於「 Python multiprocessing 模組 和 Pool 類別」,可以參考 Amo Chen(2023) 寫的這篇文章
- 文章中透過寄信給 100 位使用者的例子,講述了平行處理的使用優點。還包含了如何使用 Pool 寄信給 100 位使用者的程式碼實例。
- 假設每封信需要 1 秒寄出,那麼如果不使用平行處理,單以 for 迴圈處理,寄完 100 封信就需要 100 秒;如果以 4 個 workers 平行處理的話,理論上可以在 25 秒(100 / 4)左右處理完。
你們看著程式在跑,但隨著時間一分一秒過去,都沒有成功的跡象。你感覺這就像是在一條有無數道門的長廊,尋找著正確的那道門,但是一直找不到,也不知道何時會找到。你們的心情也漸漸從滿心期待變成近乎絕望。
就在這時,電腦上突然出現一行字:
Success! The IP address is 192.168.100 and the PORT number is 5000.
你們成功了,不敢相信地看著這行字!於是你們打鐵趁熱,用Postman工具
發送了POST請求
,結果發送成功。電腦出現了一個HTML畫面
,上面寫著:
物聯網幽靈的挑戰,用以下的線索,大喊芝麻開門吧!
- Flask 容器的 IP 位址和 PORT 號碼是
192.168.1.100:5000
- Flask 容器的密碼或驗證機制是
Basic Auth
,帳號是admin
,密碼是123456
- Flask 容器的 API 路由是
/open_door
「這是……在玩哪招?」你問。
「看來大漂亮是要我們用Flask
來建立一個RESTful API
……」眼鏡仔大嘆一口氣,「想不到還沒辦法打開門……」
「你剛才說Flask
是用Python寫的輕量級Web框架,可以讓我們快速建立Web應用程式。」你問,「那RESTful API
又是什麼東西……?」
「RESTful API
」
「那她要我們建立什麼RESTful API
?」
關於
Postman工具
,是一個模擬HTTP請求
的工具,可以用來測試網路程式的功能和效能。HTTP方法
是用來定義網路上資料的操作方式,常見的有GET
、POST
、PUT
、DELETE
等。API
是應用程式介面的縮寫,軟體之間溝通的規章和橋樑。可以想像成是一位翻譯,幫助不同國家、不同語言的人溝通。RESTful API
就是一種API的架構風格,因為有更加清晰、簡潔、易於使用和維護的特色,可以讓不同的軟體和程式可以更方便的溝通。
關於「使用 Flask 框架建立 RESTful API」可以參考氣球寫的這篇文章