速读谷-sudugu-v0305(公众号:好用的软件站)

https://www.sudugu.org/

lindongjiang (1001)5小时前

暂无介绍说明

{
  "chapterContent": {
    "actionID": "chapterContent",
    "validConfig": "",
    "content": "(//div[contains(@class,'con')])[1]",
    "requestInfo": "@js:\nvar host = String(config.host || 'https://www.sudugu.org/');\nfunction absUrl(u, base){\n  u = String(u || '').trim();\n  if(!u) return '';\n  if(u.indexOf('http://') === 0 || u.indexOf('https://') === 0) return u;\n  if(u.indexOf('//') === 0) return 'https:' + u;\n  var b = String(base || host).trim();\n  if(!b) b = host;\n  var h = b.indexOf('#');\n  if(h >= 0) b = b.substring(0, h);\n  var q = b.indexOf('?');\n  if(q >= 0) b = b.substring(0, q);\n  var p = b.indexOf('://');\n  var origin = host;\n  if(p >= 0){\n    var s = b.indexOf('/', p + 3);\n    origin = s >= 0 ? b.substring(0, s) : b;\n  }\n  if(u.charAt(0) === '/') return origin + u;\n  if(b.charAt(b.length - 1) !== '/') {\n    var k = b.lastIndexOf('/');\n    if(k >= 0) b = b.substring(0, k + 1);\n    else b = origin + '/';\n  }\n  return b + u;\n}\nvar u = '';\nif (params && params.lastResponse && params.lastResponse.nextPageUrl) u = params.lastResponse.nextPageUrl;\nif (!u && params && params.queryInfo) u = params.queryInfo.url || params.queryInfo.detailUrl || '';\nif (!u && result) {\n  if (typeof result === 'string') u = result;\n  else if (result.url) u = result.url;\n  else if (result.detailUrl) u = result.detailUrl;\n}\nif (!u && params && params.responseUrl) u = params.responseUrl;\nu = absUrl(u, params && params.responseUrl ? params.responseUrl : host);\nreturn {'url': u, 'httpHeaders': config.httpHeaders};",
    "title": "//div[contains(@class,'submenu')]/h1/text()||@js:\nvar t = String(result || '').trim();\nif(t.indexOf('>') >= 0) t = t.split('>').pop();\nreturn String(t || '').trim();",
    "moreKeys": {
      "maxPage": 20,
      "removeHtmlKeys": [
        "title",
        "content"
      ]
    },
    "host": "https://www.sudugu.org/",
    "responseFormatType": "html",
    "parserID": "DOM",
    "nextPageUrl": "(//div[contains(@class,'prenext')]/span[2]/a/@href)[1]||@js:\nvar host = String(config.host || 'https://www.sudugu.org/');\nfunction absUrl(u, base){\n  u = String(u || '').trim();\n  if(!u) return '';\n  if(u.indexOf('http://') === 0 || u.indexOf('https://') === 0) return u;\n  if(u.indexOf('//') === 0) return 'https:' + u;\n  var b = String(base || host).trim();\n  if(!b) b = host;\n  var h = b.indexOf('#');\n  if(h >= 0) b = b.substring(0, h);\n  var q = b.indexOf('?');\n  if(q >= 0) b = b.substring(0, q);\n  var p = b.indexOf('://');\n  var origin = host;\n  if(p >= 0){\n    var s = b.indexOf('/', p + 3);\n    origin = s >= 0 ? b.substring(0, s) : b;\n  }\n  if(u.charAt(0) === '/') return origin + u;\n  if(b.charAt(b.length - 1) !== '/') {\n    var k = b.lastIndexOf('/');\n    if(k >= 0) b = b.substring(0, k + 1);\n    else b = origin + '/';\n  }\n  return b + u;\n}\nfunction parseChapter(u){\n  var full = absUrl(u, host);\n  if(!full) return null;\n  var x = full;\n  var h = x.indexOf('#');\n  if(h >= 0) x = x.substring(0, h);\n  var q = x.indexOf('?');\n  if(q >= 0) x = x.substring(0, q);\n  var arr = x.split('/');\n  if(arr.length < 5) return null;\n  var bookId = arr[arr.length - 2];\n  var file = arr[arr.length - 1];\n  if(file.indexOf('.html') < 0) return null;\n  file = file.replace('.html', '');\n  var parts = file.split('-');\n  var chapterId = parts[0];\n  var page = 1;\n  if(parts.length > 1){\n    var n = parseInt(parts[1], 10);\n    if(!n || n < 1) return null;\n    page = n;\n  }\n  if(!bookId || !chapterId) return null;\n  return {'bookId': bookId, 'chapterId': chapterId, 'page': page};\n}\nvar cand = absUrl(result, params && params.responseUrl ? params.responseUrl : host);\nif(!cand) return '';\nvar curUrl = '';\nif(params && params.responseUrl) curUrl = params.responseUrl;\nif(!curUrl && params && params.queryInfo) curUrl = params.queryInfo.url || params.queryInfo.detailUrl || '';\nif(!curUrl && typeof result === 'string') curUrl = result;\nvar cur = parseChapter(curUrl);\nvar nxt = parseChapter(cand);\nif(!cur || !nxt) return '';\nif(cur.bookId !== nxt.bookId) return '';\nif(cur.chapterId !== nxt.chapterId) return '';\nif(nxt.page <= cur.page) return '';\nreturn cand;"
  },
  "enable": true,
  "bookDetail": {
    "cat": "//div[contains(@class,'itemtxt')]/p[1]/span[last()]/text()||@js:return String(result || '').trim();",
    "responseFormatType": "html",
    "lastChapterTitle": "//div[contains(@class,'itemtxt')]/ul/li[1]/a/text()||@js:return String(result || '').trim();",
    "desc": "//div[contains(@class,'des')][1]/p[1]/text()||@js:return String(result || '').trim();",
    "host": "https://www.sudugu.org/",
    "requestInfo": "@js:\nvar host = String(config.host || 'https://www.sudugu.org/');\nfunction absUrl(u, base){\n  u = String(u || '').trim();\n  if(!u) return '';\n  if(u.indexOf('http://') === 0 || u.indexOf('https://') === 0) return u;\n  if(u.indexOf('//') === 0) return 'https:' + u;\n  var b = String(base || host).trim();\n  if(!b) b = host;\n  var h = b.indexOf('#');\n  if(h >= 0) b = b.substring(0, h);\n  var q = b.indexOf('?');\n  if(q >= 0) b = b.substring(0, q);\n  var p = b.indexOf('://');\n  var origin = host;\n  if(p >= 0){\n    var s = b.indexOf('/', p + 3);\n    origin = s >= 0 ? b.substring(0, s) : b;\n  }\n  if(u.charAt(0) === '/') return origin + u;\n  if(b.charAt(b.length - 1) !== '/') {\n    var k = b.lastIndexOf('/');\n    if(k >= 0) b = b.substring(0, k + 1);\n    else b = origin + '/';\n  }\n  return b + u;\n}\nvar u = '';\nif (params && params.queryInfo) u = params.queryInfo.detailUrl || params.queryInfo.url || '';\nif (!u && result) {\n  if (typeof result === 'string') u = result;\n  else if (result.detailUrl) u = result.detailUrl;\n  else if (result.url) u = result.url;\n}\nif (!u && params && params.responseUrl) u = params.responseUrl;\nu = absUrl(u, params && params.responseUrl ? params.responseUrl : host);\nreturn {'url': u, 'httpHeaders': config.httpHeaders};",
    "actionID": "bookDetail",
    "detailUrl": "@js:\nif(params && params.queryInfo){\n  if(params.queryInfo.detailUrl) return params.queryInfo.detailUrl;\n  if(params.queryInfo.url) return params.queryInfo.url;\n}\nif(typeof result === 'string') return result;\nif(result && result.detailUrl) return result.detailUrl;\nif(result && result.url) return result.url;\nreturn '';",
    "cover": "//div[contains(@class,'item')]/a/img/@src||@js:\nif(!result) return '';\nvar u = String(result).trim();\nif(!u) return '';\nif(u.indexOf('http://') === 0 || u.indexOf('https://') === 0) return u;\nif(u.indexOf('//') === 0) return 'https:' + u;\nif(u.charAt(0) !== '/') u = '/' + u;\nreturn config.host + u.replace(/^\\/+/, '');",
    "validConfig": "",
    "parserID": "DOM",
    "status": "//div[contains(@class,'itemtxt')]/p[1]/span[1]/text()||@js:return String(result || '').trim();",
    "updateTime": "//h2[@id='dir']/span/text()||@js:return String(result || '').replace('更新时间:', '').trim();"
  },
  "bookWorld": {
    "分类": {
      "cat": "//div[contains(@class,'itemtxt')]/p[1]/span[last()]/text()||@js:return String(result || '').trim();",
      "responseFormatType": "html",
      "author": "//div[contains(@class,'itemtxt')]/p[a[contains(.,'作者')]]/a/text()||@js:return String(result || '').replace('作者:', '').trim();",
      "lastChapterTitle": "//div[contains(@class,'itemtxt')]/ul/li[1]/a/text()||@js:return String(result || '').trim();",
      "bookName": "//div[contains(@class,'itemtxt')]//h3/a/text()||//div[contains(@class,'itemtxt')]//h1/a/text()||@js:return String(result || '').trim();",
      "desc": "",
      "host": "https://www.sudugu.org/",
      "requestInfo": "@js:\nvar cat = 'xuanhuan';\nif (params && params.filters && params.filters.category) {\n  cat = String(params.filters.category);\n}\nvar page = parseInt(params.pageIndex || 1, 10);\nif (!page || page < 1) page = 1;\nvar url = config.host + cat + '/';\nif (page > 1) url = config.host + cat + '/' + page + '.html';\nreturn {'url': url, 'httpHeaders': config.httpHeaders};",
      "actionID": "bookWorld",
      "detailUrl": "//div[contains(@class,'itemtxt')]//h3/a/@href||//div[contains(@class,'itemtxt')]//h1/a/@href",
      "cover": "//img/@src||@js:\nif(!result) return '';\nvar u = String(result).trim();\nif(!u) return '';\nif(u.indexOf('http://') === 0 || u.indexOf('https://') === 0) return u;\nif(u.indexOf('//') === 0) return 'https:' + u;\nif(u.charAt(0) !== '/') u = '/' + u;\nreturn config.host + u.replace(/^\\/+/, '');",
      "validConfig": "",
      "parserID": "DOM",
      "list": "//div[contains(@class,'container')]//div[contains(@class,'item')]",
      "moreKeys": {
        "_sIndex": 0,
        "maxPage": 120,
        "pageSize": 10,
        "removeHtmlKeys": [
          "bookName",
          "author",
          "cat",
          "status",
          "lastChapterTitle",
          "updateTime",
          "desc"
        ],
        "requestFilters": [
          {
            "key": "category",
            "items": [
              {
                "title": "都市小说",
                "value": "dushi"
              },
              {
                "title": "玄幻小说",
                "value": "xuanhuan"
              },
              {
                "title": "仙侠小说",
                "value": "xianxia"
              },
              {
                "title": "轻小说",
                "value": "qing"
              },
              {
                "title": "历史小说",
                "value": "lishi"
              },
              {
                "title": "科幻小说",
                "value": "kehuan"
              },
              {
                "title": "诸天无限",
                "value": "zhutianwuxian"
              },
              {
                "title": "游戏小说",
                "value": "youxi"
              },
              {
                "title": "奇幻小说",
                "value": "qihuan"
              },
              {
                "title": "悬疑小说",
                "value": "xuanyi"
              },
              {
                "title": "体育小说",
                "value": "tiyu"
              },
              {
                "title": "官场小说",
                "value": "guanchang"
              },
              {
                "title": "军事小说",
                "value": "junshi"
              },
              {
                "title": "武侠小说",
                "value": "wuxia"
              },
              {
                "title": "现实小说",
                "value": "xianshi"
              },
              {
                "title": "乡村小说",
                "value": "xiangcun"
              },
              {
                "title": "言情小说",
                "value": "yanqing"
              }
            ]
          }
        ]
      },
      "status": "//div[contains(@class,'itemtxt')]/p[1]/span[1]/text()||@js:return String(result || '').trim();",
      "updateTime": "//div[contains(@class,'itemtxt')]/ul/li[1]/i/text()||@js:return String(result || '').trim();"
    },
    "分类导航": {
      "actionID": "bookWorld",
      "validConfig": "",
      "requestInfo": "@js:return {'url': config.host + 'fenlei/', 'httpHeaders': config.httpHeaders};",
      "bookName": "//text()||@js:\nvar t = String(result || '').trim();\nvar i = t.indexOf('(');\nif (i > 0) t = t.substring(0, i);\nreturn t;",
      "detailUrl": "//@href",
      "host": "https://www.sudugu.org/",
      "cat": "//text()||@js:\nvar t = String(result || '').trim();\nvar i = t.indexOf('(');\nif (i > 0) t = t.substring(0, i);\nreturn t;",
      "list": "//div[contains(@class,'fenlei')]//li/a",
      "responseFormatType": "html",
      "parserID": "DOM",
      "moreKeys": {
        "maxPage": 1,
        "removeHtmlKeys": [
          "bookName",
          "cat"
        ]
      }
    }
  },
  "sourceUrl": "https://www.sudugu.org/",
  "sourceType": "text",
  "weight": 9999,
  "sourceName": "速读谷-sudugu-v0305(公众号:好用的软件站)",
  "httpHeaders": {
    "Referer": "https://www.sudugu.org/",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
  },
  "miniAppVersion": "2.53.2",
  "lastModifyTime": "1772688452",
  "searchBook": {
    "cat": "//div[contains(@class,'itemtxt')]/p[1]/span[last()]/text()||@js:return String(result || '').trim();",
    "responseFormatType": "html",
    "author": "//div[contains(@class,'itemtxt')]/p[a[contains(.,'作者')]]/a/text()||@js:return String(result || '').replace('作者:', '').trim();",
    "lastChapterTitle": "//div[contains(@class,'itemtxt')]/ul/li[1]/a/text()||@js:return String(result || '').trim();",
    "bookName": "//div[contains(@class,'itemtxt')]//h3/a/text()||//div[contains(@class,'itemtxt')]//h1/a/text()||@js:return String(result || '').trim();",
    "url": "//div[contains(@class,'itemtxt')]//h3/a/@href||//div[contains(@class,'itemtxt')]//h1/a/@href",
    "desc": "",
    "host": "https://www.sudugu.org/",
    "requestInfo": "@js:\nvar kw = encodeURIComponent(String(params.keyWord || ''));\nvar page = parseInt(params.pageIndex || 1, 10);\nif (!page || page < 1) page = 1;\nvar url = config.host + 'i/sor.aspx?key=' + kw;\nif (page > 1) url += '&p=' + page;\nreturn {'url': url, 'httpHeaders': config.httpHeaders};",
    "actionID": "searchBook",
    "detailUrl": "//div[contains(@class,'itemtxt')]//h3/a/@href||//div[contains(@class,'itemtxt')]//h1/a/@href",
    "cover": "//img/@src||@js:\nif(!result) return '';\nvar u = String(result).trim();\nif(!u) return '';\nif(u.indexOf('http://') === 0 || u.indexOf('https://') === 0) return u;\nif(u.indexOf('//') === 0) return 'https:' + u;\nif(u.charAt(0) !== '/') u = '/' + u;\nreturn config.host + u.replace(/^\\/+/, '');",
    "validConfig": "{\"maxPage\":20}",
    "parserID": "DOM",
    "list": "//div[contains(@class,'container')]//div[contains(@class,'item')]",
    "moreKeys": {
      "pageSize": 20,
      "maxPage": 50,
      "removeHtmlKeys": [
        "bookName",
        "author",
        "cat",
        "status",
        "lastChapterTitle",
        "updateTime",
        "desc"
      ]
    },
    "status": "//div[contains(@class,'itemtxt')]/p[1]/span[1]/text()||@js:return String(result || '').trim();",
    "updateTime": "//div[contains(@class,'itemtxt')]/ul/li[1]/i/text()||@js:return String(result || '').trim();"
  },
  "chapterList": {
    "nextPageUrl": "//div[@id='pages']//a[contains(@class,'gr')]/@href||@js:\nvar u = String(result || '').trim();\nif(!u) return '';\nif(u.indexOf('p-') < 0 || u.indexOf('.html') < 0) return '';\nreturn u;",
    "responseFormatType": "html",
    "url": "//@href",
    "host": "https://www.sudugu.org/",
    "requestInfo": "@js:\nvar host = String(config.host || 'https://www.sudugu.org/');\nfunction absUrl(u, base){\n  u = String(u || '').trim();\n  if(!u) return '';\n  if(u.indexOf('http://') === 0 || u.indexOf('https://') === 0) return u;\n  if(u.indexOf('//') === 0) return 'https:' + u;\n  var b = String(base || host).trim();\n  if(!b) b = host;\n  var h = b.indexOf('#');\n  if(h >= 0) b = b.substring(0, h);\n  var q = b.indexOf('?');\n  if(q >= 0) b = b.substring(0, q);\n  var p = b.indexOf('://');\n  var origin = host;\n  if(p >= 0){\n    var s = b.indexOf('/', p + 3);\n    origin = s >= 0 ? b.substring(0, s) : b;\n  }\n  if(u.charAt(0) === '/') return origin + u;\n  if(b.charAt(b.length - 1) !== '/') {\n    var k = b.lastIndexOf('/');\n    if(k >= 0) b = b.substring(0, k + 1);\n    else b = origin + '/';\n  }\n  return b + u;\n}\nvar u = '';\nif (params && params.lastResponse && params.lastResponse.nextPageUrl) u = params.lastResponse.nextPageUrl;\nif (!u && params && params.queryInfo) u = params.queryInfo.detailUrl || params.queryInfo.url || '';\nif (!u && result) {\n  if (typeof result === 'string') u = result;\n  else if (result.detailUrl) u = result.detailUrl;\n  else if (result.url) u = result.url;\n}\nif (!u && params && params.responseUrl) u = params.responseUrl;\nu = absUrl(u, params && params.responseUrl ? params.responseUrl : host);\nreturn {'url': u, 'httpHeaders': config.httpHeaders};",
    "actionID": "chapterList",
    "title": "//text()||@js:return String(result || '').trim();",
    "detailUrl": "//@href",
    "validConfig": "",
    "parserID": "DOM",
    "list": "//div[@id='list']//li/a",
    "moreKeys": {
      "maxPage": 20,
      "removeHtmlKeys": [
        "title",
        "updateTime"
      ]
    },
    "updateTime": "//h2[@id='dir']/span/text()||@js:return String(result || '').replace('更新时间:', '').trim();"
  }
}