“免登录接口”通常有两种理解:

- 作为开发者,在网站外部(比如另一个程序、APP)调用 DedeCMS 的接口来发布文章,无需登录后台。
- 作为网站访客,通过接口访问文章内容,无需登录。
根据“发布文章”这个关键词,您问的应该是第一种情况:如何在网站外部程序中,通过接口向 DedeCMS 5.7 后台发布文章,而无需手动登录到 DedeCMS 后台。
在 DedeCMS 5.7 中,并没有一个现成的、开箱即用的“通用发布 API”,我们可以利用其自带的 api 目录下的接口文件来实现这个功能,最核心、最灵活的接口是 post.php。
下面我将为您提供详细的步骤、代码示例和注意事项。
核心方法:使用 api/post.php 接口
api/post.php 是一个专门用于接收外部数据并发布文章的接口,它通过 POST 请求接收文章数据,然后将其插入到数据库中。

第一步:启用并配置接口文件
-
确认文件存在: 确保
/dede/api/post.php文件存在于您的网站根目录下,默认情况下,它是存在的。 -
修改安全验证(关键步骤): 为了防止恶意调用,
post.php文件默认会有一个简单的安全验证,您需要修改它,让您的程序能够通过验证。打开
/dede/api/post.php文件,找到类似下面这样的代码:// ... 其他代码 ... // 安全校验,这里可以改成您自己的逻辑,比如检查一个特定的密钥 if (empty($dopost) || $dopost != 'save') { echo "Access Denied: Invalid dopost parameter."; exit(); } // ... 其他代码 ...修改建议: 不要直接去掉
$dopost的检查,而是增加一个更安全的密钥验证,修改为:
(图片来源网络,侵删)// 定义一个您自己知道的密钥 define('API_KEY', 'your-secret-api-key-123456'); // 安全校验 if (empty($dopost) || $dopost != 'save') { echo json_encode(['status' => -1, 'msg' => 'Access Denied: Invalid dopost parameter.']); exit(); } // 增加一个密钥验证 if (empty($key) || $key != API_KEY) { echo json_encode(['status' => -1, 'msg' => 'Access Denied: Invalid API key.']); exit(); }说明:
dopost:接口的动作,固定为save。key:您自定义的 API 密钥,用于验证请求的合法性。请务必设置一个复杂的、不易猜测的密钥。
-
处理跨域问题(如果需要): 如果您的调用端(比如另一个域名的前端)需要访问这个接口,可能会遇到跨域问题,可以在
post.php文件的开头添加以下代码来允许跨域请求(开发阶段方便,生产环境请谨慎):header('Access-Control-Allow-Origin:*'); header('Access-Control-Allow-Methods:POST,GET'); header('Access-Control-Allow-Headers:x-requested-with,content-type');
第二步:了解接口需要的参数
post.php 接口接收一系列 POST 参数,这些参数对应着文章在数据库中的字段,您可以通过查看 dede_archives(文章主表)和 dede_addonarticle(文章附加表,对于文章通用模型通常是这个)的结构来了解所有可选参数。
最核心的参数包括:
| 参数名 | 对应字段 | 说明 | 示例 |
|---|---|---|---|
typeid |
typeid |
必须,文章所属的栏目ID。 | typeid=1 |
writer |
writer |
作者,如果为空,默认为系统管理员。 | writer=张三 |
source |
source |
来源。 | source=网络转载 |
pubdate |
pubdate |
发布时间,格式为 Y-m-d H:i:s,如果为空,默认为当前时间。 |
pubdate=2025-10-27 10:30:00 |
description |
description |
description=这是文章的摘要内容。 |
|
keywords |
keywords |
文章关键词,用逗号分隔。 | keywords=技术,教程,DedeCMS |
body |
body |
必须,文章正文内容,通常是 HTML 格式。 | body=<p>这里是文章的正文内容...</p> |
arcpower |
arcpower |
发布权限,默认为 0。 | arcpower=0 |
ishtml |
ishtml |
是否生成静态页,1 是,0 否。 | ishtml=1 |
channelid |
channelid |
模型ID,文章通用模型通常是 1。 | channelid=1 |
mid |
mid |
用户模型ID,默认为 1。 | mid=1 |
sortrank |
sortrank |
文章排序,默认为按发布时间倒序。 | sortrank=100 |
第三步:编写调用代码(示例)
您可以使用任何可以发送 HTTP 请求的语言来调用这个接口,这里以 PHP 和 JavaScript (Fetch API) 为例。
示例1:使用 PHP 调用
<?php
// --- 配置 ---
$api_url = 'http://www.your-dede-site.com/dede/api/post.php';
$api_key = 'your-secret-api-key-123456'; // 和 post.php 中定义的密钥一致
// --- 准备要提交的数据 ---
$post_data = [
'dopost' => 'save',
'key' => $api_key,
'typeid' => 10, // 假设这是你要发布到的栏目ID => '通过API发布的文章标题',
'writer' => 'API自动发布',
'source' => 'API',
'pubdate' => date('Y-m-d H:i:s'),
'description' => '这是通过API接口自动生成的一篇文章摘要。',
'keywords' => 'API,自动化,DedeCMS',
'body' => '<h2>文章正文</h2><p>这是通过 <strong>PHP</strong> 脚本调用 DedeCMS 接口发布的内容。</p><p>支持HTML格式。</p>',
'ishtml' => 1,
'channelid'=> 1, // 文章通用模型
];
// --- 发送请求 ---
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时时间
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// --- 处理响应 ---
echo "HTTP Status Code: " . $http_code . "\n";
echo "API Response:\n";
echo $response . "\n";
// 解析JSON响应(如果post.php返回的是JSON格式)
$result = json_decode($response, true);
if ($result && $result['status'] == 1) {
echo "发布成功!文章ID: " . $result['aid'];
} else {
echo "发布失败!错误信息: " . ($result['msg'] ?? '未知错误');
}
?>
示例2:使用 JavaScript (Fetch API) 调用
// --- 配置 ---
const apiUrl = 'http://www.your-dede-site.com/dede/api/post.php';
const apiKey = 'your-secret-api-key-123456'; // 和 post.php 中定义的密钥一致
// --- 准备要提交的数据 ---
const postData = new URLSearchParams();
postData.append('dopost', 'save');
postData.append('key', apiKey);
postData.append('typeid', '10'); // 栏目ID
postData.append('title', '通过JS Fetch API发布的文章');
postData.append('writer', 'JS自动发布');
postData.append('source', 'JS API');
postData.append('pubdate', new Date().toISOString().slice(0, 19).replace('T', ' '));
postData.append('description', '这是通过JavaScript的Fetch API调用DedeCMS接口发布的内容。');
postData.append('keywords', 'JavaScript,Fetch,API');
postData.append('body', '<h2>文章正文</h2><p>这是通过 <strong>JavaScript</strong> 的 Fetch API 调用 DedeCMS 接口发布的内容。</p>');
postData.append('ishtml', '1');
postData.append('channelid', '1');
// --- 发送请求 ---
fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: postData
})
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log('API Response:', data);
if (data.status === 1) {
alert('发布成功!文章ID: ' + data.aid);
} else {
alert('发布失败!错误信息: ' + data.msg);
}
})
.catch(error => {
console.error('Error:', error);
alert('请求失败: ' + error.message);
});
重要注意事项
-
安全性第一:
- API 密钥:
your-secret-api-key-123456只是一个示例,请务必修改为一个复杂且唯一的密钥。 - IP 白名单:如果可能,在
post.php中增加对调用方 IP 地址的判断,只允许来自特定 IP 的请求,这是最安全的方式。 - HTTPS:强烈建议在您的网站上启用 HTTPS,以防止 API 密钥和数据在传输过程中被窃听。
- API 密钥:
-
栏目和模型:
typeid必须是已存在的栏目ID。channelid必须对应正确的模型ID,对于“文章通用模型”,通常是1,如果不确定,请登录后台查看“内容模型管理”。
-
字符编码:
- 确保您的调用端和 DedeCMS 网站的字符编码一致,最好是
UTF-8,以避免出现乱码问题。
- 确保您的调用端和 DedeCMS 网站的字符编码一致,最好是
-
错误处理:
post.php在成功发布后,通常会返回类似{"status":1,"msg":"发布成功","aid":123}的 JSON 字符串,在失败时,会返回{"status":-1,"msg":"错误信息"},请务必根据返回值判断发布是否成功,并进行相应处理。
-
内容过滤:
DedeCMS 后台有各种内容过滤和安全设置(如敏感词过滤),通过 API 发布的文章同样会受这些规则影响,请确保您的 API 调用符合网站的内容规范。
通过以上步骤,您就可以成功实现一个 DedeCMS 5.7 的文章免登录发布接口了,核心就是利用 api/post.php 文件,并通过自定义密钥来保证其安全性,这种方法灵活、可控,并且是 DedeCMS 官方支持的方式,比直接操作数据库要安全和可靠得多。
