插件介绍:

二改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码,我正好有,正好魔改下自己用。

Open API Key官网

 

实现效果:

PixPin_2024-08-27_17-01-53.jpg

 

使用方法:

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() {
        
    }
}