全網開發都可搭建技術資料庫篇2_如何呼叫沒有文件說明的 Web API

coutuixixia發表於2022-03-20

大家好!幾天前我寫了 全網開發都可搭建技術資料庫篇2_Linux系統MySQL配置主從分離的文章,裡面提到了呼叫搭建文件說明的“秘密” API 很有意思,你需要從你的瀏覽器中把 cookies 複製出來才能訪問。


有些讀者問如何實現,因此我打算詳細描述下,其實過程很簡單。我們還會談談在呼叫沒有文件說明的 API 時,可能會遇到的錯誤和道德問題。


我們用谷歌 Hangouts 舉例。我之所以選擇它,並不是因為這個例子最有用(我認為官方的 API 更實用),而是因為在這個場景中更有用的網站很多是小網站,而小網站的 API 一旦被濫用,受到的傷害會更大。因此我們使用谷歌 Hangouts,因為我 100% 肯定谷歌論壇可以抵禦這種試探行為。


我們現在開始!


第一步:開啟開發者工具,找一個 JSON 響應

我瀏覽了  ,在 Firefox 的開發者工具中開啟“網路Network”標籤,找到一個 JSON 響應。你也可以使用 Chrome 的開發者工具。


開啟之後介面如下圖:


找到其中一條 “型別Type” 列顯示為 json 的請求。


為了找一條感興趣的請求,我找了好一會兒,突然我找到一條 “people” 的端點,看起來是返回我們的聯絡人資訊。聽起來很有意思,我們來看一下。


第二步:複製為 cURL

下一步,我在感興趣的請求上右鍵,點選 “複製Copy” -> “複製為 cURLCopy as cURL”。


然後我把 curl 命令貼上到終端並執行。下面是執行結果:


$ curl ' -X POST ........ (省略了大量請求標頭)


Warning: Binary output can mess up your terminal. Use "--output -" to tell 


Warning: curl to output it to your terminal anyway, or consider "--output 


Warning: <FILE>" to save to a file.


你可能會想 —— 很奇怪,“二進位制的輸出在你的終端上無法正常顯示” 是什麼錯誤?原因是,瀏覽器預設情況下發給伺服器的請求頭中有 Accept-Encoding: gzip, deflate 引數,會把輸出結果進行壓縮。


我們可以透過管道把輸出傳遞給 gunzip 來解壓,但是我們發現不帶這個引數進行請求會更簡單。因此我們去掉一些不相關的請求頭。


第三步:去掉不相關的請求頭

下面是我從瀏覽器獲得的完整 curl 命令。有很多行!我用反斜槓(\)把請求分開,這樣每個請求頭佔一行,看起來更清晰:


curl ' \


-X POST \


-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0' \


-H 'Accept: */*' \


-H 'Accept-Language: en' \


-H 'Accept-Encoding: gzip, deflate' \


-H 'X-HTTP-Method-Override: GET' \


-H 'Authorization: SAPISIDHASH REDACTED' \


-H 'Cookie: REDACTED'


-H 'Content-Type: application/x-www-form-urlencoded' \


-H 'X-Goog-AuthUser: 0' \


-H 'Origin: ' \


-H 'Connection: keep-alive' \


-H 'Referer: /' \


-H 'Sec-Fetch-Dest: empty' \


-H 'Sec-Fetch-Mode: cors' \


-H 'Sec-Fetch-Site: same-site' \


-H 'Sec-GPC: 1' \


-H 'DNT: 1' \


-H 'Pragma: no-cache' \


-H 'Cache-Control: no-cache' \


-H 'TE: trailers' \


--data-raw 'personId=101777723309&personId=1175339043204&personId=1115266537043&personId=116731406166&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_GET&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&includedProfileStates=ADMIN_BLOCKED&includedProfileStates=DELETED&includedProfileStates=PRIVATE_PROFILE&mergedPersonSourceOptions.includeAffinity=CHAT_AUTOCOMPLETE&coreIdParams.useRealtimeNotificationExpandedAcls=true&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&requestMask.includeField.paths=person.organization&requestMask.includeField.paths=person.location&requestMask.includeField.paths=person.cover_photo&requestMask.includeContainer=PROFILE&requestMask.includeContainer=DOMAIN_PROFILE&requestMask.includeContainer=CONTACT&key=REDACTED'


第一眼看起來內容有很多,但是現在你不需要考慮每一行是什麼意思。你只需要把不相關的行刪掉就可以了。


我通常透過刪掉某行檢視是否有錯誤來驗證該行是不是可以刪除 —— 只要請求沒有錯誤就一直刪請求頭。通常情況下,你可以刪掉 Accept*、Referer、Sec-*、DNT、User-Agent 和快取相關的頭。


在這個例子中,我把請求刪成下面的樣子:


curl ' \


-X POST \


-H 'Authorization: SAPISIDHASH REDACTED' \


-H 'Content-Type: application/x-www-form-urlencoded' \


-H 'Origin: ' \


-H 'Cookie: REDACTED'\


--data-raw 'personId=101777723309&personId=1175339043204&personId=1115266537043&personId=116731406166&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_GET&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&includedProfileStates=ADMIN_BLOCKED&includedProfileStates=DELETED&includedProfileStates=PRIVATE_PROFILE&mergedPersonSourceOptions.includeAffinity=CHAT_AUTOCOMPLETE&coreIdParams.useRealtimeNotificationExpandedAcls=true&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&requestMask.includeField.paths=person.organization&requestMask.includeField.paths=person.location&requestMask.includeField.paths=person.cover_photo&requestMask.includeContainer=PROFILE&requestMask.includeContainer=DOMAIN_PROFILE&requestMask.includeContainer=CONTACT&key=REDACTED'


這樣我只需要 4  - 個請求頭:Authorization、Content-Type、Origin 和 Cookie。這樣容易管理得多。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69920392/viewspace-2877282/,如需轉載,請註明出處,否則將追究法律責任。

相關文章