织梦cms base64编写采集规则

99ANYc3cd6
预计阅读时长 19 分钟
位置: 首页 织梦建站 正文

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

织梦cms base64编写采集规则
(图片来源网络,侵删)

整个流程分为两步:

  1. 编写原始采集规则:像平常一样,在织梦后台创建一个采集节点,填写目标网站、列表页URL、内容页URL、以及各种Xpath规则。
  2. 对规则进行Base64编码:在将规则保存到数据库之前,或是在分享规则时,用Base64对其中敏感的部分(如URL、Xpath)进行编码。

下面我将分步讲解,并提供一个完整的示例。


第一步:理解织梦CMS的采集规则结构

在动手编码之前,我们需要知道织梦CMS是如何存储采集规则的,采集规则的核心数据通常存储在 dede_co_htmlsdede_co_note 这两张表中。

  • dede_co_htmls:存储了每个采集节点的具体配置,如网站名称、目标列表页、内容页URL模板、以及最重要的——内容字段的Xpath规则,这些规则通常以序列化(serialize)的字符串形式存在。
  • dede_co_note:存储了采集任务的节点列表。

我们主要关注 dede_co_htmls 表中的 coltitle (列表页标题)、 namerule (命名规则)、 htmls (内容页模板) 和 templet (最终使用的模板) 等字段,尤其是 htmls 字段,它包含了我们想保护的Xpath。

织梦cms base64编写采集规则
(图片来源网络,侵删)

第二步:编写原始采集规则(以一个示例为例)

假设我们要采集一个简单的文章网站,结构如下:

目标列表页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 字段可能会存储类似这样的序列化数据(简化版):

织梦cms base64编写采集规则
(图片来源网络,侵删)
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

你有两种主要的方式来使用这个编码后的规则:

直接修改数据库(适用于高级用户或批量导入)

  1. 备份你的数据库:这是至关重要的一步,防止误操作导致数据丢失。
  2. 登录你的数据库管理工具(如phpMyAdmin)。
  3. 找到 dede_co_htmls 表。
  4. 找到你想要修改的那个采集节点记录。
  5. htmls 字段的原始值替换为你刚才生成的Base64编码字符串。
  6. 保存修改。

⚠️ 重要提示:直接修改数据库有风险,织梦在读取这个字段时,会自动进行 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解码,然后再反序列化,从而正确加载你的采集规则。

通过采集规则导入插件(推荐,更安全)

如果你不想修改核心代码,可以开发一个简单的插件或通过一个独立的处理脚本来实现:

  1. 创建一个规则文件my_rule.txt,里面只存放Base64编码后的字符串。

    YTQ6NDtpOiJ0aXRsZSI7czoiLy9oMVsqY2xhc3M9J3Bvc3QtdGl0bGUnO2k6ImNvbnRlbnQiO3M6Ii8vZGl2W2NsYXNzPSdwcm9tcHQtY29udGVudCddO2k6InB1YmRhdGUiO3M6Ii8vc3BhbiBbY2xhc3M9J3Bvc3QtZGF0ZV09O2k6InNvdXJjZSI7czoiLy9zcGFuIFtsYXNzPSdwcm9tcHQtc291cmNlXTsiO30=
  2. 写一个导入脚本:这个脚本读取文件内容,解码后,再通过织梦的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);
?>

总结与注意事项

优点 缺点
提高安全性:防止规则被轻易窃取,特别是商业用途的采集规则。 增加复杂性:需要额外的步骤(编码/解码),维护起来更麻烦。
防止误修改:编码后的字符串对普通用户来说是乱码,降低了意外修改的风险。 依赖修改源码:最直接的方法需要修改织梦核心文件,可能影响升级。
便于分享:可以分享一个“加密”的规则文件,而不暴露目标网站的结构。 调试困难:如果编码或解码出错,排查问题会比较困难。

最佳实践建议

  1. 仅对核心规则编码:通常只需要对 htmls 字段(包含Xpath的部分)进行编码,URL等部分可以保持原样,因为URL本身不是秘密。
  2. 做好注释:在数据库或代码中做好清晰的注释,说明这个字段经过了Base64编码,并记录下解码方法,方便自己和他人日后维护。
  3. 版本控制:如果你修改了织梦的核心文件,一定要使用版本控制(如Git),以便在升级织梦时能知道哪些文件需要手动合并。
  4. 考虑使用更安全的方式:如果规则价值极高,可以考虑使用更强的加密算法(如AES),而不仅仅是Base64,Base64是一种编码,不是加密,它可以通过任何工具轻松解码,只是增加了“一眼看穿”的难度。

通过以上步骤,你就可以在织梦CMS中安全地使用Base64来编写和管理你的采集规则了。

-- 展开阅读全文 --
头像
如何知道织梦模板中button的链接
« 上一篇 12-04
你必须知道的495个C语言问题有哪些核心考点?
下一篇 » 12-05

相关文章

取消
微信二维码
支付宝二维码

目录[+]