从linux do获取论坛文章数据与复制

从linux do论坛页面获取文章的板块、标题、链接、标签和内容总结,并在标题旁添加复制按钮。支持设置界面配置。

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

作者
Loveyless
今日安裝
0
安裝總數
9
評價
0 0 0
版本
0.15.1
建立日期
2025-07-25
更新日期
2025-09-30
尺寸
47.1 KB
授權條款
未知
腳本執行於

greasyfork

https://greasyfork.org/zh-CN/scripts/543581

快速分享 Linux do 文章

image

点击后剪切板可获得如下内容 ↓

-请不要把互联网上的戾气带来这里!
@Neo(运营反馈)

L 站打击傲慢、阴阳怪气、攻击谩骂,旨在打造和谐社区。请友善交流,遵守规则,违者严惩。

https://linux.do/t/topic/482293

image

可以接入Gemini/OpenAiCompatible来总结正文内容

image image

SFC 应用中遇到的问题分析

linux.do 论坛使用 Discourse,这是一个基于 Ember.js 的 单页应用(SPA)。这意味着页面内容是动态加载和渲染的,而不是一次性从服务器完整加载的。您的脚本在处理这种动态内容时,可能会遇到以下挑战:

  1. DOM 元素加载时机:
- 脚本可能在页面初始加载时(`DOMContentLoaded` 或 `document.readyState` 为 `loading`)运行,但此时文章标题、内容(`.cooked`)或用户数据容器(`.topic-meta-data`)等关键 DOM 元素可能尚未被 Ember.js 框架完全渲染到页面上。
- 即使使用 `MutationObserver`,如果观察不够精细或回调逻辑处理不当,也可能导致重复添加按钮或数据抓取失败。
  1. 元素选择器问题:
- SFC 应用的 DOM 结构可能会比传统网站更复杂或更具动态性。例如,某些元素可能在 Shadow DOM 中(尽管 Discourse 不太常见),或者其类名、ID 会动态生成。
- 您的 `getUserData` 函数中对 `domElement` 的选择 (`document.querySelector('.topic-meta-data')`) 以及内部元素的查找可能不够鲁棒,尤其是当页面在不同状态下(如刷新、导航到新主题)其结构有微小变化时。
- `titleLinkElement.querySelector('span').textContent.trim();` 这一行可能存在问题。`a.fancy-title` 通常直接包含文本,而不需要再查询 `span` 子元素。
  1. 重复执行:
- 当前的 `MutationObserver` 逻辑可能在 DOM 变化时反复调用 `initializeScript()`,如果不对按钮是否已添加进行充分检查,可能导致页面上出现多个复制按钮。

解决方案与脚本改进

为了解决这些问题,我们可以对脚本进行以下改进:

  1. 优化 MutationObserver 策略: 让观察器更智能地判断何时执行初始化逻辑,并确保只添加一次按钮。
  2. 增强元素选择器的鲁棒性: 采用更灵活或更具体的选择器来定位目标元素,同时考虑它们的加载时机。
  3. 清理和规范代码: 提高可读性和维护性,修复一些小问题。

主要改进点解释

  1. @run-at document-idle:
- 在脚本头部添加了 `@run-at document-idle`。这指示 Tampermonkey 在文档完全加载(包括所有图片、样式表等)并且浏览器处于“空闲”状态时运行脚本。这对于 SPA 应用尤其有用,因为它能确保在框架渲染完大部分内容后再尝试操作 DOM。
  1. 更健壮的 getUserData 函数:
- 将 `plate` 属性名改为更通用的 `category`,与模板中的 `{{category}}` 对应。
- 增加了\*\*标签(tags)\*\*的提取逻辑,从 `.topic-tags` 容器中查找所有 `.discourse-tag` 元素并收集为数组。
- **优化了用户名和用户头衔的选择器**,考虑了 `linux.do`(Discourse)中可能存在的不同 DOM 结构,使其更精确地定位到发帖人信息。
- 增加了获取不到标签时的**默认值** (`['无标签']`)。
  1. 精确的 titleLinkElement 文本获取:
- 在 `getArticleData` 中,将 `titleLinkElement.querySelector('span').textContent.trim();` 改为 `titleLinkElement.textContent.trim();`。通常 `a.fancy-title` 元素本身就包含标题文本,不需要再找其内部的 `span`。
  1. 内容总结前的 DOM 清理:
- 在 `getArticleData` 中,获取 `fullTextContent` 之前,增加了**克隆 `articleRootElement`** 并**移除不必要的子元素**(如代码块 `pre, code`、引用 `blockquote`、图片 `img`、元数据 `.meta`、签名 `.signature` 等)的步骤。这样可以确保 Gemini API 接收到的文本更干净,总结更准确,避免将不相关的内容纳入总结范围。
  1. CSS 样式调整:
- 修改了 `h1[data-topic-id]` 的 CSS 规则,强制其 `display: flex` 和 `align-items: center`,并增加了 `gap`,这样无论标题多长,复制按钮都能与标题**完美对齐**,并保持适当的间距。
  1. MutationObserver 优化:
- `MutationObserver` 的回调函数现在只执行 `initializeScript()`。
- `initializeScript()` 内部会进行**全面的元素存在性检查**,并且 `addCopyButtonToArticleTitle` 函数会负责**判断按钮是否已存在**,从而防止重复添加。这种模式在 SPA 中非常有效,因为即使 DOM 频繁变化,它也能确保在正确时机一次性地完成任务。
  1. 复制成功/失败的视觉反馈:
- 在 `copyTextToClipboard` 和 `handleCopyError` 函数中,增加了 `element.focus()` 和 `element.blur()` 以及 `setTimeout`,利用 CSS 的 `:focus` 伪类来短暂显示“已复制”或“复制失败”的提示,增强用户体验。

使用方法与调试

  1. 更新脚本: 在 Tampermonkey 中用新的代码替换旧代码,并保存。
  2. 检查配置: 在 Tampermonkey 脚本设置中,根据需要调整 USE_GEMINI_API_FOR_SUMMARY(是否启用 AI 总结)、GEMINI_API_KEY(你的 Gemini API 密钥)和 LOCAL_SUMMARY_MAX_CHARS(本地总结最大字符数,现在默认为 150)等配置。
  3. 访问 linux.do: 打开或刷新 linux.do 的任何文章页面。
  4. 查看控制台: 打开浏览器的开发者工具(通常按 F12),切换到“控制台”(Console)选项卡。你会看到脚本的日志输出,例如“油猴脚本已尝试初始化。”,以及成功找到元素或获取数据的消息。如果出现错误,也会有详细的错误信息。这些日志对于调试非常有用。

通过这些改进,脚本在 linux.do 这样的 SFC 应用中应该能更稳定、更准确地工作。