楼主: zhhony
926 1

[原创博文] 基于Python通过Chrome的Cookie登录百度账户 [推广有奖]

  • 0关注
  • 0粉丝

初中生

90%

还不是VIP/贵宾

-

威望
0
论坛币
3872 个
通用积分
70.8844
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
494 点
帖子
11
精华
0
在线时间
23 小时
注册时间
2019-4-30
最后登录
2022-9-26

楼主
zhhony 在职认证  发表于 2022-8-11 13:58:57 |只看作者 |坛友微信交流群|倒序 |AI写论文
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
环境

  • 操作系统:windows 10 x64
  • 集成环境:Visual Studio Code
  • Python版本:v3.10.5 64位




------解码需要os、sqlite3、win32crypt、base64、cryptography、json
-----访问网页需要urllib、http


一、说明


这篇博文是一篇解题思路的记述文章,代码也是按照解决问题的思路一路写下去的,所以基本不存在函数、类等可以反复调用的对象,甚至其中还存在一些手动的动作。也即意味着如果你顺利的理解了这个思路,可以通过自己的修改让代码看起来更加的优雅整洁。ps:为了保证代码环境的纯净,建议在实施本博文之前,先清除百度在Chrome中的所有cookie。

二、原理简述


浏览器是利用cookie实现免密码登录的。如果想实现通过python对百度的登录,需要先在浏览器中进行一次登录,然后获取cookie文件,最后基于获取的文件进行百度其他产品的访问。

三、步骤


1、通过Chrome访问百度,获取Cookie


用户首先需要在Chrome上正式访问一次百度的网页,如百度搜索首页www.baidu.com。如果未登录,需要登录成功一次以产生cookies。
Chrome浏览器(version≥103)的cookie是以SQlite库的形式存储的。在Windows文件资源管理器的地址栏中键入路径%localAppData%\Google\Chrome\User Data\Default\network\,可以很容易的找到这个名为Cookies的SQlite文件。所以它的完整路径是:


  1. %localAppData%\Google\Chrome\User Data\Default\network\Cookies
复制代码

因为Cookies文件的本质是一个SQlite库文件,所以可以通过Navicat等数据库管理软件直接打开它。此库包含两张表:
  • - cookies
  • - meta

其中cookies表存储的就是与Cookie相关的数据。

需要关注如下几个字段:

creation_utc(创建时间) host_key(域名) name(变量名) encrypted_value(变量值) path(路径)
13302687838867670 .baidu.com BAIDUID v10J�����q��Kp¶�3)Z���&1m� /

其中host_key存储的是网页域名,可以被用于识别cookie的归属对象。name就是变量名;encrypted_value就是变量值。它是一个加密字段。其密钥存储在Local State文件中,路径为:
  1. %localAppData%\Google\Chrome\User Data\Local State
复制代码

Local State
本质上是一个Json文件。接下来将尝试通过这个文件来解密变量值。

2、利用Python解密变量

2.1准备工作


将一些常量载入
  1. import os
  2. import sqlite3
  3. import win32crypt
  4. import base64
  5. from cryptography.hazmat.primitives.ciphers.aead import AESGCM
  6. import json
  7. import time


  8. '''
  9. 关于下面这个字典的来历:它出现在这里可能会有些跳跃,有些不合逻辑,因为这个是我根据结果倒推的。
  10. 里面的key是域名,value是cookie文件里面需要的参数。他们表示的含义我没研究出来。
  11. 可以先忽略这个字典,后面你就知道为啥存在它了。
  12. '''
  13. BAIDU_BOOL = {
  14.     '.baidu.com': ['TRUE', 'FALSE'],
  15.     '.passport.baidu.com': ['TRUE', 'TRUE'],
  16.     'passport.baidu.com': ['FALSE', 'FALSE'],
  17.     'www.baidu.com': ['FALSE', 'FALSE'],
  18.     '.hm.baidu.com': ['TRUE', 'FALSE'],
  19.     '.www.baidu.com': ['TRUE', 'FALSE'],
  20.     '.wenku.baidu.com': ['TRUE', 'TRUE'],
  21.     '.miao.baidu.com': ['TRUE', 'FALSE'],
  22.     'wenku.baidu.com': ['FALSE', 'TRUE'],
  23.     '.pan.baidu.com': ['FALSE', 'FALSE'],
  24.     'pan.baidu.com': ['FALSE', 'FALSE'],
  25.     '.jingyan.baidu.com': ['FALSE', 'FALSE'],
  26.     '.baike.baidu.com': ['FALSE', 'FALSE'],
  27.     'baike.baidu.com': ['FALSE', 'FALSE'],
  28.     '.b2b.baidu.com': ['FALSE', 'FALSE'],
  29.     '.tongji.baidu.com': ['FALSE', 'FALSE'],
  30.     '.bce.baidu.com': ['FALSE', 'FALSE'],
  31.     '.developer.baidu.com': ['FALSE', 'FALSE'],
  32.     '.lewan.baidu.com': ['FALSE', 'FALSE'],
  33.     '.haokan.baidu.com': ['FALSE', 'FALSE'],
  34.     '.tieba.baidu.com': ['FALSE', 'FALSE'],
  35.     '.live.baidu.com': ['FALSE', 'FALSE'],
  36.     '.zhidao.baidu.com': ['FALSE', 'FALSE']
  37. }
  38. # 存储cookie、密钥的文件路径
  39. CHROME_COOKIE_PATH = r'\Google\Chrome\User Data\Default\network\Cookies'
  40. CHROME_LOCALSTATE_PATH = r'\Google\Chrome\User Data\Local State'

  41. # cookie文件头,最后一步手工生成cookie会用得到
  42. COOKIE_HEADER = """# Netscape HTTP Cookie File\n# http://curl.haxx.se/rfc/cookie_spec.html\n# This is a generated file!  Do not edit.\n\n"""
复制代码

2.2 获取Cookie、LocalState两个文件的完整路径
  1. conn = sqlite3.connect(dbCookies)
  2. cur = conn.cursor()
  3. sql = """select creation_utc,host_key,name,encrypted_value,path from cookies where host_key like '%baidu%'"""
  4. cur.execute(sql)
  5. valCookies = cur.fetchall()
  6. cur.close()
  7. conn.close()
复制代码

2.3 将Cookies读入valCookies变量

  1. conn = sqlite3.connect(dbCookies)
  2. cur = conn.cursor()
  3. sql = """select creation_utc,host_key,name,encrypted_value,path from cookies where host_key like '%baidu%'"""
  4. cur.execute(sql)
  5. valCookies = cur.fetchall()
  6. cur.close()
  7. conn.close()
复制代码


2.4 将LocalState存储的密钥读入key变量
  1. with open(fileLocalState, 'r', encoding='utf-8') as f:
  2.     jsonStr = json.load(f)
  3.     encryptedKey = jsonStr['os_crypt']['encrypted_key']
  4. encrypted_key_with_header = base64.b64decode(encryptedKey)
  5. encrypted_key = encrypted_key_with_header[5:]
  6. key = win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1]
复制代码

2.5 对2.3中valCookies列表中的[encrypted_value]字段进行解密
  1. # 1、预解密
  2. valCookieOut = []  # 这个用来存储解密后的cookie

  3. # 2、解密并输入明文列表
  4. for valCookieGet in valCookies:
  5.     # 将valCookies的每个元素赋值给变量。这里重点关注valEncrypted,需要解密的就是它
  6.     creation_utc, host_key, name, valEncrypted, path = valCookieGet

  7.     # 根据百度的结果,valEncrypted的构成分为三部分,都是固定长度
  8.     top = valEncrypted[:3]  # ->这个切片没啥用,也可以删掉
  9.     nonce = valEncrypted[3:15]
  10.     cipherbytes = valEncrypted[15:]

  11.     # 百度的解密过程
  12.     aesgcm = AESGCM(key)
  13.     plainbytes = aesgcm.decrypt(nonce, cipherbytes, None)
  14.     value = plainbytes.decode('utf-8')  # ->这个就是解密之后的值

  15.     # 将解密的文件存入列表
  16.     valCookieOut.append(tuple((creation_utc, host_key, name, value, path)))
复制代码

3、基于解密的列表生成cookie
  1. '''
  2. cookie文件正文的结构是[host_key] [TRUE|FALSE] [path] [TRUE|FALSE] [creation_utc] [name] [value]
  3. 中间用制表符\t分隔
  4. creation_utc那个实际上是存储有效时间戳的,用creation_utc也没啥影响,为了偷懒这里就用它占位了
  5. 文件的存储我是放在平行目录下的log文件夹,文件名加上了时间戳
  6. '''
  7. with open('../log/BaiduCookie'+str(int(time.time())), 'w') as f:
  8.     # 写入头
  9.     f.write(COOKIE_HEADER)

  10.     # 写入体
  11.     for valCookie in valCookieOut:
  12.         # 将valCookie的每个元素赋值给变量。
  13.         creation_utc, host_key, name, value, path = valCookie
  14.         cookieContent = str(host_key) + '\t' + str(BAIDU_BOOL[host_key][0]) + '\t' + str(path) + '\t' + \
  15.             str(BAIDU_BOOL[host_key][1]) + '\t' + str(creation_utc) + \
  16.             '\t' + str(name) + '\t' + str(value) + '\n'
  17.         f.write(cookieContent)
复制代码

4、cookie预览
如果一切顺利,在做完上面所有步骤后,将会获得一个编辑好的cookie文件。它大致的内容如下:



# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.



.passport.baidu.com        TRUE        /        TRUE        13302687843561289        PTOKEN        6842356784ffb2db1236574567d8ee1d3
.baidu.com        TRUE        /        FALSE        13302687839790384        BIDUPSID        AG43E548AF7F091F824110AC4ABCD9DA5
.passport.baidu.com        TRUE        /        TRUE        13302687843561303        HISTORY        ffb2db1236574567d8ee1d3affd3
...
...

5、访问网页

5.1 准备工作


包括定义好headers、载入cookie、定义好需要访问的网址
  1. from urllib.parse import *
  2. from urllib.request import *
  3. from http.cookiejar import *
  4. import time

  5. url = 'https://www.baidu.com'

  6. # 这里是采集了我电脑上chrome的header,具体可以换成自己的
  7. headers = {
  8.     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}

  9. # cookie文件偷懒了,直接复制了想要的文件名。这里可以写个方法读取最新时间戳对应的cookie
  10. cookie_jar = MozillaCookieJar('../log/BaiduCookie1658281995')
  11. cookie_jar.load(ignore_discard=True, ignore_expires=True)
复制代码

5.2 访问工作
  1. cookie_processor = HTTPCookieProcessor(cookie_jar)
  2. opener = build_opener(cookie_processor)

  3. request = Request(url, headers=headers)

  4. response = opener.open(request)
  5. data = response.read().decode('utf8')

  6. # 做你想做的事情
复制代码

5.3 存储新的cookie访问新的网页意味着会产生新的cookie,所以要及时存储这些cookie

  1. cookie_jar.save('../log/BaiduCookie'+str(int(time.time())),ignore_discard=True, ignore_expires=True)
复制代码


以上就是一个从0开始利用python登录百度账户的过程。
要注意cookie作为客户端与服务端通讯的密钥,其具有时效性。如果长时间不模拟登录,cookie就会失效。到时候需要重新将这个过程来过一次。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Chrome Cookie python CHROM Rome

1.png (15.11 KB)

1.png

沙发
zhhony 在职认证  发表于 2022-8-24 14:22:22 |只看作者 |坛友微信交流群
<!-- markdown css tag --><div class="pinggu_markdown">
<div class="pinggu_markdown__html"><p>点了这个也会存在这个问题,这段回复就是在高级模式的markdown编辑发表的</p>
</div>
</div>

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 11:52