Nat.dev Chat Downloader

Download chat content as Markdown

  1. // ==UserScript==
  2. // @name Nat.dev Chat Downloader
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.5
  5. // @description Download chat content as Markdown
  6. // @author gpt-4
  7. // @match https://nat.dev/chat
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (async function () {
  12. const fetchChats = async () => {
  13. const response = await fetch("https://nat.dev/api/completion/chat");
  14. const chats = await response.json();
  15. return chats;
  16. };
  17.  
  18. const fetchChatContent = async (id) => {
  19. const response = await fetch(`https://nat.dev/api/completion/chat/${id}`);
  20. const chatContent = await response.json();
  21. return chatContent;
  22. };
  23.  
  24. const createFloatingWindow = (chats) => {
  25. const floatWindow = document.createElement("div");
  26. floatWindow.style.position = "fixed";
  27. floatWindow.style.top = "50%";
  28. floatWindow.style.left = "50%";
  29. floatWindow.style.transform = "translate(-50%, -50%)";
  30. floatWindow.style.backgroundColor = "white";
  31. floatWindow.style.border = "1px solid black";
  32. floatWindow.style.padding = "10px";
  33. floatWindow.style.zIndex = "1000";
  34. floatWindow.style.width = "75%";
  35. floatWindow.style.height = "75%";
  36. floatWindow.style.overflowY = "scroll";
  37. floatWindow.innerHTML = "<h3>Select a chat to download:</h3>";
  38.  
  39. const closeButton = document.createElement("button");
  40. closeButton.textContent = "Close";
  41. closeButton.style.position = "absolute";
  42. closeButton.style.top = "10px";
  43. closeButton.style.right = "10px";
  44. closeButton.addEventListener("click", () => {
  45. document.body.removeChild(floatWindow);
  46. });
  47. floatWindow.appendChild(closeButton);
  48.  
  49. chats.forEach((chat, index) => {
  50. const chatItem = document.createElement("div");
  51. const truncatedDescription = `${index + 1}. ${chat.description.slice(0, 15)}...`;
  52. chatItem.textContent = truncatedDescription;
  53. chatItem.style.cursor = "pointer";
  54. chatItem.style.marginBottom = "5px";
  55.  
  56. chatItem.addEventListener("click", async () => {
  57. const chatContent = await fetchChatContent(chat.id);
  58. const markdownContent = generateMarkdown(chatContent);
  59. downloadMarkdown(markdownContent, `chat-${chat.id}.md`);
  60. });
  61.  
  62. floatWindow.appendChild(chatItem);
  63. });
  64.  
  65. document.body.appendChild(floatWindow);
  66. };
  67.  
  68. const generateMarkdown = (chatContent) => {
  69. const systemContext = chatContent.meta.systemContext;
  70. let markdownContent = `System Context: ${systemContext}\n\n`;
  71.  
  72. const processLinks = (linkId) => {
  73. const link = chatContent.links[linkId];
  74. const completion = link.completion;
  75. const author = completion.author.name;
  76. const content = completion.content;
  77. markdownContent += `Author: ${author}\n\nContent:\n${content}\n\n`;
  78.  
  79. if (link.links.length > 0) {
  80. link.links.forEach((childLinkId) => {
  81. processLinks(childLinkId);
  82. });
  83. }
  84. };
  85.  
  86. chatContent.startLinks.forEach((linkId) => {
  87. processLinks(linkId);
  88. });
  89.  
  90. return markdownContent;
  91. };
  92.  
  93. const downloadMarkdown = (markdownContent, fileName) => {
  94. const blob = new Blob([markdownContent], { type: "text/markdown" });
  95. const link = document.createElement("a");
  96. link.href = URL.createObjectURL(blob);
  97. link.download = fileName;
  98. link.style.display = "none";
  99. document.body.appendChild(link);
  100. link.click();
  101. document.body.removeChild(link);
  102. };
  103.  
  104. const downloadButton = document.createElement("button");
  105. downloadButton.textContent = "Download Chat";
  106. downloadButton.style.position = "fixed";
  107. downloadButton.style.bottom = "10px";
  108. downloadButton.style.right = "10px";
  109. downloadButton.style.zIndex = "1000";
  110. downloadButton.addEventListener("click", async () => {
  111. const chats = await fetchChats();
  112. createFloatingWindow(chats);
  113. });
  114. document.body.appendChild(downloadButton);
  115. })();

QingJ © 2025

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