📖Lofter

📖Lofter

guaner001125 (317)10/14 15:15

修复因为创建有声副本造成的错误

合集文章点击书名可以正确跳转到订阅源分类


使用洛雅橙改版阅读Σ最新测试版效果更佳https://github.com/Luoyacheng/legado

原版阅读可配套LOFTER订阅源使用
http://www.yckceo.com/yuedu/rss/json/id/641.json

❗️需登录
◎搜索格式◎
1、搜索用户<关闭精确搜索>
@用户名
2、搜索合集<关闭精确搜索>
#合集
3、搜索粮单
%粮单名<关闭精确搜索>
4、搜索文章,直接搜索
5、综合搜索【有些文章名搜不出来可以用这个试试】
。关键词<关闭精确搜索>

◎发现规则格式◎
❗️重要说明,为了不再清空发现规则,决定从源变量获取发现规则,所以请将发现规则按照下面格式写入源变量,保存后刷新发现规则。【每行一个】

🏷标签
标签名::https://api.lofter.com/oldapi/tagPosts.api?product=lofter-android-7.4.4&method=newTagSearch&offset={{(page-1) *22}}&limit=22&firstpermalink=null&tag=标签名&type=new,{"method": "POST","body":"null"}
📃用户(搜索可以得到)

◎一些使用指南◎
仅阅读Σ支持
1、点击作者名查看合集列表,长按作者名查看作者动态。
2、点击详情页书名跳转订阅源查看正文
3、长按详情页书名添加该作者的私享圈
4、点击详情页◎跳转lofter软件
5、点击正文◎查看评论
6、登录UI处可以开启查看划线评论
7、点击正文章节链接跳转lofter软件【原版阅读也支持】
8、点击评论数量条左边进入 评论主题管理
9、长按详情页标签创建【有声副本】,仅支持作者允许听书的合集,否则获取的音频链接为空

部分目录章节比较多,加载时间久,出现目录加载失败,请尝试刷新,因为可能是请求失败导致的


二维码导入
{
    "bookSourceComment": "使用洛雅橙改版阅读Σ最新测试版效果更佳https:\/\/github.com\/Luoyacheng\/legado\n\n原版阅读可配套LOFTER订阅源使用\nhttp:\/\/www.yckceo.com\/yuedu\/rss\/json\/id\/641.json\n\n❗️需登录\n◎搜索格式◎\n1、搜索用户<关闭精确搜索>\n@用户名\n2、搜索合集<关闭精确搜索>\n#合集\n3、搜索粮单\n%粮单名<关闭精确搜索>\n4、搜索文章,直接搜索\n5、综合搜索【有些文章名搜不出来可以用这个试试】\n。关键词<关闭精确搜索>\n\n◎发现规则格式◎\n❗️重要说明,为了不再清空发现规则,决定从源变量获取发现规则,所以请将发现规则按照下面格式写入源变量,保存后刷新发现规则。【每行一个】\n\n🏷标签\n标签名::https:\/\/api.lofter.com\/oldapi\/tagPosts.api?product=lofter-android-7.4.4&method=newTagSearch&offset={{(page-1) *22}}&limit=22&firstpermalink=null&tag=标签名&type=new,{\"method\": \"POST\",\"body\":\"null\"}\n📃用户(搜索可以得到)\n\n◎一些使用指南◎\n仅阅读Σ支持\n1、点击作者名查看合集列表,长按作者名查看作者动态。\n2、点击详情页书名跳转订阅源查看正文\n3、长按详情页书名添加该作者的私享圈\n4、点击详情页◎跳转lofter软件\n5、点击正文◎查看评论\n6、登录UI处可以开启查看划线评论\n7、点击正文章节链接跳转lofter软件【原版阅读也支持】\n8、点击评论数量条左边进入 评论主题管理\n9、长按详情页标签创建【有声副本】,仅支持作者允许听书的合集,否则获取的音频链接为空\n\n\n部分目录章节比较多,加载时间久,出现目录加载失败,请尝试刷新,因为可能是请求失败导致的",
    "bookSourceName": "📖Lofter",
    "bookSourceType": 0,
    "bookSourceUrl": "📖Lofter",
    "bookUrlPattern": "https?:\/\/api\\.lofter\\.com\/(?!.*newsearch).*",
    "concurrentRate": "700",
    "customButton": true,
    "customOrder": 20,
    "enabled": true,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": true,
    "exploreUrl": "<js>\n\/\/一行个数\nlet num = 3;\r\nlet all = [];\nlet d = {\n    1: 1,\n    2: 0.4,\n    3: 0.25,\n    4: 0.2,\n    5: 0.15,\n    7: 0.1,\n    10: 0.05\n};\nlet apiUrl = \"https:\/\/api.lofter.com\/\";\nlet webUrl = \"https:\/\/www.lofter.com\/\";\nlet push = (title, url, num, g,action) =>{\n    num = Number(num ?? 3);\n    if(num!=0){\n        num = num<1?num:d[num];\n    }\n\tlet j = {\n    title: title,\n    url: url,\n    style: {\n        layout_flexGrow: g == 0 ? g : 1,\n        layout_flexBasisPercent: num                           \n    }\n  }\n  if(num===0){\n      delete j.style.layout_flexBasisPercent\n  }\n     if(action){\n         j.action = action.action;\n         j.name = action.name;\n         j.type = action.type;\n         j.chars = action.chars;\n         j.viewName = action.viewName;\n         j.default = action.default;      \n         j.style.layout_justifySelf = action.style;\n         j.style.layout_wrapBefore = action.wrap;\n     }  \n     all.push(j)\t\n} \n\nfunction zwf(len,num){\n\tif(len%num!==0){\n        let n = len % num;\n        let p = num-n;\n        for(let i=0;i<p;i++){\n            push(占位符, ``, num, 1,{\"type\":\"button\",\"action\":\"java.toast('这是占位符')\"});\n        }\n    }\n}\npush(\"👤我的\",\"\",1)\npush(\"🐾我的足迹\",`${apiUrl}v2.0\/history.api?product=lofter-android-6.16.2,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain={\\{java.ajax('${webUrl}').match(\/class=\"lg2\">([^<]+)<\/)[1]}}&offset={\\{(page-1)*18}}&method=getList&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}`)\npush(\"❤️我的喜欢\",`${apiUrl}v1.1\/batchdata.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain={\\{java.ajax(\"${webUrl}\").match(\/class=\"lg2\">([^<]+)<\/)[1]}}&offset={\\{(page-1)*18}}&method=favorites&postdigestnew=1&returnData=1&limit=18\"}`)\npush(\"⭐️我的订阅\",`${apiUrl}newapi\/subscribeCollection\/list.json?offset={\\{(page-1)*10}} `)\n\npush(\"💰精选专区\",``,1);\npush(\"推荐\",`${apiUrl}recommend\/bookStoreFeedRecV2.json?tab=&count={\\{page-1}}&offset={\\{(page-1)*10}}&vipTime={\\{Date.now()}}&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&product=lofter-android-8.3.20&_={\\{Date.now()}}`)\n\npush(\"精选推荐\",`${webUrl}newweb\/bookStore\/recommendPost.json?tag=精选推荐&count={\\{page-1}}&offset={\\{(page-1)*10}}&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&_={\\{Date.now()}}`)\n\npush(\"近期热门\",`${webUrl}newweb\/bookStore\/recommendPost.json?tag=近期热门&count={\\{page-1}}&offset={\\{(page-1)*10}}&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&_={\\{Date.now()}}`)\n\npush(\"潜力新作\",`${webUrl}newweb\/bookStore\/recommendPost.json?tag=潜力新作&count={\\{page-1}}&offset={\\{(page-1)*10}}&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&_={\\{Date.now()}}`)\n\npush(\"言情\",`${apiUrl}recommend\/bookStoreFeedRecV2.json?tab=言情&count={\\{page-1}}&offset={\\{(page-1)*10}}&vipTime=1789401600000&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&product=lofter-android-8.3.20&_={\\{Date.now()}}`)\npush(\"纯爱\",`${apiUrl}recommend\/bookStoreFeedRecV2.json?tab=纯爱&count={\\{page-1}}&offset={\\{(page-1)*10}}&vipTime=1789401600000&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&product=lofter-android-8.3.20&_={\\{Date.now()}}`)\npush(\"橘气\",`${apiUrl}recommend\/bookStoreFeedRecV2.json?tab=橘气&count={\\{page-1}}&offset={\\{(page-1)*10}}&vipTime=1789401600000&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&product=lofter-android-8.3.20&_={\\{Date.now()}}`)\npush(\"衍生\",`${apiUrl}recommend\/bookStoreFeedRecV2.json?tab=衍生&count={\\{page}}&offset={\\{(page-1)*10}}&vipTime=1789401600000&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&product=lofter-android-8.3.20&_={\\{Date.now()}}`)\npush(\"其他\",`${apiUrl}recommend\/bookStoreFeedRecV2.json?tab=其他&count={\\{page-1}}&offset={\\{(page-1)*10}}&vipTime=1789401600000&portrait={\\{java.base64Encode(\\`{\"imei\":\"${java.androidId()}\",\"oaid\":\"null\",\"mac\":\"02:00:00:00:00:00\",\"androidId\":\"${java.androidId()}\"}\\`)}}&product=lofter-android-8.3.20&_={\\{Date.now()}}`);\n\n\n\nvar users = [];\nvar tags = [];\n\nvar s = String(source.getVariable() || \"\").trim();\n\nif (s.includes(\"http\")) {\nvar lines = s.split(\/\\r?\\n\/);\nfor (var i = 0; i < lines.length; i++) {\n    var line = lines[i].trim();\n    if (!line) continue;\n    var parts = line.split(\"::\");\n    if (parts.length !== 2) continue;\n    var name = parts[0].trim();\n    var url = parts[1].trim();\n    if (!url || url.indexOf(\"http\") === -1) continue;\n    if (url.indexOf(\"newTagSearch\") !== -1) {\n        tags.push(line)\n    } else if (url.indexOf(\"getPostLists\") !== -1) {\n        users.push(line)\n    }\n}\n}\n\nif(users.length){\n    push(\"📃用户\",\"\",1)\n    users.forEach(x=>{\n        let n = x.split(\"::\");\n        push(n[0],n[1],0)\n    })\n}\n\nif(tags.length){\n    push(\"🏷标签\",\"\",1)\n    tags.forEach(x=>{\n        let n = x.split(\"::\");\n        push(n[0],n[1],0)\n    })\n}\n\nJSON.stringify(all)\n\n\n\n\n<\/js>",
    "header": "@js:\nid=String(java.androidId());\nJSON.stringify({\n\"Content-Type\": \"application\/x-www-form-urlencoded;charset=utf-8\",\n\"deviceid\":id})",
    "jsLib": "function S(e){\n    return String(this.java.getString(e))    \n}\n\n  function M(e){\n    const {source} = this;\n    return String(source.getLoginInfoMap()[e] ?? \"\")\n}\n\nfunction jsonToLrc(jsonText) {\n    const {java} = this;\n    \n  var data = typeof jsonText === 'string' ? JSON.parse(jsonText) : jsonText;\n\n  function pad(n, w) {\n    if (w === undefined) w = 2;\n    return String(Math.floor(n)).padStart(w, '0');\n  }\n\n  function toTimeTag(ms) {\n    var totalSeconds = ms \/ 1000;\n    var minutes = Math.floor(totalSeconds \/ 60);\n    var seconds = totalSeconds % 60;\n    return (\n      pad(minutes) +\n      ':' +\n      pad(seconds, 2) +\n      '.' +\n      pad((seconds % 1) * 100, 2)\n    );\n  }\n\n  var lines = [];\n  for (var i = 0; i < data.length; i++) {\n    var item = data[i];\n    var timeTag = toTimeTag(item.time_begin);\n    var text = item.text != null ? item.text : '';\n    lines.push('[' + timeTag + ']' + text);\n  }\n\n  return lines.join('\\n');\n}\n\n  \nfunction getSvgCode() {\n\t  const {cache,source} = this;\n\t  let code =  cache.getFile(source.getKey()+\"_guaner_svg\") || cache.getFile(\"guaner_svg\") || `<svg viewBox=\"0 0 1000 800\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n    <path d=\"M865 100 h-600c-60 0-110 50-110 110v150l-120 80 120 80v150c0 60 50 110 110 110h600c60 0 110-50 110-110V210c0-60-50-110-110-110z  \" fill=\"none\" stroke=\"边\" stroke-width=\"40\"\/>\n    <text x=\"570\" y=\"565\" font-family=\"Roboto Condensed\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"420\" font-weight=\"bold\" fill=\"字\">\n      数量\n    <\/text>\n  <\/svg>`;\n\t  return String(code)\n}\n\nfunction getChapterSvgCode(){\n    const {cache,source} = this;\n    let code =  cache.getFile(source.getKey()+\"_guaner_svg_chapter\") \n        || cache.getFile(\"guaner_svg_chapter\") || \"\";\n        return String(code);\n}\n\n\n\n\nfunction getSvg(totalnum) {\n    let {\n        java,cache\n    } = this;\n    \n    try{\n    let co = \"#\" + String(java.getReadBookConfigMap()[\"textColor\"]).match(\/.{6}$\/)[0];\n    if (String(java.getThemeConfigMap()[\"isNightTheme\"]) === \"true\") {\n        co = \"#\" + String(java.getReadBookConfigMap()[\"textColorNight\"]).match(\/.{6}$\/)[0];\n    }\n    let color = [co, co];\n    totalnum = totalnum > 999 ? \"999\" : totalnum;\n    let dpstyle = this.getSvgCode();\n \n    if(totalnum === 0){\n        dpstyle = this.getChapterSvgCode();\n    }\n    \n    let svg = dpstyle.replace(\/\"边\"\/g,`\"${color[0]}\"`)\n    .replace(\/\"字\"\/g,`\"${color[1]}\"`)\n    .replace(\/数量\/g,totalnum);\n    return \"data:image\/svg+xml;base64,\" + java.base64Encode(svg);\n    }catch(e){\n        java.log(e)\n    }\n}\n\n\nfunction getImage(comment_total,postid, blogid,pid,type) {\n    const {chapter,java} = this;\n    if(type && this.getChapterSvgCode()){\n       return `<img src=\"data:image\/svg+xml;base64,${this.java.base64Encode(this.getChapterSvgCode().substring(110,120))},{\"click\":\"toReview(0,${postid}, ${blogid}, '${chapter?String(chapter.title).replace(\/\\s+\/g,''):''}',1)\",\"type\":\"jjwx\",\"style\":\"FULL\",\"js\":\"getSvg(0)\"}\">`;\n}\n    \n   return `<img src=\"data:image\/svg+xml;base64,${this.java.base64Encode(this.getSvgCode().substring(110,120))},{\"style\":\"TEXT\",\"type\":\"lofter\",\"js\":\"getSvg(${comment_total})\",\"click\":\"toReview(${comment_total},${postid}, ${blogid}, '${pid}')\"}\">`;\n}\n\n\n\nfunction toReview(comment_total,postid, blogid, pid,t) {\n    const {\n        java,source\n    } = this;\n  let font_size = 13;\n  let contentapi,ptext;\n  if(t==1){\n     contentapi = `https:\/\/api.lofter.com\/comment\/l1\/page.json?postId=${postid}&blogId=${blogid}&offset=0&needGift=1&openFansVipPlan=0&dunType=1`;\n  }else{\n       contentapi = `https:\/\/api.lofter.com\/comment\/pCommentList.json?postId=${postid}&blogId=${blogid}&offset=0&pid=${pid}&imgId=&commentId=`;\n  }\n  let contentJson = java.ajax(contentapi);\n  let jsonData = JSON.parse(contentJson).data.list;\n  let currentUrl = contentapi;\n  \n  if(t!==1){\n  ptext = jsonData[0].quote.replace(\/\\s*\/g,'').replace(\/^(.{40}).*\/,'$1.......');\n  let ytext = jsonData[0].quote;\n  ptext = `<div class=\"p\" style=\"font-size:12px;margin-top:2px;margin-left:12px;display:flex;align-items:center;overflow:auto;max-height:80px\" onclick=\"\n    const p1 = this.querySelector('.p1');\n    const p2 = this.querySelector('.p2');\n    if (p1.style.display !== 'none') {\n        p1.style.display = 'none';\n        p2.style.display = 'block';\n        this.style.alignItems = 'flex-start'; \n    } else {\n        p1.style.display = 'block';\n        p2.style.display = 'none';\n        this.style.alignItems = 'center'; \n    }\n\">\n    <p class=\"p1\" style=\"margin:0;padding:0;color:var(--text-primary)\">\n        <a style=\"color:var(--primary-color);font-weight:bold;\">原文:<\/a>${ptext}\n    <\/p>\n    <p class=\"p2\" style=\"margin-top:3px;padding:0;display:none;color:var(--text-primary)\">\n        <a style=\"color:var(--primary-color);font-weight:bold;\">原文:<\/a>${ytext}\n    <\/p>\n<\/div>\n`;\n  }else{\n      ptext = `<div style=\"width:100%;display:flex;align-items:center;justify-content:center\"><p style=\"font-size:14px;color:var(--primary-color);font-weight:bold;\">${pid}<\/p><\/div>`\n  }\n  \n source.put(\"sourceUrl\",source.getKey());\nlet importHtml = String(java.importScript(\"https:\/\/gitee.com\/guaner001125\/booksource\/raw\/master\/html\/comment.txt\")).split(\"\/\/◎分隔◎\");\n\/\/let importHtml = String(java.importScript(\"\/..\/comment.txt\")).split(\"\/\/◎分隔◎\");\n\n let html = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0\/css\/all.min.css\">\n<style>\n${importHtml[0]}\n<\/style>\n\n<body>\n${importHtml[1]}\n<\/body>\n<\/html>`;\n\n\nhtml = html.replace(\"<!-- Tab栏数据 -->\",ptext)\n.replace(\"<!-- 提示信息栏数据 -->\",`<span class=\"info-bar-stats\" id=\"infoCenterStats\"><span class=\"stat-item\" id=\"showTotal\">已显示<span>0<\/span>条<\/span><span class=\"stat-item\" id=\"statBlocked\">已屏蔽<span>0<\/span>条<\/span>\n<\/span>`)\n.replace(\/class=\"modal-sort\/g,'class=\"modal-sort hide ')\n\n\nlet script = `\nsetTimeout(function() {  \n    ${importHtml[2]}\n},80);\n${importHtml[3]}\n`;\n\nlet createJson = `\nfunction replaceemotes(content,emotes){\n      content = content.replace(\/\\\\[图片\\\\]|\\\\[表情\\\\]\/g,'');\n      emotes?emotes.forEach(x=>{\n          let rex = x.name.replace(\/([\\\\[\\\\]\\\\?\\\\$\\\\^\\\\(\\\\)])\/g,\"\\\\\\\\$1\");\n          let re = new RegExp(rex,'g');\n          let pic = '<img class=\"ef\" src=\"'+x.url+'\">';\n          content = content.replace(re,pic)\n      }):\"\";\n      return content\n  }\n\n\nfunction createJson(url,t){\n    let commentListData = [];\n    let data = {};\n    let commentList = [];\n    if(\/^http\/.test(url)){\n        data = JSON.parse(java.ajax(url));\n    }\n    \n    if(t && t!==1){\n        commentListData = t.data.list;\n        next_offset = t.data.offset;\n        if(t.data.hotList){\n            let hotList = t.data.hotList;\n            hotList.forEach((x,i)=>{\n                hotList[i][\"red\"] = \"热门\";\n            });\n            commentListData = hotList.concat(commentListData)\n        }\n    }else{\n        commentListData = data.data.list;\n        if(t==1){\n            next_modal_offset = data.data.offset\n        }else{\n            next_offset = data.data.offset;\n        }\n    }\n\n    for(i in commentListData){\n        let x = commentListData[i];\n        let comment = {};\n        comment.id = x.id;\n        comment.nickname = x.publisherBlogInfo.blogNickName;\n        comment.comment_body =replaceemotes(x.content,x.emotes);\n        comment.red = x.red??\"\";\n        comment.purple = String(x.publisherBlogInfo.blogId) == \"${blogid}\"?\"作者\":\"\";\n        comment.blue = x.top==1?\"置顶\":\"\";\n        comment.purpleid = comment.purple==\"作者\"?x.publisherBlogInfo.blogId:\"\";\n        comment.green = x.authorFeedBack ?? \"\";\n        comment.reader_id = x.publisherBlogInfo.blogId;\n        comment.meta_left = [java.timeFormat(x.publishTime),x.ipLocation??\"\"];\n        comment.meta_right = [(x.likeCount?'<i class=\"far fa-thumbs-up\"><\/i>'+x.likeCount:\"\")];\n        comment.card_footer_extra = \"${t}\"==\"1\"?x.quote:\"\";\n        comment.image_grid = x.images?x.images.map(x=>x.orign):[];\n        comment.replyNum = x.l2Count;\n        commentList.push(comment)\n    }\n    \n    return commentList\n}\n`;\n\nscript = script.replace(\"\/\/currentUrl变量\",`let currentUrl = \\`${contentapi}\\`;`)\n.replace(\"\/\/一些公用变量\",`\nlet contentJson = ${contentJson};\n`)\n.replace(\/\\\/\\\/加载第一页评论[\\s\\S]+?\\\/\\\/加载第一页评论结束\/,`let jsonData = createJson(\"\",contentJson);\ncurrentList = createElement(jsonData);\ncommentList.innerHTML = currentList;\n`)\n.replace(\"\/\/createJson函数\",createJson)\n.replace(\"\/\/加载更多评论url\",`currentUrl = currentUrl.replace(\/offset=\\\\d+\/,\"offset=\"+next_offset);`)\n.replace('currentPage >= totalPage || next_offset===\"\"','next_offset<0')\n.replace('modalPage >= modalTotalPage || next_modal_offset===\"\"','next_modal_offset<0')\n.replace(\"\/\/第一页更多回复url\",` currentReplyUrl = \\`https:\/\/api.lofter.com\/comment\/l2\/page\/abtest.json?postId=${postid}&blogId=${blogid}&id=$\\{id}&offset=0&fromSrc=&fromId=\\`;`)\n\n.replace(\"\/\/加载更多回复url\",`currentReplyUrl = currentReplyUrl.replace(\/offset=\\\\d+\/,\"offset=\"+next_modal_offset);`)\n\n\n\/\/  java.log(script)\n\n\njava.showBrowser(\"\",html,script,`{\n\t\texpandedCornersRadius:10,\n\t\theightPercentage:0.72\n\t\t}`);\n}\n\n",
    "lastUpdateTime": "1791962150193",
    "loginUi": "[\n        {\n        \"name\": \"❗️点对应功能按钮登录,点✓是不能登录的❗️\",\n        \"type\": \"text\"     \n    },\n    {\n        \"name\": \"账号\",\n        \"type\": \"text\"     \n    },\n    {\n        \"name\": \"密码[或短信验证码]\",\n        \"type\": \"password\"\n },{\n        \"name\": \"📱手机号登录\",\n        \"type\": \"button\",\n        \"action\": \"toLogin('phone')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }\n    },\n    {\n        \"name\": \"🆔LOFTER ID登录\",\n        \"type\": \"button\",\n        \"action\": \"toLogin('id')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"🔢获取短信验证码\",\n        \"type\": \"button\",\n        \"action\": \"getCode()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }\n    },{\n        \"name\": \"🔢验证码登录\",\n        \"type\": \"button\",\n        \"action\": \"toLogin('code')\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }\n    }, {\n        \"name\": \"账号风险验证码\",\n        \"type\":\"text\"   \n    },{\n        \"name\": \"获取账号风险验证码\",\n        \"type\":\"button\",\n        \"action\": \"toCa()\",\n         \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }    \n    },{\n        \"name\": \"立即验证\",\n        \"type\":\"button\",\n        \"action\": \"cap()\",\n         \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 0.4\n        }    \n    },{\n         \"name\": \"查看划线评\",\n        \"type\": \"toggle\",\n        \"chars\": [\"❎\", \"☑️\"],\n        \"default\": \"❎\",\n        \"style\": {\n            \"layout_flexGrow\": 1,               \n            \"layout_flexBasisPercent\": 1\n        }    \n    }\n ]",
    "loginUrl": "@js:\nfunction login() {}\n\nfunction toCa() {\n    cookie.removeCookie(\"https:\/\/www.lofter.com\");\n   cookie.removeCookie(\"📖Lofter\"); java.ajax(\"https:\/\/www.lofter.com\/front\/membership\/store-vip\/verify-phone\");\n    let token = source.getLoginHeaderMap().get(\"lofter-phone-login-auth\");\n    let co = \"LOFTER-PHONE-LOGIN-AUTH=\\\"\" + token + \"\\\";LofterInnerBrowser=true;\"\n\n    co += cookie.getCookie(\"https:\/\/www.lofter.com\");\n    let headers = JSON.stringify({\n        headers: {\n            Cookie: co\n        }\n    });\n    let verifyPhoneCheck = JSON.parse(java.ajax(\"https:\/\/www.lofter.com\/newweb\/phone\/verifyPhoneCheck.json?_=\" + Date.now() + \",\" + headers));\n    if (verifyPhoneCheck.code == 200) {\n        let phone = java.base64Decode(verifyPhoneCheck.data.cPhone);\n        java.toast(\"当前验证手机号:\\n\" + phone);\n        source.put(\"phone\",phone);\n        \/\/发送验证码\n        let imgurl = \"https:\/\/www.lofter.com\/lpt\/photoCaptcha\/getPhotoCaptcha.do?width=180&height=84&\" + Date.now();\n        let code = java.getVerificationCode(imgurl);\n        let u = \"https:\/\/www.lofter.com\/lpt\/getCaptchaPlus.do?_=\" + Date.now();\n        post = JSON.stringify({\n            method: \"POST\",\n            \"body\": \"phone=\" + phone + \"&imageCode=\" + code + \"&clientType=0&sourceType=1&countryCode=86\",headers: {Cookie: co}\n        });\n   \/\/     java.log(post)\n        let r = java.ajax(u + \",\" + post);\n    \/\/    java.log(r);\n        java.toast(JSON.parse(r).desc)\n    }\n}\n\nfunction cap(){\n    \/\/验证验证码\n         try{\n    let token = source.getLoginHeaderMap().get(\"lofter-phone-login-auth\");\n    let co = \"LOFTER-PHONE-LOGIN-AUTH=\\\"\" + token + \"\\\";LofterInnerBrowser=true;\"\n    co += cookie.getCookie(\"https:\/\/www.lofter.com\");\n    \n        let phone = String(source.get(\"phone\"));\n        java.toast(\"当前验证手机号:\\n\" + phone);\n        u = \"https:\/\/www.lofter.com\/newweb\/phone\/checkPhoneCaptcha.json?_=\" + Date.now();\n        post = JSON.stringify({\n            method: \"POST\",\n            \"body\": {\n                \"countryCode\": 86,\n                \"phone\": phone,\n                \"captcha\": result.get(\"账号风险验证码\"),\n                \"device\": String(java.androidId())\n            }\n        });\n        \/\/java.log(post)\n         r =\tjava.post(u,JSON.stringify({\n                \"countryCode\": 86,\n                \"phone\": result.get(\"账号\"),\n                \"captcha\": result.get(\"账号风险验证码\"),\n                \"device\": String(java.androidId())\n            }),{Cookie: String(co),\"content-type\":\"application\/json;charset=UTF-8\"}).body();\n     \/\/\tjava.log(r);\n        java.toast(JSON.parse(r).msg)\n         }catch(e){\n             java.log(e)\n         }\n}\n\n\nfunction getCode() {\n    try {\n    \t\n    \tlet imgurl = \"https:\/\/www.lofter.com\/lpt\/photoCaptcha\/getPhotoCaptcha.do?width=270&height=126&\" + Date.now();\n         \n        \/\/\tjava.log(imgurl)\n        java.toast(\"请输入图片验证码\");\n        let code = java.getVerificationCode(imgurl);\n        let codeurl = \"https:\/\/www.lofter.com\/lpt\/getCaptchaPlus.do,\" + JSON.stringify({\n            \"method\": \"POST\",\n            \"body\": \"clientType=0&phone=\" + result.get(\"账号\") + \"&sourceType=0&imageCode=\" + code\n        });\n        java.toast(JSON.parse(java.ajax(codeurl)).desc)\n        \/\/\tjava.log(java.ajax(codeurl))\n    } catch (e) {\n        java.log(e)\n    }\n}\n\nfunction toLogin(type) {\n    let url = \"https:\/\/www.lofter.com\/lpt\/login.do?product=lofter-android-8.3.20,\";\n    let phone = result ? result.get(\"账号\") : \"\";\n    let pwd = result ? result.get(\"密码[或短信验证码]\") : \"\";\n    let body = \"\";\n    switch (type) {\n        case 'phone':\n            body = `deviceType=0&clientType=0&passport=${java.digestHex(pwd,\"SHA-256\")}&phone=${phone}&sourceType=0&type=0`\n            break;\n\n        case 'code':\n            body = `deviceType=0&clientType=0&phone=${phone}&captcha=${pwd}&sourceType=0&type=1`\n            break;\n\n        case 'id':\n            url = \"https:\/\/www.lofter.com\/lpt\/account\/login.do?product=lofter-android-8.3.20,\";\n            body = `password=${java.digestHex(pwd,\"SHA-256\")}&blogName=${phone}`;\n            break;\n    }\n\n    let post = JSON.stringify({\n        \"method\": \"POST\",\n        \"body\": String(body)\n    });\n    \/\/\tjava.log(post)\n    let headers = {}\n    let d = JSON.parse(java.ajax(url + post));\n    java.toast(d.desc);\n\n    if (d.result == 0) {\n        headers[\"lofter-phone-login-auth\"] = d.token;\n        source.putLoginHeader(JSON.stringify(headers));\n    } else if (type == \"id\" && d.status == 200) {\n\n        headers[\"authorization\"] = \"ThirdParty \" + d.token;\n        source.putLoginHeader(JSON.stringify(headers));\n\n    }\n}",
    "respondTime": 2608,
    "ruleBookInfo": {
        "author": "$.response.blogInfo.blogNickName||$.response.posts[0].post.blogInfo.blogNickName||$.data.blogInfo.blogNickName\n<js>\nif(baseUrl.includes(\"fansonly\/\"))\nresult = cache.get(\"author\");\nif(\/origin\/.test(baseUrl) && baseUrl.includes('\"type\":2'))\nresult = result+\"【有声】\"\nresult;\n<\/js>",
        "canReName": "1",
        "coverUrl": "$.response.collection.coverUrl||$..firstImageUrl[0]||$..coverUrl||$..blogInfo.bigAvaImg||$..bigAvaImg@put:{\"page\":\"$.response.blogInfo.blogStat.publicPostCount||$..collection.postCount\"}##(http.*)\\n*##$1###",
        "init": "<js>\n\/*\ntry{\ncoo = cookie.getCookie(\"https:\/\/www.lofter.com\");\n\nlofter = String(coo).match(\/;\\s(LOFTER-[^-]+-LOGIN-AUTH)=(.*?);\/);\n\nheader = {};\nheader[lofter[1]] = lofter[2];\n\nsource.putLoginHeader(JSON.stringify(header));\nresult;\n}catch(e){\n\tjava.log(e)\n\tresult = result\n}\n*\/\ncookie.removeCookie(\"https:\/\/www.lofter.com\/\");\ncookie.removeCookie(\"📖Lofter\");\nif(\/origin\/.test(baseUrl) && !baseUrl.includes('\"type\":2')){\nurl = baseUrl.split(',{\"origin')[0].replace(\/getCollectionSimple\/,'getCollectionDetail')\nif(baseUrl.includes(\"getCollection\")){\n\turl = url.replace(\/7.4.4\/,'8.3.20')\n}\njava.put(\"url\",url)\nresult = java.ajax(url);\n}else if(\/origin\/.test(baseUrl) && baseUrl.includes(\"collectionid\")){\nurl = baseUrl.replace(\/,\"origin\":\".*?\",\"type\":2\/,\"\");\njava.put(\"url\",url);\nresult = java.ajax(url);\n}\nresult\n<\/js>",
        "intro": "@js:\na='{{$.response.collection.description}}';\nb='{{$.response.blogInfo.blogNickName}}';\nc=java.getString('$.response.posts[0].post.digest||$.response.collection.description||$.response.blogInfo.selfIntro');\n\nbook.putCustomVariable(\"h:\"+String(java.getString(\"$..homePageUrl\")).replace(\/\\n.*\/g,'')+\"\\n\"+\"p:\"+String(java.getString(\"$..blogPageUrl\")).replace(\/\\n.*\/g,''));\n\nresult =\"&emsp;&emsp;\"+c;\n\ncname=\"{{$.response.posts[0].post.postCollection.name}}\";\n\ncdes=java.getString('$.response.posts[0].post.postCollection.description');\nccount=\"{{$.response.posts[0].post.postCollection.postCount}}\";\nif(cname || a){\nresult=result+\"\\n&lrm;\\n🈴所属合集:\"+cname+\"\\n📜合集介绍:\"+cdes+\"\\n\"+\"🔢合集章节总数:\"+ccount\n+\"\\n🔍搜索合集:#\"+cname+\"<关闭精确搜索>\";\n\nresult = String(result).replace(\/📜合集介绍:\\n\/,'').replace(\/🈴所属合集:\\s+🔢合集章节总数:\\s+🔍搜索合集:#<关闭精确搜索>\/g,'')\n}\n\nresult += `<br>&lrm;<br>--复制下面的文字,可将作者添加发现或者订阅--<br>&lrm;<br>${book.author}::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=${String(java.getString(\"$..blogInfo.blogName\")).match(\/(.*)\\n*\/)[1]}.lofter.com&offset={\\{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}`",
        "kind": "$.postCollection&&$.response.collection.tags\n@js:\nname = String(java.getString(\"$..blogInfo.blogName\")).match(\/(.*)\\n*\/)[1];\nbook.putVariable(\"showAudio\",java.getString(\"$.response.collection.showAudio\"));\nbook.putVariable(\"name\",name);\nresult",
        "name": "$.response.collection.name||$..post.title||$..longInfo.title||$.data.grainInfo.name||$..post.digest||$.response.blogInfo.blogNickName||$.response.posts[0].post.blogInfo.blogNickName||$.data.blogInfo.blogNickName\n<js>\nif(baseUrl.includes(\"fansonly\/\"))\nresult = cache.get(\"author\")+\"的私享圈\";\nresult;\n<\/js>\n<js>##<\/*\\w.*?><\/js>",
        "tocUrl": "$.response.blogsetting.blogId\n@js:\nif(result){\nid='{{$.response.blogsetting.blogId}}';\nlink='{{$.response.blogLink}}';\nurl='http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-6.9.2,';\npost={\"method\": \"POST\",\n\"body\": \"targetblogid=\"+id+\"&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=\"+link+\"&offset=0&method=getPostLists&postdigestnew=1&returnData=1&limit=500&checkpwd=1&needgetpoststat=1\"}\nresult=url+JSON.stringify(post);\njava.put('url',result)}else if(baseUrl.match(\/postCollection|origin\/)){\nresult=java.get('url')\n}",
        "wordCount": "{{$.data.grainInfo.postCount}}篇文章##^篇文章$"
    },
    "ruleContent": {
        "callBackJs": "if(event == \"clickCustomButton\" || event == \"clickShareBook\"){\n\t let bbb;\n\t\tif(!chapter){\n\t     \tlet bbb = String(book.getVariable(\"custom\"));\t\t\n\t     \tlet h = bbb.match(\/h:(.*)\/)[1];\n\t     \tlet p = bbb.match(\/p:(.*)\/)[1];\n\t     \tlet r = (p || h).replace(\/com$\/,'com\/');\n\t     \tif(event == \"clickCustomButton\"){\n\t     \t\t  r = r.replace(\/https?\/,'lofter');\n\t     \t\t  java.openUrl(r)\n\t     \t}else{\n\t     \t\t\t if(book.bookUrl.includes(\"post\/detail.api\")){    \t  \n\t     \t\t  \t    java.copyText(r);\n\t     \t\t       java.toast(`已复制链接:\\n${r}`);\n\t     \t\t       true\n\t     \t\t   }\t        \t     \t\t  \t \t\t  \n\t     \t\t}\n\t\t}else{\t\t\t\n\t\t\tlet url = String(chapter.url);\n\t\t\t\n\t\t\tlet blogid = url.match(\/blogid[=_](\\d+)\/)?.[1];\n\t\t\tif(blogid){\n\t\t\tlet postid = url.match(\/postid=(\\d+)\/)[1];\n\t\t\ttoReview(\"\",postid, blogid, chapter.title,1)\n\t\t\t}\n\t\t\t}\t\t\t\n\t}\n\n\nif(event == \"clickAuthor\"){\n\tblogid = book.bookUrl.match(\/(?:blogid|grainUserId)(?:_|=)(\\d+)\/)[1];\n\turl = `https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-8.3.20#${blogid}❌${book.author},`\npost = {\"method\":\"POST\",\n\t\"body\":`targetblogid=${blogid}&method=getCollectionList&needViewCount=1&blogid=${blogid}`\t}\n\turl = url+JSON.stringify(post);\n\tjava.open(\"explore\", url, book.author+\"的合集\")\n\ttrue\n\t}\n\n\nif(event == \"longClickAuthor\"){\n\tblogid = book.bookUrl.match(\/(?:blogid|grainUserId)(?:_|=)(\\d+)\/)[1];\n\turl = `http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-8.3.20#${blogid}❌${book.author},`\npost = {\"method\":\"POST\",\"body\":\"targetblogid=\"+blogid+\"&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}\n\turl = url+JSON.stringify(post);\n\tjava.open(\"explore\", url, book.author+\"的动态\")\n\ttrue\n\t}\n\t\nif(event == \"clickBookName\"){\n    let url = String(book.bookUrl).replace(\/,{\"ori.*\/,'').replace(\/,\"origin\":\".*?\"|,\"type\":2\/g,\"\");\n    if(url.includes(\"getCollection\")){\n            let sort = JSON.stringify({\n                [\"📖《\"+book.name+\"》倒序\"]:url.replace(\/offset=\\d+\/,'offset={{(page-1)*50}}').replace(\/order=\\d+\/,'order=0'),\n                \"正序\":url.replace(\/offset=\\d+\/,'offset={{(page-1)*50}}').replace(\/order=\\d+\/,'order=1')\n             });\n        java.open(\"sort\",sort,book.name,\"Lofter\")      \n    }else{\n        java.open(\"rss\",url,book.name,\"Lofter\");\n    }\n\ttrue\n}\n\nif(event == \"longClickBookName\"){\n\tlet blogid = book.bookUrl.match(\/(?:blogid|grainUserId)(?:_|=)(\\d+)\/)[1];\n\tlet url = \"https:\/\/api.lofter.com\/newapi\/fansvip\/fansonly\/post\/all.json?targetBlogId=\"+blogid+\"&offset=0\"+',{\"origin\":\"📖Lofter\"}';\ncache.put(\"author\",book.author,30);\tjava.openUrl(\"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(url));\n\ttrue\n}\n\nif(event == \"longClickBookLabel\"){\n    let bookurl = String(book.bookUrl);\n    if(bookurl.includes(\"collectionid\") && String(book.getVariable(\"showAudio\"))==\"1\"){\n        url = bookurl.split(\/,{\"origin.*\/)[0].replace(\/\\}$\/,',\"origin\":\"📖Lofter\",\"type\":2}');\n       java.openUrl(\"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(url));\n    }else{\n        java.toast(\"此文章不支持创建有声副本\")\n    }\n    true\n}",
        "content": "<js>\nlet srcall = src;\nif(\/data:video\/.test(baseUrl)){\n\tbaseUrl = java.hexDecodeToString(result);\n    if(chapter.index == book.durChapterIndex)\n\tjava.startBrowser(baseUrl,\"视频\",null);\n\tresult = \"请刷新本页观看视频\\n视频链接:\"+baseUrl\n}else if(String(book.author).includes(\"【有声】\")){\n    const it = (JSON.parse(src).data?.audioPost?.toneInfos || [])[0];\n    if (!it?.unlocked) {\n        result = \"\";\n        java.longToast('无音轨');\n    } \n    result = it?.audioUrl ?? \"\"\n}else{\nlet postid = java.getString(\"$..post.id\");\nlet blogid = java.getString(\"$..post.blogId\");        \nlet returnContent = [];\nlet giftContent = [];\nlet content = String(java.getString(\"$..content\"));\nlet embed = String(java.getString(\"$..embed\"));\nlet videoContent = \"\";\nlet videoImg = \"\";\n\nif(embed){\n    embed = JSON.parse(embed);\n    videoContent = embed?.hlsUrl ||  embed?.video_down_url || embed?.originUrl;\n    videoImg = embed?.video_first_img;\n}\nlet posts = JSON.parse(src)?.response?.posts??[];\nlet imgs = eval(String(java.getString(\"$..photoLinks\")));\nlet img = \"\";\nimgs?imgs.forEach(x=>{\n\tx?img += \"\\n<img src=\\\"\"+x.orign.replace(\/%7C.*\/g,'')+\"\\\">\\n\":\"\"\n}):\"\";\n\nposts.forEach(x=>{\n\t   let returnContents = x.post?.returnContent??[];\n\t   returnContents.forEach(y=>{\n           let r = {\n               title : y.planTypeName?\"\\n🏷\"+y.planTypeName:\"\",\n               content:y.content?y.content:\"\",\n               imgs:y.images?y.images:[]\n           }\n           returnContent.push(r);\n\t   \t})\n});\n\n\nlet f = 0;\n\ntry{\n\tbook.getVariable();\n\tf = 1;\n}catch(e){};\nlet dpcontent = \"\";\nlet pidall = [];\nfunction getDpContent(content){\n    let api = `https:\/\/api.lofter.com\/comment\/pCommentCounts.json?postId=${postid}&blogId=${blogid}`;\n    pidall = JSON.parse(java.ajax(api)).data.list;\n    java.setContent(content);\n\tlet c = \"\";\n\tcontent = java.getElements(\"@@tag.p\").toArray().map((x,i)=>{\n\t\tvar pid = String(x.attr(\"id\"));\n\t\tvar originalText = x.html(); \n   var matchedItem = pidall.find(function(item) {\n       \n       if(\/^p_i\\d+$\/.test(item.pid)){\n           pid = \"p_i\"+i;\n       }\n       \n        return item.pid === pid && item.count!==0;\n    });\n    if (matchedItem && String(x.text()).trim()!==\"\") {\n        var comment_total = matchedItem.count;                 \n        var pid = matchedItem.pid;                                 \n        var imageOrContent = getImage(comment_total, postid, blogid, pid);\n        return originalText+imageOrContent;      \n    }else{\n    \t return originalText\n    \t}\n\t\t}).join(\"\\n\");\n    return content;\n}\n\nfunction getDpReturn(content){\n     content = content.split(\"\\n\").map((x,i)=>{\n\t\t\t   originalText = String(x);\n\t\t\t   matchedItem = pidall.find(function(item,index) {\t\t\t    \n\t\t\t   return (item.pid.match(\/r_.*?_i(\\d+)\/)?item.pid.match(\/r_.*?_i(\\d+)\/)[1]:item.pid) == i;\t\t\t\n              });\n\t\t\tif (matchedItem) {\n                comment_total = matchedItem.count;                 \n                pid = matchedItem.pid;                               \n                imageOrContent = getImage(comment_total, postid, blogid, pid);\n                return originalText.replace(\/\\s+$\/g,'')+imageOrContent;      \n            }else if(originalText.trim()!==\"\"){\n                return originalText\n             }\n    }).join(\"\\n\");\n            return content\n}\n\n\n\nfunction getGift(){\n    let url =\"https:\/\/api.lofter.com\/v1.1\/trade\/gift\/post\/newSupportInfo?postId=\"+postid +\"&blogId=\"+ blogid +\"&openFansVipPlan=0&vipFans=0\";\n\t$  = JSON.parse(String(java.ajax(url)));\n\tl = $.data.gainReturnGifts.length?$.data.gainReturnGifts:$.data.returnGifts;\n\tls = [];\n    \n    \n    if(returnContent.length>0){\n          if(content.match(\/<p>[^<]*<\\\/p>[^<]*<p id=\"p_[^\"]+\"\/)){\n                content = content.replace(\/<\\\/p>[^<]*<p>\/,'');\n                returnContent = [];\n                return\n          }\n        \n        \n            returnContent.forEach((x,i)=>{\n                let d = l[i];\n                  returnContent[i].title = \"\\n🏷 \"+d.planType.name+\" \"+(d.title?d.title:\"\")+(d.promotion?\"\\n【\"+d.promotion+\"】\\n\":\"\")\n            });\n            return\n    }\n    \n    \n    \n\tl.forEach(x=>{\n\t\turl = \"https:\/\/api.lofter.com\/v1.1\/trade\/gift\/myReturnGift?id=\"+x.id+\"&postId=\"+postid+\"&blogId=\"+blogid;\n\t\tls.push(url)\n\t});\n    \n\tjava.ajaxAll(ls).forEach((x,i)=>{\n        let y = JSON.parse(x.body());\n        let d = y.data.plan;\n        if(d){\n        let r = {\n            title : \"\\n🏷 \"+d.planType.name+\" \"+(d.title?d.title:\"\")+(d.promotion?\"\\n【\"+d.promotion+\"】\\n\":\"\"),\n            content :d.content?d.content:\"\",\n            imgs:d.images?d.images:\"\"\n        }\n        \n        }else{\n            let d = l[i];\n            r = {\n                title : \"\\n🏷 \"+d.planType.name+\" \"+(d.title?d.title:\"\")+(d.promotion?\"\\n【\"+d.promotion+\"】\\n\":\"\"),\n            content : \"❌\"+y.msg+\"❌\"+\"\\n\"+d.defaultPromotion+\"\\n\"+d.digest,\n            imgs:[]\n            }\n        }\n        giftContent.push(r);\n    });\n    \n}\n\ngetGift();\nif(giftContent.length>0){\n    returnContent = giftContent;\n}\n\n\nif(\/☑️\/.test(M(\"查看划线评\")) && f===1){\n    content = getDpContent(content)+img;\n    returnContent.forEach(x=>{\n        let imgs = x.imgs.map(x=>`<img src=\"${x.raw}\">\\n`).join(\"\");\n        content += x.title+\"\\n\" + getDpReturn(x.content)+\"\\n\"+imgs;\n    });\n}else{\n\t  \n    content = java.getString(\"@@tag.p@html\",content)+img;\n    returnContent.forEach(x=>{\n        let imgs = x.imgs.map(x=>`<img src=\"${x.raw}\">\\n`).join(\"\");\n        content += x.title+\"\\n\" + x.content +\"\\n\"+ imgs;\n    });\n}\n\nif(videoContent){\n    if(chapter.index == book.durChapterIndex)\n\tjava.startBrowser(videoContent,\"视频\",null);\n    videoContent = \"\\n❗️刷新本章节或点击图片播放视频❗️\\n视频链接:\"+videoContent+\"\\n\"+`<img src=\"${videoImg},{\"click\":\"java.startBrowser('${videoContent}','视频',null)\"}\">\\n`;\n    \n}else{\n    videoContent = \"\"\n}\n\n\nresult = content\n.replace(\/<img[^>]*?src[^>]*?prompt_list_risk[^>]*?>\/g,'')\n.replace(\/<a[^>]*?store-vip\\\/verify-phone\"[^>]*?>\/,'当前账号存在风险,需验证。\\n(❗️要看彩蛋请完成验证后刷新正文)\\n1、点击登录。\\n2、点击获取账号风险验证码\\n3、填入验证码\\n4、点击立即验证\\n5、提示成功即可刷新正文获取内容')\n+videoContent+(getChapterSvgCode()?getImage(0,postid,blogid,\"\",1):\"\");\n}\nresult\n<\/js>\n##tbc\\.|【成为我的高级粉丝,解锁我的回礼与海量权益】|【赠送.*?即可获得回礼】##<br>",
        "imageStyle": "FULL",
        "replaceRegex": "<js>\nresult = result.replace(\/src=\"((?:(?!.*;base64,).)*)\"\/g,`src=\"$1,{\"headers\":{\"referer\":\"{{$..blogPageUrl}}\"}}\"`)\n.replace(\/\\},\\{\"headers\/g,',\"headers')\n<\/js>",
        "subContent": "<js>\nresult = \"\";\nconst it = (JSON.parse(src).data?.audioPost?.toneInfos || [])[0];\nif(book.type != 32){\n\tresult = \"\";\n}else if (!it?.unlocked && book.type == 32){\n\tresult = \"[00:00.00]无音轨,不支持播放\";    \n}else{\n    let subtitleUrl = it.subtitleUrl;\n    let subtitle = String(java.ajax(subtitleUrl))\n    result = jsonToLrc(subtitle);\n}\nresult\n<\/js>"
    },
    "ruleExplore": {
        "author": "$.post.blogInfo.blogNickName||$.blogInfo.blogNickName",
        "bookList": "<js>result.replace(\/null\/g,'')<\/js>\n$.response.items[*]||$.response.posts[*]||$.response.collections[*]||$.data.collections[*]||$.data.list[*]",
        "bookUrl": "@js:url='{{$.post.blogId||$.post.blogPageUrl||$..postView.blogId}}';\nid='{{$.post.id||$.id||$.collectionId||$..postView.id}}';\nbody=\"targetblogid=\"+url+\"&postid=\"+id;\nresult='https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"'+String(body)+'\"}';\nif(!url){\n\tblogid = baseUrl.match(\/(\\d+)❌\/)?.[1]||java.getString(\"$.blogId\");\t result=`https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-8.3.20,{\"method\": \"POST\",\"body\":\"targetblogid=${blogid}&method=getCollectionSimple&offset=0&limit=2000&blogid=${blogid}&collectionid=${id}&order=1\"}`;\n\t}",
        "coverUrl": "$.post||$.coverUrl||$..postView.firstImageUrl[0]||$..postView.firstImage.orign||$.blogInfo.bigAvaImg\n@js:if(result.match(\/firstImageUrl=\\[\"\",\"\"\\]\/)){\nresult=result.match(\/bigAvaImg=(.*?),\/)?result.match(\/bigAvaImg=(.*?),\/)[1]:'';}else if(\/^http\/.test(result)){\n\tresult = result\n\t}else{\nresult=result.match(\/firstImageUrl=\\[\"([^\"]+)\"\/)?result.match(\/firstImageUrl=\\[\"([^\"]+)\"\/)[1]:\"\"\n}",
        "intro": "{{$.post.digest||$..postView.digest||$..postView.selfIntro}}\n<br>&lrm;<br>\n--复制下面的文字,粘贴至发现规则添加用户--\n{{$.post.blogInfo.blogNickName}}::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"targetblogid={{$.post.blogInfo.blogId}}&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain={{$.post.blogInfo.blogName}}.lofter.com&offset={{'\\{\\{(page-1)*18\\}\\}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}'}}\n@js:\nif(\/❌\/.test(baseUrl)){\n\tresult = `<br>&lrm;<br>\n--复制下面的文字,粘贴至发现规则添加用户--\n${baseUrl.match(\/❌(.*)$\/)[1]}::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"targetblogid=${baseUrl.match(\/(\\d+)❌\/)[1]}&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&offset={{'\\{\\{(page-1)*18\\}\\}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}'}}`\n\t}\nresult",
        "kind": "$.post.tag||$.tags||$..postView.tagList[*]",
        "lastChapter": "$.post.publishTime||$.postCount||$.unreadCount||$..postView.publishTime\n<js>\nif(\/\\d{13}\/.test(result)){\nresult=java.timeFormat(parseInt(result));\njava.put('time',result)\n}else{\n\tresult = result+\"篇文章\"\n\tif(String(java.getString(\"$.unreadCount\")))result=\"更新\"+result\n\t}\n<\/js>\n##^篇文章$",
        "name": "$..postView.title||$..postView.digest||$..postView.selfIntro||$.post.title||$.post.noticeLinkTitle||$.post.digest||$.post.blogInfo.blogId||$.post.blogPageUrl||$.name##<\/*\\w.*?>"
    },
    "ruleSearch": {
        "author": "$.blogInfo.blogNickName||$.blogName||$..postView.blogInfo.blogNickName",
        "bookList": "<js>\n\nlet a = JSON.parse(result);\nif(a.data && a.data.insertion){\n\t\ta.data.posts.unshift(a.data.insertion)\t\n}else if(a.data && a.data.collection){\n\ta.data.collections = a.data.collections?a.data.collections:[];\n\t  a.data.collections.unshift(a.data.collection);\n}\n\nresult = JSON.stringify(a);\n\n<\/js>\n$.data.collections[*]&&$.data.posts[*]&&$.data.blogs[*]&&$.data.grainList[*]",
        "bookUrl": "$.postPageUrl||$..postView.postPageUrl\n@js:\nif(!result){\n    if(!'{{$.name||$..postView.name}}'){\n        id='{{$.blogId||$..postView.blogId}}';\n        result='http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-8.3.20,{\"method\": \"POST\",\"body\":\"targetblogid='+id+'&method=getBlogInfoDetail&returnData=1&checkpwd=1&needgetpoststat=1\"}'\n    }else if(\/grain.json\/.test(baseUrl)){\n        result = \"https:\/\/api.lofter.com\/api-grain\/grain\/getDetail.json?grainId={{$.id||$..postView.id}}&offset=0&grainUserId={{$.userId||$..postView.userId}}\"\n    }else{\n        blogid='{{$.blogId||$..postView.blogId}}';\n        id='{{$.id||$..postView.postCollection.id}}';\n        name='{{$.blogName||$..postView.blogInfo.blogNickName}}';\n        java.put('name',name);\n        result='https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-8.3.20,{\"method\": \"POST\",\"body\":\"blogdomain='+name+'.lofter.com&method=getCollectionDetail&offset=0&limit=2000&blogid='+blogid+'&collectionid='+id+'&order=1\"}';\n        java.put('url',result)\n    }\n}else{\n    body=\"blogdomain=_blogid_{{$.blogId||$..postView.blogId}}.lofter.com&postid={{$.id||$..postView.id}}\";\n    result='https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"'+String(body)+'\"}';\n};\n",
        "checkKeyWord": "https:\/\/api.lofter.com\/newapi\/fansvip\/fansonly\/post\/all.json?targetBlogId=820675052&offset=0,{\"origin\":\"📖Lofter\"}",
        "coverUrl": "$.firstImageUrl[0]||$.blogInfo.bigAvaImg||$.bigAvaImg||$.coverUrl||$..postView.firstImageUrl[0]",
        "intro": "{{$.digest||$.selfIntro||$.posts[0].digest||$.description||$..postView.digest||$..postView.selfIntro}}",
        "kind": "$.tagList[*]||$.tags[*]||$..postView.tagList[*]",
        "lastChapter": "$.publishTime||$..postView.publishTime\n<js>\nlet title = java.getString('$.posts[0].title||$.posts[0].digest');\nif(result){\nresult?result=java.timeFormat(parseInt(result)):'';\njava.put('time',result)}else if(title){\n\tresult = title\n\t}else{\n\tresult = \"{{$.postCount}}篇文章\"\n}<\/js>\n##<\/*\\w+.*?>|^0*篇文章$|^篇文章$",
        "name": "$..postView.title||$..postView.digest||$..postView.selfIntro||$.title||$.noticeLinkTitle||$.digest||$.blogInfo.blogNiceName||$.blogNickName||$.name\n<js>\nprefix = java.get(\"prefix\");\nresult = \/[@#%#]\/.test(prefix)?prefix+result:result\n<\/js>\n##<\/*\\w.*?>"
    },
    "ruleToc": {
        "chapterList": "$..posts[*]||$.response.items[*]||$.data.list[*]@put:{\"blogname\":\"$..blogName\"}\n<js>\n\nif(result.length){\n\t   java.put(\"chapterlength\",result.length);\n\t}else{\n\t\tjava.put(\"chapterlength\",1);\n\t\tresult = \"[{'title':'暂无目录'}]\"\n\t\t}\nif(String(book.author).includes(\"【有声】\"))\nbook.type = 32\nresult\t\t\n<\/js>\n$.[*]",
        "chapterName": "$.post.title||$.post.digest||$.post.blogInfo.blogNickName||$..postView.title||$..postView.digest||$.title\n<js>if(result){\nresult=result\n}else{result=book.name}\nresult = String(result).replace(\/<\\\/*\\w.*?>\/g,'')\nif(result.length>50){\n\tresult = String(result).replace(\/(^.{1,25})[\\s\\S]+\/g,'$1……')\n\t}\nresult\n<\/js>",
        "chapterUrl": "<js>\nlet h = String(java.getString(\"$..homePageUrl\")).replace(\/\\n.*\/g,'');\nlet p = String(java.getString(\"$..blogPageUrl\"));\nlet r = (p || h).replace(\/https?\/,'lofter').replace(\/com$\/,'com\/');\nif(!p && !h){\n\tr = \"lofter:\/\/\"+java.getString(\"$..blogName\")+\".lofter.com\/post\/\"+java.getString(\"$..permalink\")\t\n}\n\t\nlet js = `\"js\":\"if(!book)java.openUrl('${r}')\"`\n\nif(String(book.author).includes(\"【有声】\")){\n    const pid = \"{{$.post.id||$..postView.id}}\";\n     const b = \"{{$.post.blogId||$..postView.blogId}}\";\n     const c = baseUrl.match(\/collectionid=(\\d+)\/)?.[1];\n     const A = \"https:\/\/api.lofter.com\/newapi\/post\/audio\/\";\n     const Q = `blogId=${b}&collectionId=${c}`; \n     result = `${A}info.json?postId=${pid}&${Q}`;\n     \n}else if(\/postCollection|blogHomePage|api-grain|fansonly\/.test(baseUrl)){\tbody=\"blogdomain=_blogid_{{$.post.blogId||$..postView.blogId}}.lofter.com&postid={{$.post.id||$..postView.id}}&needgetpoststat=1&supportposttypes=1,2,3,4,5,6&requestType=0\";\nresult=`https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-8.3.20,{\"method\":\"POST\",\"body\":\"${String(body)}\"}`\n}else if(\/hlsUrl\":\"(.*?)\"\/.test(result)){\n\t\tresult = `data:video;base64,${java.base64Encode(String(result).match(\/hlsUrl\":\"(.*?)\"\/)[1])},{\"type\":\"\"}`\n}else{\n\t result = baseUrl\n}\nresult = \/}$\/.test(result)?result.replace(\/}$\/,`,${js}}`):result+`,{${js}}`;\n<\/js>",
        "nextTocUrl": "<js>\nlist=[];\nif(\/limit=500\/.test(baseUrl)){\npages=java.get(\"page\");\npage=parseInt(pages\/500);\nurl=String(java.get(\"url\"));\nif(page>6){\npage=6\n}else{page=page}\nfor(i=1;i<=page;i++){\nlist.push(url.replace(\/offset=\\d+\/,'offset='+(parseInt(i)*500)))\n}\n}else if(\/api-grain|fansonly\/.test(baseUrl)){\n\toffset = \"{{$.data.offset}}\";\n\tif(offset!=\"-1\"){\n\tlist = baseUrl.replace(\/offset=\\d+\/,'offset='+offset);\n}\n\t}\nlist\n<\/js>",
        "updateTime": "$.post.publishTime\n<js>\nif(\/api-grain\/.test(baseUrl)){\n\tresult = \"所属合集:\"+java.getString(\"$..postCollection.name\");\n\t}else{\n(result?java.timeFormat(parseInt(result)):java.get('time'))+\" \"+\"所属合集:\"+java.getString(\"$..postCollection.name\")\n}\n<\/js>\n##所属合集:$"
    },
    "searchUrl": "@js:\nlet prefix = key.charAt(0);\njava.put(\"prefix\",prefix);\nlet offset = '{\\{(page-1) *' + (prefix === '%' ? '10}' : (prefix === '@' ? '10}' : '20}')) + '}';\nlet baseUrl = \"https:\/\/api.lofter.com\/newsearch\/\"\nswitch(prefix) {\n    case '@':\n        result = baseUrl+'blog.json?key=' + key.slice(1)+ '&limit=10&offset=' + offset;\n        break;\n    case '#':\n    case '#':       \n        result = baseUrl+'collection.json?key=' + key.slice(1) + '&limit=20&offset=' + offset;\n        break;\n    case '。':\n         result = baseUrl+'{{page==1?\"v2\/all.json\":\"all\/post.json\"}}?key=' + key.slice(1)  + '&sortType=0&version=1&offset=' + offset + '&limit=20';\n         break\n    case '%':\n        result = baseUrl+'grain.json?key='+key.slice(1)+'&limit=10&offset=' + offset;\n        break;\n    default:\n        let header = {\n            \"headers\": {\n                \"Content-Type\": \"application\/x-www-form-urlencoded;charset=utf-8\",\n                \"deviceid\": java.androidId(),\n                \"if-modified-since\": String(new Date()).replace(\/(.*?)\\s(.*?)\\s(.*?)\\s(.*?)GMT.*\/,'$1, $3 $2 $4 GMT')\n            }\n        };\n       \n        result = baseUrl+'post.json?key=' + key + '&sortType=0&version=1&offset=' + offset + '&limit=20,' + JSON.stringify(header);\n}\n",
    "weight": 0
}
广告