全網開發都可搭建技術資料庫篇2_如何呼叫沒有文件說明的 Web API
大家好!幾天前我寫了 全網開發都可搭建技術資料庫篇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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 全網開發都可搭建技術資料庫篇2_如何呼叫沒有文件說明搭建 Web API資料庫WebAPI
- 全網開發都可搭建技術資料庫篇-如何看待LINUX和IOS兩個程式的使用體驗資料庫LinuxiOS
- 有沒有完全自主的國產化資料庫技術資料庫
- web開發框架技術有哪些?Web框架
- 全網開發網站搭建教程篇之Python 標準庫之 sys網站Python
- 墨天輪最受DBA歡迎的資料庫技術文件-巡檢篇資料庫
- 墨天輪最受DBA歡迎的資料庫技術文件-監控篇資料庫
- 產品資料管理(PDM)技術說明書
- 2019產品資料管理(PDM)技術說明
- 如何理解Python web開發技術PythonWeb
- knife4j api文件使用說明API
- 墨天輪最受DBA歡迎的資料庫技術文件-SQL優化篇資料庫SQL優化
- 搭建Python爬取菠菜程式開發網頁搭建網站技術篇-在搭建Java中如何遍歷字串呢?Python網頁網站Java字串
- koa+mysql+vue+socket.io全棧開發之web api篇MySqlVue全棧WebAPI
- 墨天輪最受DBA歡迎的資料庫技術文件-故障處理案例篇資料庫
- 墨天輪最受DBA歡迎的資料庫技術文件-容災備份篇資料庫
- 七、資料庫技術的發展及新技術資料庫
- Web前端技術分享:全棧工程師常用的開發工具Web前端全棧工程師
- ES API,使用Kibana的開發工具用例說明API
- 如何取出 API 呼叫返回的 JSON 資料APIJSON
- USDT質押挖礦/系統開發說明/SUDT流動性挖礦技術開發搭建詳情
- 又是沒有專業技術的一篇嘿嘿!
- DAPP去中心化合約模式系統開發(技術說明)APP中心化模式
- CocosCreator 開發facebook小遊戲,呼叫排行榜的api並沒有執行遊戲API
- 如何寫好一篇技術型文件?
- 如何製作Java文件說明書Java
- Web前端開發掌握的技術Web前端
- 全棧 – 10 資料庫 用MAMP和WAMP搭建Web環境全棧資料庫Web
- 如何呼叫api介面獲取其中的資料API
- 如何呼叫API獲取你想要的資料API
- Activiti(一) activiti資料庫表說明資料庫
- 合約量化策略跟單系統技術開發功能說明
- 分散式資料庫技術之路未來如何發展?分散式資料庫
- 循序漸進學.Net Core Web Api開發系列【9】:常用的資料庫操作WebAPI資料庫
- 【Visual Leak Detector】庫的 22 個 API 使用說明API
- 騰訊基於全時態資料庫技術的資料閃回資料庫
- Web全棧開發有前途嗎?Web全棧
- 全棧全平臺開源專案 CodeRiver 資料庫設計文件全棧資料庫