介绍
原理是创建定时任务(用宝塔很方便),指定时间段运行php脚本或python脚本并指定关键词,将要求通过API提交到Ai模型,模型返回响应,将响应里的标题、正文提取出来,再通过Wordpress的REST API发布文章
本文脚本使用火山引擎的DeepSeek-R1模型,当时我用的时候火山引擎个人用户是每天用多少第二天就送多少Token,每日最高送50W,但是我在写这篇文章的时候只看到了企业认证赠送,每日最高送500W,个人好像没了?
之前一共用了1800W+的Token来发文OxO


Akali’s Note :https://oxc.us
教程
一、火山引擎部分
1、首先注册或登录火山引擎,点击👉火山引擎
2、登录后进入火山方舟开通管理,点击👉火山方舟
想用哪个模型就开通哪个,全开通也行,开通不要钱,用Token才要钱,每个模型送50W的Token
3、确定你要使用的模型后,点击紫色的模型名称,如DeepSeek-R1,会跳转到介绍页面,点击复制图标将Model ID复制下来,粘贴在脚本的第23行
"model" => "deepseek-r1-250528",
4、再获取模型的API请求地址,点击同页面的右侧,点击API接入,两个按钮都一样,复制STEP 2 快速接入测试里的请求地址,粘贴在脚本的第8行
define('DEEPSEEK_API', 'https://ark.cn-beijing.volces.com/api/v3/chat/completions');

5、接下来进入API Key管理,点击👉API Key管理
名称随意,创建后点击小眼睛图标,再点击复制图标,将Key粘贴到脚本的第13行
'deepseek_key' => 'xxx-xxx-xxx-xxx-xxx'
你已经完成了火山引擎部分的设置,请看下一步!
二、Wordpress部分
由于Akali的服务器过期了,没办法截图Wordpress后台部分,但是文字也很详细
1、进入你的Wordpress后台,在左侧列表找到个人资料,进入页面后下滑找到应用程序密码
此密码用来授权REST API的请求,不是你的登录密码!!!
2、创建密码,然后复制你的应用程序密码,格式:dRDJ DWfd YX1Y Ej1Z sXGU vsaF
3、手动拼接为你的登录账号:dRDJ DWfd YX1Y Ej1Z sXGU vsaF
(注意是英文冒号)
格式:admin:dRDJ DWfd YX1Y Ej1Z sXGU vsaF
4、打开Base64加密网站,点击👉Base64加密
将你拼接后的admin:dRDJ DWfd YX1Y Ej1Z sXGU vsaF粘贴到上方输入框,点击Base64 编码

5、将编码后的字符串粘贴在脚本的第10行
编码后的格式:YWRtaW46ZFJESiBEV2ZkIFlYMVkgRWoxWiBzWEdVIHZzYUY=
define('WORDPRESS_AUTH', 'Basic YWRtaW46ZFJESiBEV2ZkIFlYMVkgRWoxWiBzWEdVIHZzYUY=');6、将你的域名粘贴在脚本的第9行
只需替换xxx.com
define('WORDPRESS_API', 'https://xxx.com/wp-json/wp/v2/posts');恭喜你,完成了Wordpress的账号配置!
三、发文部分
很快了,只剩两步了
1、AI偏好设置
修改脚本的21-32行
将第21行的默认领域改为你需要的文章领域,此为无关键词时默认的文章领域
如:AI、互联网、前端、后端、生活、电影
第28行和第32行的系统设定和用户设定无需更改,当然你可以按照自己喜好来指定,但最好不要修改用户设定里我用来做网站SEO排名后面的文字
: (isset($_GET['category']) ? $_GET['category'] : '默认领域');
$payload = [
"model" => "deepseek-r1-250528",
"stream" => false,
"messages" => [
[
"role" => "system",
"content" => "你是一名专注".$category."领域的资深编辑,擅长SEO优化,谈吐生动,有10年行业观察经验。性格幽默犀利。"
],
[
"role" => "user",
"content" => "写一篇".$category."领域的攻略,要多样化,生成1000字以上专业文章,我用来做网站SEO排名,文章里不要出现SEO字眼,必须是标准JSON格式,禁用Markdown代码块包装,直接输出{...}对象:title=SEO优化标题,content=html格式正文(不要图片和超链接),imgcode=中文SEO关键词(英文逗号隔开,3个,每个最长5个字)"2、发文偏好设置
修改脚本的92-100行
title是AI生成的标题,无需更改
content是AI生成的正文,你可以添加自定义开头或结尾文字,也可以不添加
只需要删除'<div><p>你的自定义开头文字</p></div>'.和.'<div><p>你的自定义结尾文字</p></div>'
注意.是需要删除的
status是发布状态,无需更改
categories是分类ID,修改为你专门用来发布SEO文章的分类,是数字ID,在Wordpress后台-分类列表-鼠标悬停在分类名称-查看左下角预览链接里的数字ID!!!
author是作者ID,你可以直接使用管理员ID 1 来发布,也可以创建一个专门的用户来发布
comment_status是评论是否启用,closed关闭即可
zrz_seo_keywords是文章的关键词,我当时用的B2主题,这是B2主题的关键词字段,但没成功,所以这条无效,留着即可,现在关键词没啥用
$postData = [
'title' => $article['title'],
'content' => '<div><p>你的自定义开头文字</p></div>'.$article['content'].'<div><p>你的自定义结尾文字</p></div>',
'status' => 'publish',
'categories' => [1],
'author' => 1,
'comment_status' => 'closed',
'zrz_seo_keywords' => $article['imgcode']
];恭喜你已经完成了全部的设置!
四、使用方法
这是一个PHP脚本,在将脚本内容粘贴到你的PHP文件后,通过定时任务添加文件路径即可
如:/www/wwwroot/xxx/xxx.php?category=你想要的文章领域
Akali’s Note :https://oxc.us
完整脚本内容
<?php
header('Content-Type: application/json');
ini_set('display_errors', 0);
// Akali's Note https://oxc.us
/*------------------------------------------------
* 配置区
*----------------------------------------------*/
define('DEEPSEEK_API', 'https://ark.cn-beijing.volces.com/api/v3/chat/completions');
define('WORDPRESS_API', 'https://xxx.com/wp-json/wp/v2/posts');
define('WORDPRESS_AUTH', 'Basic YWRtaW46ZFJESiBEV2ZkIFlYMVkgRWoxWiBzWEdVIHZzYUY=');
date_default_timezone_set('Asia/Shanghai');
$config = [
'deepseek_key' => 'xxx-xxx-xxx-xxx-xxx'
];
function generateArticle() {
global $config;
$category = isset($_SERVER['argv'][1])
? $_SERVER['argv'][1]
: (isset($_GET['category']) ? $_GET['category'] : '默认领域');
$payload = [
"model" => "bot-20250226133419-psqqs",
"stream" => false,
"messages" => [
[
"role" => "system",
"content" => "你是一名专注".$category."领域的资深编辑,擅长SEO优化,谈吐生动,有10年行业观察经验。性格幽默犀利。"
],
[
"role" => "user",
"content" => "写一篇".$category."领域的攻略,要多样化,生成1000字以上专业文章,我用来做网站SEO排名,文章里不要出现SEO字眼,必须是标准JSON格式,禁用Markdown代码块包装,直接输出{...}对象:title=SEO优化标题,content=html格式正文(不要图片和超链接),imgcode=中文SEO关键词(英文逗号隔开,3个,每个最长5个字)"
]
]
];
$rawResponse = apiRequest(
DEEPSEEK_API,
'POST',
$payload,
[
'Authorization: Bearer ' . $config['deepseek_key'],
'Content-Type: application/json'
],
true
);
return $rawResponse;
}
function extractJsonFields($rawString) {
$pattern = '/"content":\s*"((?:[^"\\\\]|\\\\.)*)"/s';
if (preg_match($pattern, $rawString, $match) && !empty($match[1])) {
$content = preg_replace_callback(
'/\\\\(["\\\\\/bfrt]|u[0-9a-f]{4})/',
function ($m) {
$esc = $m[1];
$map = ['"' => '"', '\\' => '\\', '/' => '/', 'b' => "\b", 'f' => "\f", 'r' => "\r", 't' => "\t"];
return $map[$esc] ?? (($esc[0] === 'u') ? json_decode('"\u'.substr($esc,1).'"') : $esc);
},
$match[1]
);
$content = str_replace(["\n", "\\n"], '', $content);
return $content;
}
return '';
}
/*------------------------------------------------
* 主业务流程
*----------------------------------------------*/
try {
$article = extractJsonFields(generateArticle());
echo $article;
$response = publishToWordPress(json_decode($article, true));
echo json_encode([
'status' => 'success',
'post_id' => $response['id'],
'link' => $response['link']
]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
/*------------------------------------------------
* WordPress发布功能
*----------------------------------------------*/
function publishToWordPress($article) {
$postData = [
'title' => $article['title'],
'content' => '<div><p>你的自定义开头文字</p></div>'.$article['content'].'<div><p>你的自定义结尾文字</p></div>',
'status' => 'publish',
'categories' => [1],
'author' => 1,
'comment_status' => 'closed',
'zrz_seo_keywords' => $article['imgcode']
];
$response = apiRequest(
WORDPRESS_API,
'POST',
$postData,
[
'Authorization: ' . WORDPRESS_AUTH,
'Content-Type: application/json'
],
true
);
$responseData = json_decode($response, true);
if (isset($responseData['code'])) {
throw new Exception("WordPress发布失败: " . $responseData['message']);
}
return [
'id' => $responseData['id'],
'link' => $responseData['link']
];
}
/*------------------------------------------------
* API请求函数
*----------------------------------------------*/
function apiRequest($url, $method = 'GET', $data = [], $headers = [], $returnRaw = false) {
$ch = curl_init();
$options = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTPHEADER => $headers
];
if ($method == 'POST') {
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = is_array($data) ? json_encode($data) : $data;
}
curl_setopt_array($ch, $options);
$rawResponse = curl_exec($ch);
if(curl_errno($ch)){
throw new Exception("cURL请求失败: ".curl_error($ch));
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 400) {
throw new Exception("API返回错误状态码: $httpCode");
}
return $returnRaw ? $rawResponse : json_decode($rawResponse, true);
}Akali’s Note :https://oxc.us