fetch 自动加cookie_如何在shell中动态获取chrome浏览器的cookie信息
0. 背景
在工作的時候,經常要接觸一些辦公系統,在網頁上通過機械化的操作,來完成一個簡單的功能,比如某臺主機權限的申請,通過一套操作一下,大概7、8個步驟,花費30秒的時間,雖然不長,但是要脫離終端,到瀏覽器去操作,打斷了心流,就感覺很煩人了。
我們在網頁的操作,其實就是往這個網站的后臺發起一個API請求,這個動作,我們在終端里面,通過curl命令也能完成,比如我們打開百度的首頁,通過chrome的控制臺 -> Network -> 找到對應的請示,右鍵,Copy -> Copy as cURL,我們就能得到如下的一條命令:
在終端執行這條命令,和你瀏覽器發起的這個請求,其實是等同的,但是這里面,有一個最重要的參數,就是你的Cookie信息,這個信息可以代表你當前在這個網站上的登錄用戶,如果我們要寫一些自動化的網站操作腳本,或者寫爬蟲什么的,第一步就是怎么拿到cookie信息。
1. 獲取chrome瀏覽器里的cookie
cookie信息,肯定是存儲在chrome中,具體的存儲位置未知,并且對于這么隱私的數據,應該也是會進行加密存儲的,因此,我并沒有去嘗試通過讀取cookie文件的方式。
想起之前用過一個模擬發請求的chrome插件,postman,通過安裝Postman Interceptor攔截器,可以讓我們在postman里模擬發請求的時候,自動帶上網站的cookie信息,但是查閱了postman的相關資料,也沒有開放接口讓我們在其它地方可以拿到cookie信息。
1.1 通過chrome插件獲取cookie數據
既然在瀏覽器插件里能拿到cookie,那么我們自己實現一個不就行了嗎,拿到數據之后,再想辦法把數據傳出來就可以了。參考chrome api文檔,我們可以通過添加一個cookies的監聽器,來拿到變化的cookie,以及拿到某個domain域下的所有cookie,但是chrome也是運行在瀏覽器環境之上,無法直接往本地存儲寫數據,只能通過對外發起ajax請求來把數據傳出去了。核心代碼如下:
function refreshDomain(domain) {chrome.cookies.getAll({domain: domain}, function (cookies) {// 這里就能拿到這個域下所有cookie了let all_cookies = cookies.filter(item => item.domain === domain).map(item => item.name + "=" + item.value).join("; ");console.log("Report Cookie:domain=" + domain + ",cookies=" + all_cookies);$.ajax({//這里需要一個http服務來接收數據url: "http://localhost:8888",method: "POST",data: {domain: domain,cookies: all_cookies},dataType: "json",success: function(data) { console.log("Report success:" + data) },failure: function (data) {console.log("Report failure:" + data)}})}); }chrome.cookies.onChanged.addListener(function (event) {const cookie = event.cookie;refreshDomain(cookie.domain); });1.2 接收數據并存儲
這里還需要實現一個http服務來接收插件發出來的cookie數據,這里我用spring boot初始化出來一個spring mvc的工程,再添加兩個api,一個用于接收cookie并存儲,一個用于對外再接供獲取cookie信息的接口。代碼如下:
@SpringBootApplication @EnableWebMvc @Controller public class CookieManager {private static Map<String, String> domainCookies = new HashMap<>(1024);@RequestMapping(value = "/", method = RequestMethod.GET)@ResponseBodypublic String getCookie(@RequestParam("domain") String domain) {return domainCookies.entrySet().stream().filter(e -> domain.endsWith(e.getKey())).map(Entry::getValue).collect(Collectors.joining("; "));}@RequestMapping(value = "/", method = RequestMethod.POST)@ResponseBodypublic String setCookie(@RequestParam("domain") String domain,@RequestParam("cookies") String cookies) throws IOException {domainCookies.put(domain, cookies);return domain;}public static void main(String[] args) {SpringApplication.run(CookieManager.class, args);} }這里在獲取cookie的時候做了一個處理,自動把父域的cookie帶上。比如獲取domain=http://www.baidu.com的cookie,會把domain=.http://baidu.com的數據也返回
1.3 在shell中的用法
COOKIE=$(wget localhost:8888/?domain=www.baidu.com -q -O -) echo $COOKIEcurl 'https://www.baidu.com/' -H "Cookie: $COOKIE"注意這里"Cookie: $COOKIE"必須是雙引號,不能用單引號。
特別注意
cookie信息是一個非常隱私和重要的數據,雖然通過這個方法,能夠將瀏覽器里面這個數據導出來,但對于這個數據,是需要特別小心保存的,cookie信息如果被別人拿到,相當于別人可以用你的身份做任何事情,這是非常危險的。因此本文只是作為一個例子,沒有做任何加密,但在實際應用中,最好都做加密傳輸。
參考文檔
- Postman: https://www.getpostman.com/
- Chrome api:https://developer.chrome.com/apps/api_index
- 本文代碼:https://github.com/homeway88/halo_blog/tree/master/2019-10-07-cookie-manager
總結
以上是生活随笔為你收集整理的fetch 自动加cookie_如何在shell中动态获取chrome浏览器的cookie信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis 自动生成integer_
- 下一篇: 滴滴魅族手机人脸识别没有反应_手机UI颜