【Python小技巧】browser_cookie3访问Chrome浏览器Cookies文件报错的解决办法


前言

近期需要使用Chrome访问网页,并通过browser_cookie3需要提取其Cookie作为登录验证,之前113版本的Chrome浏览器写的代码都可以正常运行,但最近总是错误频发,总不能正常运行。甚是头疼。


一、browser_cookie3访问Chrome浏览器Cookies文件报错

  1. 报错提示如下,文件访问被拒绝,发现文件路径不对
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 1165, in chrome
    return Chrome(cookie_file, domain_name, key_file).load()
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 494, in load
    with _DatabaseConnetion(self.cookie_file) as con:
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 352, in __enter__
    return self.get_connection()
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 388, in get_connection
    con = method()
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 379, in __get_connection_legacy
    shutil.copyfile(self.__database_file, self.__temp_cookie_file)
  File "D:\ProgramData\anaconda3\lib\shutil.py", line 254, in copyfile
    with open(src, 'rb') as fsrc:
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Administrator\\AppData\\Roaming\\..\\Local\\Google\\Chrome\\User Data\\Default\\Network\\Cookies'

经研究,browser_cookie3的库文件__init__.py,将以下代码调整顺序放到第三

            genararated_paths.append(
                {
    
    'env': 'APPDATA', 'path': '..\\Local\\' + path.format(channel=chan)})

最终如下:

def _genarate_win_paths_chromium(paths: Union[str, list], channel: Union[str, list] = None):
    """Generate paths for chromium based browsers on windows"""

    paths, channel = _normalize_genarate_paths_chromium(paths, channel)
    genararated_paths = []
    for chan in channel:
        for path in paths:
            # genararated_paths.append(
                # {'env': 'APPDATA', 'path': '..\\Local\\' + path.format(channel=chan)})
            genararated_paths.append(
                {
    
    'env': 'LOCALAPPDATA', 'path': path.format(channel=chan)})
            genararated_paths.append(
                {
    
    'env': 'APPDATA', 'path': path.format(channel=chan)})
            genararated_paths.append(
                {
    
    'env': 'APPDATA', 'path': '..\\Local\\' + path.format(channel=chan)})
    # print(genararated_paths)
    return genararated_paths

路径是正确了,可依旧提示访问被拒绝!

File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 1237, in load
    for cookie in cookie_fn(domain_name=domain_name):
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 1164, in chrome
    return Chrome(cookie_file, domain_name, key_file).load()
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 493, in load
    with _DatabaseConnetion(self.cookie_file) as con:
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 351, in __enter__
    return self.get_connection()
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 387, in get_connection
    con = method()
  File "D:\ProgramData\anaconda3\lib\site-packages\browser_cookie3\__init__.py", line 378, in __get_connection_legacy
    shutil.copyfile(self.__database_file, self.__temp_cookie_file)
  File "D:\ProgramData\anaconda3\lib\shutil.py", line 254, in copyfile
    with open(src, 'rb') as fsrc:
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Network\\Cookies'
  1. 尝试更新Chrome浏览器(最早是113版本,不知道什么时候更新为114版本了),问题依旧;
  2. 更换browser_cookie3库版本,安装最新版,又换到老版本,问题依旧;
  3. 使用sqlite直接访问,同样无法打开,报错如下:
con = sqlite3.connect(filename)
sqlite3.OperationalError: unable to open database file

尝试了多个方法,修改了很多代码,问题依旧。

二、踏破铁鞋无觅处、得来全不费工夫

经多日研究,发现shutil.copyfile复制文件时就出现了问题(排除网上因为目标地址是目录不是文件名而产生的报错),因为Cookies文件被Chrome浏览器打开,在占用状态是无法完成复制的。当然直接打开也是不允许的,故sqlite也无法进行Cookie的读取。

由于Chrome浏览器自动更新到114版本,对Cookies文件进行了打开占用,致使无法通过其它方法进行访问。

这个问题找到了,解决办法也就清楚了。

1、变更到老版本(113版本)的Chrome浏览器。但一定要禁止自动更新,否则一升级问题依旧。
2、将访问代码切换到browser_cookie3支持的其它浏览器。

这里笔者改为Microsoft Edge浏览器,代码修改如下:

    #cookies = browser_cookie3.chrome(domain_name='xxxx')
    cookies = browser_cookie3.edge(domain_name='xxxx')

至此,问题解决。

最后,通过pip install browser_cookie3 -U 将库更新到最新版本,访问正常。

(base) C:\Users\Administrator>pip install browser_cookie3 -U
Requirement already satisfied: browser_cookie3 in d:\programdata\anaconda3\lib\site-packages (0.19.0)
Collecting browser_cookie3
  Using cached browser_cookie3-0.19.1-py3-none-any.whl (14 kB)
Requirement already satisfied: pycryptodomex in d:\programdata\anaconda3\lib\site-packages (from browser_cookie3) (3.17)
Requirement already satisfied: lz4 in d:\programdata\anaconda3\lib\site-packages (from browser_cookie3) (3.1.3)
Installing collected packages: browser_cookie3
  Attempting uninstall: browser_cookie3
    Found existing installation: browser-cookie3 0.19.0
    Uninstalling browser-cookie3-0.19.0:
      Successfully uninstalled browser-cookie3-0.19.0
Successfully installed browser_cookie3-0.19.1

总结

虽然解决方法很简单,过程中却经历了各种折腾,但也对浏览器、操作系统等有了更深的认识。
尽管在程序调试中出现一下问题,但也证明Chrome浏览器在安全方面更强一些。

另外就是解决问题就和解方程一样,一条路不通,可以换一条路。也许问题很快就可以解决!

debug虽然有时候很烦人,不过,这也是编程的乐趣之一!

猜你喜欢

转载自blog.csdn.net/popboy29/article/details/131416800
今日推荐