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

2023-10-19 05:28:58 +08:00
 jadec0der
需求是想用脚本抓和处理一些内网 API 获取的数据。但是公司的内部登录有 2FA ,几小时就过期,要经常重新认证。

之前的做法要么是复制浏览器 cookie 到 Python ,要么是建一个油猴脚本。但都感觉有些麻烦,希望有个 playground 类的扩展可以直接写代码然后跑,语言不太有所谓,主要是 HTTP 请求直接用浏览器 cookie ,要是内置一个 SQLite 就更棒了。
2379 次点击
所在节点    浏览器
12 条回复
d0m2o08
2023-10-19 07:44:56 +08:00
ShineyWang
2023-10-19 08:58:58 +08:00
rukeypei
2023-10-19 09:17:57 +08:00
写一个 chrome extension 直接抓
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
2023-10-19 09:22:58 +08:00
ayfun
2023-10-19 09:33:29 +08:00
原生 IndexedDB
yh7gdiaYW
2023-10-19 09:45:34 +08:00
一般来说这种应该用 playwright/puppeteer ?不过需求比较简单的话可能重了点
iOCZ
2023-10-19 10:10:55 +08:00
以前有个人用 go 写的 LeetCode 助手,使用了浏览器里的登录信息,用的一个三方去读取的
julyclyde
2023-10-19 12:43:40 +08:00
我昨天刚实习了把 cookie 从浏览器抄到 requests 库

先建立一个 SimpleCookie class 的对象,用 SimpleCookie 实例的 load 方法把 cookie 字符串加载进来
再把这个对象压平成文本格式的 dict
用 requests 的 session 对象的 cookie 成员对象的 update 方法读前述 dict 即可
hollc
2023-10-19 13:38:59 +08:00
如果是因为 2FA 导致程序没法自动登录的话,有 python 实现的 2FA ,可以接入进去
Cooooooode
2023-10-19 13:53:23 +08:00
playwright 吧
Qetesh
2023-10-19 22:10:10 +08:00
使用 selenium 模拟登录,2FA 在模拟登录也好解决。可以很方便取到最新 cookie

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/983324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX