点击展开更新日志

2025

08-13

新增 browserless 部署

nexttime

会有些什么呢(❁´◡`❁)

源起

最开始的需求只是想写一个 Python 脚本实现小网站的自动签到,然后还得每天手动跑一遍(可恶,怎么还要手动执行🙄),所以在了解到自动化流程后开始探索自动化方法。

因此行文顺序是按照我的需求实现顺序展开,请根据需要自行跳转。

本文仍在探索阶段,所记录仅为经验之谈,供参考。

playwright

参考文档

依然是那句话,如果有官网文档,最推荐先看一下官方文档。

概述

这是一个 Web 应用端到端测试工具,支持主流浏览器,如 Chromium、Firefox,主要是方便自动化浏览器操作。如果你曾经了解过 Selenium ,那么可以认为是近似工具。

安装

改命令会同时安装浏览器到 ~/.cache/ms-playwright 目录下,如果需要安装到自定义目录,可以手动设置 PLAYWRIGHT_BROWSERS_PATH 环境变量,再使用以下命令安装。

1
npm init playwright@latest

关于 npm 安装,下载安装程序无脑安装即可,至于是否使用 nvm ,根据个人需求,如果不了解这是什么,那就说明并不需要。

基础使用

因为笨蛋站长🤐已经把学过的 C 和 Java 忘完了,因此下面的示例以 Python 说明:

先在包管理器安装 playwright 包:

清华源镜像:https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

更换位置在 PyCharm 左下角【包管理器】那里,有个设置。

1
2
3
4
5
6
7
8
9
10
11
12
import time
from playwright.sync_api import sync_playwright, TimeoutError

with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://www.evergarden.top")
time.sleep(10)
page.close()
context.close()
browser.close()

这就是一个最小的测试用例,playwrigth 中可以选择使用同步函数 sync_api 或 异步函数 async_api ,使用异步,需要在 with 前加关键字 async,不然会报错。

基本的流程就和人工操作浏览器是一样的,只不过进行了拆解:

  • 创建一个 chromium 浏览器对象
  • 创建一个浏览器上下文
  • 创建一个页面 page
  • 打开网址
  • 销毁创建的对象(关闭浏览器)

基于这个逻辑就能把签到啥的逻辑做到代码里实现自动化,但——是,对于验证码的处理就比较麻烦(尝试接入大模型但失败了),因此目前我的处理方法是第一次手动辅助完成登录,保存登录状态到 state.json (cookie),下次就使用状态文件创建上下文就可以直接进入登录状态(playwright测试浏览器是不会自动保存cookie的哦)。
这样的弊端就是对于签到二次验证就还是需要手动辅助,不能完全实现自动化,后续的想法是将这类需要复杂处理的网站单独拎出来,具体处理逻辑可以等做起来了再补充。

Browserless

参考文档

官网文档

概述

无头浏览器,因为上面的代码执行还需要依赖本地安装的浏览器,换个地方就跑不起来了,因此如果能调用独立的浏览器完成操作自然更好(也可以选择使用本地浏览器,但担心污染数据,不予考虑)。

部署

采用 Docker部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: browserless
services:
browserless:
container_name: browserless
image: ghcr.io/browserless/chromium
ports:
- 3003:3000 # 默认3000,因其它程序已占用,换成了 3003
environment:
- CONCURRENT=5 # 并发数:5
- TOKEN=browserLESS # token,必要不必需,不设置会随机生成
- TIMEOUT=120000 # 连接超时时间,默认30s ,单位ms
- HOST="192.168.7.26" # 主机绑定,默认 localhost 仅本地访问?(没试过)
- METRICS_JSON_PATH=/root/metrics.json
- DATA_DIR=/data/my-profile
- DOWNLOAD_DIR=/downloads
- PROXY_HOST=""