<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>DIYgod/RSSHub Open Pull Requests</title><link>https://github.com/DIYgod/RSSHub/pulls</link><atom:link href="http://rss.144-124-237-35.sslip.io/github/pull/DIYgod/RSSHub" rel="self" type="application/rss+xml"></atom:link><description>DIYgod/RSSHub Open Pull Requests - Powered by AtomRSS</description><generator>AtomRSS</generator><webMaster>contact@atomgroup.dev (AtomRSS)</webMaster><language>en</language><lastBuildDate>Mon, 19 Oct 2026 03:59:04 GMT</lastBuildDate><ttl>5</ttl><item><title>chore: integrate knip</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/cline/blog
/infzm/1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[ ] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Integrates &lt;a href=&quot;https://knip.dev/&quot;&gt;knip&lt;/a&gt; to find unused files, exports, dependencies and circular imports. It runs as &lt;code&gt;pnpm knip&lt;/code&gt; and as a step in the lint workflow (with the &lt;code&gt;github-actions&lt;/code&gt; reporter for inline annotations).&lt;/p&gt;
&lt;h3&gt;Config (&lt;code&gt;knip.ts&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Route modules are loaded by directory import, which knip cannot trace. Files exporting &lt;code&gt;route&lt;/code&gt;, &lt;code&gt;namespace&lt;/code&gt; or &lt;code&gt;apiRoute&lt;/code&gt; are listed as entries, and &lt;code&gt;includeEntryExports&lt;/code&gt; is on so other exports in route files are still checked. &lt;code&gt;scripts/knip-preprocessor.ts&lt;/code&gt; drops only the registry exports from the report.&lt;/li&gt;
&lt;li&gt;Script entries come from knip&#39;s package.json / GitHub Actions plugins; only files they can&#39;t see are listed (the &lt;code&gt;actions/github-script&lt;/code&gt; imports and the Dockerfile minifier).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignoreIssues&lt;/code&gt; is limited to modules whose exports are consumed outside the graph: worker shims and &lt;code&gt;*.worker.*&lt;/code&gt; replacements, the npm package entry, Cloudflare entries, and the disabled Twitter login flows (kept on purpose, see the commented-out imports in &lt;code&gt;twitter/api&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Circular imports are reported as errors, and configuration hints fail the run.&lt;/li&gt;
&lt;li&gt;Production patterns carry the &lt;code&gt;!&lt;/code&gt; suffix, so &lt;code&gt;knip --production&lt;/code&gt; can be run on demand (not in CI).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cleanup from the findings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fix:&lt;/strong&gt; the &lt;code&gt;cline&lt;/code&gt; namespace used a default export, so its metadata was never registered.&lt;/li&gt;
&lt;li&gt;Removed unreachable files: art-template leftovers from #20777, old-style sjtu/seiee and scnu routes that have not been registered since &lt;code&gt;router.ts&lt;/code&gt; was removed, &lt;code&gt;puppeteer-utils.ts&lt;/code&gt; (missed in #21976), and never-imported type files.&lt;/li&gt;
&lt;li&gt;Removed the needless &lt;code&gt;export&lt;/code&gt; from 251 route &lt;code&gt;handler&lt;/code&gt;s (the &lt;code&gt;new:route&lt;/code&gt; template doesn&#39;t export it) and from unused types.&lt;/li&gt;
&lt;li&gt;Broke circular imports in &lt;code&gt;infzm&lt;/code&gt;, &lt;code&gt;sdo/ff14risingstones&lt;/code&gt; and &lt;code&gt;youtube&lt;/code&gt; by moving shared code to the module both sides use. This only moves code; behaviour is unchanged.&lt;/li&gt;
&lt;li&gt;Dropped unused dependencies: &lt;code&gt;rfc4648&lt;/code&gt;, &lt;code&gt;yaml-eslint-parser&lt;/code&gt;, &lt;code&gt;eslint-nibble&lt;/code&gt;, &lt;code&gt;@types/eslint&lt;/code&gt;, &lt;code&gt;@types/module-alias&lt;/code&gt;. Added &lt;code&gt;@types/mdast&lt;/code&gt; for a JSDoc type import that relied on a transitive dependency.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Verified locally: &lt;code&gt;pnpm knip&lt;/code&gt;, &lt;code&gt;pnpm typecheck&lt;/code&gt;, oxlint, oxfmt, &lt;code&gt;pnpm build:routes&lt;/code&gt;, and the registry / pkg tests.&lt;/p&gt;
&lt;p&gt;🤖 Generated with &lt;a href=&quot;https://claude.com/claude-code&quot;&gt;Claude Code&lt;/a&gt;&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23606</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23606</guid><pubDate>Sat, 17 Oct 2026 01:46:22 GMT</pubDate><author>hyoban</author></item><item><title>feat(route/cloudflarestatus): add full-text blog feed</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Follow-up to #23543, which was closed after the Cloudflare Status feed was fixed upstream in 9e677874d94237eaf9bc9fbcc5d8c707d033ebdd. This PR focuses on the Blog feed.&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/cloudflarestatus/blog
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随路由规范&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有，代码是否有对应措施？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Date and time / 日期和时间
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] Puppeteer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Adds a full-text Cloudflare Blog feed at &lt;code&gt;/cloudflarestatus/blog&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The official RSS feed provides the article list, authors, publication dates, categories, GUIDs, and cover-image enclosures. The route fetches article pages for the full content, including inline images, code blocks, and copyable prompts that may be missing from the RSS feed.&lt;/p&gt;
&lt;p&gt;Article content is cached, relative URLs are resolved, and copyable prompts are converted into code blocks. Article requests run with a concurrency limit of three.&lt;/p&gt;
&lt;p&gt;This PR adds one route file under the existing &lt;code&gt;cloudflarestatus&lt;/code&gt; namespace. It does not modify the Status route or require additional packages, authentication, or browser automation.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23590</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23590</guid><pubDate>Fri, 16 Oct 2026 01:33:50 GMT</pubDate><author>ljh12138164</author></item><item><title>feat(panasonic): add camera and lens firmware feed</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;!--
Please include route starts with /, with all required and optional parameters.
Fail to comply will result in your pull request being closed automatically.
请在 `routes` 区域填写以 / 开头的完整路由地址，否则你的 PR 将会被无条件关闭。
如果路由包含在文档中列出可以完全穷举的参数（例如分类），请依次全部列出。

```routes
/some/route
/some/other/route
/dont/use/this/or/modify/it
/use/the/fenced/code/block/below
```

If your changes are not related to route, please fill in `routes` section with `NOROUTE`. Fail to comply will result in your PR being closed.
如果你的 PR 与路由无关, 请在 `routes` 区域 填写 `NOROUTE`，而不是直接删除 `routes` 区域。否则你的 PR 将会被无条件关闭。
--&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/panasonic/firmware
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[ ] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Adds &lt;code&gt;/panasonic/firmware&lt;/code&gt; for the latest firmware listed on Panasonic&#39;s global support pages, covering full-frame, Micro Four Thirds, and compact cameras, plus interchangeable lenses including LEICA DG.&lt;/p&gt;
&lt;p&gt;Items include the model, firmware version, release date, category, and download-page link. Radar rules are included. Model filtering uses RSSHub&#39;s common parameters.&lt;/p&gt;
&lt;p&gt;Only the latest listed version per model is included. Historical releases and camera software updates are excluded; intermediate releases may be missed between feed refreshes.&lt;/p&gt;
&lt;p&gt;Validation: focused type-aware lint and formatting checks passed. Live route behavior, source date/time-zone semantics, and anti-bot behavior have not yet been verified. No dependencies or browser automation added.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23588</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23588</guid><pubDate>Thu, 15 Oct 2026 17:23:26 GMT</pubDate><author>fdkevin0</author></item><item><title>feat(route): add nixpkgs-update package result feeds</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/nix-community/update-logs/crush
/nix-community/update-logs/changedetection-io
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows Script Standard / 跟随路由规范&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有，是否有对应措施？&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Date and time / 日期和时间
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Summarizes 20 daily logs with update/build outcomes and source links. PR evidence is log-only, not merge status.&lt;/li&gt;
&lt;li&gt;UTC dates; stable GUIDs may not re-notify. Concurrency 3; 600s cache. JSX, bilingual docs, Radar.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Test logs (excerpts)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-console&quot;&gt;$ pnpm typecheck
&amp;gt; tsc --noEmit
$ pnpm exec oxlint --type-aware lib/routes/nix-community
$ pnpm exec oxfmt --check lib/routes/nix-community
All matched files use the correct format.
$ FULL_ROUTES_TEST=true pnpm vitest run lib/app.test.ts -t &#39;/nix-community/update-logs/:pkg&#39;
Test Files  1 passed (1)
Tests  1 passed | 3888 skipped (3889)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Local server:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;python3 - &amp;lt;&amp;lt;&#39;PY&#39;
import urllib.request as u
import xml.etree.ElementTree as E
for pkg in (&#39;crush&#39;, &#39;changedetection-io&#39;):
    for fmt in (&#39;rss&#39;, &#39;atom&#39;):
        with u.urlopen(f&#39;http://127.0.0.1:1200/nix-community/update-logs/{pkg}?format={fmt}&#39;, timeout=60) as r:
            root = E.fromstring(r.read())
            path = &#39;./channel/item&#39; if fmt == &#39;rss&#39; else &#39;{http://www.w3.org/2005/Atom}entry&#39;
            count = len(root.findall(path))
            assert r.status == 200 and count == 20
            print(pkg, fmt, r.status, count)
PY
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;crush rss 200 20
crush atom 200 20
changedetection-io rss 200 20
changedetection-io atom 200 20
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;58 temporary checks passed; no route tests added. Full suite not run; two extra cache tests failed without Redis. AI-assisted; submitter tested manually.&lt;/p&gt;
&lt;p&gt;💘 Generated with Crush&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23548</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23548</guid><pubDate>Sun, 11 Oct 2026 08:54:19 GMT</pubDate><author>DaVinci42</author></item><item><title>fix(telegram): group album messages into single feed items in mtproto</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/telegram/channel/awesomeRSSHub
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[ ] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;In Telegram MTProto, albums (media groups) are delivered as multiple contiguous &lt;code&gt;Message&lt;/code&gt; objects sharing the same &lt;code&gt;groupedId&lt;/code&gt; (64-bit integer), where the text caption and forward/story info are typically attached to only one of the messages.&lt;/p&gt;
&lt;p&gt;Previously, &lt;code&gt;tglib/channel.ts&lt;/code&gt; attempted to buffer media using an ad-hoc &lt;code&gt;text === &#39;&#39;&lt;/code&gt; heuristic:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Broken on forwarded albums&lt;/strong&gt;: when a message is forwarded, &lt;code&gt;message.fwdFrom&lt;/code&gt; prepends &lt;code&gt;Forwarded From: ...: &lt;/code&gt; to every message, making &lt;code&gt;text&lt;/code&gt; non-empty for all messages. Consequently, each photo in the album was emitted as a separate feed item with a fallback UTC date title (e.g. &lt;code&gt;Fri, 09 Oct 2026 07:09:24 GMT&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Broken caption placement&lt;/strong&gt;: if the caption was attached to the first message in the album, the first message was emitted immediately with only 1 photo, and remaining photos were orphaned or merged into the subsequent unrelated post.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reversed order&lt;/strong&gt;: messages from Telegram MTProto arrive in reverse chronological order (descending ID). Without sorting, media in the album was displayed backwards.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This PR addresses the issue according to Telegram&#39;s native protocol:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contiguous messages sharing &lt;code&gt;message.groupedId&lt;/code&gt; are grouped together. Standalone messages (&lt;code&gt;groupedId == null&lt;/code&gt;) are treated as single items.&lt;/li&gt;
&lt;li&gt;Album messages are sorted ascending by &lt;code&gt;id&lt;/code&gt; so photos and media appear in their original intended sequence.&lt;/li&gt;
&lt;li&gt;All media items across the album are aggregated into a single &lt;code&gt;description&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Text caption, forward attribution (&lt;code&gt;fromName&lt;/code&gt; / &lt;code&gt;fwdFrom&lt;/code&gt;), and story peer are resolved and rendered once per album.&lt;/li&gt;
&lt;li&gt;Canonical &lt;code&gt;link&lt;/code&gt; and &lt;code&gt;guid&lt;/code&gt; are set to &lt;code&gt;https://t.me/${username}/${primaryMsg.id}&lt;/code&gt; (matching the first post ID of the album, consistent with Telegram web preview format).&lt;/li&gt;
&lt;/ul&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23537</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23537</guid><pubDate>Fri, 09 Oct 2026 14:57:45 GMT</pubDate><author>petrouv</author></item><item><title>feat(route): add Oaktree Capital insights</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;No related issue.&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/oaktree/insights
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Adds &lt;code&gt;/oaktree/insights&lt;/code&gt; for &lt;a href=&quot;https://www.oaktreecapital.com/insights&quot;&gt;Oaktree Capital Insights&lt;/a&gt; - Howard Marks memos, market commentary, education and press mentions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The full insights list is embedded in the page as JSON (no pagination), so the route parses it directly; the latest 30 entries are returned by default and the common &lt;code&gt;limit&lt;/code&gt; parameter can be used for more.&lt;/li&gt;
&lt;li&gt;Full text is fetched from each internal insight detail page and cached per link with &lt;code&gt;cache.tryGet&lt;/code&gt;; press mentions link to external websites.&lt;/li&gt;
&lt;li&gt;Items are categorised by content type (&lt;code&gt;memos&lt;/code&gt;, &lt;code&gt;press&lt;/code&gt;, &lt;code&gt;Market Commentary&lt;/code&gt;, &lt;code&gt;Education&lt;/code&gt;) and media type (&lt;code&gt;article&lt;/code&gt;, &lt;code&gt;audio&lt;/code&gt;, &lt;code&gt;video&lt;/code&gt;), so both can be filtered with common parameters, e.g. &lt;code&gt;?filter_category=audio&lt;/code&gt; or &lt;code&gt;?filterout_category=audio|video&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23528</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23528</guid><pubDate>Fri, 09 Oct 2026 02:59:03 GMT</pubDate><author>argsno</author></item><item><title>fix(telegram): handle unresolvable forwarded channels and story peers</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/telegram/channel/awesomeRSSHub
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[ ] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;When a Telegram message forwards from a private channel or supergroup that the current session has not joined, &lt;code&gt;client.getEntity(message.fwdFrom.fromId)&lt;/code&gt; throws &lt;code&gt;ChannelPrivateError: You haven&#39;t joined this channel/supergroup. (caused by channels.GetChannels)&lt;/code&gt;. Similarly, if a story peer cannot be resolved, &lt;code&gt;client.getEntity(message.media.peer)&lt;/code&gt; can throw an error.&lt;/p&gt;
&lt;p&gt;Uncaught exceptions in these lookups cause the entire channel route handler to crash with HTTP 503 (&quot;Internal server error&quot;), failing to render the feed even though the main channel messages were successfully retrieved.&lt;/p&gt;
&lt;p&gt;This PR wraps both entity resolutions in &lt;code&gt;try ... catch&lt;/code&gt; blocks so that unresolvable forward sources and stories are gracefully skipped while the rest of the feed and messages render normally.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23525</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23525</guid><pubDate>Thu, 08 Oct 2026 13:33:38 GMT</pubDate><author>petrouv</author></item><item><title>fix(route/guancha): fetch full text only for paginated articles and update list APIs</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/guancha
/guancha/all
/guancha/review
/guancha/story
/guancha/fengwen
/guancha/redian
/guancha/gundong
/guancha/home
/guancha/others
/guancha/headline
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[ ] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;h3&gt;Problem&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;guancha.cn&lt;/code&gt; only serves the &lt;code&gt;_s.shtml&lt;/code&gt; variant (the article body on a single page) for &lt;strong&gt;multi-page&lt;/strong&gt; articles. Single-page articles have no such variant, and requesting it &lt;strong&gt;302-redirects to the homepage&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Both routes rewrote every link to &lt;code&gt;_s.shtml&lt;/code&gt; unconditionally, so for single-page articles the detail request landed on the homepage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;headline.ts&lt;/code&gt;: &lt;code&gt;item.description! += content(&#39;.all-txt&#39;).html()!&lt;/code&gt; appended the literal string &lt;strong&gt;&lt;code&gt;null&lt;/code&gt;&lt;/strong&gt; to the description.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;index.ts&lt;/code&gt;: the description came out &lt;code&gt;null&lt;/code&gt;/empty.&lt;/li&gt;
&lt;li&gt;The item &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; of those articles also pointed at a URL that redirects to the homepage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Measured on one &lt;code&gt;/guancha/headline&lt;/code&gt; response (20 items):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;article&lt;/th&gt;
&lt;th&gt;items&lt;/th&gt;
&lt;th&gt;&lt;code&gt;_s.shtml&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;body&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;paginated (&lt;code&gt;.module-page&lt;/code&gt; present)&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;single page (&lt;code&gt;.module-page&lt;/code&gt; absent)&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;302 → &lt;code&gt;www.guancha.cn&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;missing / literal &lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The correlation is 100%.&lt;/p&gt;
&lt;h3&gt;Why not just drop the &lt;code&gt;_s.shtml&lt;/code&gt; rewrite&lt;/h3&gt;
&lt;p&gt;Because that would be a regression. For paginated articles &lt;code&gt;_s.shtml&lt;/code&gt; really is the &lt;strong&gt;full&lt;/strong&gt; text, while the plain URL returns only page 1 — e.g. for one article the plain page yields 1232 chars of text vs 7401 chars for &lt;code&gt;_s.shtml&lt;/code&gt;, and the plain page body is a &lt;strong&gt;prefix&lt;/strong&gt; of the &lt;code&gt;_s&lt;/code&gt; one. Removing the rewrite would silently truncate every multi-page article to its first page.&lt;/p&gt;
&lt;h3&gt;What this PR does&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Keeps the original link, which also fixes &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; for every article.&lt;/li&gt;
&lt;li&gt;Reads the body from the current page first, and &lt;strong&gt;only when the article is actually paginated&lt;/strong&gt; fetches the &lt;code&gt;_s.shtml&lt;/code&gt; full text and prefers it. The pagination container &lt;code&gt;.module-page&lt;/code&gt; is a reliable signal — measured 1 occurrence for paginated articles and 0 for single-page ones.&lt;/li&gt;
&lt;li&gt;Only assigns the body when it was really retrieved, so the literal &lt;code&gt;null&lt;/code&gt; is gone.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Second fix: the two list endpoints changed upstream&lt;/h3&gt;
&lt;p&gt;While verifying the routes above I found five of them were already broken on
&lt;code&gt;master&lt;/code&gt;, independently of this PR:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/api/redian.htm&lt;/code&gt; still responds, but the JSON keys became lowercase
(&lt;code&gt;title&lt;/code&gt;/&lt;code&gt;httpUrl&lt;/code&gt;). Reading &lt;code&gt;TITLE&lt;/code&gt;/&lt;code&gt;HTTP_URL&lt;/code&gt; produced
&lt;code&gt;https://www.guancha.cnundefined&lt;/code&gt; for every item link.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/api/gundong.htm&lt;/code&gt; now returns &lt;strong&gt;404&lt;/strong&gt;. The rolling-news list moved to
&lt;code&gt;/api/gundong&lt;/code&gt;, with the same lowercase keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That broke &lt;code&gt;/guancha&lt;/code&gt;, &lt;code&gt;/guancha/all&lt;/code&gt;, &lt;code&gt;/guancha/redian&lt;/code&gt;, &lt;code&gt;/guancha/gundong&lt;/code&gt;
and &lt;code&gt;/guancha/others&lt;/code&gt; — i.e. every route that reads the two lists.&lt;/p&gt;
&lt;p&gt;The second commit extracts a single &lt;code&gt;fetchApiList()&lt;/code&gt; helper shared by both
lists, points the rolling-news request at &lt;code&gt;/api/gundong&lt;/code&gt;, and reads
&lt;code&gt;item.title ?? item.TITLE&lt;/code&gt; / &lt;code&gt;item.httpUrl ?? item.HTTP_URL&lt;/code&gt;, so the routes
survive the keys being renamed back.&lt;/p&gt;
&lt;p&gt;Verified against the live site: both endpoints return 200 and all 18 items
across them resolve to article pages that respond 200 with &lt;code&gt;.all-txt&lt;/code&gt;
present.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23503</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23503</guid><pubDate>Wed, 07 Oct 2026 03:07:05 GMT</pubDate><author>flareskyqq</author></item><item><title>feat(route/hotukdeals): add tag route</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/hotukdeals/tag/flight
/hotukdeals/tag/flight/new
/hotukdeals/tag/flight/temp
/hotukdeals/tag/flight/highest_price
/hotukdeals/tag/flight/lowest_price
/hotukdeals/tag/flight/discussion
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随
&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Adds a generic tag feed for hotukdeals, e.g. &lt;a href=&quot;https://www.hotukdeals.com/tag/flight&quot;&gt;https://www.hotukdeals.com/tag/flight&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The tag listing is fetched with a plain HTTP request. Each deal card has its thread data (title, slug, type, &lt;code&gt;publishedAt&lt;/code&gt;, author, merchant, image)
embedded as JSON in its &lt;code&gt;data-vue3&lt;/code&gt; attribute, so no browser is needed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sort&lt;/code&gt; maps to the site&#39;s &lt;code&gt;sortBy&lt;/code&gt; query and defaults to &lt;code&gt;new&lt;/code&gt; (most recent), which suits a feed better than the site&#39;s default &quot;hottest&quot; order.&lt;/li&gt;
&lt;li&gt;The listing only contains a truncated snippet, so the full description (&lt;code&gt;threadDetails.preparedHtmlDescription&lt;/code&gt;) and categories (&lt;code&gt;groups&lt;/code&gt;) are read
from each deal page&#39;s &lt;code&gt;__INITIAL_STATE__&lt;/code&gt; via &lt;code&gt;evaluateScriptData&lt;/code&gt;, with results cached through &lt;code&gt;cache.tryGet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pubDate&lt;/code&gt; is parsed from the Unix timestamp &lt;code&gt;publishedAt&lt;/code&gt;, so no time zone conversion is needed.&lt;/li&gt;
&lt;li&gt;Unknown tags redirect to &lt;code&gt;/tag&lt;/code&gt; on the site; the route detects this and throws a clear error instead of returning an empty feed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;antiCrawler: true&lt;/code&gt; is kept for consistency with the existing hotukdeals routes. No blocking was observed during testing.&lt;/li&gt;
&lt;/ul&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23492</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23492</guid><pubDate>Tue, 06 Oct 2026 03:42:28 GMT</pubDate><author>zhgqthomas</author></item><item><title>feat(konek): add Deep Web Konek newest posts</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;None.&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/konek/newest
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows Script Standard / 跟随路由规范&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Date and time / 日期和时间
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] Puppeteer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Adds /konek/newest for Deep Web Konek, an independent cybersecurity news and research publication. Fetches up to 100 published posts from the public HN+ /contents endpoint used by the site&#39;s Vue frontend, including full article text, authors, UTC publication dates, categories and tags. Includes a Radar rule and stable GUIDs based on post IDs. No authentication or new dependencies are required.&lt;/p&gt;
&lt;p&gt;Validation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Formatting check and type-aware oxlint passed for both route files.&lt;/li&gt;
&lt;li&gt;Executed the final handler against the live API: 100 unique posts with full descriptions and valid publication dates.&lt;/li&gt;
&lt;li&gt;Local RSSHub endpoint returned HTTP 200 and valid XML with 100 items. The common parameter limit=3 returned 3 items.&lt;/li&gt;
&lt;/ul&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23470</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23470</guid><pubDate>Mon, 05 Oct 2026 04:21:46 GMT</pubDate><author>TungHaHuy</author></item><item><title>feat(route): add Game Wisdom full-text articles</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/game-wisdom
/game-wisdom/analysis
/game-wisdom/critical
/game-wisdom/general
/game-wisdom/guest
/game-wisdom/podcast
/game-wisdom/series
/game-wisdom/spotlight
/game-wisdom/videos
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[x] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Game Wisdom&#39;s official feeds only include excerpts. This route reads the first page of the official site or category feed and adds the full article body from each article page. The site has no public posts API (only oEmbed is exposed under &lt;code&gt;/wp-json/&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The site&#39;s robots.txt sets &lt;code&gt;Crawl-delay: 30&lt;/code&gt;. The route fetches article pages with a concurrency of 2 and caches each processed article. If an article page cannot be fetched or parsed, that item falls back to the official excerpt without caching it.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23468</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23468</guid><pubDate>Sun, 04 Oct 2026 10:45:52 GMT</pubDate><author>mcdp-adk</author></item><item><title>feat(route): add 台湾小说网 (xsw)</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/xsw/17301350
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 无&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确 (站点为东八区, 使用 &lt;code&gt;timezone(..., 8)&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;站点 HTTPS 证书链不完整, 使用 http 直连。&lt;/li&gt;
&lt;li&gt;页面 meta 谎报 big5, 实际为 UTF-8, 使用 ofetch 默认解码。&lt;/li&gt;
&lt;li&gt;全书无逐章时间戳, pubDate 统一取书页「更新:」时间 (东八区)。&lt;/li&gt;
&lt;li&gt;书页内嵌最新 10 条目录, 完整目录需翻页; 本路由提供嵌入式预览条目。&lt;/li&gt;
&lt;/ul&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23435</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23435</guid><pubDate>Tue, 29 Sep 2026 09:40:24 GMT</pubDate><author>xbpk3t</author></item><item><title>feat(route/cumst): add posts and DMs feeds</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/onlyheaven/posts
/onlyheaven/dms
/onlyheaven/onlyfans/16786030
/onlyheaven/onlyfans/16786030/dms
/onlyheaven/fansly/365078231763660800
/onlyheaven/fansly/365078231763660800/dms
/onlyheaven/patreon/4407214
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows Script Standard / 跟随路由规范&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Date and time / 日期和时间
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Adds OnlyHeaven (&lt;a href=&quot;http://cum.st/&quot;&gt;cum.st&lt;/a&gt;) feeds for recent posts and DMs across creators and for individual OnlyFans, Fansly, and Patreon creators. Entries link to their source pages and include available images from unlocked attachments.&lt;/p&gt;
&lt;p&gt;Route generation, lint, formatting, typecheck, and 23 offline route and registry tests passed.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23399</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23399</guid><pubDate>Sat, 26 Sep 2026 14:31:11 GMT</pubDate><author>gekangen</author></item><item><title>fix(douban): use configured cookie for group route</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;NOROUTE
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[ ] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[x] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;This fixes the existing Douban group route; it does not add a new route, package, or Puppeteer dependency.&lt;/p&gt;
&lt;p&gt;The automated route runner cannot exercise this configuration-dependent fix because it does not have a &lt;code&gt;DOUBAN_COOKIE&lt;/code&gt;; Douban returns HTTP 403 to the runner without one. The route was therefore marked &lt;code&gt;NOROUTE&lt;/code&gt; for the online route check and verified separately with &lt;code&gt;DOUBAN_COOKIE&lt;/code&gt; configured.&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Send the configured &lt;code&gt;DOUBAN_COOKIE&lt;/code&gt; when fetching a Douban group listing.&lt;/li&gt;
&lt;li&gt;Send the same cookie when fetching individual group topic pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without the cookie, Douban can redirect these requests to its security verification page even when the instance operator has configured &lt;code&gt;DOUBAN_COOKIE&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Verification&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Built the Chromium-bundled Docker image successfully on Linux/ARM64.&lt;/li&gt;
&lt;li&gt;Verified &lt;code&gt;/douban/group/705363&lt;/code&gt; returns HTTP 200 and a valid RSS feed with &lt;code&gt;DOUBAN_COOKIE&lt;/code&gt; configured.&lt;/li&gt;
&lt;li&gt;Verified the existing Bilibili user-video route still returns HTTP 200.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git diff --check&lt;/code&gt; passes.&lt;/li&gt;
&lt;/ul&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23277</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23277</guid><pubDate>Sun, 13 Sep 2026 03:34:37 GMT</pubDate><author>tianalei</author></item><item><title>feat(route): add iandaily daily digest</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/iandaily
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dynamically discovers the site&#39;s hashed application bundle instead of hardcoding an asset URL.&lt;/li&gt;
&lt;li&gt;Extracts the static &lt;code&gt;JSON.parse&lt;/code&gt; payload with Acorn without executing remote JavaScript.&lt;/li&gt;
&lt;li&gt;Emits one item per daily edition, including its overview, highlights, columns, and original links.&lt;/li&gt;
&lt;li&gt;The source exposes calendar dates only, so the route parses them without inventing a publication time.&lt;/li&gt;
&lt;li&gt;Verified with formatting, type checking, route/Worker builds, a mocked five-edition route test, the complete workerd suite, and a live request to &lt;code&gt;/iandaily&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23256</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23256</guid><pubDate>Thu, 10 Sep 2026 07:30:22 GMT</pubDate><author>DeyunMa</author></item><item><title>feat(route/hackernews): filter stories by minimum comment count</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Replaces #23216.&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/hackernews
/hackernews/index/sources/10
/hackernews/best/sources/10
/hackernews/newest
/hackernews/index/comments/10?limit=1
/hackernews/over/sources/100/10
/hackernews/submitted/sources/dang/1
/hackernews/item/sources/8863
/hackernews/threads/comments_list/dang
/hackernews/jobs
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[ ] Follows [&lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt;](&lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;https://docs.rsshub.app/joinus/advanced/script-standard&lt;/a&gt;) / 跟随 [&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;](&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;https://docs.rsshub.app/zh/joinus/advanced/script-standard&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] [&lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt;](&lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;https://docs.rsshub.app/joinus/advanced/pub-date&lt;/a&gt;) / [&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;](&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;https://docs.rsshub.app/zh/joinus/advanced/pub-date&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Add minimum-comment filtering before the common limit, preserving existing ID parameters, GUIDs and empty-feed checks. Normalize comment counts independently of GUID construction and separate caches by output format. Move tests outside route sources to fix the Docker build failure in #23216, with type-checking and CI coverage.&lt;/p&gt;
&lt;p&gt;Before rebasing, 427 tests (including 24 Hacker News tests), 14 workerd tests, type checking, targeted lint/format checks, Docker build and startup checks passed. Local code review completed without unresolved actionable findings. Git range-diff confirms the patch is unchanged after rebasing; the new HEAD has not been revalidated.&lt;/p&gt;
&lt;p&gt;HN may return HTTP 429; this change adds no new anti-bot or rate-limit handling. High thresholds can yield empty feeds. These 10 examples sample distinct parameter and output behaviors to reduce live HN requests; full-comment output uses limit=1.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23218</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23218</guid><pubDate>Sun, 06 Sep 2026 16:51:36 GMT</pubDate><author>PeterDaveHello</author></item><item><title>feat(route): add CPP（无差别同人站） route</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;!--
Please include route starts with /, with all required and optional parameters.
Fail to comply will result in your pull request being closed automatically.
请在 `routes` 区域填写以 / 开头的完整路由地址，否则你的 PR 将会被无条件关闭。
如果路由包含在文档中列出可以完全穷举的参数（例如分类），请依次全部列出。

```routes
/some/route
/some/other/route
/dont/use/this/or/modify/it
/use/the/fenced/code/block/below
```

If your changes are not related to route, please fill in `routes` section with `NOROUTE`. Fail to comply will result in your PR being closed.
如果你的 PR 与路由无关, 请在 `routes` 区域 填写 `NOROUTE`，而不是直接删除 `routes` 区域。否则你的 PR 将会被无条件关闭。
--&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/cpp/event
/cpp/event/310100
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23215</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23215</guid><pubDate>Sun, 06 Sep 2026 01:55:00 GMT</pubDate><author>marcosteam</author></item><item><title>feat(route/gq/tw): add GQ Taiwan category and subcategory feeds</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;This adds a feed that supports category filtering, which the official feed doesn&#39;t support.&lt;/p&gt;
&lt;p&gt;Continues from #20183. The last requested changes should be fixed.&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;!--
Please include route starts with /, with all required and optional parameters.
Fail to comply will result in your pull request being closed automatically.
请在 `routes` 区域填写以 / 开头的完整路由地址，否则你的 PR 将会被无条件关闭。
如果路由包含在文档中列出可以完全穷举的参数（例如分类），请依次全部列出。

```routes
/some/route
/some/other/route
/dont/use/this/or/modify/it
/use/the/fenced/code/block/below
```

If your changes are not related to route, please fill in `routes` section with `NOROUTE`. Fail to comply will result in your PR being closed.
如果你的 PR 与路由无关, 请在 `routes` 区域 填写 `NOROUTE`，而不是直接删除 `routes` 区域。否则你的 PR 将会被无条件关闭。
--&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/gq/tw/entertainment
/gq/tw/life/outdoor
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23189</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23189</guid><pubDate>Wed, 02 Sep 2026 15:39:17 GMT</pubDate><author>johan456789</author></item><item><title>fix(router/twitter): lock tokens temporarily on 401/403 instead of permanent removal</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&amp;lt;ISSUE_NUMBER&amp;gt;&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;NOROUTE
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由&lt;/li&gt;
&lt;li&gt;[ ] Follows [&lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt;](&lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;https://docs.rsshub.app/joinus/advanced/script-standard&lt;/a&gt;) / 跟随 [&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;](&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;https://docs.rsshub.app/zh/joinus/advanced/script-standard&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制&lt;/li&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;li&gt;[ ] [&lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt;](&lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;https://docs.rsshub.app/joinus/advanced/pub-date&lt;/a&gt;) / [&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;](&lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;https://docs.rsshub.app/zh/joinus/advanced/pub-date&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Behavior hardening for the 401/403 path in &lt;code&gt;twitterGot()&lt;/code&gt;
(&lt;code&gt;lib/routes/twitter/api/web-api/utils.ts&lt;/code&gt;), building on #&amp;lt;PR1_NUMBER&amp;gt;.&lt;/p&gt;
&lt;h3&gt;Problem&lt;/h3&gt;
&lt;p&gt;On 401/403 the current code does&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;config.twitter.authToken?.splice(tokenIndex, 1);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which removes the token from the in-memory array &lt;strong&gt;irreversibly&lt;/strong&gt; (until process
restart) — even for a transient error. With a single-token deployment, one transient
401/403 permanently disables authenticated access. This is also the first half of the
silent guest-degradation chain fixed in #&amp;lt;PR1_NUMBER&amp;gt;.&lt;/p&gt;
&lt;h3&gt;Changes&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;splice()&lt;/code&gt; → existing time-based lock (3600s)&lt;/strong&gt; on 401/403, consistent with the
429/rate-limit path. Transient auth errors lock the token temporarily instead of
deleting it permanently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defensive check in &lt;code&gt;twitterGot&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;auth &amp;amp;&amp;amp; !auth.token&lt;/code&gt; now throws
&lt;code&gt;ConfigNotFoundError&lt;/code&gt;, guaranteeing a guest cookie jar can never be cached under
the literal key &lt;code&gt;twitter:cookie:undefined&lt;/code&gt;, even if &lt;code&gt;getAuth&lt;/code&gt; changes in the future.&lt;/li&gt;
&lt;li&gt;Removed the dead commented-out re-login fallback code in this block (the
username/password fields it references are already commented out in &lt;code&gt;getAuth&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Design notes (per discussion with @dosu in #&amp;lt;ISSUE_NUMBER&amp;gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Failure still surfaces&lt;/strong&gt;: once every token is locked, &lt;code&gt;getAuth(30)&lt;/code&gt; exhausts its
retries (~30s worst case) and returns &lt;code&gt;undefined&lt;/code&gt;, so &lt;code&gt;twitterGot&lt;/code&gt; throws
&lt;code&gt;ConfigNotFoundError&lt;/code&gt; instead of looping forever — the failure is no longer silent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recovery&lt;/strong&gt;: a locked token is retried after the 3600s lock expires. If maintainers
prefer a different duration now that the lock is the sole recovery mechanism (vs a
backstop before permanent removal), happy to adjust — e.g. escalate the TTL on
repeated 401/403 for the same token.&lt;/li&gt;
&lt;li&gt;Multi-token pools keep rotating through unlocked tokens while one is locked.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Related&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Issue: #&amp;lt;ISSUE_NUMBER&amp;gt;&lt;/li&gt;
&lt;li&gt;Depends on #&amp;lt;PR1_NUMBER&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;
---

## 给 @dosu 的 issue 回复（确认拆分方案）

```markdown
Thanks @dosu — agreed on splitting, that&#39;s cleaner for review and bisecting. Plan:

**PR 1** (minimal, obviously correct): the `!config.twitter.authToken?.length` guard
alone.

**PR 2** (behavior change): `splice()` → temporary lock on 401/403 + the
`auth &amp;amp;&amp;amp; !auth.token` defensive check.

On your design question: keeping the 3600s lock for now, and I believe the
&quot;eventually surface the failure&quot; requirement is already satisfied without extra code —
once all tokens are locked, `getAuth(30)` exhausts its retries (each retry sleeps
500–1000ms and moves to the next index) and returns `undefined`, so `twitterGot`
throws `ConfigNotFoundError` after ~30s worst case rather than looping forever. The
failure stops being silent either way.

The remaining judgment call is the lock TTL: with `splice()` gone, 3600s becomes the
sole recovery mechanism, so a permanently revoked token would retry hourly forever
(though each retry only costs one failed request, and the failure is now logged and
surfaced). If maintainers prefer, I can escalate the TTL on repeated 401/403 for the
same token instead of a fixed 3600s — will leave that open for review.

Opening the PRs now.&lt;/code&gt;&lt;/pre&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23166</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23166</guid><pubDate>Mon, 31 Aug 2026 14:57:23 GMT</pubDate><author>cloneselfish-wq</author></item><item><title>feat(route/nytimes): add Wirecutter</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;N/A&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/nytimes/wirecutter
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[x] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Why.&lt;/strong&gt; Wirecutter has an official feed at &lt;code&gt;nytimes.com/wirecutter/feed/&lt;/code&gt;, but it only carries the opening few paragraphs and stops before any of the actual picks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How.&lt;/strong&gt; The feed supplies the item list. Each post is then rendered from &lt;code&gt;props.pageProps.post&lt;/code&gt; in the page&#39;s &lt;code&gt;__NEXT_DATA__&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the hero image, then the opening paragraphs (&lt;code&gt;structuredLede&lt;/code&gt;), then each chapter under its title as a heading&lt;/li&gt;
&lt;li&gt;node trees come in two formats, a DOM-shaped one (&lt;code&gt;type: &#39;tag&#39;&lt;/code&gt; with a &lt;code&gt;name&lt;/code&gt;) and a document one (the element is the &lt;code&gt;type&lt;/code&gt;, with &lt;code&gt;marks&lt;/code&gt; for formatting), and both go through a tag/attribute allowlist that drops layout classes and &lt;code&gt;data-gtm-*&lt;/code&gt; tracking attributes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shortcode-callout&lt;/code&gt; / &lt;code&gt;product_callout&lt;/code&gt; (the picks) render as the ribbon, product name, photo, verdict and description; &lt;code&gt;shortcode-gallery&lt;/code&gt;, &lt;code&gt;shortcode-caption&lt;/code&gt; and &lt;code&gt;scoop_image_block&lt;/code&gt; become figures; &lt;code&gt;shortcode-pullquote&lt;/code&gt; becomes a blockquote&lt;/li&gt;
&lt;li&gt;&lt;code&gt;adslot&lt;/code&gt;, &lt;code&gt;shortcode-recirc&lt;/code&gt; and &lt;code&gt;shortcode-scoop_form_callout&lt;/code&gt; are dropped as ads, in-house promos and a form, and &lt;code&gt;script&lt;/code&gt; / &lt;code&gt;style&lt;/code&gt; are dropped&lt;/li&gt;
&lt;li&gt;an unknown node keeps its content without its element, so a new block type never fails the item&lt;/li&gt;
&lt;li&gt;images drop the resizing query string so the original is served&lt;/li&gt;
&lt;li&gt;&lt;code&gt;category&lt;/code&gt; holds the section and subsection names, e.g. &lt;code&gt;Electronics&lt;/code&gt; and &lt;code&gt;Laptops&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Anti-bot.&lt;/strong&gt; The site sits behind DataDome. Articles are fetched two at a time with &lt;code&gt;p-map&lt;/code&gt; and 403s are not retried. When an article can&#39;t be fetched or parsed, the item falls back to the opening paragraphs from the feed&#39;s &lt;code&gt;content:encoded&lt;/code&gt;. That fallback happens outside &lt;code&gt;cache.tryGet&lt;/code&gt;, so it isn&#39;t cached and the article is tried again on the next run.&lt;/p&gt;
&lt;p&gt;🤖 Generated with &lt;a href=&quot;https://claude.com/claude-code&quot;&gt;Claude Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://claude.ai/code/session_017gmEyEJ8ufxFDtbwMCXNiL&quot;&gt;https://claude.ai/code/session_017gmEyEJ8ufxFDtbwMCXNiL&lt;/a&gt;&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23143</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23143</guid><pubDate>Sun, 30 Aug 2026 05:57:49 GMT</pubDate><author>IvanWng97</author></item><item><title>fix(route/xueqiu): avoid caching transient detail failures</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;NOROUTE&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/xueqiu/user/1505944393
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由&lt;/li&gt;
&lt;li&gt;[x] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[x] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Follow-up fix for the existing &lt;code&gt;/xueqiu/user/:id/:type?&lt;/code&gt; route after #22708.&lt;/p&gt;
&lt;p&gt;The route fetches each status detail through &lt;code&gt;statuses/show.json&lt;/code&gt; inside &lt;code&gt;cache.tryGet&lt;/code&gt;. The current implementation treats every response containing an &lt;code&gt;error_code&lt;/code&gt; as a permanent failure and returns the timeline fallback from inside the cache callback. Authentication or other transient business errors are therefore cached as incomplete items. HTTP 200 responses with an empty detail body are also cached. A single transient upstream failure can consequently leave only some items in the same feed without their details until the content cache expires.&lt;/p&gt;
&lt;p&gt;修复已有 &lt;code&gt;/xueqiu/user&lt;/code&gt; 路由在 #22708 后仍存在的详情缓存污染问题。当前实现将任意带 &lt;code&gt;error_code&lt;/code&gt; 的响应都视为永久失败，并在 &lt;code&gt;cache.tryGet&lt;/code&gt; 回调内返回列表摘要，因此鉴权等瞬态业务错误也会被缓存；HTTP 200 但详情正文为空时同样会缓存空详情。这会让同一 feed 中部分 item 长期缺少详情。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes / 改动&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache the timeline fallback only for the explicitly known permanent error &lt;code&gt;20210&lt;/code&gt;; authentication, WAF, rate-limit, network, unknown business errors, and empty HTTP 200 details fall back for the current feed without entering the detail cache. / 仅明确的永久错误 &lt;code&gt;20210&lt;/code&gt; 缓存摘要；鉴权、WAF、限流、网络、未知业务错误和 HTTP 200 空详情仅在当次 feed 回退，不写详情缓存。&lt;/li&gt;
&lt;li&gt;Validate the assembled detail after including text, images, and repost content, and use &lt;code&gt;detail.description&lt;/code&gt; when &lt;code&gt;detail.text&lt;/code&gt; is empty. / 组合文字、图片和转发内容后再校验详情，并在 &lt;code&gt;detail.text&lt;/code&gt; 为空时使用 &lt;code&gt;detail.description&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;item.text || item.description&lt;/code&gt; for the timeline fallback and keep the item even when both are empty. / 摘要回退优先使用 &lt;code&gt;item.text&lt;/code&gt;，其次使用 &lt;code&gt;item.description&lt;/code&gt;；二者为空时仍保留 item。&lt;/li&gt;
&lt;li&gt;Disable automatic retries for &lt;code&gt;show.json&lt;/code&gt; so an HTTP 400 is not amplified into three requests, while retaining the existing per-handler concurrency of 3. / 对 &lt;code&gt;show.json&lt;/code&gt; 设置 &lt;code&gt;retry: 0&lt;/code&gt;，避免一次 HTTP 400 放大为三次请求，同时保留现有单 handler 并发 3。&lt;/li&gt;
&lt;li&gt;Add debug diagnostics with the item id, target, HTTP status, business error code, and failure classification, without logging cookies or content. / 增加 debug 诊断日志，只记录 item id、target、HTTP 状态、业务错误码和失败分类，不记录 Cookie 或正文。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The existing cache key is intentionally unchanged, so this PR prevents new transient failures from being cached but does not migrate previously cached incomplete items.&lt;/p&gt;
&lt;p&gt;Local cold-cache validation for &lt;code&gt;/xueqiu/user/1505944393&lt;/code&gt; completed twice: both requests returned HTTP 200 with 20 items and 0 empty descriptions in 6.97 s and 6.36 s respectively. Type checking, linting, formatting, and route generation pass.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23129</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23129</guid><pubDate>Sat, 29 Aug 2026 11:36:04 GMT</pubDate><author>sirius60111</author></item><item><title>fix(route/anthropic): locate research publications anywhere in flight data</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;p&gt;Same symptom as the previously fixed #21581 (&lt;code&gt;Error: this route is empty&lt;/code&gt;), but a different cause — the page layout changed again.&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/anthropic/research
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/anthropic/research&lt;/code&gt; currently fails with &lt;code&gt;Error: this route is empty&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The route reads the publication list out of the Next.js flight payload at the fixed path &lt;code&gt;item.page.sections&lt;/code&gt;. &lt;code&gt;www.anthropic.com/research&lt;/code&gt; now nests that section deeper inside the React element tree, so &lt;code&gt;.flatMap((item) =&amp;gt; item?.page?.sections ?? [])&lt;/code&gt; resolves to an empty array, no &lt;code&gt;Publications&lt;/code&gt; section is found, and the route returns no items.&lt;/p&gt;
&lt;p&gt;This PR walks the parsed flight payload and picks up the &lt;code&gt;Publications&lt;/code&gt; section wherever it sits, instead of relying on one fixed path. Posts are deduplicated by slug in case the section is embedded more than once (server payload + client hydration).&lt;/p&gt;
&lt;p&gt;Verified against the live page on &lt;code&gt;pnpm dev&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/anthropic/research&lt;/code&gt; → 20 items (the route&#39;s default limit), previously 0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/anthropic/research?limit=3&lt;/code&gt; → 3 items, &lt;code&gt;limit&lt;/code&gt; still honored (as added in #23075)&lt;/li&gt;
&lt;li&gt;titles, links, &lt;code&gt;pubDate&lt;/code&gt; and full article bodies all populate correctly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not switching to DOM parsing like the sibling &lt;code&gt;/anthropic/news&lt;/code&gt; route: the research page only server-renders ~10 publications before the &quot;See more&quot; button, which would silently cut the route&#39;s default of 20.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23119</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23119</guid><pubDate>Thu, 27 Aug 2026 11:25:11 GMT</pubDate><author>naplesblue</author></item><item><title>feat(route): add zjnu</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;!--
Please include route starts with /, with all required and optional parameters.
Fail to comply will result in your pull request being closed automatically.
请在 `routes` 区域填写以 / 开头的完整路由地址，否则你的 PR 将会被无条件关闭。
如果路由包含在文档中列出可以完全穷举的参数（例如分类），请依次全部列出。

```routes
/some/route
/some/other/route
/dont/use/this/or/modify/it
/use/the/fenced/code/block/below
```

If your changes are not related to route, please fill in `routes` section with `NOROUTE`. Fail to comply will result in your PR being closed.
如果你的 PR 与路由无关, 请在 `routes` 区域 填写 `NOROUTE`，而不是直接删除 `routes` 区域。否则你的 PR 将会被无条件关闭。
--&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/zjnu/news
/zjnu/academic
/zjnu/media
/zjnu/general
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[x] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[x] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Adds a route for &lt;a href=&quot;http://zjnu.edu.cn/&quot;&gt;zjnu.edu.cn&lt;/a&gt;&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/23038</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/23038</guid><pubDate>Sat, 15 Aug 2026 18:27:03 GMT</pubDate><author>gushen610140</author></item><item><title>feat(utils): add parse date range to extract start&amp;end date</title><description>&lt;h2&gt;Involved Issue / 该 PR 相关 Issue&lt;/h2&gt;
&lt;p&gt;Close #&lt;/p&gt;
&lt;h2&gt;Example for the Proposed Route(s) / 路由地址示例&lt;/h2&gt;
&lt;!--
Please include route starts with /, with all required and optional parameters.
Fail to comply will result in your pull request being closed automatically.
请在 `routes` 区域填写以 / 开头的完整路由地址，否则你的 PR 将会被无条件关闭。
如果路由包含在文档中列出可以完全穷举的参数（例如分类），请依次全部列出。

```routes
/some/route
/some/other/route
/dont/use/this/or/modify/it
/use/the/fenced/code/block/below
```

If your changes are not related to route, please fill in `routes` section with `NOROUTE`. Fail to comply will result in your PR being closed.
如果你的 PR 与路由无关, 请在 `routes` 区域 填写 `NOROUTE`，而不是直接删除 `routes` 区域。否则你的 PR 将会被无条件关闭。
--&gt;
&lt;pre&gt;&lt;code class=&quot;language-routes&quot;&gt;/shanghaimuseum/display/offline-exhibit
/chnmuseum/zl
/dpm/exhibitions
/chnmus/information/exhibition/special
/hebeimuseum/list/special
/sdmuseum/exhibitions
/sxhm/temporary
/njmuseum/exhibitionIndex/
/hnmuseum/current-exhibitions
/capitalmuseum/exhibition
/gdmuseum/exhibition
/3gmuseum/tempexhibition
/szmuseum/temporary
/tjbwg/exhibition
/chinasilkmuseum/zz
/grandcanalmuseum/linzhantezhan
/ahm/exhibition/xztj
/minhangmuseum/interim
/canalmuseum/lszl
/namoc/zhanlan
/wzbwg/zhanlan/specialexhibition
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;New RSS Route Checklist / 新 RSS 路由检查表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] New Route / 新的路由
&lt;ul&gt;
&lt;li&gt;[x] Follows &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/script-standard&quot;&gt;Script Standard&lt;/a&gt; / 跟随 &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/script-standard&quot;&gt;路由规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Anti-bot or rate limit / 反爬/频率限制
&lt;ul&gt;
&lt;li&gt;[ ] If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href=&quot;https://docs.rsshub.app/joinus/advanced/pub-date&quot;&gt;Date and time&lt;/a&gt; / &lt;a href=&quot;https://docs.rsshub.app/zh/joinus/advanced/pub-date&quot;&gt;日期和时间&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Parsed / 可以解析&lt;/li&gt;
&lt;li&gt;[ ] Correct time zone / 时区正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[ ] New package added / 添加了新的包&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;Puppeteer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note / 说明&lt;/h2&gt;
&lt;p&gt;Adds a new utility &lt;code&gt;lib/utils/parse-date-range.ts&lt;/code&gt; that extracts a &lt;strong&gt;start date&lt;/strong&gt; and &lt;strong&gt;end date&lt;/strong&gt; from free-form date range strings, returning both in &lt;code&gt;YYYY-MM-DD&lt;/code&gt; format, can support both CN&amp;amp;EN date range format.
This utility was originally written in the &lt;code&gt;chnmuseum&lt;/code&gt; route. It is now promoted to a standalone, well-tested helper so that other routes (e.g. museum, gallery, and exhibition feeds) can reuse it directly instead of reimplementing the same logic.&lt;/p&gt;
</description><link>https://github.com/DIYgod/RSSHub/pull/22905</link><guid isPermaLink="false">https://github.com/DIYgod/RSSHub/pull/22905</guid><pubDate>Sat, 01 Aug 2026 05:53:41 GMT</pubDate><author>magazian</author></item></channel></rss>