Greasy Fork is available in English.

提取b站视频cc字幕内容(自行配合GPT)

一键复制视频字幕文本,可以配合GPT对视频进行总结

// ==UserScript==
// @name         提取b站视频cc字幕内容(自行配合GPT)
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  一键复制视频字幕文本,可以配合GPT对视频进行总结
// @author       Josh
// @match        https://www.bilibili.com/video/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @grant        unsafeWindow
// @grant        GM_xmlhttpRequest
// @grant        GM_download
// @grant        GM_setClipboard
// @license MIT
// ==/UserScript==

var currentCCText = "";

function createBtn() {
  const right = document.querySelector(".video-toolbar-right");
  const btn = document.createElement("div");
  btn.innerHTML = `<div class="bpx-player-dm-btn-send bui bui-button">
  <div id="fetchCCBtn" style="border-radius: 10px;padding: 8px;" class="bui-area bui-button-blue">复制视频字幕内容</div>
  </div>`;
  right.appendChild(btn);
  _setBtnCopyEvent();
}

function createFailBtn() {
  const right = document.querySelector(".video-toolbar-right");
  const btn = document.createElement("div");
  btn.innerHTML = `<div class="bpx-player-dm-btn-send bui bui-button bui-disabled">
  <div style="border-radius: 10px;padding: 8px;" class="bui-area bui-button-blue">该视频无字幕</div>
  </div>`;
  right.appendChild(btn);
}

function _setBtnCopyEvent() {
  const btn = document.querySelector("#fetchCCBtn");
  btn.addEventListener("click", function () {
    GM_setClipboard(currentCCText);
    btn.innerText = "复制成功";
    setTimeout(() => {
      btn.innerText = "复制视频字幕内容";
    }, 2000);
  });
}

function getSubtitleUrl() {
  return unsafeWindow.__INITIAL_STATE__.videoData.subtitle.list[0].subtitle_url;
}

function main() {
  try {
    GM_xmlhttpRequest({
      method: "GET",
      url: getSubtitleUrl(),
      onload: function (res) {
        const data = JSON.parse(res.response);
        for (const e of data.body) {
          currentCCText += e.content + "  ";
        }
        createBtn();
      },
    });
  } catch (e) {
    createFailBtn();
  }
}

setTimeout(main, 5000);