请问有什么办法可以用浏览器的 cookie 跑 Python /Javascript 脚本吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jadec0der
V2EX    浏览器

请问有什么办法可以用浏览器的 cookie 跑 Python /Javascript 脚本吗?

  •  
  •   jadec0der 2023-10-19 05:28:58 +08:00 2902 次点击
    这是一个创建于 722 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求是想用脚本抓和处理一些内网 API 获取的数据。但是公司的内部登录有 2FA ,几小时就过期,要经常重新认证。

    之前的做法要么是复制浏览器 cookie 到 Python ,要么是建一个油猴脚本。但都感觉有些麻烦,希望有个 playground 类的扩展可以直接写代码然后跑,语言不太有所谓,主要是 HTTP 请求直接用浏览器 cookie ,要是内置一个 SQLite 就更棒。
    12 条回复    2023-10-19 22:10:10 +08:00
    d0m2o08
        1
    d0m2o08  
       2023-10-19 07:44:56 +08:00   1
    ShineyWang
        2
    ShineyWang  
       2023-10-19 08:58:58 +08:00
    rukeypei
        3
    rukeypei  
       2023-10-19 09:17:57 +08:00
    写一个 chrome extension 直接抓
    DeeCheung
        4
    DeeCheung  
       2023-10-19 09:21:27 +08:00
    我自己用 `Bun(自带 sqlite) + js` 解析提取,一个 Bun 二进制+脚本即可,你也可以打包在一起单文件当 cli 用,缺点不支持 win

    ``` js
    // TODO v11 v12
    import { Database } from 'bun:sqlite'
    import { createDecipheriv, pbkdf2Sync } from 'node:crypto'

    const KEY_LENGTH = 16
    const SALT = 'saltysalt'
    const IV = Buffer.alloc(KEY_LENGTH).fill(' ')
    const password = 'peanuts'
    const key = getDerivedKey(password, 1)

    function getDerivedKey(password, iterations) {
    return pbkdf2Sync(password, SALT, iterations, KEY_LENGTH, 'sha1')
    }

    function decryptorCookie(encryptedCookie) {
    const decipher = createDecipheriv('AES-128-CBC', key, IV)
    const decryptedCookie = decipher.update(encryptedCookie.slice(3))
    return decryptedCookie.toString() + decipher.final('utf8')
    }

    function parseExpiresUtc(n) {
    return new Date(n / 1e3 - 116444736e5)
    }

    function parseCookie(item) {
    const { name, host_key, encrypted_value: str, expires_utc, has_expires } = item
    // V10
    const val = decryptorCookie(str)
    const expires = parseExpiresUtc(expires_utc)
    const unixTime = +(expires / 1e3).toFixed(0)
    const out = { key: name, val, has_expires, expires, host: host_key, unixTime }
    return out
    }

    const DefaultDbPath = '~/.config/chromium/Default/Cookies'
    export function getCookies(sql, dbPath = DefaultDbPath) {
    const db = new Database(dbPath)
    const query = db.query(sql)
    const items = query.all()
    return items.map(parseCookie)
    }

    export function toNetscapeCookieFile(arr) {
    const lines = arr
    .map(c => {
    return `${c.host} TRUE / TRUE ${c.unixTime} ${c.key} ${c.val}`
    })
    .join('\n')
    return `# Netscape HTTP Cookie File
    # This file is generated by yt-dlp. Do not edit.

    ${lines}`
    }

    export function toHeadersCookie(arr) {
    return arr.map(c => `${c.key}=${c.val}`).join('; ')
    }

    if (import.meta.main) {
    const sql = `SELECT * FROM cookies where host_key = '.aliyundrive.com' and name = 'cookie2';`
    console.log(getCookies(sql))

    const sql1 = `SELECT * FROM cookies where host_key = '.bilibili.com' and name = 'SESSDATA';`
    const cookies = await getCookies(sql)
    console.log(toNetscapeCookieFile(cookies))
    }

    ```
    DeeCheung
        5
    ayfun
        6
    ayfun  
       2023-10-19 09:33:29 +08:00
    原生 IndexedDB
    yh7gdiaYW
        7
    yh7gdiaYW  
       2023-10-19 09:45:34 +08:00
    一般来说这种应该用 playwright/puppeteer ?不过需求比较简单的话可能重了点
    iOCZ
        8
    iOCZ  
       2023-10-19 10:10:55 +08:00
    以前有个人用 go 写的 LeetCode 助手,使用了浏览器里的登录信息,用的一个三方去读取的
    julyclyde
        9
    julyclyde  
       2023-10-19 12:43:40 +08:00
    我昨天刚实习了把 cookie 从浏览器抄到 requests 库

    先建立一个 SimpleCookie class 的对象,用 SimpleCookie 实例的 load 方法把 cookie 字符串加载进来
    再把这个对象压平成文本格式的 dict
    用 requests 的 session 对象的 cookie 成员对象的 update 方法读前述 dict 即可
    hollc
        10
    hollc  
       2023-10-19 13:38:59 +08:00
    如果是因为 2FA 导致程序没法自动登录的话,有 python 实现的 2FA ,可以接入进去
    Cooooooode
        11
    Cooooooode  
       2023-10-19 13:53:23 +08:00
    playwright 吧
    Qetesh
        12
    Qetesh  
       2023-10-19 22:10:10 +08:00
    使用 selenium 模拟登录,2FA 在模拟登录也好解决。可以很方便取到最新 cookie
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5155 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 09:19 PVG 17:19 LAX 02:19 JFK 05:19
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86