UNPKG

rsshub

Version:
721 lines (703 loc) 29 kB
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import { t as ViewType } from "./types-D84BRIt4.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import { t as art } from "./render-BQo6B4tL.mjs"; import path from "node:path"; import { load } from "cheerio"; //#region lib/routes/banshujiang/index.ts init_esm_shims(); const handler = async (ctx) => { const { category } = ctx.req.param(); const limit = Number.parseInt(ctx.req.query("limit") ?? "20", 10); const baseUrl = "http://banshujiang.cn"; const targetUrl = new URL(`${category ? "e_books" : `category/${category}`}/page/1`, baseUrl).href; const $ = load(await ofetch_default(targetUrl)); const language = $("html").attr("lang") ?? "zh"; let items = []; items = $("ul.small-list li.row").slice(0, limit).toArray().map((el) => { const $el = $(el); const $aEl = $el.find("span.book-property__title").first().next("a"); const title$1 = $aEl.text().trim(); const image = $el.find("meta[property=\"og:image\"]").attr("content") ?? $el.find("img").attr("src"); const description = art(path.join(__dirname, "templates/description-16be3a2a.art"), { images: image ? [{ src: image, alt: title$1 }] : void 0, description: $el.find("div.small-list__item-desc").html() }); const pubDateStr = image?.split(/\?timestamp=/).pop(); const linkUrl = $aEl.attr("href"); const categoryEls = $el.find("span.book-property__title").toArray(); const categories = [...new Set(categoryEls.map((el$1) => $(el$1).next("span").text()).filter(Boolean))]; const authors = $el.find("span.book-property__title").eq(1).text(); const upDatedStr = pubDateStr; return { title: title$1, description, pubDate: pubDateStr ? parseDate(pubDateStr, "x") : void 0, link: linkUrl ? new URL(linkUrl, baseUrl).href : void 0, category: categories, author: authors, content: { html: description, text: description }, image, banner: image, updated: upDatedStr ? parseDate(upDatedStr, "x") : void 0, language }; }); items = await Promise.all(items.map((item) => { if (!item.link) return item; return cache_default.tryGet(item.link, async () => { const $$ = load(await ofetch_default(item.link)); const title$1 = $$("div.ebook-title").text().trim(); const image = $$("div.span6 img").attr("src"); const description = art(path.join(__dirname, "templates/description-16be3a2a.art"), { images: image ? [{ src: image, alt: title$1 }] : void 0, description: ($$("table").first().parent().html() ?? "") + ($$("div.ebook-markdown").html() ?? "") }); $$("ul.inline").parent().parent().remove(); const pubDateStr = image?.split(/\?timestamp=/).pop(); const linkUrl = $$("div.ebook-title a").attr("href"); const categories = [...new Set($$("table tr").toArray().map((el) => $$(el).find("td").last().text()).filter(Boolean))]; const authors = $$("table tr").first().find("td").last().text(); const upDatedStr = pubDateStr; const processedItem = { title: title$1, description, pubDate: pubDateStr ? parseDate(pubDateStr, "x") : item.pubDate, link: linkUrl ? new URL(linkUrl, baseUrl).href : item.link, category: categories, author: authors, content: { html: description, text: description }, image, banner: image, updated: upDatedStr ? parseDate(upDatedStr, "x") : item.updated, language }; return { ...item, ...processedItem }; }); })); const title = $("title").text().replace(/第1页\s-\s/, ""); return { title, description: title.split(/-/).pop()?.trim(), link: targetUrl, item: items, allowEmpty: true, image: new URL("logo.png?imageView2/2/w/128/h/128/q/100", baseUrl).href, author: $("a.brand").text(), language, id: $("meta[property=\"og:url\"]").attr("content") }; }; const route = { path: "/:category{.+}?", name: "分类", url: "banshujiang.cn", maintainers: ["nczitzk"], handler, example: "/banshujiang/other/人工智能", parameters: { category: { description: "分类,默认为全部,可在对应分类页 URL 中找到", options: [ { label: "ActionScript", value: "programming_language/ActionScript" }, { label: "ASP.net", value: "programming_language/ASP.net" }, { label: "C", value: "programming_language/C" }, { label: "C#", value: "programming_language/C%23" }, { label: "C++", value: "programming_language/C++" }, { label: "CoffeeScript", value: "programming_language/CoffeeScript" }, { label: "CSS", value: "programming_language/CSS" }, { label: "Dart", value: "programming_language/Dart" }, { label: "Elixir", value: "programming_language/Elixir" }, { label: "Erlang", value: "programming_language/Erlang" }, { label: "F#", value: "programming_language/F%23" }, { label: "Go", value: "programming_language/Go" }, { label: "Groovy", value: "programming_language/Groovy" }, { label: "Haskell", value: "programming_language/Haskell" }, { label: "HTML5", value: "programming_language/HTML5" }, { label: "Java", value: "programming_language/Java" }, { label: "JavaScript", value: "programming_language/JavaScript" }, { label: "Kotlin", value: "programming_language/Kotlin" }, { label: "Lua", value: "programming_language/Lua" }, { label: "Objective-C", value: "programming_language/Objective-C" }, { label: "Perl", value: "programming_language/Perl" }, { label: "PHP", value: "programming_language/PHP" }, { label: "PowerShell", value: "programming_language/PowerShell" }, { label: "Python", value: "programming_language/Python" }, { label: "R", value: "programming_language/R" }, { label: "Ruby", value: "programming_language/Ruby" }, { label: "Rust", value: "programming_language/Rust" }, { label: "Scala", value: "programming_language/Scala" }, { label: "Shell Script", value: "programming_language/Shell%20Script" }, { label: "SQL", value: "programming_language/SQL" }, { label: "Swift", value: "programming_language/Swift" }, { label: "TypeScript", value: "programming_language/TypeScript" }, { label: "Android", value: "mobile_development/Android" }, { label: "iOS", value: "mobile_development/iOS" }, { label: "Linux", value: "operation_system/Linux" }, { label: "Mac OS X", value: "operation_system/Mac%20OS%20X" }, { label: "Unix", value: "operation_system/Unix" }, { label: "Windows", value: "operation_system/Windows" }, { label: "DB2", value: "database/DB2" }, { label: "MongoDB", value: "database/MongoDB" }, { label: "MySQL", value: "database/MySQL" }, { label: "Oracle", value: "database/Oracle" }, { label: "PostgreSQL", value: "database/PostgreSQL" }, { label: "SQL Server", value: "database/SQL%20Server" }, { label: "SQLite", value: "database/SQLite" }, { label: "Apache 项目", value: "open_source/Apache项目" }, { label: "Web 开发", value: "open_source/Web开发" }, { label: "区块链", value: "open_source/区块链" }, { label: "程序开发", value: "open_source/程序开发" }, { label: "人工智能", value: "other/人工智能" }, { label: "容器技术", value: "other/容器技术" }, { label: "中文", value: "language/中文" }, { label: "英文", value: "language/英文" } ] } }, description: `::: tip 订阅 [人工智能](https://banshujiang.cn//category/other/人工智能),其源网址为 \`https://banshujiang.cn//category/other/人工智能\`,请参考该 URL 指定部分构成参数,此时路由为 [\`/banshujiang/category/other/人工智能\`](https://rsshub.app/banshujiang/other/人工智能)。 ::: <details> <summary>更多分类</summary> #### 编程语言 | 分类 | ID | | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | [ActionScript](http://www.banshujiang.cn/category/programming_language/ActionScript/page/1) | [category/programming_language/ActionScript](https://rsshub.app/banshujiang/programming_language/ActionScript) | | [ASP.net](http://www.banshujiang.cn/category/programming_language/ASP.net/page/1) | [category/programming_language/ASP.net](https://rsshub.app/banshujiang/programming_language/ASP.net) | | [C](http://www.banshujiang.cn/category/programming_language/C) | [category/programming_language/C](https://rsshub.app/banshujiang/programming_language/C) | | [C#](http://www.banshujiang.cn/category/programming_language/C%23) | [category/programming_language/C%23](https://rsshub.app/banshujiang/programming_language/C%23) | | [C++](http://www.banshujiang.cn/category/programming_language/C++) | [category/programming_language/C++](https://rsshub.app/banshujiang/programming_language/C++) | | [CoffeeScript](http://www.banshujiang.cn/category/programming_language/CoffeeScript) | [category/programming_language/CoffeeScript](https://rsshub.app/banshujiang/programming_language/CoffeeScript) | | [CSS](http://www.banshujiang.cn/category/programming_language/CSS) | [category/programming_language/CSS) | | [Dart](http://www.banshujiang.cn/category/programming_language/Dart) | [category/programming_language/Dart](https://rsshub.app/banshujiang/programming_language/Dart) | | [Elixir](http://www.banshujiang.cn/category/programming_language/Elixir) | [category/programming_language/Elixir](https://rsshub.app/banshujiang/programming_language/Elixir) | | [Erlang](http://www.banshujiang.cn/category/programming_language/Erlang) | [category/programming_language/Erlang](https://rsshub.app/banshujiang/programming_language/Erlang) | | [F#](http://www.banshujiang.cn/category/programming_language/F%23) | [category/programming_language/F%23](https://rsshub.app/banshujiang/programming_language/F%23) | | [Go](http://www.banshujiang.cn/category/programming_language/Go) | [category/programming_language/Go](https://rsshub.app/banshujiang/programming_language/Go) | | [Groovy](http://www.banshujiang.cn/category/programming_language/Groovy) | [category/programming_language/Groovy](https://rsshub.app/banshujiang/programming_language/Groovy) | | [Haskell](http://www.banshujiang.cn/category/programming_language/Haskell) | [category/programming_language/Haskell](https://rsshub.app/banshujiang/programming_language/Haskell) | | [HTML5](http://www.banshujiang.cn/category/programming_language/HTML5) | [category/programming_language/HTML5](https://rsshub.app/banshujiang/programming_language/HTML5) | | [Java](http://www.banshujiang.cn/category/programming_language/Java) | [category/programming_language/Java](https://rsshub.app/banshujiang/programming_language/Java) | | [JavaScript](http://www.banshujiang.cn/category/programming_language/JavaScript) | [category/programming_language/JavaScript](https://rsshub.app/banshujiang/programming_language/JavaScript) | | [Kotlin](http://www.banshujiang.cn/category/programming_language/Kotlin) | [category/programming_language/Kotlin](https://rsshub.app/banshujiang/programming_language/Kotlin) | | [Lua](http://www.banshujiang.cn/category/programming_language/Lua) | [category/programming_language/Lua](https://rsshub.app/banshujiang/programming_language/Lua) | | [Objective-C](http://www.banshujiang.cn/category/programming_language/Objective-C) | [category/programming_language/Objective-C](https://rsshub.app/banshujiang/programming_language/Objective-C) | | [Perl](http://www.banshujiang.cn/category/programming_language/Perl) | [category/programming_language/Perl](https://rsshub.app/banshujiang/programming_language/Perl) | | [PHP](http://www.banshujiang.cn/category/programming_language/PHP) | [category/programming_language/PHP](https://rsshub.app/banshujiang/programming_language/PHP) | | [PowerShell](http://www.banshujiang.cn/category/programming_language/PowerShell) | [category/programming_language/PowerShell](https://rsshub.app/banshujiang/programming_language/PowerShell) | | [Python](http://www.banshujiang.cn/category/programming_language/Python) | [category/programming_language/Python](https://rsshub.app/banshujiang/programming_language/Python) | | [R](http://www.banshujiang.cn/category/programming_language/R/page/1) | [category/programming_language/R](https://rsshub.app/banshujiang/programming_language/R) | | [Ruby](http://www.banshujiang.cn/category/programming_language/Ruby/page/1) | [category/programming_language/Ruby](https://rsshub.app/banshujiang/programming_language/Ruby) | | [Rust](http://www.banshujiang.cn/category/programming_language/Rust/page/1) | [category/programming_language/Rust](https://rsshub.app/banshujiang/programming_language/Rust) | | [Scala](http://www.banshujiang.cn/category/programming_language/Scala/page/1) | [category/programming_language/Scala](https://rsshub.app/banshujiang/programming_language/Scala) | | [Shell Script](http://www.banshujiang.cn/category/programming_language/Shell%20Script/page/1) | [category/programming_language/Shell%20Script](https://rsshub.app/banshujiang/programming_language/Shell%20Script) | | [SQL](http://www.banshujiang.cn/category/programming_language/SQL/page/1) | [category/programming_language/SQL](https://rsshub.app/banshujiang/programming_language/SQL) | | [Swift](http://www.banshujiang.cn/category/programming_language/Swift/page/1) | [category/programming_language/Swift](https://rsshub.app/banshujiang/programming_language/Swift) | | [TypeScript](http://www.banshujiang.cn/category/programming_language/TypeScript/page/1) | [category/programming_language/TypeScript](https://rsshub.app/banshujiang/programming_language/TypeScript) | #### 移动开发 | 分类 | ID | | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | | [Android](http://www.banshujiang.cn/category/mobile_development/Android/page/1) | [category/mobile_development/Android](https://rsshub.app/banshujiang/mobile_development/Android) | | [iOS](http://www.banshujiang.cn/category/mobile_development/iOS/page/1) | [category/mobile_development/iOS](https://rsshub.app/banshujiang/mobile_development/iOS) | #### 操作系统 | 分类 | ID | | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | | [Linux](http://www.banshujiang.cn/category/operation_system/Linux/page/1) | [category/operation_system/Linux](https://rsshub.app/banshujiang/operation_system/Linux) | | [Mac OS X](http://www.banshujiang.cn/category/operation_system/Mac%20OS%20X/page/1) | [category/operation_system/Mac%20OS%20X](https://rsshub.app/banshujiang/operation_system/Mac%20OS%20X) | | [Unix](http://www.banshujiang.cn/category/operation_system/Unix/page/1) | [category/operation_system/Unix](https://rsshub.app/banshujiang/operation_system/Unix) | | [Windows](http://www.banshujiang.cn/category/operation_system/Windows/page/1) | [category/operation_system/Windows](https://rsshub.app/banshujiang/operation_system/Windows) | #### 数据库 | 分类 | ID | | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | [DB2](http://www.banshujiang.cn/category/database/DB2/page/1) | [category/database/DB2](https://rsshub.app/banshujiang/database/DB2) | | [MongoDB](http://www.banshujiang.cn/category/database/MongoDB/page/1) | [category/database/MongoDB](https://rsshub.app/banshujiang/database/MongoDB) | | [MySQL](http://www.banshujiang.cn/category/database/MySQL/page/1) | [category/database/MySQL](https://rsshub.app/banshujiang/database/MySQL) | | [Oracle](http://www.banshujiang.cn/category/database/Oracle/page/1) | [category/database/Oracle](https://rsshub.app/banshujiang/database/Oracle) | | [PostgreSQL](http://www.banshujiang.cn/category/database/PostgreSQL/page/1) | [category/database/PostgreSQL](https://rsshub.app/banshujiang/database/PostgreSQL) | | [SQL Server](http://www.banshujiang.cn/category/database/SQL%20Server/page/1) | [category/database/SQL%20Server](https://rsshub.app/banshujiang/database/SQL%20Server) | | [SQLite](http://www.banshujiang.cn/category/database/SQLite/page/1) | [category/database/SQLite](https://rsshub.app/banshujiang/database/SQLite) | #### 开源软件 | 分类 | ID | | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | [Apache 项目](http://www.banshujiang.cn/category/open_source/Apache项目/page/1) | [category/open_source/Apache 项目](https://rsshub.app/banshujiang/open_source/Apache项目) | | [Web 开发](http://www.banshujiang.cn/category/open_source/Web开发/page/1) | [category/open_source/Web 开发](https://rsshub.app/banshujiang/open_source/Web开发) | | [区块链](http://www.banshujiang.cn/category/open_source/区块链/page/1) | [category/open_source/区块链](https://rsshub.app/banshujiang/open_source/区块链) | | [程序开发](http://www.banshujiang.cn/category/open_source/程序开发/page/1) | [category/open_source/程序开发](https://rsshub.app/banshujiang/open_source/程序开发) | #### 其他 | 分类 | ID | | -------------------------------------------------------------------- | ------------------------------------------------------------------------ | | [人工智能](http://www.banshujiang.cn/category/other/人工智能/page/1) | [category/other/人工智能](https://rsshub.app/banshujiang/other/人工智能) | | [容器技术](http://www.banshujiang.cn/category/other/容器技术/page/1) | [category/other/容器技术](https://rsshub.app/banshujiang/other/容器技术) | #### 语言 | 分类 | ID | | --------------------------------------------------------------- | ---------------------------------------------------------------------- | | [中文](http://www.banshujiang.cn/category/language/中文/page/1) | [category/language/中文](https://rsshub.app/banshujiang/language/中文) | | [英文](http://www.banshujiang.cn/category/language/英文/page/1) | [category/language/英文](https://rsshub.app/banshujiang/language/英文) | </details> `, categories: ["reading"], features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportRadar: true, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [ { source: ["banshujiang.cn/:category?"], target: (params) => { const category = params.category; return `/banshujiang${category ? `/${category}` : ""}`; } }, { title: "ActionScript", source: ["banshujiang.cn/programming_language/ActionScript/page/1"], target: "/programming_language/ActionScript" }, { title: "ASP.net", source: ["banshujiang.cn/programming_language/ASP.net/page/1"], target: "/programming_language/ASP.net" }, { title: "C", source: ["banshujiang.cn/programming_language/C"], target: "/programming_language/C" }, { title: "C#", source: ["banshujiang.cn/programming_language/C%23"], target: "/programming_language/C%23" }, { title: "C++", source: ["banshujiang.cn/programming_language/C++"], target: "/programming_language/C++" }, { title: "CoffeeScript", source: ["banshujiang.cn/programming_language/CoffeeScript"], target: "/programming_language/CoffeeScript" }, { title: "CSS", source: ["banshujiang.cn/programming_language/CSS"], target: "/programming_language/CSS" }, { title: "Dart", source: ["banshujiang.cn/programming_language/Dart"], target: "/programming_language/Dart" }, { title: "Elixir", source: ["banshujiang.cn/programming_language/Elixir"], target: "/programming_language/Elixir" }, { title: "Erlang", source: ["banshujiang.cn/programming_language/Erlang"], target: "/programming_language/Erlang" }, { title: "F#", source: ["banshujiang.cn/programming_language/F%23"], target: "/programming_language/F%23" }, { title: "Go", source: ["banshujiang.cn/programming_language/Go"], target: "/programming_language/Go" }, { title: "Groovy", source: ["banshujiang.cn/programming_language/Groovy"], target: "/programming_language/Groovy" }, { title: "Haskell", source: ["banshujiang.cn/programming_language/Haskell"], target: "/programming_language/Haskell" }, { title: "HTML5", source: ["banshujiang.cn/programming_language/HTML5"], target: "/programming_language/HTML5" }, { title: "Java", source: ["banshujiang.cn/programming_language/Java"], target: "/programming_language/Java" }, { title: "JavaScript", source: ["banshujiang.cn/programming_language/JavaScript"], target: "/programming_language/JavaScript" }, { title: "Kotlin", source: ["banshujiang.cn/programming_language/Kotlin"], target: "/programming_language/Kotlin" }, { title: "Lua", source: ["banshujiang.cn/programming_language/Lua"], target: "/programming_language/Lua" }, { title: "Objective-C", source: ["banshujiang.cn/programming_language/Objective-C"], target: "/programming_language/Objective-C" }, { title: "Perl", source: ["banshujiang.cn/programming_language/Perl"], target: "/programming_language/Perl" }, { title: "PHP", source: ["banshujiang.cn/programming_language/PHP"], target: "/programming_language/PHP" }, { title: "PowerShell", source: ["banshujiang.cn/programming_language/PowerShell"], target: "/programming_language/PowerShell" }, { title: "Python", source: ["banshujiang.cn/programming_language/Python"], target: "/programming_language/Python" }, { title: "R", source: ["banshujiang.cn/programming_language/R/page/1"], target: "/programming_language/R" }, { title: "Ruby", source: ["banshujiang.cn/programming_language/Ruby/page/1"], target: "/programming_language/Ruby" }, { title: "Rust", source: ["banshujiang.cn/programming_language/Rust/page/1"], target: "/programming_language/Rust" }, { title: "Scala", source: ["banshujiang.cn/programming_language/Scala/page/1"], target: "/programming_language/Scala" }, { title: "Shell Script", source: ["banshujiang.cn/programming_language/Shell%20Script/page/1"], target: "/programming_language/Shell%20Script" }, { title: "SQL", source: ["banshujiang.cn/programming_language/SQL/page/1"], target: "/programming_language/SQL" }, { title: "Swift", source: ["banshujiang.cn/programming_language/Swift/page/1"], target: "/programming_language/Swift" }, { title: "TypeScript", source: ["banshujiang.cn/programming_language/TypeScript/page/1"], target: "/programming_language/TypeScript" }, { title: "Android", source: ["banshujiang.cn/mobile_development/Android/page/1"], target: "/mobile_development/Android" }, { title: "iOS", source: ["banshujiang.cn/mobile_development/iOS/page/1"], target: "/mobile_development/iOS" }, { title: "Linux", source: ["banshujiang.cn/operation_system/Linux/page/1"], target: "/operation_system/Linux" }, { title: "Mac OS X", source: ["banshujiang.cn/operation_system/Mac%20OS%20X/page/1"], target: "/operation_system/Mac%20OS%20X" }, { title: "Unix", source: ["banshujiang.cn/operation_system/Unix/page/1"], target: "/operation_system/Unix" }, { title: "Windows", source: ["banshujiang.cn/operation_system/Windows/page/1"], target: "/operation_system/Windows" }, { title: "DB2", source: ["banshujiang.cn/database/DB2/page/1"], target: "/database/DB2" }, { title: "MongoDB", source: ["banshujiang.cn/database/MongoDB/page/1"], target: "/database/MongoDB" }, { title: "MySQL", source: ["banshujiang.cn/database/MySQL/page/1"], target: "/database/MySQL" }, { title: "Oracle", source: ["banshujiang.cn/database/Oracle/page/1"], target: "/database/Oracle" }, { title: "PostgreSQL", source: ["banshujiang.cn/database/PostgreSQL/page/1"], target: "/database/PostgreSQL" }, { title: "SQL Server", source: ["banshujiang.cn/database/SQL%20Server/page/1"], target: "/database/SQL%20Server" }, { title: "SQLite", source: ["banshujiang.cn/database/SQLite/page/1"], target: "/database/SQLite" }, { title: "Apache 项目", source: ["banshujiang.cn/open_source/Apache项目/page/1"], target: "/open_source/Apache 项目" }, { title: "Web 开发", source: ["banshujiang.cn/open_source/Web开发/page/1"], target: "/open_source/Web 开发" }, { title: "区块链", source: ["banshujiang.cn/open_source/区块链/page/1"], target: "/open_source/区块链" }, { title: "程序开发", source: ["banshujiang.cn/open_source/程序开发/page/1"], target: "/open_source/程序开发" }, { title: "人工智能", source: ["banshujiang.cn/other/人工智能/page/1"], target: "/other/人工智能" }, { title: "容器技术", source: ["banshujiang.cn/other/容器技术/page/1"], target: "/other/容器技术" }, { title: "中文", source: ["banshujiang.cn/language/中文/page/1"], target: "/language/中文" }, { title: "英文", source: ["banshujiang.cn/language/英文/page/1"], target: "/language/英文" } ], view: ViewType.Articles }; //#endregion export { handler, route };