fetch 自动加cookie_如何在shell中动态获取chrome浏览器的cookie信息
0. 背景
在工作的時(shí)候,經(jīng)常要接觸一些辦公系統(tǒng),在網(wǎng)頁(yè)上通過(guò)機(jī)械化的操作,來(lái)完成一個(gè)簡(jiǎn)單的功能,比如某臺(tái)主機(jī)權(quán)限的申請(qǐng),通過(guò)一套操作一下,大概7、8個(gè)步驟,花費(fèi)30秒的時(shí)間,雖然不長(zhǎng),但是要脫離終端,到瀏覽器去操作,打斷了心流,就感覺(jué)很煩人了。
我們?cè)诰W(wǎng)頁(yè)的操作,其實(shí)就是往這個(gè)網(wǎng)站的后臺(tái)發(fā)起一個(gè)API請(qǐng)求,這個(gè)動(dòng)作,我們?cè)诮K端里面,通過(guò)curl命令也能完成,比如我們打開(kāi)百度的首頁(yè),通過(guò)chrome的控制臺(tái) -> Network -> 找到對(duì)應(yīng)的請(qǐng)示,右鍵,Copy -> Copy as cURL,我們就能得到如下的一條命令:
在終端執(zhí)行這條命令,和你瀏覽器發(fā)起的這個(gè)請(qǐng)求,其實(shí)是等同的,但是這里面,有一個(gè)最重要的參數(shù),就是你的Cookie信息,這個(gè)信息可以代表你當(dāng)前在這個(gè)網(wǎng)站上的登錄用戶(hù),如果我們要寫(xiě)一些自動(dòng)化的網(wǎng)站操作腳本,或者寫(xiě)爬蟲(chóng)什么的,第一步就是怎么拿到cookie信息。
1. 獲取chrome瀏覽器里的cookie
cookie信息,肯定是存儲(chǔ)在chrome中,具體的存儲(chǔ)位置未知,并且對(duì)于這么隱私的數(shù)據(jù),應(yīng)該也是會(huì)進(jìn)行加密存儲(chǔ)的,因此,我并沒(méi)有去嘗試通過(guò)讀取cookie文件的方式。
想起之前用過(guò)一個(gè)模擬發(fā)請(qǐng)求的chrome插件,postman,通過(guò)安裝Postman Interceptor攔截器,可以讓我們?cè)趐ostman里模擬發(fā)請(qǐng)求的時(shí)候,自動(dòng)帶上網(wǎng)站的cookie信息,但是查閱了postman的相關(guān)資料,也沒(méi)有開(kāi)放接口讓我們?cè)谄渌胤娇梢阅玫絚ookie信息。
1.1 通過(guò)chrome插件獲取cookie數(shù)據(jù)
既然在瀏覽器插件里能拿到cookie,那么我們自己實(shí)現(xiàn)一個(gè)不就行了嗎,拿到數(shù)據(jù)之后,再想辦法把數(shù)據(jù)傳出來(lái)就可以了。參考chrome api文檔,我們可以通過(guò)添加一個(gè)cookies的監(jiān)聽(tīng)器,來(lái)拿到變化的cookie,以及拿到某個(gè)domain域下的所有cookie,但是chrome也是運(yùn)行在瀏覽器環(huán)境之上,無(wú)法直接往本地存儲(chǔ)寫(xiě)數(shù)據(jù),只能通過(guò)對(duì)外發(fā)起ajax請(qǐng)求來(lái)把數(shù)據(jù)傳出去了。核心代碼如下:
function refreshDomain(domain) {chrome.cookies.getAll({domain: domain}, function (cookies) {// 這里就能拿到這個(gè)域下所有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({//這里需要一個(gè)http服務(wù)來(lái)接收數(shù)據(jù)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 接收數(shù)據(jù)并存儲(chǔ)
這里還需要實(shí)現(xiàn)一個(gè)http服務(wù)來(lái)接收插件發(fā)出來(lái)的cookie數(shù)據(jù),這里我用spring boot初始化出來(lái)一個(gè)spring mvc的工程,再添加兩個(gè)api,一個(gè)用于接收cookie并存儲(chǔ),一個(gè)用于對(duì)外再接供獲取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的時(shí)候做了一個(gè)處理,自動(dòng)把父域的cookie帶上。比如獲取domain=http://www.baidu.com的cookie,會(huì)把domain=.http://baidu.com的數(shù)據(jù)也返回
1.3 在shell中的用法
COOKIE=$(wget localhost:8888/?domain=www.baidu.com -q -O -) echo $COOKIEcurl 'https://www.baidu.com/' -H "Cookie: $COOKIE"注意這里"Cookie: $COOKIE"必須是雙引號(hào),不能用單引號(hào)。
特別注意
cookie信息是一個(gè)非常隱私和重要的數(shù)據(jù),雖然通過(guò)這個(gè)方法,能夠?qū)g覽器里面這個(gè)數(shù)據(jù)導(dǎo)出來(lái),但對(duì)于這個(gè)數(shù)據(jù),是需要特別小心保存的,cookie信息如果被別人拿到,相當(dāng)于別人可以用你的身份做任何事情,這是非常危險(xiǎn)的。因此本文只是作為一個(gè)例子,沒(méi)有做任何加密,但在實(shí)際應(yīng)用中,最好都做加密傳輸。
參考文檔
- 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
總結(jié)
以上是生活随笔為你收集整理的fetch 自动加cookie_如何在shell中动态获取chrome浏览器的cookie信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mybatis 自动生成integer_
- 下一篇: 滴滴魅族手机人脸识别没有反应_手机UI颜