Thêm nút Sao chép vào tin nhắn trò chuyện trên bot.n.cn của 360

Thêm nút "Sao chép" vào các phần tử tin nhắn trò chuyện để dễ dàng sao chép nội dung của chúng.

  1. // ==UserScript==
  2. // @name Add Copy Button to Chat Messages on 360's bot.n.cn
  3. // @description Adds a "Copy" button to chat message elements to easily copy their content.
  4. // @name:zh-CN 为360纳米AI聊天消息添加复制按钮
  5. // @description:zh-CN 为聊天消息元素添加“复制”按钮,以便轻松复制其内容。
  6. // @name:ar إضافة زر نسخ لرسائل الدردشة على bot.n.cn الخاص بـ 360
  7. // @description:ar يضيف زر "نسخ" إلى عناصر رسائل الدردشة لنسخ محتواها بسهولة.
  8. // @name:bg Добавяне на бутон за копиране към съобщенията в чата на bot.n.cn на 360
  9. // @description:bg Добавя бутон "Копиране" към елементите на съобщенията в чата за лесно копиране на тяхното съдържание.
  10. // @name:cs Přidat tlačítko Kopírovat do chatovacích zpráv na bot.n.cn od 360
  11. // @description:cs Přidává tlačítko "Kopírovat" k prvkům chatovacích zpráv pro snadné kopírování jejich obsahu.
  12. // @name:da Tilføj en kopiknap til chatbeskeder på 360's bot.n.cn
  13. // @description:da Tilføjer en "Kopiér"-knap til chatbeskedelementer for nemt at kopiere deres indhold.
  14. // @name:de Kopierknopf zu Chatnachrichten auf 360's bot.n.cn hinzufügen
  15. // @description:de Fügt einen "Kopieren"-Knopf zu Chatnachrichtenelementen hinzu, um deren Inhalt einfach zu kopieren.
  16. // @name:el Προσθήκη κουμπιού αντιγραφής στα μηνύματα συνομιλίας στο bot.n.cn της 360
  17. // @description:el Προσθέτει ένα κουμπί "Αντιγραφή" στα στοιχεία μηνυμάτων συνομιλίας για εύκολη αντιγραφή του περιεχομένου τους.
  18. // @name:en Add Copy Button to Chat Messages on 360's bot.n.cn
  19. // @description:en Adds a "Copy" button to chat message elements to easily copy their content.
  20. // @name:eo Aldoni Kopi-Butonon al Babilaj Mesaĝoj en bot.n.cn de 360
  21. // @description:eo Aldonas "Kopii"-butonon al babilaj mesaĝelementoj por facile kopii ilian enhavon.
  22. // @name:es Añadir botón de copiar a mensajes de chat en bot.n.cn de 360
  23. // @description:es Añade un botón "Copiar" a los elementos de mensajes de chat para copiar fácilmente su contenido.
  24. // @name:fi Lisää kopiointipainike chattiviesteihin 360:n bot.n.cn-sivustolla
  25. // @description:fi Lisää "Kopioi"-painikkeen chattiviestielementteihin niiden sisällön helppoa kopiointia varten.
  26. // @name:fr Ajouter un bouton Copier aux messages de chat sur bot.n.cn de 360
  27. // @description:fr Ajoute un bouton "Copier" aux éléments des messages de chat pour copier facilement leur contenu.
  28. // @name:fr-CA Ajouter un bouton Copier aux messages de clavardage sur bot.n.cn de 360
  29. // @description:fr-CA Ajoute un bouton "Copier" aux éléments des messages de clavardage pour en copier facilement le contenu.
  30. // @name:he הוסף כפתור העתקה להודעות צ'אט ב-bot.n.cn של 360
  31. // @description:he מוסיף כפתור "העתק" לרכיבי הודעות הצ'אט כדי להעתיק בקלות את תוכנם.
  32. // @name:hr Dodaj gumb za kopiranje porukama chata na bot.n.cn od 360
  33. // @description:hr Dodaje gumb "Kopiraj" elementima poruka chata za jednostavno kopiranje njihovog sadržaja.
  34. // @name:hu Másolás gomb hozzáadása a csevegőüzenetekhez a 360 bot.n.cn oldalán
  35. // @description:hu Hozzáad egy "Másolás" gombot a csevegőüzenet-elemekhez a tartalom egyszerű másolásához.
  36. // @name:id Tambah Tombol Salin ke Pesan Obrolan di bot.n.cn milik 360
  37. // @description:id Menambahkan tombol "Salin" ke elemen pesan obrolan untuk menyalin kontennya dengan mudah.
  38. // @name:it Aggiungi pulsante Copia ai messaggi di chat su bot.n.cn di 360
  39. // @description:it Aggiunge un pulsante "Copia" agli elementi dei messaggi di chat per copiarne facilmente il contenuto.
  40. // @name:ja 360のbot.n.cnのチャットメッセージにコピーボタンを追加
  41. // @description:ja チャットメッセージ要素に「コピー」ボタンを追加して、内容を簡単にコピーできるようにします。
  42. // @name:ka დაამატეთ ასლი ღილაკი ჩატის შეტყობინებებში 360-ის bot.n.cn-ზე
  43. // @description:ka ჩატის შეტყობინებების ელემენტებში "ასლი" ღილაკის დამატება მათი შინაარსის მარტივად კოპირებისთვის.
  44. // @name:ko 360의 bot.n.cn 채팅 메시지에 복사 버튼 추가
  45. // @description:ko 채팅 메시지 요소에 "복사" 버튼을 추가하여 내용을 쉽게 복사할 수 있도록 합니다.
  46. // @name:nb Legg til en kopieringsknapp i chattemeldinger på 360s bot.n.cn
  47. // @description:nb Legger til en "Kopier"-knapp i chattemeldingselementer for å enkelt kopiere innholdet deres.
  48. // @name:nl Voeg een kopieerknop toe aan chatberichten op 360's bot.n.cn
  49. // @description:nl Voegt een "Kopiëren"-knop toe aan chatberichtelementen om de inhoud gemakkelijk te kopiëren.
  50. // @name:pl Dodaj przycisk Kopiuj do wiadomości czatu na bot.n.cn od 360
  51. // @description:pl Dodaje przycisk "Kopiuj" do elementów wiadomości czatu, aby łatwo skopiować ich zawartość.
  52. // @name:pt-BR Adicionar botão Copiar às mensagens de chat no bot.n.cn da 360
  53. // @description:pt-BR Adiciona um botão "Copiar" aos elementos de mensagens de chat para copiar facilmente seu conteúdo.
  54. // @name:ro Adaugă un buton de copiere la mesajele de chat pe bot.n.cn al 360
  55. // @description:ro Adaugă un buton "Copiază" la elementele mesajelor de chat pentru a le copia ușor conținutul.
  56. // @name:ru Добавить кнопку копирования в сообщения чата на bot.n.cn от 360
  57. // @description:ru Добавляет кнопку "Копировать" к элементам сообщений чата для легкого копирования их содержимого.
  58. // @name:sk Pridať tlačidlo Kopírovať do správ četu na bot.n.cn od 360
  59. // @description:sk Pridáva tlačidlo "Kopírovať" k prvkom správ četu na jednoduché kopírovanie ich obsahu.
  60. // @name:sr Додај дугме за копирање порукама у чету на bot.n.cn од 360
  61. // @description:sr Додаје дугме "Копирај" елементима порука у чету за лако копирање њиховог садржаја.
  62. // @name:sv Lägg till en kopieringsknapp i chattmeddelanden på 360:s bot.n.cn
  63. // @description:sv Lägger till en "Kopiera"-knapp i chattmeddelandeelement för att enkelt kopiera deras innehåll.
  64. // @name:th เพิ่มปุ่มคัดลอกให้กับข้อความแชทบน bot.n.cn ของ 360
  65. // @description:th เพิ่มปุ่ม "คัดลอก" ให้กับองค์ประกอบข้อความแชทเพื่อคัดลอกเนื้อหาได้อย่างง่ายดาย
  66. // @name:tr 360'ın bot.n.cn üzerindeki sohbet mesajlarına Kopyala düğmesi ekle
  67. // @description:tr Sohbet mesajı öğelerine içeriğini kolayca kopyalamak için bir "Kopyala" düğmesi ekler.
  68. // @name:ug 360 نىڭ bot.n.cn دىكى پاراڭلىشىش ئۇچۇرلىرىغا كۆچۈرۈش كۇنۇپكىسى قوشۇش
  69. // @description:ug پاراڭلىشىش ئۇچۇرلىرى ئېلېمېنتلىرىغا ئۇلارنىڭ مەزمۇنىنى ئاسان كۆچۈرۈش ئۈچۈن "كۆچۈرۈش" كۇنۇپكىسى قوشىدۇ.
  70. // @name:uk Додати кнопку копіювання до повідомлень чату на bot.n.cn від 360
  71. // @description:uk Додає кнопку "Копіювати" до елементів повідомлень чату для легкого копіювання їх вмісту.
  72. // @name:vi Thêm nút Sao chép vào tin nhắn trò chuyện trên bot.n.cn của 360
  73. // @description:vi Thêm nút "Sao chép" vào các phần tử tin nhắn trò chuyện để dễ dàng sao chép nội dung của chúng.
  74. // @name:zh 为360的bot.n.cn上的聊天消息添加复制按钮
  75. // @description:zh 为聊天消息元素添加“复制”按钮,以便轻松复制其内容。
  76. // @name:zh-HK 為360嘅bot.n.cn上嘅聊天訊息添加複製按鈕
  77. // @description:zh-HK 為聊天訊息元素添加「複製」按鈕,以便輕鬆複製其內容。
  78. // @name:zh-SG 为360的bot.n.cn上的聊天消息添加复制按钮
  79. // @description:zh-SG 为聊天消息元素添加“复制”按钮,以便轻松复制其内容。
  80. // @name:zh-TW 為360的bot.n.cn上的聊天訊息添加複製按鈕
  81. // @description:zh-TW 為聊天訊息元素添加「複製」按鈕,以便輕鬆複製其內容。
  82. // @namespace http://tampermonkey.net/
  83. // @version 0.1.0
  84. // @author aspen138
  85. // @match *://bot.n.cn/*
  86. // @grant none
  87. // @run-at document-end
  88. // @icon https://p1.ssl.qhimg.com//t11098f6bcd26caa77d8aa4d2fb.png
  89. // @license MIT
  90. // ==/UserScript==
  91.  
  92.  
  93. (function() {
  94. 'use strict';
  95.  
  96. // Update these if class names change
  97. const MESSAGE_CONTENT_CLASS = 'UserMessage-module__container--cAvvK';
  98. const CHAT_MESSAGE_CONTENT_CLASS = 'ChatMessage-module__content--MYneF';
  99. const NEW_MESSAGE_SELECTOR = '.max-w-\\[80\\%\\].rounded-\\[16px\\].px-\\[16px\\].py-\\[10px\\].text-white.text-\\[15px\\].leading-\\[22px\\].whitespace-pre-line.break-all.overflow-x-hidden';
  100.  
  101. function createCopyButton() {
  102. const button = document.createElement('button');
  103. button.innerText = 'Copy';
  104. button.classList.add('copy-button');
  105. button.style.position = 'sticky';
  106. button.style.top = '10px';
  107. button.style.right = '10px';
  108. button.style.backgroundColor = '#4CAF50';
  109. button.style.color = '#fff';
  110. button.style.border = 'none';
  111. button.style.borderRadius = '4px';
  112. button.style.padding = '5px 10px';
  113. button.style.cursor = 'pointer';
  114. button.style.fontSize = '0.9em';
  115. button.style.zIndex = '1000';
  116. button.style.boxShadow = '0 2px 6px rgba(0,0,0,0.2)';
  117. button.style.marginLeft = 'auto';
  118. button.style.float = 'right';
  119. button.style.display = 'inline-block';
  120.  
  121. button.addEventListener('mouseenter', () => {
  122. button.style.backgroundColor = '#45a049';
  123. });
  124. button.addEventListener('mouseleave', () => {
  125. button.style.backgroundColor = '#4CAF50';
  126. });
  127.  
  128. return button;
  129. }
  130.  
  131. function addCopyButton(element) {
  132. if (element.querySelector('.copy-button')) return;
  133.  
  134. const isNewMessage = element.matches(NEW_MESSAGE_SELECTOR);
  135. const contentElement = isNewMessage ? element : element.querySelector(`.${MESSAGE_CONTENT_CLASS}`);
  136.  
  137. if (!contentElement) return;
  138.  
  139. element.style.position = 'relative';
  140. element.style.display = 'block';
  141.  
  142. const copyButton = createCopyButton();
  143.  
  144. copyButton.addEventListener('click', () => {
  145. const textToCopy = contentElement.innerText.trim().replace(/Copy(?=[^Copy]*$)/, "");
  146. navigator.clipboard.writeText(textToCopy).then(() => {
  147. copyButton.innerText = 'Copied!';
  148. copyButton.style.backgroundColor = '#388E3C';
  149. setTimeout(() => {
  150. copyButton.innerText = 'Copy';
  151. copyButton.style.backgroundColor = '#4CAF50';
  152. }, 2000);
  153. }).catch(err => {
  154. console.error('Failed to copy text: ', err);
  155. });
  156. });
  157.  
  158. element.appendChild(copyButton);
  159. }
  160.  
  161. function processExistingMessages() {
  162. // Process original chat messages
  163. document.querySelectorAll(`.${CHAT_MESSAGE_CONTENT_CLASS}`).forEach(addCopyButton);
  164. // Process new gradient messages
  165. document.querySelectorAll(NEW_MESSAGE_SELECTOR).forEach(addCopyButton);
  166. }
  167.  
  168. function observeNewMessages() {
  169. const observer = new MutationObserver((mutations) => {
  170. for (const mutation of mutations) {
  171. if (mutation.type === 'childList') {
  172. mutation.addedNodes.forEach(node => {
  173. if (node.nodeType === Node.ELEMENT_NODE) {
  174. // Check for both message types
  175. if (node.matches(`.${CHAT_MESSAGE_CONTENT_CLASS}, ${NEW_MESSAGE_SELECTOR}`)) {
  176. addCopyButton(node);
  177. }
  178. // Check nested elements
  179. node.querySelectorAll(`.${CHAT_MESSAGE_CONTENT_CLASS}, ${NEW_MESSAGE_SELECTOR}`).forEach(addCopyButton);
  180. }
  181. });
  182. }
  183. }
  184. });
  185.  
  186. observer.observe(document.body, { childList: true, subtree: true });
  187. }
  188.  
  189. function init() {
  190. processExistingMessages();
  191. observeNewMessages();
  192. }
  193.  
  194. if (document.readyState === 'loading') {
  195. document.addEventListener('DOMContentLoaded', init);
  196. } else {
  197. init();
  198. }
  199. })();