📖Lofter
📖Lofter
guaner001125 (317)13小时前
1、改为登录UI登录,之前网页登录过的,重新登录。
支持手机登录和lofterid登录,优选手机登录。
2、精彩专区会员显示彩蛋内容
{
"bookSourceComment": "需登录\n◎搜索格式◎\n1、搜索用户<关闭精确搜索>\n@用户名\n2、搜索合集<关闭精确搜索>\n#合集\n3、搜索粮单\n%粮单名<关闭精确搜索>\n4、搜索文章,直接搜索\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部分目录章节比较多,加载时间久,出现目录加载失败,请尝试刷新,因为可能是请求失败导致的",
"bookSourceName": "📖Lofter",
"bookSourceType": 0,
"bookSourceUrl": "📖Lofter",
"bookUrlPattern": "https?:\/\/api\\.lofter\\.com\/(?!.*newsearch).*",
"concurrentRate": "700",
"customButton": false,
"customOrder": 85,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": true,
"exploreUrl": "🐾足迹::https:\/\/api.lofter.com\/v2.0\/history.api?product=lofter-android-6.16.2,{\"method\":\"POST\",\"body\":\"supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain={{java.ajax(\"https:\/\/www.lofter.com\/\").match(\/class=\"lg2\">([^<]+)<\/)[1]}}&offset={{(page-1)*18}}&method=getList&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"} \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溏乃言::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"targetblogid=523035851&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=reroi.lofter.com&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}\n\n砂上雪::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=taste-s.lofter.com&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}",
"header": "@js:\nid=String(java.androidId());\nJSON.stringify({\n\"Content-Type\": \"application\/x-www-form-urlencoded;charset=utf-8\",\n\"deviceid\":id})",
"jsLib": "function getImage(comment_total,postid, blogid,pid){\n\tlet d = String(Date.now()).replace(\/^\\d{6}\/,'');\n return `<img src=\"data:image\/svg+xml;base64,,{\"style\":\"text\",\"type\":\"lofter\",\"js\":\"getSvg(${comment_total},${postid}, ${blogid}, '${pid}',${d})\"}\">`;\n}\n\nfunction generateHTML(yuan,jsonData) {\n\t\n let html = `\n<!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 <title>段评内容<\/title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;\n max-width: 800px;\n margin: 0 auto;\n padding: 20px;\n background-color: #f5f5f5;\n line-height: 1.6;\n }\n .comment-container {\n background: white;\n border-radius: 8px;\n margin-bottom: 15px;\n padding: 15px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n .comment-main {\n margin-bottom: 10px;\n }\n .comment-text {\n color: #333;\n margin-bottom: 8px;\n white-space: pre-wrap;\n }\n .comment-meta {\n font-size: 12px;\n color: #666;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .comment-user {\n font-weight: 500;\n color: #1a73e8;\n }\n .comment-time {\n color: #999;\n }\n .comment-likes {\n color: #ff6b35;\n font-size: 12px;\n }\n .replies {\n margin-left: 20px;\n border-left: 2px solid #e0e0e0;\n padding-left: 15px;\n margin-top: 10px;\n }\n .reply {\n background: #f8f9fa;\n padding: 10px;\n border-radius: 6px;\n margin-bottom: 8px;\n font-size: 14px;\n }\n .reply:last-child {\n margin-bottom: 0;\n }\n .reply-text {\n color: #333;\n margin-bottom: 5px;\n white-space: pre-wrap;\n }\n .reply-meta {\n font-size: 11px;\n color: #666;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .reply-user {\n font-weight: 500;\n color: #1a73e8;\n }\n .reply-time {\n color: #999;\n }\n .reply-likes {\n color: #ff6b35;\n font-size: 11px;\n }\n h1 {\n text-align: center;\n color: #333;\n margin-bottom: 30px;\n }\n .yuan-text {\n background: linear-gradient(135deg, #f0f0f0 0%, #e0e0e0 100%); \n color: black;\n padding: 20px;\n border-radius: 10px;\n font-size: 1em;\n font-weight: bold;\n margin-bottom: 20px;\n box-shadow: 0 4px 8px rgba(0,0,0,0.2);\n }\n <\/style>\n<\/head>\n<body>\n \n <div class=\"yuan-text\">${yuan}<\/div>\n`;\n\n jsonData.forEach((comment, index) => {\n html += `\n <div class=\"comment-container\">\n <div class=\"comment-main\">\n <div class=\"comment-text\">${comment.text.replace(\/\\n\/g, '<br>')}<\/div>\n <div class=\"comment-meta\">\n <span class=\"comment-user\">${comment.user}<\/span>\n <div>\n <span class=\"comment-time\">${comment.time}<\/span>\n <span class=\"comment-likes\">♡ ${comment.like}<\/span>\n <\/div>\n <\/div>\n <\/div>\n`;\n\n if (comment.reply && comment.reply.length > 0) {\n html += '<div class=\"replies\">';\n comment.reply.forEach(reply => {\n html += `\n <div class=\"reply\">\n <div class=\"reply-text\">${reply.text.replace(\/\\n\/g, '<br>')}<\/div>\n <div class=\"reply-meta\">\n <span class=\"reply-user\">${reply.user}<\/span>\n <div>\n <span class=\"reply-time\">${reply.time}<\/span>\n <span class=\"reply-likes\">♡ ${reply.like}<\/span>\n <\/div>\n <\/div>\n <\/div>\n`;\n });\n html += '<\/div>';\n }\n\n html += `\n <\/div>\n`;\n });\n\n html += `\n<\/body>\n<\/html>\n `;\n\n return html;\n}\n\n\nfunction getSvg(comment_total,postid, blogid, pid,date) {\n let {java,cache,result} = this;\n let memoryKey = \"lofter\"+postid+blogid+pid;\n let Memory = String(cache.getFromMemory(memoryKey)); \n let re = \"1\"+date;\n let f = Memory.includes(re);\n \n if (f) { \n \tjava.longToast(\"数据加载中……请稍候\");\n \tlet contentapi = `https:\/\/api.lofter.com\/comment\/pCommentList.json?postId=${postid}&blogId=${blogid}&offset=0&pid=${pid}&imgId=&commentId=`;\n \t\n \tlet jsonData = JSON.parse(java.ajax(contentapi)).data.list;\n \tlet yuan = jsonData[0].quote.replace(\/^(.{40}).*\/,'$1.......');\n \tlet content = [];\n \tjsonData.forEach(x=>{\n \t\t let c = {\n \t\t \t text: x.content,\n \t\t \t user:x.publisherBlogInfo.blogNickName,\n \t\t \t time:java.timeFormat(x.publishTime),\n \t\t \t like:x.likeCount\n \t\t \t}\n \t\t \tif(x.l2Count>0){\n \t\t \t\tlet replyapi = `https:\/\/api.lofter.com\/comment\/l2\/page\/abtest.json?postId=${postid}&blogId=${blogid}&id=${x.id}&offset=0&fromSrc=&fromId=`;\n \t\t \t\tlet replyData = JSON.parse(java.ajax(replyapi)).data.list;\n \t\t \t\t\n \t\t \t\tlet replyList = [];\n \t\t \t\treplyData.forEach(y=>{\n \t\t \t\t\tlet reply = {\n \t\t \t\t\t \ttext: y.content,\n \t\t \t user:y.publisherBlogInfo.blogNickName,\n \t\t \t time:java.timeFormat(y.publishTime),\n \t\t \t like:y.likeCount\n \t\t \t\t\t\t}\n \t\t \t\t\treplyList.push(reply)\n \t\t \t\t\t});\n \t\t \t\t\tc.reply = replyList\n \t\t \t\t}\n \t\t \tcontent.push(c)\n \t\t});\n \t\t\n \tlet html = generateHTML(yuan,content)\n \t\n \t\n \t\njava.base64Encode(html).length()>65364?java.toast(\"数据太大,无法加载,请减少评论数量\"):\n \tjava.startBrowser(\"data:text\/html;base64,\"+java.base64Encode(html), \"段评\");\n \n}else{\n cache.putMemory(memoryKey,\"1\"+date)\n }\n \n \nlet svg = `\n <svg width=\"1000\" height=\"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=\"#B2B2B2\" stroke-width=\"55\"\/>\n <text x=\"570\" y=\"565\" font-family=\"Roboto Condensed\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"420\" font-weight=\"bold\" fill=\"#707070\">\n ${comment_total || \"\"}\n <\/text>\n <text x=\"520\" y=\"700\" font-family=\"Arial\" text-anchor=\"middle\" font-size=\"40\" fill=\"#000000\">\n 刷新图片查看段评\n <\/text>\n <\/svg>\n`;\n return \"data:image\/svg+xml;base64,\" + java.base64Encode(svg);\n}\n",
"lastUpdateTime": "1768657913924",
"loginUi": "[\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 ]",
"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 let imgurl = \"https:\/\/www.lofter.com\/lpt\/photoCaptcha\/getPhotoCaptcha.do,\" + JSON.stringify({\n \"method\": \"POST\",\n \"body\": \"width=270&height=126\"\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",
"canReName": "1",
"coverUrl": "$.response.collection.coverUrl||$..firstImageUrl[0]||$..coverUrl||$..blogInfo.bigAvaImg||$..bigAvaImg@put:{\"page\":\"$.response.blogInfo.blogStat.publicPostCount\"}##(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\njava.log(JSON.stringify(header))\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)){\nurl = baseUrl.split(',{\"origin')[0];\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\nresult =\"  \"+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‎\\n🈴所属合集:\"+cname+\"\\n📜合集介绍:\"+cdes+\"\\n\"+\"🔢合集章节总数:\"+ccount\n+\"\\n🔍搜索合集:#\"+cname+\"<关闭精确搜索>\";\n\nresult = String(result).replace(\/📜合集介绍:\\n\/,'').replace(\/🈴所属合集:\\s+🔢合集章节总数:\\s+🔍搜索合集:#<关闭精确搜索>\/g,'')\n}\n\nresult += `<br>‎<br>--复制下面的文字,可将作者添加发现或者订阅--<br>‎<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\n@js:\nname = String(java.getString(\"$..blogInfo.blogName\")).match(\/(.*)\\n*\/)[1];\nbook.putVariable(\"name\",name);\nresult",
"name": "$.response.collection.name||$..post.title||$.data.grainInfo.name||$.response.blogInfo.blogNickName||$.response.posts[0].post.blogInfo.blogNickName||$.data.blogInfo.blogNickName",
"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\/)){\nresult=java.get('url')\n}",
"wordCount": "{{$.data.grainInfo.postCount}}篇文章##^篇文章$"
},
"ruleContent": {
"callBackJs": "if(event == \"clickAuthor\"){\n\tblogdomain= book.getVariable(\"name\")+\".lofter.com\";\n\tblogid = book.bookUrl.match(\/(?:blogid|grainUserId)(?:_|=)(\\d+)\/)[1];\n\turl = `https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-8.2.32#${blogdomain}❌${blogid}❌${book.author},`\npost = {\"method\":\"POST\",\n\t\"body\":`blogdomain=${blogdomain}&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\tblogdomain= book.getVariable(\"name\")+\".lofter.com\";\n\tblogid = book.bookUrl.match(\/(?:blogid|grainUserId)(?:_|=)(\\d+)\/)[1];\n\turl = `http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4#${blogdomain}❌${blogid}❌${book.author},`\npost = {\"method\":\"POST\",\n\t\"body\":`,{\"method\":\"POST\",\"body\":\"targetblogid=${blogid}&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=${blogdomain}.lofter.com&offset={{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}`\n\t\t}\n\t\n\turl = url+JSON.stringify(post);\n\tjava.open(\"explore\", url, book.author+\"的动态\")\n\ttrue\n\t}",
"content": "<js>\nlet srcall = src;\nif(\/\\.mp4\/.test(baseUrl)){\n\tjava.startBrowser(baseUrl,\"视频\");\n\tresult = \"请点击章节链接观看视频\\n视频链接:\"+baseUrl\n\t}else{\nlet returnContent = \"\";\t\t\nlet returnimages = [];\nlet content = String(java.getString(\"$..content\"));\nlet pics = JSON.parse(src)?.data?.plan?.images??[];\nlet posts = JSON.parse(src)?.response?.posts??[];\nposts.forEach(x=>{\n\t let returnContents = x.post?.returnContent??[];\n\t returnContents.forEach(y=>{\n\t \t\t \treturnContent += \"\\n🏷 \"+y.planTypeName+\"\\n\"+y.content+\"\\n\";\n\t \t\t \ty.images?returnimages.concat(y.images):null;\n\t \t})\n\t});\n\t\nif(pics){\n\tpics=pics.map(x=>`<img src=\"${x.raw}\">\\n`).join(\"\");\n\t}\nlet postid = java.getString(\"$..post.id\");\nlet blogid = java.getString(\"$..post.blogId\");\nlet f = 0;\ntry{\n\tbook.getVariable();\n\tf = 1;\n\t}catch(e){\t}\nlet dpcontent = \"\";\nif(\/段评\/.test(source.getVariable()) && f===1){\nif(!\/myReturnGift\/.test(baseUrl)){\n\tlet api = `https:\/\/api.lofter.com\/comment\/pCommentCounts.json?postId=${postid}&blogId=${blogid}`;\n let pidall = JSON.parse(java.ajax(api)).data.list;\n java.put(\"pidall\",JSON.stringify(pidall));\n java.put(\"postid\",String(postid));\n java.put(\"blogid\",String(blogid));\n\tjava.setContent(content);\n\tlet c = \"\";\n\tcontent = java.getElements(\"@@tag.p\").toArray().map(x=>{\n\t\tvar pid = String(x.attr(\"id\"));\n\t\tvar originalText = x.text(); \n var matchedItem = pidall.find(function(item) {\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 if(returnContent.trim()!==\"\"){\n content = content+returnContent\n }\n\t}else if(\/myReturnGift\/.test(baseUrl) && String(content).trim()!==\"\"){\n pidall = JSON.parse(java.get(\"pidall\")); \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 \n return (item.pid.match(\/r_.*?_i(\\d+)\/)?item.pid.match(\/r_.*?_i(\\d+)\/)[1]:item.pid) == i;\t\t\t\n });\n\t\t\t\n\t\t\tif (matchedItem) {\n comment_total = matchedItem.count; \n pid = matchedItem.pid; \n imageOrContent = getImage(comment_total, java.get(\"postid\"), java.get(\"blogid\"), pid);\n return originalText.replace(\/\\s+$\/g,'')+imageOrContent; \n }else if(originalText.trim()!==\"\"){\n \t return originalText\n \t}\n\t\t\t}).join(\"\\n\");\n}\njava.setContent(srcall);\n}\n\nimgs = eval(String(java.getString(\"$..photoLinks\")));\nvideo =\/video_down_url\\\\\":\\\\\"(.*?)\\\\\"\/.test(result)? \"视频链接:\"+String(result).match(\/video_down_url\\\\\":\\\\\"(.*?)\\\\\"\/)[1]:\"\";\nimg = \"\";\nimgs?imgs.forEach(x=>{\n\tx?img += \"<img src=\\\"\"+x.orign.replace(\/%7C.*\/g,'')+\"\\\">\\n\":\"\"\n\t}):\"\";\ng=\t(\/myReturnGift\/.test(baseUrl)&&(\/[\\u4e00-\\u9fa5]\/.test(content) || pics))?\"🏷 \"+java.getString(\"$..planType.name\")+\" \"+java.getString(\"$.data.plan.title\")+\"\\n\"+(String(java.getString(\"$..promotion\"))?\"【\"+java.getString(\"$..promotion\")+\"】\\n\":\"\"):\"\";\n\nresult = g+ content + pics+ \"\\n\"+img+\"\\n\"+video;\n\nif(video && (chapter.index == book.durChapterIndex)){\n \tjava.startBrowser(video.replace(\/视频链接:\/,''),\"内容\");\n \tresult = \"❗️刷新本章节播放视频❗️\"+result;\n \t\t\t}\n}\nif(result ==\"\\n\\n\")result = String(java.getString(\"$..msg\")).replace(\/success\/g,'');\nresult = result.replace(\/<img[^>]*?src[^>]*?prompt_list_risk[^>]*?>\/g,'').replace(\/<a[^>]*?store-vip\\\/verify-phone\"[^>]*?>\/,'当前账号存在风险,需验证。\\n(❗️要看彩蛋请完成验证后刷新正文)\\n1、点击登录。\\n2、点击获取账号风险验证码\\n3、填入验证码\\n4、点击立即验证\\n5、提示成功即可刷新正文获取内容');\nresult\n<\/js>\n##tbc\\.|没有赠礼记录|【成为我的高级粉丝,解锁我的回礼与海量权益】##<br>",
"imageStyle": "FULL",
"nextContentUrl": "<js>\nif(!\/myReturnGift\/.test(baseUrl)){\ntry{\n\t\tid = java.getString(\"$..post.id\");\n\t\tid2 = java.getString(\"$..post.blogId\");\nurl =\"https:\/\/api.lofter.com\/v1.1\/trade\/gift\/post\/newSupportInfo?postId=\"+id+\"&blogId=\"+id2+\"&openFansVipPlan=0&vipFans=0\";\n\t$ = JSON.parse(String(java.ajax(url)));\n\tl = $.data.gainReturnGifts.length?$.data.gainReturnGifts:$.data.returnGifts;\n\tls = []\n\tl.forEach(x=>{\n\t\turl = \"https:\/\/api.lofter.com\/v1.1\/trade\/gift\/myReturnGift?id=\"+x.id+\"&postId=\"+id+\"&blogId=\"+id2;\n\t\tls.push(url)\n\t\t})\n\tresult = ls\n\t}catch(e){\n\t\t}\n\t}\n<\/js>",
"replaceRegex": "##src=\"((?:(?!.*;base64,).)*)\"##src=\"$1,{'headers':{'referer':'{{$..blogPageUrl}}'}}\""
},
"ruleExplore": {
"author": "$.post.blogInfo.blogNickName",
"bookList": "<js>result.replace(\/null\/g,'')<\/js>\n$.response.items[*]||$.response.posts[*]||$.response.collections[*]",
"bookUrl": "@js:url='{{$.post.blogId||$.post.blogPageUrl}}';\nid='{{$.post.id||$.id}}';\nmain=url.match(\/_blogid_\\d+\/)?url.match(\/_blogid_(\\d+)\/)[1]:url;\nif(!url)main = baseUrl.match(\/#(.*?)❌\/)[1].replace(\/\\.lofter\\.com\/g,'');\nbody=\"blogdomain=_blogid_\"+main+\".lofter.com&postid=\"+id;\nresult='https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"'+String(body)+'\"}';\nif(!url)result='https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-7.4.4,{\"method\": \"POST\",\"body\":\"blogdomain='+main+'.lofter.com&method=getCollectionSimple&offset=0&limit=2000&blogid='+baseUrl.match(\/❌(.*?)❌\/)[1]+'&collectionid='+id+'&order=1\"}';",
"coverUrl": "$.post||$.coverUrl\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}}\n<br>‎<br>\n--复制下面的文字,粘贴至发现规则添加用户--\n{{$.post.blogInfo.blogNickName}}::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"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>‎<br>\n--复制下面的文字,粘贴至发现规则添加用户--\n${baseUrl.match(\/❌.*?❌(.*)$\/)[1]}::http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"targetblogid=${baseUrl.match(\/❌(\\d+)\/)[1]}&supportposttypes=1%2C2%2C3%2C4%2C5%2C6&blogdomain=${baseUrl.match(\/#(.*?)❌\/)[1]}&offset={{'\\{\\{(page-1)*18\\}\\}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}'}}`\n\t}\nresult",
"kind": "$.post.tag||$.tags",
"lastChapter": "$.post.publishTime||$.postCount\n@js:\nif(\/\\d{13}\/.test(result)){\nresult=java.timeFormat(parseInt(result));\njava.put('time',result)\n}else{\n\tresult = result+\"篇文章\"\n\t}",
"name": "$.post.title||$.post.noticeLinkTitle||$.post.digest||$.post.blogInfo.blogId||$.post.blogPageUrl||$.name##<\/*\\w.*?>"
},
"ruleSearch": {
"author": "$.blogInfo.blogNickName||$.blogName",
"bookList": "$..postData[*]||$.data.posts[*]||$.data.blogs[*]||$.data.collections[*]||$.data.grainList[*]",
"bookUrl": "$.postPageUrl\n@js:\nif(!result){\n if(!'{{$.name}}'){\n id='{{$.blogId}}';\n result='http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"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}}&offset=0&grainUserId={{$.userId}}\"\n }else{\n blogid='{{$.blogId}}';\n id='{{$.id}}';\n name='{{$.blogName}}';\n java.put('name',name);\n result='https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-7.4.4,{\"method\": \"POST\",\"body\":\"blogdomain='+name+'.lofter.com&method=getCollectionSimple&offset=0&limit=2000&blogid='+blogid+'&collectionid='+id+'&order=1\"}';\n java.put('url',result)\n }\n}else{\n body=\"blogdomain=_blogid_{{$.blogId}}.lofter.com&postid={{$.id}}\";\n result='https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"'+String(body)+'\"}';\n};\n",
"checkKeyWord": "我们也玩点不一样的",
"coverUrl": "$.firstImageUrl[0]||$.blogInfo.bigAvaImg||$.bigAvaImg||$.coverUrl",
"intro": "{{$.digest||$.selfIntro||$.posts[0].digest||$.description}}",
"kind": "$.tagList||$.tags",
"lastChapter": "$.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": "$.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[*]@put:{\"blogname\":\"$..blogName\"}\n<js>\n\nif(result.length){\n\tresult\n\t}else{\n\t\t\"[{'title':'暂无目录'}]\"\n\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}\nString(result).replace(\/<\\\/*\\w.*?>\/g,'')\n<\/js>\n##(^.{1,25})##$1###",
"chapterUrl": "<js>\nif(\/postCollection|blogHomePage|api-grain\/.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\t}else\tif(\/video_down_url\":\"(.*?)\"\/.test(result)){\n\t\tresult = String(result).match(\/video_down_url\":\"(.*?)\"\/)[1];\n\t\t}else{\n\t\t\tresult = baseUrl\n\t\t\t}\n<\/js>",
"formatJs": "\"第\"+index+\"篇 \"+title",
"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\/.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:\n\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+'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 result = baseUrl+'post.json?key=' + key + '&sortType=0&offset=' + offset + '&limit=20,' + JSON.stringify(header);\n}\n",
"weight": 0
}