📖 Lofter
Lofter
分享者: guaner001125 (317)发布时间: 2天前
下拉【🔍搜索】或刷新【🔍搜索】分类搜索
🏷标签名::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"} {
"articleStyle": 3,
"cacheFirst": false,
"customOrder": 25,
"enableJs": true,
"enabled": true,
"enabledCookieJar": true,
"header": "{\n\"Content-Type\": \"application\/x-www-form-urlencoded;charset=utf-8\"\n}",
"jsLib": "function isL(){\n\tconst {source} = this;\n\ttry{\n\t\tsource.refreshJSLib();\n\t\treturn true\n\t\t}catch(e){\n\t\t\treturn false\n\t\t\t}\n\t}\n\nfunction getHtml(cover,type,name,url){\n\t\n\tlet result = `\n\t\n<div style=\"\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: #f5f5f5;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', 'Hiragino Sans GB', sans-serif;\n padding: 20px;\n box-sizing: border-box;\n\">\n<p><a href=\"legado:\/\/import\/bookSource?src=${encodeURI(\"http:\/\/www.yckceo.com\/yuedu\/shuyuan\/json\/id\/6873.json\")}\">导入lofter书源<\/a><\/p>\n <img \n src=\"${cover}\" \n style=\"\n width: 150px;\n height: auto;\n object-fit: cover;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n margin-bottom: 20px;\n \"\n >\n <p style=\"\n font-size: 18px;\n font-weight: 500;\n color: #333;\n margin: 0 0 20px 0;\n text-align: center;\n line-height: 1.4;\n \">${type}《${name}》<\/p>\n <a \n href='${url}' \n style=\"\n display: inline-block;\n padding: 12px 32px;\n background-color: #4CAF50;\n color: white;\n text-decoration: none;\n border-radius: 24px;\n font-weight: 500;\n font-size: 16px;\n transition: background-color 0.3s;\n box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3);\n \" onmouseover=\"this.style.backgroundColor='#45a049'\"\n onmouseout=\"this.style.backgroundColor='#4CAF50'\"\n >加入书架<\/a>\n<\/div>\n`\n\treturn result\n\t\n\t}",
"lastUpdateTime": 1768498669056,
"loadWithBaseUrl": true,
"loginUrl": "https:\/\/www.lofter.com\/front\/login",
"preload": false,
"preloadJs": "window.java = java;",
"ruleArticles": "<js>result.replace(\/:null\/g,':\"\"').replace(\/null\/,'');<\/js>\n$.response.items[*]||$.response.posts[*]||$.data.posts[*]||$.data.blogs[*]||$.data.collections[*]||$.data.grainList[*]||$.response.collections[*]\n<js>\na=result;\nbaseUrl.match(\/newsearch\/)?result=\"[{post:{title:'右上角三点,设置源变量确认搜索'}}]\":result=result;\nsource.getVariable()!=''?result=a:result=result\n<\/js>\n$.[*]",
"ruleContent": "<js>\nif(\/grain;\/.test(baseUrl)){\n let grain = String(java.hexDecodeToString(src)).split(\"❌\");\n result = `<title>刷新跳转<\/title><script>\n setTimeout(function() {\n java.open(\"sort\", \"${'https:\/\/api.lofter.com\/api-grain\/grain\/getDetail.json?grainId='+grain[0]+'&offset=0&grainUserId='+grain[1]}\",\"📗${grain[2]}\");\n window.close()\n},8);\n<\/script>`;\n}else if(\/collections;\/.test(baseUrl)){\n let collections = String(java.hexDecodeToString(src)).split(\"❌\");\n result = `<title>刷新跳转<\/title><script>\n setTimeout(function() {\n java.open(\"sort\", '${'https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-7.4.4,{\"method\": \"POST\",\"body\":\"blogdomain=' + collections[2] + '.lofter.com&method=getCollectionSimple&offset=0&limit=2000&blogid=' + collections[0] + '&collectionid=' + collections[1] + '&order=1\"}'}',\"📖${collections[3]}\");\n window.close()\n},8);\n<\/script>`;\n}else{\ncontent = String(java.getString(\"$..content\"));\nimgs = eval(String(java.getString(\"$..photoLinks\")));\nlet tags = String(java.getString(\"$..tag\"));\nlet blogdomain = String(java.getString(\"$..blogInfo.blogName\"));\n\nlet author = String(java.getString(\"$..blogInfo.blogNickName\"));\nauthoru = `http:\/\/api.lofter.com\/v2.0\/blogHomePage.api?product=lofter-android-7.4.4,{\"method\": \"POST\",\"body\":\"targetblogid=${java.getString(\"$..blogInfo.blogId\")}&method=getBlogInfoDetail&returnData=1&checkpwd=1&needgetpoststat=1\"}`;\nauthorurl= `legado:\/\/import\/addToBookshelf?src=${encodeURIComponent(authoru)},{\"origin\":\"📖Lofter\"}`\n\nlet postCollection =String(java.getString(\"$..postCollection.name\")); \nlet postNum = postCollection?\"(\"+String(java.getString(\"$..postCollection.postCount\"))+\"篇)\":\"\";\npostCollectionu = `https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-7.4.4,{\"method\": \"POST\",\"body\":\"blogdomain=${java.getString(\"$..blogInfo.blogName\")}.lofter.com&method=getCollectionSimple&offset=0&limit=2000&blogid=${java.getString(\"$..postCollection.blogId\")}&collectionid=${java.getString(\"$..postCollection.id\")}&order=1\"}`;\n\npostCollectionurl= `legado:\/\/import\/addToBookshelf?src=${encodeURIComponent(postCollectionu)},{\"origin\":\"📖Lofter\"}`\n\npostCollection = postCollection?`<p style=\"text-align:center\"><a class=\"toBook\" onclick='toOpen(\"📖\",\"${postCollection}\",\\`${postCollectionu}\\`)'>📖合集:<\/a><a href='${postCollectionurl}'>${postCollection}<\/a><\/p>`:\"\";\n\nauthor = `<p style=\"text-align:center\"><a class=\"toAuthor\" onclick='toOpen(\"👤\",\"${author}\",\\`${authoru}\\`)'>👤作者:<\/a><a href='${authorurl}'>${author}<\/a><\/p>${postCollection}`;\n\ntags = tags?tags.split(\",\").map(x=>{\n let url = `https:\/\/api.lofter.com\/oldapi\/tagPosts.api?product=lofter-android-7.4.4&method=newTagSearch&offset={\\{(page-1) *18}}&limit=18&firstpermalink=null&tag=${x}&type=new,{\"method\": \"POST\",\"body\":\"null\"}`;\n\treturn `<label class=\"tag\" onclick='toOpen(\"🏷\",\"${x}\",\\`${url}\\`)'>${x}<\/label>`\n\t}).join(\"\"):null;\ntags = tags?`<div>${tags}<\/div>`:\"\";\nlet embed,img_height,img_width,video_first_img\ntry{\nembed = java.getString(\"$.response.posts[0].post.embed\")??\"{x:1}\";\nimg_height = java.getString(\"$.img_height\", embed);\nimg_width = java.getString(\"$.img_width\", embed);\nvideo_first_img = java.getString(\"$.video_first_img\", embed);\n}catch(e){\n\t\/\/java.log(e)\n\t}\n\/\/ 获取视频URL\nlet videoUrl = \/video_down_url\\\\\":\\\\\"(.*?)\\\\\"\/.test(result) ? String(result).match(\/video_down_url\\\\\":\\\\\"(.*?)\\\\\"\/)[1] : \"\";\n\nvideo = videoUrl ? `<div style=\"display: flex; flex-direction: column; align-items: center; margin: 5px 0;\"> \n \n <div style=\"width: 100%; max-width: 100%; border: 2px solid #e0e0e0; border-radius: 8px; box-shadow: 0 8px 25px rgba(0,0,0,0.15); background: #000; overflow: hidden;\">\n <video controls poster=\"${video_first_img}\" style=\"width: 100%; display: block;\">\n <source src=\"${videoUrl}\" type=\"video\/mp4\">\n <\/video>\n <\/div>\n<\/div>\n` : \"\";\n\nvideoUrl = videoUrl?`<div style=\"width: 100%; max-width: 90%; word-break: break-all; background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 8px; padding: 12px 15px; font-family: 'Consolas', 'Monaco', monospace; font-size: 14px; color: #495057;\">\n 视频链接:${videoUrl}\n <\/div>`:\"\";\n\nimg = \"\";\nif(imgs) {\n imgs.forEach(x => {\n if(x) {\n img += `<div class=\"image-container\">\n <img src=\"${x.orign.replace(\/%7C.*\/g, '')}\" loading=\"lazy\">\n <\/div>\\n`;\n }\n });\n}\n\ncontent = content.replace(\/<p[^>]*>\\s* * *<\\\/p>\/g, '').replace(\/\\s{2,}\/g,'').replace(\/title=\"\"[^>]+|style=\"[^\"]+\"\/g,'\/').replace(\/(<img([^>]+)>)\/g,'<div class=\"image-container\">$1<\/div>');\ncontent = content.replace(\/<p[^>]*>\/g, '<p>'); \/\/ 移除p标签中的所有属性\n\nresult = `\n<title>${String(java.getString(\"$..title||$..content\")).replace(\/<\\\/?([a-z]+)[^>]*>|\\s\/g,'')}<\/title>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n${String(java.getString(\"$..title\"))?'<h3 class=\"title-card\">'+java.getString(\"$..title\")+'<\/h3>'+author+'<hr>':author+\"<hr>\"}\n\n<div class=\"post-container\">\n <div class=\"post-content\">\n ${content}\n <\/div>\n ${img}\n ${video}\n ${tags}\n<\/div>\n${videoUrl}\n <div id=\"apiPopupOverlay\" \n style=\"\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.6);\n z-index: 1000;\n justify-content: center;\n align-items: center;\n \" \n onclick=\"closeApiPopup()\">\n \n <div id=\"apiPopup\" \n style=\"\n background: white;\n border-radius: 8px;\n padding: 0;\n width: 90%;\n max-width: 700px;\n max-height: 80vh;\n box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2);\n position: relative;\n display: flex;\n flex-direction: column;\n \" \n onclick=\"event.stopPropagation();\">\n \n <div style=\"\n background: #f8f9fa;\n padding: 20px;\n border-bottom: 1px solid #e9ecef;\n border-radius: 8px 8px 0 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n \">\n <h3 style=\"margin: 0; font-size: 16px; font-weight: 600; color: #333;\">\n API接口信息\n <\/h3>\n <button onclick=\"closeApiPopup()\" \n style=\"\n background: none;\n border: none;\n color: #666;\n font-size: 24px;\n cursor: pointer;\n padding: 0;\n line-height: 1;\n width: 30px;\n height: 30px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n \"\n onmouseover=\"this.style.background='#e9ecef';\"\n onmouseout=\"this.style.background='transparent';\">\n ×\n <\/button>\n <\/div>\n \n <div style=\"padding: 20px; flex: 1; overflow: auto;\">\n <textarea id=\"apiTextArea\" \n readonly\n style=\"\n width: 100%;\n height: 150px;\n padding: 12px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.5;\n color: #333;\n background: #fafafa;\n resize: none;\n outline: none;\n box-sizing: border-box;\n \"\n onfocus=\"this.select();\">22<\/textarea>\n \n \n <div style=\"display: flex; gap: 10px; margin-top: 20px; flex-wrap: wrap;\">\n <button onclick=\"selectAndCopy()\" \n style=\"\n background: #2c3e50;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n cursor: pointer;\n flex: 1;\n min-width: 120px;\n transition: background 0.2s ease;\n \"\n onmouseover=\"this.style.background='#34495e';\"\n onmouseout=\"this.style.background='#2c3e50';\">\n 复制文本\n <\/button>\n \n <button onclick=\"check()\" \n style=\"\n background: #6c757d;\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n cursor: pointer;\n flex: 1;\n min-width: 120px;\n transition: background 0.2s ease;\n \"\n onmouseover=\"this.style.background='#5a6268';\"\n onmouseout=\"this.style.background='#6c757d';\">\n 全选文本\n <\/button>\n <\/div>\n \n <!-- 提示信息 -->\n <div id=\"copySuccess\" \n style=\"\n display: none;\n background: #d4edda;\n border: 1px solid #c3e6cb;\n color: #155724;\n padding: 10px 15px;\n border-radius: 4px;\n margin-top: 15px;\n text-align: center;\n font-size: 13px;\n \">\n 文本已复制到剪贴板\n <\/div>\n \n <!-- 使用说明 -->\n <div style=\"\n margin-top: 20px;\n padding: 12px;\n background: #f8f9fa;\n border-left: 4px solid #6c757d;\n border-radius: 4px;\n font-size: 13px;\n color: #495057;\n \">\n <div style=\"font-weight: 600; margin-bottom: 5px;\">使用说明:<\/div>\n 复制上述文本后,可粘贴到分类URL中使用\n <\/div>\n <\/div>\n <\/div>\n <\/div>\n\n<script>\n\/\/ 显示弹窗\n function showApiPopup() {\n document.getElementById('apiPopupOverlay').style.display = 'flex';\n document.getElementById('copySuccess').style.display = 'none';\n }\n \n \/\/ 关闭弹窗\n function closeApiPopup() {\n document.getElementById('apiPopupOverlay').style.display = 'none';\n }\n \n \/\/ 全选文本\n function selectAllText() {\n const textarea = document.getElementById('apiTextArea');\n textarea.select();\n textarea.focus();\n }\n \n \/\/ 复制文本\n function selectAndCopy() {\n const textarea = document.getElementById('apiTextArea');\n textarea.select();\n textarea.focus();\n \n try {\n const successful = document.execCommand('copy');\n if (successful) {\n showCopySuccess();\n } else {\n fallbackCopy();\n }\n } catch (err) {\n fallbackCopy();\n }\n }\n \n \/\/ 显示复制成功提示\n function showCopySuccess() {\n const successMsg = document.getElementById('copySuccess');\n successMsg.style.display = 'block';\n successMsg.textContent = '✅ 文本已复制到剪贴板';\n \n setTimeout(() => {\n successMsg.style.display = 'none';\n }, 3000);\n }\n \n \/\/ 备用复制方法\n function fallbackCopy() {\n const textarea = document.getElementById('apiTextArea');\n textarea.select();\n textarea.focus();\n \n try {\n navigator.clipboard.writeText(textarea.value)\n .then(() => {\n showCopySuccess();\n })\n .catch(() => {\n alert('复制失败,请手动复制文本');\n });\n } catch (err) {\n alert('请手动选择并复制文本');\n }\n }\n \n \/\/ 点击弹窗外关闭弹窗\n document.getElementById('apiPopupOverlay').addEventListener('click', closeApiPopup);\n\n\n\nfunction toOpen(type,name,url){\n\tif(\/👤\/.test(type)){\n\t\t url = \\`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=${blogdomain}.lofter.com&offset={\\{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}\\`\n\t\t}\n url = String(url).replace(\/offset=\\\\d+\/g,'offset={\\{(page-1)*18}}').replace(\/limit=\\\\d+\/g,'limit=18');\n \n if(\/👤|🏷\/.test(type)){\n document.querySelector(\"#apiPopup h3\").textContent= type+name;\n document.querySelector(\"textarea\").value=type+ name+\"::\"+url\n showApiPopup()\n }\n try{\n java.open(\"sort\", url, type+name+(type==\"📖\"?\"${postNum}\":\"\"))\n }catch(e){}\n\t} \n<\/script>\n`;\nif(String(java.getString(\"$..blogInfo.blogNickName\"))==\"\"){\n\tresult = String(java.getString(\"$..msg\"))\n\t}\n\n}\nresult = result.replace(\/(<p><br\\s*\\\/><\\\/p>){1,}\/g,'')\n\n<\/js>\n##tbc\\.##<br>‎<br>",
"ruleDescription": "@js:\nif(\/newsearch\\\/blog.json\/.test(baseUrl) || String(java.get(\"prefix\"))==\"@\"){\n result = `\n <title>{{$.blogNickName}}<\/title>\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n <div class=\"user-profile-card\">\n <div class=\"user-header\">\n <img src=\"{{$.bigAvaImg}}\" class=\"user-avatar\">\n <div class=\"user-meta\">\n <h2 class=\"username\">{{$.blogNickName}}<\/h2>\n <p class=\"user-bio\">${java.getString(\"$.selfIntro\")}<\/p>\n <\/div>\n <\/div>\n \n <div class=\"copy-section\">\n <div class=\"copy-content\" id=\"copyContent\">\n👤{{$.blogNickName}}::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={{$.blogName}}.lofter.com&offset={\\{(page-1)*18}}&method=getPostLists&postdigestnew=1&returnData=1&limit=18&checkpwd=1&needgetpoststat=1\"}\n <\/div>\n <button class=\"copy-btn\" onclick=\"handleCopy()\">\n <span class=\"copy-icon\">⎘<\/span>\n <span class=\"copy-text\">一键复制后粘贴到分类URL<\/span>\n <\/button>\n <div class=\"copy-feedback\" id=\"copyFeedback\"><\/div>\n <\/div>\n <\/div>\n\n <style>\n .user-profile-card{\n max-width: 600px;\n margin: 0 auto;\n padding: 25px;\n background: white;\n border-radius: 12px;\n box-shadow: 0 5px 15px rgba(0,0,0,0.08);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n \n .user-header {\n display: flex;\n align-items: flex-start;\n margin-bottom: 20px;\n padding: 15px;\n background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);\n border-radius: 10px;\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\n }\n \n .user-avatar {\n width: 70px;\n height: 70px;\n border-radius: 50%;\n object-fit: cover;\n border: 3px solid white;\n box-shadow: 0 3px 10px rgba(0,0,0,0.1);\n }\n \n .user-meta {\n margin-left: 18px;\n flex: 1;\n }\n \n .username {\n margin: 0 0 5px;\n color: #333;\n font-size: 20px;\n font-weight: 600;\n }\n \n .user-bio {\n margin: 0;\n color: #666;\n font-size: 15px;\n line-height: 1.5;\n }\n \n .copy-section {\n margin-top: 25px;\n }\n \n .copy-content {\n padding: 15px;\n background: #f8f9fa;\n border-radius: 8px;\n border: 1px solid #eaeaea;\n font-family: 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n word-break: break-all;\n white-space: pre-wrap;\n margin-bottom: 15px;\n max-height: 200px;\n overflow-y: auto;\n }\n \n .copy-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px 24px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: none;\n border-radius: 8px;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.3s;\n width: 100%;\n box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n }\n \n .copy-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 5px 10px rgba(0,0,0,0.15);\n background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);\n }\n \n .copy-icon {\n font-size: 18px;\n margin-right: 8px;\n }\n \n .copy-feedback {\n height: 20px;\n margin-top: 12px;\n text-align: center;\n font-size: 14px;\n transition: all 0.3s;\n }\n \n @media (max-width: 600px) {\n .user-profile-card {\n padding: 18px;\n border-radius: 0;\n }\n \n .user-header {\n flex-direction: column;\n align-items: center;\n text-align: center;\n }\n \n .user-meta {\n margin-left: 0;\n margin-top: 15px;\n }\n \n .copy-content {\n font-size: 13px;\n padding: 12px;\n }\n \n .copy-btn {\n padding: 10px 15px;\n font-size: 14px;\n }\n }\n <\/style>\n\n <script>\n function handleCopy() {\n const content = document.getElementById('copyContent');\n const feedback = document.getElementById('copyFeedback');\n \n \/\/ 创建范围并选择文本\n const range = document.createRange();\n range.selectNode(content);\n window.getSelection().removeAllRanges();\n window.getSelection().addRange(range);\n \n try {\n \/\/ 执行复制命令\n const successful = document.execCommand('copy');\n if(successful) {\n feedback.textContent = '复制成功!';\n feedback.style.color = '#4CAF50';\n } else {\n feedback.textContent = '复制失败,请手动选择文本';\n feedback.style.color = '#F44336';\n }\n } catch(err) {\n feedback.textContent = '复制错误: ' + err;\n feedback.style.color = '#F44336';\n }\n \n \/\/ 清除选择\n window.getSelection().removeAllRanges();\n \n \/\/ 3秒后隐藏反馈\n setTimeout(() => {\n feedback.textContent = '';\n }, 3000);\n }\n <\/script>\n `;\n} else if(String(java.get(\"prefix\"))==\"%\" && !isL()){\nlet grainurl = 'https:\/\/api.lofter.com\/api-grain\/grain\/getDetail.json?grainId='+java.getString(\"$.id\")+'&offset=0';\n grainurl= `legado:\/\/import\/addToBookshelf?src=${encodeURIComponent(grainurl)},{\"origin\":\"📖Lofter\"}`;\n result = getHtml(java.getString(\"$.coverUrl\"),\"粮单\",java.getString(\"$.name\"),grainurl)\n\n}else if(String(java.get(\"prefix\"))==\"#\" && !isL()){\n java.log(result)\n blogid = '{{$.blogId}}';\n id = '{{$.id}}';\n blogName = '{{$.blogName}}';\n let curl = 'https:\/\/api.lofter.com\/v1.1\/postCollection.api?product=lofter-android-7.4.4,{\"method\": \"POST\",\"body\":\"blogdomain=' + blogName + '.lofter.com&method=getCollectionSimple&offset=0&limit=2000&blogid=' + blogid + '&collectionid=' + id + '&order=1\"}';\n curl = `legado:\/\/import\/addToBookshelf?src=${encodeURIComponent(curl)},{\"origin\":\"📖Lofter\"}`;\n result = getHtml(java.getString(\"$.coverUrl\"),\"合集\",java.getString(\"$.name\"),curl)\n \n}else {\n result = \"\";\n}\nresult\n",
"ruleImage": "{{$..firstImageUrl##.*?(https.*?)\"##$1###}}{{$..postView.firstImage.orign||$.postData.blogInfo.bigAvaImg||$..blogInfo.bigAvaImg||$..bigAvaImg||$..coverUrl}}##(http.*?)https?.*##$1\n<js>\nif(\/^http\/.test(result)){\nresult = result+\",\"+JSON.stringify({'headers':{'referer':'http:\/\/www.lofter.com'}});\n}\n<\/js>",
"ruleLink": "@js:\nif (String(java.get(\"prefix\")) == \"@\" ){\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 (String(java.get(\"prefix\")) == \"%\") {\n result = `http:\/\/www.lofter.com@js:'data:grain;base64,${java.base64Encode(java.getString(\"$.id\")+\"❌\"+java.getString(\"$.userId\")+\"❌\"+java.getString(\"$.name\"))},{\"type\":\"\"}'`;\n result = isL()?result:java.getString(\"$.id\")+\"&\"+java.getString(\"$.userId\");\n } else if (String(java.get(\"prefix\")) == \"#\") {\n blogid = '{{$.blogId}}';\n id = '{{$.id}}';\n blogName = '{{$.blogName}}';\n result = `http:\/\/www.lofter.com@js:'data:collections;base64,${java.base64Encode(blogid+\"❌\"+id+\"❌\"+blogName+\"❌\"+java.getString(\"$.name\"))},{\"type\":\"\"}'`;\n result = isL()?result:id+\"&\"+blogid;\n }else{\n url = '{{$.post.blogId||$.blogId||$..postView.blogId}}';\n id = '{{$.post.id||$.id||$..postView.id}}';\n if (url.match(\/_blogid_\\d+\/)) {\n main = url.match(\/(_blogid_.*?)\\\/\/)[1];\n body = \"blogdomain=\" + main + \"&postid=\" + id;\n result = 'https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-7.4.4,{\"method\":\"POST\",\"body\":\"' + String(body) + '\"}';\n } else {\n result = \"https:\/\/api.lofter.com\/oldapi\/post\/detail.api?product=lofter-android-7.4.4\";\n option = {\n \"method\": \"POST\",\n \"body\": \"blogdomain=_blogid_\" + url + \".lofter.com&postid=\" + id\n }\n result = result + \",\" + JSON.stringify(option)\n }\n \n };\nresult",
"ruleNextPage": "<js>\nif(\/offset={\\{\\(page-1\\)\\s*\\*\\d+}\\}\/.test(baseUrl)){\n\tlet p = baseUrl.match(\/\\*(\\d+)\\}\/)[1];\n\tbaseUrl = baseUrl.replace(\/offset={\\{\\(page-1\\)\\s*\\*\\d+}\\}\/,'offset='+p);\n\t}else if(String(java.getString(\"$.data.offset\"))){\n\t\t let offset = String(java.getString(\"$.data.offset\"));\n\t\t if(offset!=-1){\n\t\t \tbaseUrl = baseUrl.replace(\/offset=\\d+\/,'offset='+offset);\n\t\t \t}\n\t}else if(\/offset=\\d+\/.test(baseUrl)){\n\t\t offset =Number(baseUrl.match(\/offset=(\\d+)\/)[1]);\n let limit = Number(baseUrl.match(\/limit=(\\d+)\/)[1]);\n baseUrl = baseUrl.replace(\/offset=\\d+\/,'offset='+(offset+limit));\n\t\t}\n<\/js>",
"rulePubDate": "$.post.publishTime||$.publishTime\n@js:a=result?java.timeFormat(parseInt(result)):'';\nresult = a+\" {{$.postCount##^[^\\d]+.*}}篇•\"+String(java.getString(\"$.post.tag||$.tagList||$..tags\")).replace(\/\\n|\"*,\"*|\\[\"\/g,'🏷').replace(\/\"\\]|\\[\\]\/g,'')+java.getString(\"$.authName&&$.selfIntro&&$..$..postView.digest\");\nresult.replace(\/\\s+篇•|•$\/g,' ')",
"ruleTitle": "{{$..longInfo.title}}•{{$.post.title||$.post.noticeLinkTitle||$..postView.title||$..postView.digest||$.post.digest||$.blogNiceName||$.blogNickName||$.title||$.noticeLinkTitle||$.digest||$.blogInfo.blogNiceName||$.blogNickName||$.post.blogInfo.blogId||$.post.blogPageUrl||$.name}}\n<js>\n\nif(\/api-grain\/.test(baseUrl)){\n\tresult = String(java.getString(\"$..postView.title||$..postView.digest\"));\n\tif(String(java.getString(\"$..viewRankPublic\"))==\"false\"){\n\t\tresult = \"\"\n\t\t}\n\t}\n\na=result.replace(\/^(.{0,15})\/,'$1').replace(\/<.*?>\/g,'').replace(\/^•\/,'');\njava.put('text',a);\na<\/js>",
"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+'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}",
"showWebLog": false,
"singleUrl": false,
"sortUrl": "🏷手机壁纸::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🏷短视频::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🔍搜索::{{let a=\"\";svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"\/><text x=\"220\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"50\" fill=\"#333\" font-weight=\"bold\">输入要搜索的内容,格式如下:<\/text><text x=\"150\" y=\"200\" font-family=\"Arial, sans-serif\" font-size=\"50\" fill=\"#333\" font-weight=\"bold\">文章名 @用户名 #合集名 %粮单名<\/text><text x=\"190\" y=\"290\" font-family=\"Arial, sans-serif\" font-size=\"30\" fill=\"#333\">下拉【🔍搜索】或刷新【🔍搜索】分类弹出输入框<\/text><\/svg>`));if(page==1){try{a=java.getVerificationCode('data:image\/svg+xml;base64,'+svg);}catch(e){java.log(e)};if(a==\"\"){a=source.getVariable()};source.setVariable(a);}else{a=source.getVariable()};key = String(a);let prefix = key.charAt(0);java.put(\"prefix\",prefix);let offset=0;let baseUrl = \"https:\/\/api.lofter.com\/newsearch\/\";switch(prefix) {case '@':result = baseUrl+'blog.json?key=' + key.slice(1)+ '&limit=10&offset=' + offset;break;case '#':case '#':result = baseUrl+'collection.json?key=' + key.slice(1) + '&limit=10&offset=' + offset;break;case '%':result = baseUrl+'grain.json?key='+key.slice(1)+'&limit=10&offset=' + offset;break;default:let header = {\"headers\": {\"Content-Type\": \"application\/x-www-form-urlencoded;charset=utf-8\",\"deviceid\": java.androidId(),\"if-modified-since\": String(new Date()).replace(\/(.*?)\\s(.*?)\\s(.*?)\\s(.*?)GMT.*\/,'$1, $3 $2 $4 GMT')} };result = baseUrl+'post.json?key=' + key + '&sortType=0&offset=' + offset + '&limit=10,' + JSON.stringify(header);};result}}\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\"}",
"sourceComment": "下拉【🔍搜索】或刷新【🔍搜索】分类搜索\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\"}",
"sourceGroup": "阅读",
"sourceIcon": "https:\/\/is1-ssl.mzstatic.com\/image\/thumb\/Purple221\/v4\/af\/c2\/00\/afc200a4-978b-193a-a749-2151041ef09e\/AppIcon-1x_U007ephone-0-0-0-85-220-0.png\/492x0w.webp",
"sourceName": "📖\nLofter",
"sourceUrl": "Lofter",
"style": ".tag {display: inline-block; background: #f1f1f1; color: #333333; border-radius: 15px; padding: 2px 10px; margin: 4px; box-shadow: 0 3px 6px rgba(0,0,0,0.1); transition: all 0.2s ease; cursor: pointer; } \n.post-container {\n max-width: 800px;\n margin: 0 auto;\n padding: 20px; \n line-height: 1.6;\n color: #333;\n }\n .title-card{ \t\n border-radius: 8px;\n text-align: center;\n margin: 5px auto;\n margin-bottom:20px;\n max-width: 80%;\n \t}\n .post-content {\n margin-bottom: 20px;\n }\n \n .post-content p {\n margin: 0 0 10px 0;\n text-indent:1.7em;\n word-break: break-word;\n }\n \n .image-container {\n margin: 15px 0;\n text-align: center;\n }\n \n .image-container img {\n max-width: 100%;\n height: auto;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n ",
"type": 0
}