Puppeteer cookie 使用,免登录 CSDN 简书 掘金

想用 Puppeteer 登录 CSDN,如果自动再用 Puppeteer 登录一遍太麻烦了吧,所以想用 cookie 进入博客首页,这样就是已登录状态,结果试了好多办法都不行。到底是版本问题,还是怎么,这些文章到底怎么回事。现在提供一种可行的办法。


【2022.05.22更新】

后面的不要看了,这次有更好的方案。

1、借助插件导出 cookie。这个插件同样选择 EditThisCookie。但好像很多人下载不到这个插件,我离线下载放到蓝奏云盘。自己下载到浏览器自己安装吧。至于插件的安装我之前分享过 Google 浏览器 Chrome 插件系列,这可能是最全的吧

https://wwp.lanzout.com/i9rD0058toda 密码:7abs

2、插件安装成功后,进入想使用cookie的网站,然后点击插件,选择要导出的cookie,如果不知道哪些需要,可以将全部一键导出。

3、导出的 cookie 格式是一个 json 数组。

4、可以直接放到代码中使用,用一个数组去接收。

const cookies = [
    {
        "domain": ".guozh.net",
        "expirationDate": 1674570808,
        "hostOnly": false,
        "httpOnly": false,
        "name": "__gads",
        "path": "/",
        "sameSite": "unspecified",
        "secure": false,
        "session": false,
        "storeId": "0",
        "value": "ID=bab08:S=ALNI_MbDbdXk1ZMUuekE9Jnow",
        "id": 1
    },
    {
        "domain": ".guozh.net",
        "expirationDate": 1682840356,
        "hostOnly": false,
        "httpOnly": false,
        "name": "__gpi",
        "path": "/",
        "sameSite": "unspecified",
        "secure": false,
        "session": false,
        "storeId": "0",
        "value": "NI_MbkGDdiOgqXkQ",
        "id": 2
    }
    ];

然后循环遍历数组,将每一个cookie对象设置到 Puppeteer

 //设置cookie
  for(let i = 0; i < cookies.length; i++){
    await page.setCookie(cookies[i]);
  }

如果嫌导出 cookie 太多,放到代码中不美观。可以将导出 cookie 放到新建的 .json 文件中,以后想更新,直接复制粘贴到文件就行。

在到代码中读取文件中的 cookie。比如说我在项目工程目录下创建 test.json 文件,然后将上面的cookie粘贴在里面。

再到需要的地方,引入这个文件,引入后 cookies 就有值,直接对它循环遍历就行。

var cookies = require('./test.json');

找出网页Cookie

一般我们会用F12查看 cookie

如果少量,只需要其中一两个,这方法还算好。

如果还不满足,推荐使用这个插件 EditThisCookie ,一键获取所有 cookie ,同时支持复制所有 cookie 。

Puppeteer 访问网页使用 Cookie

先来看看我 cookie 报错的用法

前面使用网上别人的方法时一直会报错

(network.deletecookies) invalid parameters name string value expected

报错位置是这行代码 await page.setCookie(cookie)

这里 搜到,好像我传入 cookie 的参数形式有问题,应该是字符串,而我传的是数组,这样子传入不行

// const cookies = [{
//     'name': 'UserName',
//     'value': 'xxx'
// },{
//     'name': 'UserInfo',
//     'value': 'xxx'
// }];

正确方法如下:先看一组 cookie

const cookies = {'url': 'https://blog.csdn.net/', 'name': 'UserName', 'value': 'xxx'}
await page.setCookie(cookies)

这样子使用是没问题的,不会报错。但是我的 cookie 不仅仅一组。有多套,有个办法就是如上,再构造一个 cookie2出来,然后再设置 set 。

	const cookie1 = {'url': 'https://blog.csdn.net/', 'name': 'username1', 'value': 'xxx'}
	
	const cookie2 = {'url': 'https://blog.csdn.net/', 'name': 'username2', 'value': 'xxx'}
	
	await page.setCookie(cookie1)
    await page.setCookie(cookie2)

还有种办法就是用文件读取方式。用刚才的插件,将刚才的插件将 cookie 复制出来,然后创建文件整理成如下图,不一定所有都需要,只留下自己需要的,这里我拿我用的其中两个举例。

将文件放到 module 下,然后用如下代码

const { cookie1, cookie2 , cookie3, cookie4, cookie5, cookie6, cookie7, cookie8, cookie9} = require('./cookie');
const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
        headless: false,
        args: ['--start-maximized'],
    });
    const page = await browser.newPage()
    await page.setCookie(cookie1)
    await page.setCookie(cookie2)
    await page.setCookie(cookie3)
    await page.setCookie(cookie4)
    await page.setCookie(cookie5)
    await page.setCookie(cookie6)
    await page.setCookie(cookie7)
    await page.setCookie(cookie8)
    await page.setCookie(cookie9)
    await page.setViewport({ width: 1920, height: 1080 });
    await page.goto('https://blog.csdn.net/')
    // await browser.close()
})();

现在再进入网站,好像已经处于登录状态了。

好的,希望能帮到你。

未经允许不得转载:老郭种树 » Puppeteer cookie 使用,免登录 CSDN 简书 掘金

赞 (1)

5 评论

8+2=

  1. Sinosaurus

    嗨,我按照你的方式进行操作,依旧无法显示登陆,而且写入cookie成功,可以在页面跳转后读取的到,但是就是无法显示登陆状态

    回复
    • guozh

      大兄弟,很抱歉,这玩意我忘的差不多了

      回复
  2. ovo

    非常非常非常好使,感謝.那個擴展很強大,能導出完整的json cookies信息. :mrgreen:

    回复
  3. wteamxq

    😉 碰到一样的情况, 使用插件将cookies写入成功了。但还是无法显示登录状态, 估计浏览器版本不同, 取的cookies无法复用。

    参考国外教程, 觉得还是pptr上登录一遍,获取到cookies存储起来靠谱些:
    https://help.apify.com/en/articles/1640711-how-to-log-in-to-a-website-using-puppeteer

    回复
  4. jit

    不行啊

    回复

能将我博客放入广告拦截白名单吗?

我尽量分享有用并且长期有用的内容,希望能帮到你,谢谢支持。