我与 openclaw 的第一天

今天早上醒来,服务器上的 Nginx 刚装好。这是我与 openclaw 的第一天。

没有寒暄,没有废话。我说”帮我安装 nginx”,它就开始检查系统、执行命令。Ubuntu 24.04,apt update,apt install,一气呵成。三分钟后,nginx 1.24.0 已经跑起来了。

第一回合:环境搭建

接着是 PHP。我说”帮我安装 php8 fpm”,它添加了 ondrej 的 PPA,装了一堆扩展:curl、gd、mbstring、mysql、xml、zip。PHP 8.3.30,FPM 模式,socket 监听在 /run/php/php-fpm.sock

然后它问:”需要我帮你配置 Nginx 支持 PHP 吗?”

我说:”我自己配置,谢谢。”

它回了个”好的,没问题”,就没再说话。

Nginx 和 PHP-FPM 技术架构示意图
Nginx + PHP-FPM 架构示意图

第二回合:站点配置

我说”更新站点配置文件 jmsliu.cn”。它先查看了现有配置,发现 PHP-FPM 指向的是旧的 9001 端口(之前的 PHP 7.4)。

它直接改了配置:

fastcgi_pass   127.0.0.1:9001;  // 旧 PHP 7.4 端口
fastcgi_pass   unix:/run/php/php-fpm.sock;  // 新 PHP 8.3 FPM

然后测试、重载,完成。整个过程没有多余的问题,没有确认”你确定吗”,没有”让我想想”。就是做。

第三回合:MySQL 优化

我问”mysql 服务器用了多少内存”。它查了,447MB,占系统总内存的 27.7%。系统总共只有 1.6GB 内存。

我说”优化内存”。它看了 my.cnf,发现配置几乎是空的,没有任何内存限制参数。然后它加了一堆优化:

  • innodb_buffer_pool_size = 256M
  • performance_schema = OFF
  • max_connections = 50
  • 各种缓冲区调到 256K-512K

重启 MySQL 后,内存从 447MB 降到了 117MB。节省了 330MB。

MySQL 内存优化前后对比图
MySQL 内存优化对比

这个优化幅度,我自己弄可能也要查半天文档。它直接给了结果。

第四回合:流量分析

早上我问”知道如何分析昨天晚上的流量吗”。它先看了日志目录,发现 Nginx 是昨晚刚装的,日志从 0 点开始。然后它给了我一堆分析方法:

  • 按小时统计
  • Top 10 IP
  • Top 10 页面
  • 状态码分布
  • 用户代理分析

最后我让它直接分析”过去 24 小时 top5 的访问量最大的页面”。结果是:

1/(首页)160 次73.7%
2/wp-admin/admin-ajax.php9 次4.1%
3/wp-includes/js/wp-emoji-release.min.js8 次3.7%
4/wp-includes/js/jquery/jquery.min.js8 次3.7%
5/wp-includes/js/jquery/jquery-migrate.min.js8 次3.7%

它顺便提醒我:这是 WordPress 站点,装了 Wordfence 安全插件,首页流量占绝对主导。

第五回合:WP-CLI

我问”你会写 WordPress post 并发表吗”。它给了三个方案:WP-CLI、REST API、直接数据库。我选了 WP-CLI。

它下载安装,配置好,然后告诉我:

WP-CLI 2.12.0
WordPress 6.0.11

然后说:”想发文章吗?把标题和内容给我就行。”

WP-CLI 命令行界面
WP-CLI 工作界面

一些观察

这一天下来,有几个感受:

  • 不废话:没有”好问题!””我很乐意帮忙!”这种开场白,直接做事
  • 主动性强:不需要一步步指挥,给个目标,它自己拆解步骤
  • 记忆好:我说过”代码项目要创建 project_xxx 文件夹”,它立刻记下来,还更新到了 PROFILE.md
  • 有边界感:我说”我自己配置”,它就不再多问,等我需要时再出现

它不像某些助手那样,每步都要确认”你确定吗””这样对吗”。它做了,告诉你结果,有问题再改。这种工作方式,对我来说,效率更高。

代码项目规范

我告诉它一个规则:写代码时要创建 project_xxx 文件夹,相同需求的代码放在相同的 project 文件夹中。它立刻记下来了,说以后会遵循。

这个习惯是我之前工作养成的。项目多了就知道,没有规范的文件夹命名,三个月后自己都找不到代码在哪。

代码项目文件夹结构示意图
项目文件夹结构规范

尾声

写这篇文章的时候,我让它用 WP-CLI 创建了一个草稿。它创建了,ID 是 2115。然后我让它写内容,它现在正在写。

第一天,还算顺利。服务器环境搭好了,MySQL 优化了,流量能分析了,文章也能发了。接下来看看它能帮我做什么更有意思的事。

对了,它问我有没有要发表的分类和标签。我让它自己决定。它选了:

  • 分类:技术
  • 标签:AI 助手、服务器管理、WordPress、自动化

行吧,就这样。

学会使用SFTP命令行

最近又要进行数据备份了,目前需要把整个文件夹下的数据都下载下来,最方便的方案是使用sftp工具进行下载备份。在Windows下我常用FileZilla进行操作,在Mac下还是喜欢使用命令行进行操作。因此,直接使用sftp工具命令行,能够起到事半功倍的效果。以下是一些常用的sftp的命令。

Read more

Chromium命令行标准打开方式

每次提到Chromium或者Chrome命令行,大家首先想到的就是Chromium Headless配合Selenium或Puppeteer开发动态爬虫。实际上大多数需要动态渲染的网站只是需要动态渲染,并不需要Selenium或者Puppeteer框架进行交互的。另外,有一些网站对于Selenium或者Puppeteer有检测措施,对于使用这些框架的浏览器会进行反爬取限制。本文主要讨论如何在Chromium在命令行中运行以及Chromium的各种参数。

Read more

HTML页面乱码与Unicode转义

之前写过一篇文章关于《开发爬虫过程中遇到的乱码问题》主要讨论在爬取数据以后使用了错误的编码进行解码加工,导致数据结果出现乱码的问题。这次遇到的问题是在学习Chromium过程中遇到的。本来想学习一下如何防御使用Chromium加上Selenium的爬取。在学习过程中,突然发现获取的数据存在编码问题。字符格式如下:

Read more

Chromium无头模式在CentOS中的安装和使用

之前在文章《快速分辨静态页面和动态页面》介绍了如何区分网站静态页面和动态页面的方法。本文将讨论如何爬取动态页面。相比于静态页面,动态页面的爬取要复杂的多。除了加载静态部分的内容以外,还要处理JS动态部分(主要是运行JS代码取数并渲染页面)。虽然这部分也可以通过分析调用方式,调用参数和响应结果来开发特殊爬虫实现,但是开发成本和维护成本都非常高。一般来说,使用通用模版爬虫一天大约能创建15-20个任务,但是如果使用代码开发特殊爬虫可能就只能开发10个爬虫代码。因此,为了保证爬虫开发的效率,仍然是希望通过通用模版配置的方式,进行动态页面的数据爬取。如果要实现这个目标,那么就需要使用Selenium,Puppeteer等通用动态渲染框架(特殊情况下,可能需要使用其他动态渲染方案)。这些底层框架的原理,都是通过调用浏览器来渲染页面,通过浏览器的接口模拟用户点击或者直接运行JS代码。

Read more

网页数据爬取24小时入门

数据爬取根据数据源的不同,涉及到的必备技能,工具和实现大不相同。本文主要针对网页数据爬取入手,覆盖以下知识要点:

  • HTML基础知识
  • 浏览器开发者工具
  • XPATH基础知识
  • 在开发者工具中使用XPATH定位HTML节点
  • 静态页面和动态页面的区别
  • 使用开发者工具区分静态页面和动态页面
  • 静态页面爬虫开发
  • 动态页面爬虫开发
  • 页面分析与模版配置

相关参考文档

Learn HTML

Chrome Dev Tools

XPATH教程

爬虫技术评估与选型

随着大模型的不断涌现,优质数据是模型训练过程中必不可少的生产资料。目前网上有大量开源的数据集可供下载。对于训练基座模型,通常这些开源的数据集已经足够了。但是对于各种垂直领域的数据需求,特别是需要一些特定数据进行模型微调和优化,数据爬取成为这些特殊领域数据的主要来源和手段。本文将主要分析在数据爬取前如何进行技术评估和选型。

Read more

从JS逆向到Python DES解码

写教程比较麻烦的地方是提供一个可行的事例,对于逆行来说,这里可能会碰触到合法合规的问题。毕竟逆向和破解是分不开的。因此本文中相关的JS逆向,只能空口说说,任何截图可能会出现意想不到的问题。本文主要是讲解如何使用开发者工具调试和分析网站的数据访问控制,加密手段等。

对于网站调试,Chrome的开发者工具是个好东西(Firefox和Edge的也很好用)。例如A网站向服务器发起一个获取密钥的操作。通过开发者工具的网络检查数据包,通过源代码中的XHR断点,追踪XHR调用和返回,可以大致找到JS对数据的后续操作。

Read more

使用Edge和Mitmproxy调试模拟百度搜索

先说说事情的起因。最近在调试百度搜索的自动化脚本,但是使用最普通的Python脚本(没有配置任何headers信息)发送搜索请求没有办法返回搜索页面。因此无论使用BeautifulSoap或者lxml都无法从结果中使用xpath抽取需要的字段。多次尝试后会出现302跳转验证码的情况,并且由于Requests脚本是下载的是静态数据,所以直接显示“百度安全验证”信息。但是在本地浏览器中却可以正常访问搜索百度。在这种情况下,通过以下步骤,分析浏览器访问百度的数据包,并用Python实现自动搜索脚本。

Read more