今晚登录树莓派发现输入延迟很高,htop 打开一看 clash 占用的内存快拉满了,netstat -anp 发现有很多不明连接。
搜到相关 Issue:请考虑关闭 Allow-Lan。
还是那句:任何需要部署到公网的东西都要注意权限(身份验证+端口限制)最小化。
1 2 3 4 5 allow-lan: true authentication: - "<user>:<pass>" external-controller: '127.0.0.1:9090' secret: '<secret>' 还好在树莓派上跑的是备用代理 CloudFlare WARP,要是机场梯子的话 200G 流量一下午就能刷完。
添加相应配置之后就没有不明 IP 连进来了。
微信是我见过最傻逼的产品。
文章标题已经把整个流程描述完了,如果有便签请顺手记录下微信号和绑定银行卡的后六位,说不定哪天就用上。
即便如此,四个验证步骤(找回密码的短信验证 -> 是否记得微信号 -> 人脸识别 -> 确认短信)有一个填错直接重来。
微信依然是我见过最傻逼的产品。
继 Heroku、Railway 收费后,能免费使用(好用)的网站托管服务还剩下 Vercel和 Huggingface。
但 Vercel 不支持 docker deployment,huggingface 限制则很少。
unlimited! 确实良心。
配置文件 官方文档其实很清晰了,这里简单贴一下没有读写权限问题的 FastAPI Server 配置。
README.md 1 2 3 4 5 6 7 8 9 10 11 --- title: Sig emoji: 🐢 colorFrom: green colorTo: pink sdk: docker app_port: 7860 pinned: false --- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference Dockerfile 利用多级构建缓存减少后续部署时间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 # build cache FROM python:3.
选型 目前在 huggingface 部署了多个签到脚本,由于仓库设置成 Private,想看脚本输出就只能在浏览器请求 log/filename=<filename>&token=<token> 接口。
及时获取签到通知就成了一个新需求,要求如下:
能自建推送服务器。 足够简单。 日志隐私保护可有可无,单纯是数据在自己手上比较安心。
签到日志输出内容: <datetime.now> <sign_platform> <sign_result>,没有任何利用价值。
简单则是针对安卓端的需求:安卓推送需要 FCM(绑定谷歌三件套)必须在后台一直挂着梯子,所以 App 方案反而是能接受的。
那可选的也就不多了。
首先排除:WxPusher、Server酱、TelegramBot、QQBot、邮箱。
还剩下 pushdeer、Bark、Gotify。
pushdeer 最开始吸引我的是 pushdeer,下载 App 打开后发现 UI 做的还可以。
But
emmm,登录进去发现安卓端还没有开发好自建服务器的功能,推送信息下面还带广告,直接弃用。 Bark 针对 Apple 设备推送的效果很好,但是官方没有提供安卓端的 App,目前只有 PushLite 可用,要一直挂着梯子,且 PushLite 界面过于简陋,弃用。
Gotify 官方文档清晰明了,无论是搭建服务端还是使用客户端接收消息都突出一个简单易用还好用。
do one thing,and do well.
服务端 树莓派使用可执行文件 + Nginx 做反向代理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # > curl -s https://api.
browser 一行命令完成安装依赖和浏览器。
playwright install --with-deps chromium firefox 万能的 record 模式 参考 [[playwright 五分钟上手指南]],遇到任何定位问题直接哪里不会点哪里。
1 await page.pause() 官方文档不推荐的写法 参考 Auto-waiting,绝大部分方法都会自动等待页面加载完成才执行相应操作,超过系统默认超时时间(30s)才会报错。
1 2 3 # https://playwright.dev/python/docs/api/class-page#page-wait-for-timeout await page.wait_for_timeout(1000) # DISCOURAGED await page.wait_for_load_state("networkidle") # 等待网络加载完成 XPath locator和 CSS locator 也是不推荐的,更直观的写法是使用 Locator 的各种定位 API。
要等待某个元素出现选 is_enabled() | focus() 优于 is_visible()。
is_visible() 在 headless = False 下没有问题,但调试的下切换到其他窗口,is_visible() 就会失去聚焦对象。
playwright._impl._api_types.Error: Playwright connection closed 多半是过度封装创建函数导致的。page 对象一旦跳出 async with async_playwright() as playwright: 上下文就无法获取 browser | context 原来的属性。
代理 1 2 3 4 5 6 7 8 async with async_playwright() as playwright: # 对整个 browser 设置代理 browser = await playwright.
本文旨在“快速上手”,所以不会像其他文章一样详细介绍每一个模块,具体用法请根据实际需求翻阅官方文档。
安装 1 2 pip3 install playwright playwright install chromium firefox 调试模式 & 生成代码 自动生成代码:
playwright codegen -o test.py -b chromium 调试模式会自动记录并生成代码。 移动到相应位置显示元素定位代码,填入相关验证信息,点击登录。 右边的调试窗口已经自动生成刚才的登录流程代码(同步)了,将操作部分的代码加 await 改成异步即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import asyncio from playwright.async_api import async_playwright async def main(): """ headless = False,显示界面 slow_mo,模仿用户在一秒内完成每一步操作 """ async with async_playwright() as p: # 初始化浏览器 browser = await p.