[{"bookSourceComment":"QQ 浏览器小说接口书源 v7；发现页按 QQ 浏览器分类表重排为 22 类，并补齐女频扩展、纯爱与短篇。搜索合并 QQ 浏览器和 QQ 阅读并自动去重。","bookSourceGroup":"QQ浏览器","bookSourceName":"QQ浏览器-完整分类-v7","bookSourceType":0,"bookSourceUrl":"https:\/\/so.html5.qq.com\/?legado_source=qqbrowser_categories_v7","customOrder":0,"enabled":true,"enabledCookieJar":false,"enabledExplore":true,"exploreUrl":"[{\"title\":\"男频·玄幻\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1501&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·都市\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1505&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·仙侠\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1504&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·奇幻\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1502&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·历史\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1506&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·军事\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1507&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·科幻\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1509&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·悬疑\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1508&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·游戏\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1510&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"男频·武侠\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1503&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"轻小说\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1512&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"现实\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1499&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"女频·现代言情\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1524&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"女频·古代言情\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1523&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"女频·悬疑\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1518&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"女频·仙侠奇缘\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1517&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"女频·玄幻言情\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1516&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"女频·浪漫青春\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1522&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"女频·科幻空间\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1519&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"女频·游戏竞技\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1520&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"纯爱\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1707&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}},{\"title\":\"短篇\",\"url\":\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/rank\/list?groupid=1515&start={{(page-1)*20}}&count=20&sub=\",\"style\":{\"layout_flexGrow\":1}}]","header":"{\n  \"User-Agent\": \"Mozilla\/5.0 (Linux; U; Android 13; zh-cn; V2183A Build\/TP1A.220624.014) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/89.0.4389.72 MQQBrowser\/13.4 Mobile Safari\/537.36 COVC\/046223\",\n  \"Referer\": \"https:\/\/novel.html5.qq.com\/\",\n  \"Q-GUID\": \"0ee63838b72eb075f63e93ae0bc288cb\",\n  \"QIMEI36\": \"8ff310843a87a71101958f5610001e316a11\"\n}","lastUpdateTime":"1781961659885","respondTime":1000,"ruleBookInfo":{"author":"$.author","coverUrl":"$.picurl","init":"$.data.bookInfo","intro":"$.summary","kind":"{{$.subject}}·{{$.subtype}}\n{{$.tag##\\|##、}}","lastChapter":"$.lastSerialname","name":"$.resourceName","tocUrl":"https:\/\/novel.html5.qq.com\/qbread\/api\/book\/all-chapter?bookId={{$.resourceID}}","wordCount":"$.contentsize"},"ruleContent":{"content":"@js:\n(function () {\n  var json = JSON.parse(String(result));\n  var blocks = json && json.data && json.data.Content;\n  if (blocks && blocks.length) {\n    var text = blocks[0].Content;\n    if (Array.isArray(text)) return text.join(\"\\n\");\n    return text == null ? \"\" : String(text);\n  }\n  return \"【QQ浏览器正文接口异常】\\n章节请求：\" + String(chapter.url) + \"\\n接口响应：\" + String(result);\n})()"},"ruleExplore":{"author":"$.author","bookList":"$.rows[*]","bookUrl":"https:\/\/novel.html5.qq.com\/qbread\/api\/novel\/bookInfo?resourceId={{$.resourceID}}","coverUrl":"$.picurl","intro":"$.summary","kind":"{{$.subject}}·{{$.subtype}}\n{{$.tag##\\|##、}}","lastChapter":"$.lastSerialname","name":"$.resourceName","wordCount":"$.contentsize"},"ruleSearch":{"author":"$.author","bookList":"$.books[*]","bookUrl":"$.bookUrl","coverUrl":"$.coverUrl","intro":"$.intro","kind":"$.kind","lastChapter":"$.lastChapter","name":"$.name","wordCount":"$.wordCount"},"ruleToc":{"chapterList":"$.rows[*]","chapterName":"$.serialName","chapterUrl":"$.serialID\n@js:\nvar matched = String(baseUrl).match(\/[?&]bookId=([^&#]+)\/);\nvar bookId = matched ? decodeURIComponent(matched[1]) : String(book.kind);\nvar data = JSON.stringify({\n  ContentAnchorBatch: [{\n    BookID: bookId,\n    ChapterSeqNo: [String(result)]\n  }],\n  Scene: \"chapter\"\n});\nvar option = {\n  method: \"POST\",\n  headers: {\n    \"Content-Type\": \"application\/json; charset=UTF-8\",\n    \"Referer\": \"https:\/\/novel.html5.qq.com\/\"\n  },\n  body: data,\n  retry: 2\n};\n\"https:\/\/novel.html5.qq.com\/be-api\/content\/ads-read,\" + JSON.stringify(option)"},"searchUrl":"https:\/\/so.html5.qq.com\/ajax\/real\/search_result?tabId=360&q={{key}},{\"bodyJs\":\"var browser = JSON.parse(String(result));\\nvar officialUrl = \\\"https:\/\/newopensearch.reader.qq.com\/wechat?keyword=\\\" + encodeURIComponent(String(key)) + \\\"&start=\\\" + ((page - 1) * 20) + \\\"&end=\\\" + (page * 20 - 1);\\nvar officialText = java.ajax(officialUrl);\\nvar official = {};\\ntry { official = JSON.parse(String(officialText)); } catch (e) { official = {}; }\\nvar books = [];\\nvar seen = {};\\nfunction addBook(item) {\\n  var mark = String(item.name || \\\"\\\").replace(\/\\\\s+\/g, \\\"\\\").toLowerCase() + \\\"|\\\" + String(item.author || \\\"\\\").replace(\/\\\\s+\/g, \\\"\\\").toLowerCase();\\n  if (!item.name || seen[mark]) return;\\n  seen[mark] = true;\\n  books.push(item);\\n}\\nfunction officialKind(raw) {\\n  var parts = String(raw || \\\"\\\").split(\\\",\\\");\\n  var names = [];\\n  var used = {};\\n  for (var n = 0; n < parts.length; n++) {\\n    var bits = parts[n].split(\\\":\\\");\\n    var label = bits.length > 1 ? bits[1] : \\\"\\\";\\n    if (label && label != \\\"小说\\\" && !used[label]) { used[label] = true; names.push(label); }\\n  }\\n  return names.join(\\\"·\\\");\\n}\\nvar states = page == 1 && browser && browser.data && browser.data.state ? browser.data.state : [];\\nfor (var i = 0; i < states.length; i++) {\\n  var items = states[i].items || [];\\n  for (var j = 0; j < items.length; j++) {\\n    var b = items[j];\\n    var resourceId = String(b.docId || \\\"\\\").replace(\/^.*_\/, \\\"\\\");\\n    addBook({name:b.title, author:b.author, coverUrl:b.cover_url, intro:b.abstract, kind:String(b.tag_views || \\\"\\\").replace(\/\\\\s+\/g, \\\"·\\\"), resourceId:resourceId, lastChapter:\\\"\\\", wordCount:\\\"\\\", bookUrl:\\\"https:\/\/novel.html5.qq.com\/qbread\/api\/novel\/bookInfo?resourceId=\\\" + resourceId, searchFrom:\\\"QQ浏览器\\\"});\\n  }\\n}\\nvar list = official && official.booklist ? official.booklist : [];\\nfor (var k = 0; k < list.length; k++) {\\n  var o = list[k];\\n  var bid = String(o.bid || \\\"0\\\");\\n  var resourceId2 = String(1100000000 + parseInt(bid, 10));\\n  var tail = parseInt(bid.slice(-3), 10);\\n  var dir = tail < 10 ? bid.slice(-1) : (tail < 100 ? bid.slice(-2) : bid.slice(-3));\\n  var cover = \\\"https:\/\/wfqqreader-1252317822.image.myqcloud.com\/cover\/\\\" + dir + \\\"\/\\\" + bid + \\\"\/b_\\\" + bid + \\\".jpg\\\";\\n  addBook({name:o.title, author:o.author, coverUrl:cover, intro:o.intro, kind:officialKind(o.categoryInfoV4), resourceId:resourceId2, lastChapter:o.updateInfo, wordCount:o.totalWords, bookUrl:\\\"https:\/\/bookshelf.html5.qq.com\/qbread\/api\/novel\/intro-info?bookid=\\\" + resourceId2, searchFrom:\\\"QQ阅读\\\"});\\n}\\nJSON.stringify({books:books})\"}","weight":0}]