核心原理
这个接口的实现主要依赖于 DedeCMS 的后台文件 dede/article_add.php,该文件原本用于处理后台表单提交的文章数据,我们的思路是:

(图片来源网络,侵删)
- 创建一个独立的接口文件:
api_post_article.php,这个文件将作为外部调用的入口。 - 模拟后台请求:在这个接口文件中,我们模拟
article_add.php所需的表单数据和运行环境。 - 安全验证:这是最关键的一步,为了避免任何人都能调用此接口发布文章,我们必须设置一个安全验证机制,
- Token 验证:在调用接口时,需要提供一个正确的、难以猜测的 Token。
- IP 白名单:只允许来自特定 IP 地址的请求调用此接口。
- 数据传递:通过 POST 请求,将要发布的文章标题、内容、栏目ID等信息传递给接口文件。
- 处理并返回结果:接口文件调用
article_add.php的核心逻辑,处理文章发布,并返回成功或失败的信息。
详细实现步骤
第一步:创建接口文件 api_post_article.php
在您的网站根目录(与 dede 文件夹同级)创建一个新文件 api_post_article.php,将以下代码复制到该文件中。
<?php
/**
* DedeCMS 5.7 免登录文章发布接口
*
* 调用方法:
* POST /api_post_article.php
*
* 请求头:
* Content-Type: application/x-www-form-urlencoded
*
* POST 数据:
* - token: [您的安全令牌] 文章标题
* - typeid: 栏目ID (必需)
* - body: 文章内容 (支持HTML)
* - description:
* - author: 作者
* - source: 来源
* - flag: 特性 (如 'c' 推荐, 'h' 头条, 'p' 图片)
* - litpic: 缩略图URL
* - keywords: 关键词 (用逗号分隔)
* - ishtml: 是否生成HTML (0或1)
* - userip: 发布者IP
* - dtime: 发布时间 (时间戳,留空则为当前时间)
*
* 返回:
* JSON格式的成功或失败信息
*/
// ===================================================================
// 1. 安全配置 - 请务必修改这些值
// ===================================================================
define('API_TOKEN', 'YourSuperSecretAndLongRandomToken123!'); // 替换成您自己的复杂Token
define('ALLOWED_IPS', ['127.0.0.1', '192.168.1.100']); // 替换成允许调用此接口的IP地址
// ===================================================================
// 2. 安全验证
// ===================================================================
// IP白名单验证
$client_ip = $_SERVER['REMOTE_ADDR'];
if (!in_array($client_ip, ALLOWED_IPS)) {
http_response_code(403);
die(json_encode(['code' => 403, 'msg' => 'Forbidden: Your IP is not allowed.']));
}
// Token验证
if (!isset($_POST['token']) || $_POST['token'] !== API_TOKEN) {
http_response_code(401);
die(json_encode(['code' => 401, 'msg' => 'Unauthorized: Invalid token.']));
}
// ===================================================================
// 3. 数据准备
// ===================================================================
// 引入DedeCMS核心文件
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once (dirname(__FILE__) . "/dede/config.php");
require_once DEDEINC."/arc.archives.class.php";
// 检查必要的POST数据是否存在
if (empty($_POST['title']) || empty($_POST['typeid']) || empty($_POST['body'])) {
die(json_encode(['code' => 400, 'msg' => 'Bad Request: Title, typeid, and body are required.']));
}
// 准备文章数据
$arc = new Archives();
// 从POST数据中获取并赋值
$arc->title = cn_substrR($_POST['title'], 100);
$arc->typeid = intval($_POST['typeid']);
$arc->description = cn_substrR($_POST['description'], 250);
$arc->writer = empty($_POST['author']) ? $cfg_adminuser : cn_substrR($_POST['author'], 20);
$arc->source = empty($_POST['source']) ? '未知' : cn_substrR($_POST['source'], 50);
$arc->keywords = empty($_POST['keywords']) ? '' : cn_substrR($_POST['keywords'], 30);
$arc->litpic = empty($_POST['litpic']) ? '' : $_POST['litpic'];
$arc->userip = empty($_POST['userip']) ? $_SERVER['REMOTE_ADDR'] : $_POST['userip'];
$arc->dtime = empty($_POST['dtime']) ? time() : $_POST['dtime'];
// 处理文章内容
// 注意:这里直接使用了body内容,确保您传递的内容是安全的
$arc->body = $_POST['body'];
// 设置发布状态
$arc->arcrank = 0; // 0: 已审核, -1: 待审核 (根据需要修改)
// 设置特性 (flag)
$arc->flag = empty($_POST['flag']) ? '' : $_POST['flag'];
// 设置是否为HTML模型
$arc->ishtml = isset($_POST['ishtml']) ? intval($_POST['ishtml']) : 1;
// ===================================================================
// 4. 发布文章
// ===================================================================
$channelid = 1; // 频道ID,1代表普通文章,根据您的网站情况修改
$senddate = time();
$mid = 1; // 管理员ID,1为超级管理员
// 调用发布方法
$arc->SendArchives($typeid, $channelid, $senddate, $mid);
// ===================================================================
// 5. 返回结果
// ===================================================================
if ($arc->arcID > 0) {
// 发布成功
echo json_encode([
'code' => 200,
'msg' => 'Article published successfully!',
'article_id' => $arc->arcID,
'article_url' => $arc->ArcUrl
]);
} else {
// 发布失败
$errorMsg = empty($arc->ErrorMsg) ? 'Unknown error occurred.' : $arc->ErrorMsg;
echo json_encode([
'code' => 500,
'msg' => 'Failed to publish article.',
'error' => $errorMsg
]);
}
?>
第二步:修改和配置
-
修改安全配置:
define('API_TOKEN', 'YourSuperSecretAndLongRandomToken123!');:这是最重要的安全设置,请将'YourSuperSecretAndLongRandomToken123!'替换成您自己生成的、非常复杂的、难以猜测的字符串。define('ALLOWED_IPS', ['127.0.0.1', '192.168.1.100']);:将IP地址列表修改为您的服务器IP或允许调用此接口的客户端IP。
-
确保目录权限:
- 确保您的
uploads目录(存放附件)和data目录有写入权限。 - 确保
dede/templets目录有写入权限,因为article_add.php会在这里生成一些临时文件。
- 确保您的
第三步:如何调用接口
您可以通过任何支持HTTP请求的语言或工具来调用这个接口。

(图片来源网络,侵删)
请求方式:POST
URL:http://您的网站域名/api_post_article.php
请求头:
Content-Type: application/x-www-form-urlencoded
POST 数据 (示例):
token=YourSuperSecretAndLongRandomToken123!这是通过API发布的文章 &typeid=1 &body=<p>这是文章的<strong>正文内容</strong>,支持<b>HTML标签</b>。</p><p>这是第二段。</p> &description=这是一段通过API自动发布的文章摘要。 &author=API用户 &keywords=API,DedeCMS,自动发布 &litpic=http://您的网站.com/uploads/thumb.jpg &flag=c
成功响应示例 (JSON):

(图片来源网络,侵删)
{
"code": 200,
"msg": "Article published successfully!",
"article_id": "123",
"article_url": "http://您的网站.com/123.html"
}
失败响应示例 (JSON):
// Token错误
{
"code": 401,
"msg": "Unauthorized: Invalid token."
}
// IP不在白名单
{
"code": 403,
"msg": "Forbidden: Your IP is not allowed."
}
// 缺少必要参数
{
"code": 400,
"msg": "Bad Request: Title, typeid, and body are required."
}
重要注意事项
-
安全第一:
- Token:务必使用一个足够复杂的、唯一的Token,并妥善保管,不要将其硬编码在前端JavaScript中。
- IP白名单:如果可能,尽量使用IP白名单,这是最直接有效的安全措施。
- 输入过滤:虽然代码中使用了
cn_substrR等DedeCMS自带的函数进行长度限制,但对于来自外部的所有数据,都应保持警惕,在实际生产环境中,您可能需要增加更严格的HTML标签过滤、XSS攻击防御等。
-
栏目ID (typeid):
- 调用接口前,您需要知道目标栏目在数据库中的
ID,您可以在后台“核心”->“栏目管理”中查看每个栏目的ID。
- 调用接口前,您需要知道目标栏目在数据库中的
-
文章状态 (arcrank):
- 代码中
$arc->arcrank = 0;表示文章发布后直接通过审核,如果您希望文章发布后需要手动审核,请将其修改为$arc->arcrank = -1;。
- 代码中
-
附件处理:
- 此接口不处理附件上传,如果您的文章内容中包含
[upfile]...[/upfile]这样的标签,并且需要上传附件,您需要更复杂的逻辑来处理文件上传,或者确保附件已经上传到指定目录,并在body中直接使用附件的URL。
- 此接口不处理附件上传,如果您的文章内容中包含
-
错误排查:
- 如果发布失败,请检查接口返回的
error字段,并查看服务器的php_error.log文件,通常会有更详细的错误信息。 - 确保DedeCMS的数据库连接信息 (
include/common.inc.php和dede/config.php) 正确无误。
- 如果发布失败,请检查接口返回的
这个接口为您提供了一个强大而灵活的自动化发布文章的解决方案,请根据您的实际需求进行调整和使用。
