尝试在树莓派上使用Playwright

尝试在树莓派上使用Playwright

Update: Playwright now full supports ARM64.Just Update to v1.17.0.

起因

想要写个Py脚本搞定某个网站的签到功能,然而登陆入口有reCAPTCHA验证,签发的Session有效期又只有不到一星期.正面搞定自动登录签到难度几乎是Hard级别了.但是此网站还提供了Login By Google,第三方登陆可以绕过万恶的reCAPTCHA.计划通!

Playwright

当然想想也知道,模拟请求的方式对Google登陆来讲几乎没戏,因此还是上无头浏览器吧.在浏览器控制库选择方面,考虑到很多人用的selenium最新的正式版还停留在2018 12月,因此我选择了最近风头正劲的Playwright.在我的体验中,Playwright的auto-wait是个很棒的Feature,没必要再纠结sleep几秒了.同时还支持以编程的方式阻断或修改特定的网络请求等奇妙特性.

在本地的测试中,我用Firefox driver,导航到Google Login,等待二步验证,完成登陆并签到一气呵成.由于Playwright驱动的是Firefox本身而不是用于测试自动化的Gecko Driver,因此甚至没有遇到Google的不安全预警.计划通!

Playwright on ARMv7

然鹅,当我尝试部署到树莓派上时,却发现Playwright官方不支持armv7架构(啊这...)

在issue区也有相关的讨论,大概集中于Playwright包含一些定制的浏览器二进制文件,而这些定制版本不提供某些平台的二进制这一问题.不过Playwright提供了改变定制浏览器存放目录的环境变量,通过这种方法可以自己引入浏览器二进制文件.

  1. 使用Chromium浏览器.
    在各个浏览器的选择中,Chromium Driver是直接套用的原生版本,因此我们也只需要下载ARM平台二进制即可.

    RUN apt-get update && \
        apt-get install -y \
        chromium \
        nodejs
  2. 安装x86_64平台的Linux Whl包,可在https://pypi.org/project/playwright/#files下载到.
  3. 将whl重命名为 playwright-1.9.2-py3-none-any.whl,即可在所有架构上安装.
  4. 安装whl

    pip install playwright-1.9.2-py3-none-any.whl
  5. 删除Playwright自带Node环境,更换为arm架构node.这里以Py3.9为例.

    rm /usr/local/lib/python3.9/site-packages/playwright/driver/node && \
        ln -s /usr/bin/node /usr/local/lib/python3.9/site-packages/playwright/driver/node
  6. 新建个存放Chromium的文件夹,后面的步骤中需要通过环境变量方式指定Playwright使用此文件夹.(注意 chromium-854489是指定的版本号,不能改变)

    mkdir -p ~/pw-browser/chromium-854489/chrome-linux
    RUN ln -s /usr/bin/chromium ~/pw-browser/chromium-854489/chrome-linux/chrome
  7. 增加环境变量

    PLAYWRIGHT_BROWSERS_PATH=~/pw-browser

    运行脚本,发现可以正常使用Chromium.

绕过安全校验

与Firefox不同.Chromium的自动化测试模式会被Login via Google识别,从而提示不安全的浏览器,并阻止登陆.

一般来讲,你可以在Google账户设置中允许不安全应用.比如在这里:https://myaccount.google.com/lesssecureapps

但是对于打开了二重验证的账号来讲,这个选项是无法选择的.因此,我采取了另一种办法.

  1. 在非自动化模式下打开Chromium.
  2. 登陆账号,通过二重验证.
  3. 将浏览器的Userdir文件夹复制到另一个位置.
  4. 在脚本中使用持久化上下文的方式,导入之前复制的userdir.

        user_data_dir="/home/pi/.config/chromium/"#userdir目录
        browser = p.chromium.launch_persistent_context(user_data_dir)
  5. 你会发现,Google账号已经自动登录到浏览器上了,直接跳转即可.
tag(s): none
show comments · back · home
Edit with markdown

已有 2 条评论

  1. fanovorc

    请问博主,我看维基上说树莓派4B已经支持armV8了,这样能否直接编译aarch64版本的playwright.whl文件再用playwright install 下载浏览器驱动呢

    fanovorc April 16th, 2022 at 11:47 pm回复
    1. SaltedFish

      实际上 playwright使用的是自己编译的浏览器来进行驱动,而他的浏览器暂时不支持ARMv8,因此playwright的whl架构和这个问题关系不大.不过目前Playwright已经发布了ARM版本的浏览器驱动了.

      SaltedFish August 23rd, 2022 at 01:05 pm回复