Komica AI Generator

允許在 Komica 綜合討論區中使用 OpenAI 的 API 來生成文本,並將其作為快速回復框的回復。

// ==UserScript==
// @name         Komica AI Generator
// @namespace    https://chat.openai.com/
// @version      1.3
// @description  允許在 Komica 綜合討論區中使用 OpenAI 的 API 來生成文本,並將其作為快速回復框的回復。
// @author       ChatGPT
// @match        https://gaia.komica1.org/00b/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=komica.org
// @license MIT
// ==/UserScript==

window.onload = function () {
    'use strict';
    var API_KEY = 'Replace with your OpenAI API key'; //把你的OpenAI API Key填在這裡
    var qlinks = document.querySelectorAll(".qlink");
    let postContent;
    var quickReplyForm = document.getElementById('quickreply-form');
    var checkbox = document.createElement('input');
    checkbox.type = 'checkbox';
    checkbox.name = 'ai-generate';
    checkbox.id = 'ai-generate';
    var label = document.createElement('label');
    label.textContent = 'AI生成';
    label.htmlFor = 'ai-generate';
    var brackets = document.createElement('span');
    brackets.textContent = '[';
    var closingBrackets = document.createElement('span');
    closingBrackets.textContent = ']';
    var submitDiv = quickReplyForm.getElementsByTagName('div')[quickReplyForm.getElementsByTagName('div').length - 1];
    submitDiv.appendChild(brackets);
    submitDiv.appendChild(checkbox);
    submitDiv.appendChild(label);
    submitDiv.appendChild(closingBrackets);

    qlinks.forEach((qlink) => {
        qlink.addEventListener('click', (event) => {
            var postId = qlink.dataset.no;
            postContent = document.querySelector(`.post[data-no="${postId}"] .quote`).textContent.trim();

            checkbox.addEventListener('change', function handleCheckboxChange() {
                if (checkbox.checked) {
                    quickReplyForm.querySelector('textarea[name="pOBvrtyJK"]').value = 'AI生成中...';
                    var API_ENDPOINT = 'https://api.openai.com/v1/chat/completions';
                    var prompt = [{
                            "role": "system",
                            "content": "Please reply to this post using zh-tw."
                        }, {
                            "role": "user",
                            "content": postContent
                        }
                    ];
                    var data = {
                        'model': 'gpt-3.5-turbo',
                        'messages': prompt,
                        'max_tokens': 1048, //最大token數, 生成文章長度限制
                        'temperature': 1, //控制生成的採樣溫度,取值範圍為0到2。較高的溫度值會使輸出更隨機,而較低的溫度值則會使輸出更加集中和確定性。
                    }

                    var headers = {
                        'Content-Type': 'application/json',
                        'Authorization': 'Bearer ' + API_KEY + ''
                    };

                    fetch(API_ENDPOINT, {
                        method: 'POST',
                        headers: headers,
                        body: JSON.stringify(data)
                    })
                    .then((response) => {
                        response.json().then((json) => {
                            var replyText = json.choices[0].message.content;
                            quickReplyForm.querySelector('textarea[name="pOBvrtyJK"]').value = ">>" + postId + "\n" + replyText;
                            checkbox.checked = false;
                            checkbox.removeEventListener('change', handleCheckboxChange);
                        })
                        .catch((error) => {
                            if (API_KEY === 'Replace with your OpenAI API key') {
                                quickReplyForm.querySelector('textarea[name="pOBvrtyJK"]').value = '我是精障...就是不填API key..(去填啦很簡單= =';
                            } else {
                                console.error(error);
                                quickReplyForm.querySelector('textarea[name="pOBvrtyJK"]').value = '-Error- 出錯了 可能你API key怪怪的';
                            }
                            checkbox.removeEventListener('change', handleCheckboxChange);
                        });
                    })
                }
            });
        });
    });
}