如何在shell中动态获取chrome浏览器的cookie信息

2019-10-07-chrome.jpeg

0. 背景

在工作的时候,经常要接触一些办公系统,在网页上通过机械化的操作,来完成一个简单的功能,比如某台主机权限的申请,通过一套操作一下,大概7、8个步骤,花费30秒的时间,虽然不长,但是要脱离终端,到浏览器去操作,打断了心流,就感觉很烦人了。
我们在网页的操作,其实就是往这个网站的后台发起一个API请求,这个动作,我们在终端里面,通过curl命令也能完成,比如我们打开百度的首页,通过chrome的控制台 -> Network -> 找到对应的请示,右键,Copy -> Copy as cURL,我们就能得到如下的一条命令:

curl 'https://www.baidu.com/' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-User: ?1' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' -H 'Sec-Fetch-Site: none' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' -H 'Cookie: BIDUPSID=A10629EBE8B29EBEE170B7E4E405; PSTM=1520729161; BDUSS=pMV2FGNlNaUUdB134asdfCOVU5cHFCR0p2SzBtY0Q2OWlNZlhORHdhN1ZjQVFBQUFBJCQAAAAAABBBBBGHAAaG9tZXdheQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDejVzw3o1cck; ' --compressed

在终端执行这条命令,和你浏览器发起的这个请求,其实是等同的,但是这里面,有一个最重要的参数,就是你的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)
    @ResponseBody
    public 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)
    @ResponseBody
    public 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=www.baidu.com的cookie,会把domain=.baidu.com的数据也返回

1.3 在shell中的用法

COOKIE=$(wget localhost:8888/?domain=www.baidu.com -q -O -)
echo $COOKIE

curl 'https://www.baidu.com/' -H "Cookie:  $COOKIE"

注意这里"Cookie: $COOKIE"必须是双引号,不能用单引号。

特别注意

cookie信息是一个非常隐私和重要的数据,虽然通过这个方法,能够将浏览器里面这个数据导出来,但对于这个数据,是需要特别小心保存的,cookie信息如果被别人拿到,相当于别人可以用你的身份做任何事情,这是非常危险的。因此本文只是作为一个例子,没有做任何加密,但在实际应用中,最好都做加密传输。

参考文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容