Eng*_*ain 1 python selenium headless headless-browser whatsapp
我正在尝试绕过 web.whatsapp.com 二维码扫描页面。这是我到目前为止使用的代码:
options = webdriver.ChromeOptions();
options.add_argument('--user-data-dir=./User_Data')
driver = webdriver.Chrome(options=options)
driver.get('https://web.whatsapp.com/')
Run Code Online (Sandbox Code Playgroud)
第一次尝试时,我必须手动扫描 QR 码,而在以后的尝试中,它不会要求提供 QR 码。
但是,如果我在添加此行 chrome_options.add_argument("--headless") 后尝试执行相同的操作,则会出现将 DevTools 活动端口写入文件时出错。我尝试了至少十几种不同的谷歌搜索解决方案,但没有一个有效。对此的任何帮助将不胜感激!谢谢。
到目前为止,尝试了不同组合中的一堆不同参数,但没有任何效果:
options = Options() #decomment for local debugging
options.add_argument('--no-sandbox')
options.add_argument('--headless')
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-setuid-sandbox')
options.add_argument('--remote-debugging-port=9222')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu') # Last I checked this was necessary.
options.add_argument('start-maximized')
options.add_argument('disable-infobars')
options.add_argument('--user-data-dir=./User_Data')
driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get('https://web.whatsapp.com/')
Run Code Online (Sandbox Code Playgroud)
最近我做了一个whatsapp bot,也遇到了同样的问题。经过很长时间的搜索,我想出了这个解决方案:
第一个问题是浏览器缓存,如果它没有获取浏览器apdata中缓存的二维码,它将继续等待以扫描它。
所以在我的程序中我使用以下函数来获取:
def apdata_path():
path = str(pathlib.Path().absolute())
driver_path = path + "\chromedriver.exe"
apdata = os.getenv('APPDATA')
apdata_path = "user-data-dir=" + \
re.findall(".+.\Dta\D", a)[0] + \
r'Local\Chromium\User Data\Default\Default'
apdata_path = apdata_path.replace("\\", "\\"*2)
return apdata_path
Run Code Online (Sandbox Code Playgroud)
在这里它找到第一个 apdata 路径 => C:\Users\AppData\ 然后我将路径的其余部分连接到缓存文件夹,在本例中我使用 Chromium。在你的情况下它将是:
C:\Users\AppData\Local\Google\Chrome\用户数据\默认
可能有更好的方法来查找配置文件数据路径。找到它后我设置了驱动程序:
def chrome_driver(user_agent=0):
usr_path = apdata_path()
chrome_path = file_path() + '\Chromium 85\\bin\chrome.exe'
options = webdriver.ChromeOptions()
options.binary_location = r"{}".format(chrome_path)
if user_agent != 0:
options.add_argument('--headless')
options.add_argument('--hide-scrollbars')
options.add_argument('--disable-gpu')
options.add_argument("--log-level=3")
options.add_argument('--user-agent={}'.format(user_agent))
options.add_argument(usr_path)
driver = webdriver.Chrome('chromedriver.exe', chrome_options=options)
return driver
Run Code Online (Sandbox Code Playgroud)
在这里我遇到了另一个问题,即有时 Selenium 无法工作,因为 Whatsapp 具有用户代理验证,以便能够验证浏览器版本是否兼容。我了解不多,所以我通过反复试验得出了这个结论,也许这不是真正的解释。但这对我有用。
因此,在我的机器人中,我创建了一个启动函数来获取用户代理并获取第一个 QR 扫描并将其保留在浏览器缓存中:
def whatsapp_QR():
driver = chrome_driver()
user_agent = driver.execute_script("return navigator.userAgent;")
driver.get("https://web.whatsapp.com/")
print("Scan QR Code, And then Enter")
input()
print("Logged In")
driver.close()
return user_agent
Run Code Online (Sandbox Code Playgroud)
毕竟,我的机器人工作了,虽然不完美,但运行得很顺利。我能够在无头模式下在我的测试组中发送消息。
总而言之,在 apdata 中获取配置文件用户缓存以绕过 QR 码(但您需要在没有 headless 的情况下运行一次来创建第一个缓存)。
然后获取用户代理以绕过 Wthatsapp 验证。所以整个选项集看起来像这样:
options.add_argument('--headless')
options.add_argument('--hide-scrollbars')
options.add_argument('--disable-gpu')
options.add_argument("--log-level=3")
options.add_argument('--user-agent={}'.format(user_agent)) # User agent for validation
options.add_argument(usr_path) #apdata user profile, to by pass QR code
Run Code Online (Sandbox Code Playgroud)
usr_path =“用户数据目录=rC:\Users\\AppData\Local\Google\Chrome\User Data\Default”
| 归档时间: |
|
| 查看次数: |
2869 次 |
| 最近记录: |