Base64编码本身并不是采集规则的一部分,而是一种“加密”或“混淆”手段,它的主要目的是防止你的采集规则(特别是目标网站的URL和关键Xpath)被轻易地他人看到、复制或滥用。

整个流程分为两步:
- 编写原始采集规则:像平常一样,在织梦后台创建一个采集节点,填写目标网站、列表页URL、内容页URL、以及各种Xpath规则。
- 对规则进行Base64编码:在将规则保存到数据库之前,或是在分享规则时,用Base64对其中敏感的部分(如URL、Xpath)进行编码。
下面我将分步讲解,并提供一个完整的示例。
第一步:理解织梦CMS的采集规则结构
在动手编码之前,我们需要知道织梦CMS是如何存储采集规则的,采集规则的核心数据通常存储在 dede_co_htmls 和 dede_co_note 这两张表中。
dede_co_htmls:存储了每个采集节点的具体配置,如网站名称、目标列表页、内容页URL模板、以及最重要的——内容字段的Xpath规则,这些规则通常以序列化(serialize)的字符串形式存在。dede_co_note:存储了采集任务的节点列表。
我们主要关注 dede_co_htmls 表中的 coltitle (列表页标题)、 namerule (命名规则)、 htmls (内容页模板) 和 templet (最终使用的模板) 等字段,尤其是 htmls 字段,它包含了我们想保护的Xpath。

第二步:编写原始采集规则(以一个示例为例)
假设我们要采集一个简单的文章网站,结构如下:
目标列表页URL: https://example.com/list/{page}.html页URL**: https://example.com/article/{id}.html
需要采集的字段:
-
//h1[@class='post-title'] -
//div[@class='post-content'] - 发布时间:
//span[@class='post-date'] - 来源:
//span[@class='post-source']
在织梦后台,我们会创建一个采集节点,填写这些信息,保存后,dede_co_htmls 表的 htmls 字段可能会存储类似这样的序列化数据(简化版):

a:4:{i:"title";s:"//h1[@class='post-title']";i:"content";s:"//div[@class='post-content']";i:"pubdate";s:"//span[@class='post-date']";i:"source";s:"//span[@class='post-source']";}
我们的目标就是把这个字符串中的Xpath部分进行Base64编码。
第三步:对规则进行Base64编码
我们可以用任何编程语言(如PHP、Python)或在线工具来完成编码,这里我们用 PHP,因为织梦本身就是PHP写的。
假设我们想把 htmls 字段里的整个值进行编码。
原始数据:
a:4:{i:"title";s:"//h1[@class='post-title']";i:"content";s:"//div[@class='post-content']";i:"pubdate";s:"//span[@class='post-date']";i:"source";s:"//span[@class='post-source']";}
PHP编码代码:
<?php
$original_string = 'a:4:{i:"title";s:"//h1[@class=\'post-title\']";i:"content";s:"//div[@class=\'post-content\']";i:"pubdate";s:"//span[@class=\'post-date\']";i:"source";s:"//span[@class=\'post-source\']";}';
// 进行Base64编码
$encoded_string = base64_encode($original_string);
echo $encoded_string;
?>
编码后的结果:
YTQ6NDtpOiJ0aXRsZSI7czoiLy9oMVsqY2xhc3M9J3Bvc3QtdGl0bGUnO2k6ImNvbnRlbnQiO3M6Ii8vZGl2W2NsYXNzPSdwcm9tcHQtY29udGVudCddO2k6InB1YmRhdGUiO3M6Ii8vc3BhbiBbY2xhc3M9J3Bvc3QtZGF0ZV09O2k6InNvdXJjZSI7czoiLy9zcGFuIFtsYXNzPSdwcm9tcHQtc291cmNlXTsiO30=
你得到了一个长长的、无法直接阅读的字符串,这就是你的“加密”后的采集规则。
第四步:将编码后的规则应用到织梦CMS
你有两种主要的方式来使用这个编码后的规则:
直接修改数据库(适用于高级用户或批量导入)
- 备份你的数据库:这是至关重要的一步,防止误操作导致数据丢失。
- 登录你的数据库管理工具(如phpMyAdmin)。
- 找到
dede_co_htmls表。 - 找到你想要修改的那个采集节点记录。
- 将
htmls字段的原始值替换为你刚才生成的Base64编码字符串。 - 保存修改。
⚠️ 重要提示:直接修改数据库有风险,织梦在读取这个字段时,会自动进行 unserialize() 反序列化,它不会自动进行 base64_decode(),如果你直接把编码后的字符串存入 htmls,织梦将无法解析它,导致采集失败。
正确的做法是:你需要修改织梦的源代码,让它在处理 htmls 字段时,先尝试进行 base64_decode() 解码。
修改文件:/dede/co_do.php
查找代码:找到处理采集规则的地方,通常是在 GetCohtml() 函数或类似逻辑中。
添加解码逻辑:在 unserialize() 之前,加入 base64_decode()。
// 原始代码可能是这样的
$htmls = $row['htmls'];
$cfg_array = unserialize($htmls);
// 修改为这样
$htmls = $row['htmls'];
// 尝试Base64解码
$decoded_htmls = @base64_decode($htmls);
// 如果解码成功(并且不是布尔值false),则使用解码后的内容
if ($decoded_htmls !== false) {
$cfg_array = unserialize($decoded_htmls);
} else {
// 如果解码失败(比如不是Base64编码的),则按原逻辑处理
$cfg_array = unserialize($htmls);
}
完成这个修改后,织梦在读取 htmls 字段时,就会自动先进行Base64解码,然后再反序列化,从而正确加载你的采集规则。
通过采集规则导入插件(推荐,更安全)
如果你不想修改核心代码,可以开发一个简单的插件或通过一个独立的处理脚本来实现:
-
创建一个规则文件:
my_rule.txt,里面只存放Base64编码后的字符串。YTQ6NDtpOiJ0aXRsZSI7czoiLy9oMVsqY2xhc3M9J3Bvc3QtdGl0bGUnO2k6ImNvbnRlbnQiO3M6Ii8vZGl2W2NsYXNzPSdwcm9tcHQtY29udGVudCddO2k6InB1YmRhdGUiO3M6Ii8vc3BhbiBbY2xhc3M9J3Bvc3QtZGF0ZV09O2k6InNvdXJjZSI7czoiLy9zcGFuIFtsYXNzPSdwcm9tcHQtc291cmNlXTsiO30= -
写一个导入脚本:这个脚本读取文件内容,解码后,再通过织梦的API或直接写入数据库的方式来创建或更新采集节点,这样,核心代码保持不变,安全性更高。
第五步:如何解码和查看规则(用于维护或分享)
当你需要查看或修改这个被Base64编码的规则时,只需要进行反向操作。
PHP解码代码:
<?php $encoded_string = 'YTQ6NDtpOiJ0aXRsZSI7czoiLy9oMVsqY2xhc3M9J3Bvc3QtdGl0bGUnO2k6ImNvbnRlbnQiO3M6Ii8vZGl2W2NsYXNzPSdwcm9tcHQtY29udGVudCddO2k6InB1YmRhdGUiO3M6Ii8vc3BhbiBbY2xhc3M9J3Bvc3QtZGF0ZV09O2k6InNvdXJjZSI7czoiLy9zcGFuIFtsYXNzPSdwcm9tcHQtc291cmNlXTsiO30='; // 进行Base64解码 $decoded_string = base64_decode($encoded_string); echo "解码后的字符串:\n"; var_dump($decoded_string); // 如果是序列化的数据,可以进一步反序列化 $original_array = unserialize($decoded_string); echo "\n反序列化后的数组:\n"; var_dump($original_array); ?>
总结与注意事项
| 优点 | 缺点 |
|---|---|
| 提高安全性:防止规则被轻易窃取,特别是商业用途的采集规则。 | 增加复杂性:需要额外的步骤(编码/解码),维护起来更麻烦。 |
| 防止误修改:编码后的字符串对普通用户来说是乱码,降低了意外修改的风险。 | 依赖修改源码:最直接的方法需要修改织梦核心文件,可能影响升级。 |
| 便于分享:可以分享一个“加密”的规则文件,而不暴露目标网站的结构。 | 调试困难:如果编码或解码出错,排查问题会比较困难。 |
最佳实践建议:
- 仅对核心规则编码:通常只需要对
htmls字段(包含Xpath的部分)进行编码,URL等部分可以保持原样,因为URL本身不是秘密。 - 做好注释:在数据库或代码中做好清晰的注释,说明这个字段经过了Base64编码,并记录下解码方法,方便自己和他人日后维护。
- 版本控制:如果你修改了织梦的核心文件,一定要使用版本控制(如Git),以便在升级织梦时能知道哪些文件需要手动合并。
- 考虑使用更安全的方式:如果规则价值极高,可以考虑使用更强的加密算法(如AES),而不仅仅是Base64,Base64是一种编码,不是加密,它可以通过任何工具轻松解码,只是增加了“一眼看穿”的难度。
通过以上步骤,你就可以在织梦CMS中安全地使用Base64来编写和管理你的采集规则了。
