您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Quick and simple script to export your private messages into a textfile.
- // ==UserScript==
- // @name KoGaMa: Export direct messages
- // @namespace github.com/deutschsimmy
- // @version 1.5
- // @description Quick and simple script to export your private messages into a textfile.
- // @author ⛧ simmy
- // @match *://www.kogama.com/*
- // @grant unsafeWindow
- // @grant GM_download
- // ==/UserScript==
- (function() {
- 'use strict';
- let chatData = null;
- function addExportButton() {
- const targetElement = document.querySelector('.F3PyX');
- if (targetElement && !document.querySelector('.export-btn')) {
- const exportButton = document.createElement('button');
- exportButton.className = 'export-btn';
- exportButton.title = 'Export chat history to a text file. In case it does not work close and reopen the chat.';
- exportButton.style.width = '30px';
- exportButton.style.height = '30px';
- exportButton.style.background = 'url(https://i.imgur.com/hG5QwIl.gif) center center / 16px 16px no-repeat';
- exportButton.style.border = 'none';
- exportButton.style.cursor = 'pointer';
- exportButton.style.position = 'absolute';
- exportButton.style.top = '50%';
- exportButton.style.right = '37px';
- exportButton.style.transform = 'translateY(-50%)';
- targetElement.style.position = 'relative';
- targetElement.appendChild(exportButton);
- exportButton.addEventListener('click', function() {
- exportChatHistory();
- });
- }
- }
- function exportChatHistory() {
- if (chatData) {
- chatData.reverse();
- let formattedChat = chatData.map(message => {
- const timestamp = new Date(message.created).toLocaleString();
- return `[ ${timestamp} ] ${message.from_username}: ${message.message}`;
- }).join('\n');
- formattedChat = formattedChat.replace(/\n{2,}/g, '\n');
- const filename = `${chatData[0].to_profile_id}.txt`;
- const blob = new Blob([formattedChat], { type: 'text/plain' });
- const url = URL.createObjectURL(blob);
- const downloadLink = document.createElement('a');
- downloadLink.href = url;
- downloadLink.download = filename;
- document.body.appendChild(downloadLink);
- downloadLink.click();
- document.body.removeChild(downloadLink);
- URL.revokeObjectURL(url);
- } else {
- console.error('No chat data found');
- }
- }
- function monitorRequests() {
- const originalOpen = unsafeWindow.XMLHttpRequest.prototype.open;
- const originalSend = unsafeWindow.XMLHttpRequest.prototype.send;
- unsafeWindow.XMLHttpRequest.prototype.open = function(method, url) {
- this._url = url;
- originalOpen.apply(this, arguments);
- };
- unsafeWindow.XMLHttpRequest.prototype.send = function(body) {
- this.addEventListener('load', function() {
- if (this._url.includes('/chat/') && this._url.includes('/history/')) {
- const urlParts = this._url.split('/');
- const selfId = urlParts[4];
- const friendId = urlParts[6];
- console.log('Detected chat history request:', selfId, friendId);
- if (this.responseType === '' || this.responseType === 'text') {
- chatData = JSON.parse(this.responseText).data;
- } else if (this.responseType === 'json') {
- chatData = this.response.data;
- }
- addExportButton();
- }
- });
- originalSend.apply(this, arguments);
- };
- }
- monitorRequests();
- })();