Zotero GPT Connector

Connector

目前为 2023-11-23 提交的版本。查看 最新版本

// ==UserScript==
// @name         Zotero GPT Connector
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Connector
// @author       Polygon
// @match        https://chat.openai.com/*
// @icon         https://cdn.oaistatic.com/_next/static/media/favicon-32x32.be48395e.png
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @run-at       document-start
// ==/UserScript==

(async function () {
  'use strict';
  // 在Zotero中执行代码
  function execInZotero(code) {
    return new Promise((resolve, reject) => {
      GM_xmlhttpRequest({
        method: "POST",
        url: "http://127.0.0.1:23119/zoterogpt",
        headers: {
          "Content-Type": "application/json",
        },
        responseType: "json",
        data: JSON.stringify({code}),
        onload: function (response) {
          if (response.status >= 200 && response.status < 300) {
            resolve(response.response.result);
          } else {
            reject(new Error(`Request failed with status: ${response.status}`));
          }
        },
        onerror: function (error) {
          reject(new Error('Network error'));
        }
      });
    });
  }

  // 设定ChatGPT输入框文本并发送
  const setText = (text) => {
    // 获取 input 输入框的dom对象
    var element_input = window.document.querySelector('#prompt-textarea');
    // 修改input的值
    element_input.value = text;
    // 设置输入框的 input 事件
    var event = new InputEvent('input', {
      'bubbles': true,
      'cancelable': true,
    });
    element_input.dispatchEvent(event);
    document.querySelector("[data-testid=send-button]").click()
    setTimeout(() => {
      document.querySelector("[data-testid=send-button]").click()
    }, 100)
  }

  function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
  }

  while (true) {
    console.log("running...")
    try {
      const result = await execInZotero(`
        if (!window.Meet.tasks){
          window.Meet.tasks = []
        } else {
          window.Meet.tasks
        }
      `)
      const tasks = result;
      if (!tasks || tasks.length == 0) {
        await sleep(500)
        continue
      }
      const task = tasks.slice(-1)[0]
      if (task.type == "request") {
        // 操作浏览器提问
        let getUserQuestionNum = () => document.querySelectorAll("[data-message-author-role=user]").length
        const questionNum = getUserQuestionNum()
        console.log(task.text)
        setText(task.text)
        while (getUserQuestionNum() == questionNum) {
          await sleep(100)
        }
        await execInZotero(`
          window.Meet.tasks.push({
            type: "response",
            text: "处理中..."
          })
        `)
      } else if (task.type == "response") {
        const outputEle = [...document.querySelectorAll('[data-testid^=conversation-turn]')].slice(-1)[0];
        const contentEle = outputEle.querySelector(".gap-3") || outputEle
        const isDone = contentEle.nextElementSibling.querySelector("button")
        const text = contentEle.querySelector(".markdown").innerHTML
        // 读取浏览器数据
        await execInZotero(`
          const task = window.Meet.tasks.slice(-1)[0]
          if (task.type == "response") {
            task.text = \`${text}\`;
            task.isDone = ${isDone ? "true" : "false"}
          }
        `)
      }
    } catch (e) {
      console.log(e)
    }
    await sleep(10)
  }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址