插件介绍:
二改ZhiNianChatgpt(2024.8.27可用)
加入功能:去除授权码,无需付费,精简代码,只用输入官方API即可使用,具备连续对话功能
缺点:使用必须挂梯子
记录历程:
https://www.typecho.wiki/typecho-chatgpt-plugin-chapptwrite.html
https://www.typecho.wiki/typecho-theme-zhinianchatgpt.html
知道ChatgptWrite的比较多,但是最新的包也报错AxiosError: Network Error,发现他使用的是作者接口不是官方接口,找着找着就发现上面这个ZhiNianChatgpt页面更精简一点,然而两个都不能用,因为他们都是用的自己的转接口,得买他们的API码,我正好有,正好魔改下自己用。
实现效果:
使用方法:
1.Typecho中的/usr/plugins目录里面,新建一个文件夹,文件夹名称ZhiNianChatgpt,文件夹里新建一个文本,将下面代码复制进去,之后把该文件改名为Plugin.php。然后去后台开启插件,对插件进行相应的配置
2.定位到typecho根目录中的admin/write-post
文件中,在46-48行左右,加入下面这段代码,如图
<?php \Typecho\Plugin::factory('admin/write-post.php')->aiWrite(); ?>
Plugin.php代码如下:
<?php
/**
* Typecho自动写文章插件
*
* @package ZhiNianChatgpt
* @author 执念博客
* @version 1.0.0
* @link https://zhinianboke.com
*/
class ZhiNianChatgpt_Plugin implements Typecho_Plugin_Interface
{
// 存储对话记录
private static $messages = [];
/**
* 激活插件方法,如果激活失败,直接抛出异常
*/
public static function activate()
{
Typecho_Plugin::factory('admin/write-post.php')->aiWrite = array('ZhiNianChatgpt_Plugin', 'render');
}
/**
* 禁用插件方法,如果禁用失败,直接抛出异常
*/
public static function deactivate()
{
}
/**
* 获取插件配置面板
*
* @param Form $form 配置面板
*/
public static function config(Typecho_Widget_Helper_Form $form)
{
$div = new Typecho_Widget_Helper_Layout();
$div->html('<small>
<h5>基础功能</h5>
<span><p>①请填写API密钥以便于插件正常工作。</p></span>
</small>');
$div->render();
// 添加API密钥输入框
$apiKey = new Typecho_Widget_Helper_Form_Element_Text('apiKey', NULL, NULL,
_t('API密钥'), _t('请填写您的API密钥'));
$form->addInput($apiKey->addRule('required', _t('必须填写API密钥')));
}
/**
* 个人用户的配置面板
*
* @param Form $form
*/
public static function personalConfig(Typecho_Widget_Helper_Form $form)
{
}
/**
* 插件实现方法
*
* @access public
* @return void
*/
public static function render()
{
$apiKey = Helper::options()->plugin('ZhiNianChatgpt')->apiKey; // 从配置中获取API密钥
echo <<<EOF
<script type="text/javascript">
var messages = []; // 存储对话记录
function showAiContent() {
var aiDiv = document.getElementById("AiWriteAsk");
var responseDiv = document.getElementById("zhinianblog_respone_div");
if (aiDiv.style.display == "none") {
aiDiv.style.display = "block";
responseDiv.style.display = "block";
document.getElementById("aiWrite-button").innerHTML = "收起AI写作";
} else {
aiDiv.style.display = "none";
responseDiv.style.display = "none";
document.getElementById("aiWrite-button").innerHTML = "展开AI写作";
}
}
function copyContent() {
const responseText = document.getElementById('zhinianblog_respone');
if (responseText.value) {
responseText.select(); // 选中生成的结果
navigator.clipboard.writeText(responseText.value).then(() => {
// 选中后不弹出提示
}).catch(err => {
console.error('复制失败:', err);
});
} else {
alert('没有内容可复制!');
}
}
function clearContent() {
document.getElementById('keywords').value = ''; // 清空关键字输入框
document.getElementById('zhinianblog_respone').value = ''; // 清空结果框
messages = []; // 清空对话记录
}
function startWrite() {
var keywords = document.getElementById('keywords').value;
messages.push({ role: "user", content: keywords }); // 添加用户消息到对话记录
document.getElementById("zhinianblog_respone").value = '等待接口响应中.......';
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.openai.com/v1/chat/completions'); // 使用官方 ChatGPT API 地址
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Authorization', 'Bearer {$apiKey}');
xhr.send(JSON.stringify({
model: "gpt-3.5-turbo", // 使用的模型
messages: messages // 发送对话记录
}));
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText) {
var obj = JSON.parse(xhr.responseText);
var text = obj.choices[0].message.content; // 获取返回的内容
document.getElementById("zhinianblog_respone").value = text;
messages.push({ role: "assistant", content: text }); // 添加助手消息到对话记录
}
};
}
// 监听输入框的输入事件,自动滚动
function handleInput() {
const input = document.getElementById('keywords');
input.scrollLeft = input.scrollWidth; // 自动滚动到最后
}
</script>
<style>
.text-area {
font-size: 12pt; /* 设置文本框字体大小 */
font-weight: normal; /* 不加粗 */
overflow-x: auto; /* 允许横向滚动 */
}
</style>
<div style="margin:0px 0px 10px 0px;text-align:left;">
<a class="primary" id="aiWrite-button" style="text-decoration:none; color:white; padding:7px; margin:17px 0px 17px 0px" onclick="showAiContent()">展开AI写作</a>
</div>
<div id="AiWriteAsk" style="display:none;margin-top:10px;margin-bottom:10px;">
<div style="display: flex; align-items: center; width: 100%;">
<input type="text" placeholder="请输入关键字..." class="w-50 text title text-area" id="keywords" value="" style="flex: 1; margin-right: 10px;" oninput="handleInput()"/>
<label onclick="startWrite()" class="primary" style="text-decoration:none; color:white; padding:7px 15px; margin-right: 5px;">生成</label>
<label onclick="copyContent()" class="primary" style="text-decoration:none; color:white; padding:7px 15px; margin-right: 5px;">复制</label>
<label onclick="clearContent()" class="primary" style="text-decoration:none; color:white; padding:7px 15px;">清除</label>
</div>
</div>
<div id="zhinianblog_respone_div" style="display:none;">
<textarea autocomplete="off" id="zhinianblog_respone" class="w-100 mono text-area" rows="5"></textarea>
</div>
EOF;
}
/**
* 输出头部css
*
* @access public
* @param unknown $header
* @return unknown
*/
public static function header() {
}
/**
* 输出底部js
*
* @access public
* @param unknown $header
* @return unknown
*/
public static function footer() {
}
}