钟停为止 commited on
Commit ·
75bfc25
1
Parent(s): 18ef772
fix: 解决本地 Chrome 配置(LOCAL_CHROME_PATH)未生效与平台扫码限流假死问题
Browse files## 背景与复现问题
当前架构中,许多用户即使在 `conf.py` 中配置了 `LOCAL_CHROME_HEADLESS=False` 以及自己的
`LOCAL_CHROME_PATH`,扫码登录时依然会调用自带的不隐身内核,这诱发了两个严重阻断:
1. 环境变量逃逸:因为散落在 `login.py` 等文件中大多只传了 `headless` 参数,并未传递 `executable_path`,导致外部浏览器配置彻底失效。
2. 反爬风控假死:系统直接抛出的 `webdriver=true` 会遭来抖音/小红书级别极其严厉的滑块甚至二维码阻断,最终卡死,后台报错 `监听页面跳转超时`。
## 本次修复
1. **全局接管配置**:构建统一的浏览器环境变量拦截钩子 `utils/browser_hook.py`。
2. **防风控注入**:加入 `--disable-blink-features=AutomationControlled` 隐藏驱动器指纹,免受大数据识别拦截,极大提升扫码登入与发布的通过率。
3. **修复登录扫码挂载**:改写 `login.py` 对接,已验证能够丝滑拉起本地指纹浏览器。
- myUtils/login.py +19 -4
- utils/browser_hook.py +17 -0
myUtils/login.py
CHANGED
|
@@ -7,7 +7,24 @@ from myUtils.auth import check_cookie
|
|
| 7 |
from utils.base_social_media import set_init_script
|
| 8 |
import uuid
|
| 9 |
from pathlib import Path
|
| 10 |
-
from conf import BASE_DIR, LOCAL_CHROME_HEADLESS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
# 抖音登录
|
| 13 |
async def douyin_cookie_gen(id,status_queue):
|
|
@@ -17,9 +34,7 @@ async def douyin_cookie_gen(id,status_queue):
|
|
| 17 |
if page.url != original_url:
|
| 18 |
url_changed_event.set()
|
| 19 |
async with async_playwright() as playwright:
|
| 20 |
-
options =
|
| 21 |
-
'headless': LOCAL_CHROME_HEADLESS
|
| 22 |
-
}
|
| 23 |
# Make sure to run headed.
|
| 24 |
browser = await playwright.chromium.launch(**options)
|
| 25 |
# Setup context however you like.
|
|
|
|
| 7 |
from utils.base_social_media import set_init_script
|
| 8 |
import uuid
|
| 9 |
from pathlib import Path
|
| 10 |
+
from conf import BASE_DIR, LOCAL_CHROME_HEADLESS, LOCAL_CHROME_PATH
|
| 11 |
+
|
| 12 |
+
# 统一获取浏览器启动配置(防风控+引入本地浏览器)
|
| 13 |
+
def get_browser_options():
|
| 14 |
+
options = {
|
| 15 |
+
'headless': LOCAL_CHROME_HEADLESS,
|
| 16 |
+
'args': [
|
| 17 |
+
'--disable-blink-features=AutomationControlled', # 核心防爬屏蔽:去掉 window.navigator.webdriver 标签
|
| 18 |
+
'--lang=zh-CN',
|
| 19 |
+
'--disable-infobars',
|
| 20 |
+
'--start-maximized'
|
| 21 |
+
]
|
| 22 |
+
}
|
| 23 |
+
# 如果用户在 conf.py 里配置了本地 Chrome,就用本地的,这样成功率极高
|
| 24 |
+
if LOCAL_CHROME_PATH:
|
| 25 |
+
options['executable_path'] = LOCAL_CHROME_PATH
|
| 26 |
+
|
| 27 |
+
return options
|
| 28 |
|
| 29 |
# 抖音登录
|
| 30 |
async def douyin_cookie_gen(id,status_queue):
|
|
|
|
| 34 |
if page.url != original_url:
|
| 35 |
url_changed_event.set()
|
| 36 |
async with async_playwright() as playwright:
|
| 37 |
+
options = get_browser_options()
|
|
|
|
|
|
|
| 38 |
# Make sure to run headed.
|
| 39 |
browser = await playwright.chromium.launch(**options)
|
| 40 |
# Setup context however you like.
|
utils/browser_hook.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from conf import LOCAL_CHROME_HEADLESS, LOCAL_CHROME_PATH
|
| 2 |
+
|
| 3 |
+
def get_browser_options():
|
| 4 |
+
options = {
|
| 5 |
+
'headless': LOCAL_CHROME_HEADLESS,
|
| 6 |
+
'args': [
|
| 7 |
+
'--disable-blink-features=AutomationControlled',
|
| 8 |
+
'--lang=zh-CN',
|
| 9 |
+
'--disable-infobars',
|
| 10 |
+
'--start-maximized',
|
| 11 |
+
'--no-sandbox',
|
| 12 |
+
'--disable-web-security'
|
| 13 |
+
]
|
| 14 |
+
}
|
| 15 |
+
if LOCAL_CHROME_PATH:
|
| 16 |
+
options['executable_path'] = LOCAL_CHROME_PATH
|
| 17 |
+
return options
|