🌸 hanime1.life
https://www.hanime1.life🔞
laizhiyu (6509)10/31 17:30
第三方H站
{
"bookSourceGroup": "视频,AI,R18",
"bookSourceName": "🌸 hanime1.life",
"bookSourceType": 4,
"bookSourceUrl": "https:\/\/www.hanime1.life🔞",
"bookUrlPattern": ".*hanime[0-9a-z.-]*(\/enter)?\/watch\\?v=\\d+.*",
"concurrentRate": "1\/1200",
"customButton": false,
"customOrder": 0,
"enabled": true,
"enabledCookieJar": true,
"enabledExplore": true,
"eventListener": false,
"exploreUrl": "🏳 最新上传::https:\/\/www.hanime1.life\/search?sort=%E6%9C%80%E6%96%B0%E4%B8%8A%E5%82%B3&page={{page}}\n最新上市::https:\/\/www.hanime1.life\/search?sort=%E6%9C%80%E6%96%B0%E4%B8%8A%E5%B8%82&page={{page}}\n本日排行::https:\/\/www.hanime1.life\/search?sort=%E6%9C%AC%E6%97%A5%E6%8E%92%E8%A1%8C&page={{page}}\n他们在看::https:\/\/www.hanime1.life\/search?sort=%E4%BB%96%E5%80%91%E5%9C%A8%E7%9C%8B&page={{page}}\n里番::https:\/\/www.hanime1.life\/search?genre=%E8%A3%8F%E7%95%AA&page={{page}}\n泡面番::https:\/\/www.hanime1.life\/search?genre=%E6%B3%A1%E9%BA%B5%E7%95%AA&page={{page}}\nMotion Anime::https:\/\/www.hanime1.life\/search?genre=Motion%20Anime&page={{page}}\n3DCG::https:\/\/www.hanime1.life\/search?genre=3DCG&page={{page}}\n2.5D动画::https:\/\/www.hanime1.life\/search?genre=2.5D&page={{page}}\n2D动画::https:\/\/www.hanime1.life\/search?genre=2D%E5%8B%95%E7%95%AB&page={{page}}\nAI生成::https:\/\/www.hanime1.life\/search?genre=AI%E7%94%9F%E6%88%90&page={{page}}\nMMD::https:\/\/www.hanime1.life\/search?genre=MMD&page={{page}}\nCosplay::https:\/\/www.hanime1.life\/search?genre=Cosplay&page={{page}}\n新番预告::https:\/\/www.hanime1.life\/search?genre=%E6%96%B0%E7%95%AA%E9%A0%90%E5%91%8A&page={{page}}",
"header": "{\"User-Agent\":\"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/126.0.0.0 Safari\/537.36\",\"Referer\":\"https:\/\/www.hanime1.life\/\"}",
"jsLib": "function H1G(k){var v=\"\";try{v=source.get(k)}catch(e){try{v=java.get(k)}catch(e2){}};if(v===\"null\"||v===\"undefined\")v=\"\";return String(v||\"\")}\nfunction H1P(k,v){try{source.put(k,String(v))}catch(e){try{java.put(k,String(v))}catch(e2){}}}\nfunction H1DOM(){var d=\"\";try{d=H1G(\"h1dom\")}catch(e){d=\"\"}\n if(!d){d=\"\"}\n if(!d){return \"https:\/\/www.hanime1.life\"}\n if(d.indexOf(\"http\")===0){return d}\n return \"https:\/\/\"+d}\nfunction H1OPT(){return \"\"}\n\nfunction H1LIST(java,source,result){\n var d=org.jsoup.Jsoup.parse(String(result))\n var out=[]\n var seen={}\n \/\/ template A: sort\/search pages\n var cards=d.select('div.video-item-container[title]')\n for(var i=0;i<cards.size();i++){\n var card=cards.get(i)\n var a=card.selectFirst(\"a.video-link\")\n if(!a){continue}\n var u=String(a.attr(\"href\"))\n if(u.indexOf(\"watch?v=\")<0){continue}\n var tt=card.selectFirst(\"div.title\")\n var name=tt?tt.text().trim():\"\"\n if(!name){continue}\n var img=card.selectFirst(\"img.main-thumb\")\n var cover=img?String(img.attr(\"src\")):\"\"\n var dur=card.selectFirst(\"div.duration\")\n var du=dur?dur.text().trim():\"\"\n var sub=card.selectFirst(\"div.subtitle\")\n var author=\"\";var date=\"\"\n if(sub){\n var aa=sub.selectFirst(\"a\")\n author=aa?aa.text().trim():\"\"\n var st=sub.selectFirst(\"span.subtitle-time\")\n date=st?st.text().trim():\"\"\n }\n var st2=card.selectFirst(\"div.stats-container\")\n var views=\"\"\n if(st2){\n var items=st2.select(\"div.stat-item\")\n if(items.size()>1){views=String(items.get(1).text()).trim()}\n }\n if(seen[u]){continue}\n seen[u]=1\n out.push({name:name,u:u,cover:cover,author:author,date:date,du:du,views:views})\n }\n if(out.length>0){return out}\n \/\/ template B: genre pages\n var as2=d.select('a[href*=\"watch?v=\"]')\n for(var i=0;i<as2.size();i++){\n var a2=as2.get(i)\n var u2=String(a2.attr(\"href\"))\n if(seen[u2]){continue}\n var inner=a2.selectFirst(\"div.home-rows-videos-div\")\n if(!inner){continue}\n var tt2=a2.selectFirst(\"div.home-rows-videos-title\")\n var name2=tt2?tt2.text().trim():\"\"\n if(!name2){continue}\n var img2=a2.selectFirst(\"img\")\n var cover2=img2?String(img2.attr(\"src\")):\"\"\n seen[u2]=1\n out.push({name:name2,u:u2,cover:cover2,author:\"\",date:\"\",du:\"\",views:\"\"})\n }\n return out\n}\n\nfunction H1CUR(java,source,result,baseUrl){\n var d=org.jsoup.Jsoup.parse(String(result))\n var h3=d.selectFirst(\"h3#shareBtn-title\")\n var name=h3?h3.text().trim():\"\"\n var h4s=d.select(\"div.video-details-wrapper h4\")\n var author=\"\"\n for(var i=0;i<h4s.size();i++){\n var t=h4s.get(i).text().trim()\n if(t){author=t;break}\n }\n if(!author){var vn=d.selectFirst(\"a#video-artist-name\");author=vn?vn.text().trim():\"\"}\n var tags=[]\n var tagEls=d.select(\"div.single-video-tag a\")\n for(var i=0;i<tagEls.size();i++){\n var tt=tagEls.get(i).text().trim()\n tt=String(tt).replace(\/^#\\s*\/,\"\").replace(\/\\s*\\(\\d+\\)\\s*$\/,\"\").trim()\n if(tt&&tt!==\"add\"&&tt!==\"remove\"&&tt!==\"new\"&&tt!==\"edit\"&&tt.indexOf(\".\")<0&&tt.length<20&&tags.indexOf(tt)<0){tags.push(tt)}\n }\n var desc=\"\"\n var panel=d.selectFirst(\"div.video-description-panel\")\n if(panel){\n var cap=panel.selectFirst(\"div.video-caption-text\")\n desc=cap?cap.text().trim():\"\"\n }\n var views=\"\";var date=\"\"\n var vd=d.selectFirst(\"div.video-details-wrapper.hidden-sm\")\n if(vd){\n var vt=String(vd.text())\n var vm=vt.match(\/\\u89c2\\u770b\\u6b21\\u6570\\uff1a([^\\s&]+)\/)\n if(vm){views=vm[1]}\n var dm=vt.match(\/(20\\d{2}-\\d{2}-\\d{2})\/)\n if(dm){date=dm[1]}\n }\n var cover=\"\"\n var pv=d.selectFirst(\"video#player\")\n if(pv){var po=String(pv.attr(\"poster\"));cover=po}\n var durSec=\"\"\n var meta=d.selectFirst(\"meta[property=og:video:duration]\")\n if(meta){durSec=String(meta.attr(\"content\"))}\n var kindStr=tags.join(\",\")\n var introStr=desc\n if(views){introStr=introStr?(introStr+\"\\n\"+views):views}\n if(date){introStr=introStr?(introStr+\"\\n\"+date):date}\n var durStr=durSec?(\"\\u65f6\\u957f \"+durSec+\" \\u79d2\"):\"\"\n return {name:name,author:author,tags:tags,desc:desc,views:views,date:date,cover:cover,durSec:durSec,kindStr:kindStr,introStr:introStr,durStr:durStr}\n}\n\nfunction H1CHAP(java,source,book,result,baseUrl){\n var d=org.jsoup.Jsoup.parse(String(result))\n var links=d.select('#playlist-scroll a[href*=\"watch?v=\"]')\n var out=[];var seen={}\n for(var i=0;i<links.size();i++){\n var u=String(links.get(i).attr(\"href\"))\n if(seen[u]){continue}\n seen[u]=1\n var title=\"\"\n var cell=null\n var p=links.get(i)\n while(p!=null){\n var cn=String(p.classNames ? p.classNames() : \"\")\n if(cn.indexOf(\"playlist-hover-wrap\")>=0){cell=p;break}\n p=p.parent()\n }\n if(cell){\n var h4=cell.selectFirst(\"h4.video-title\")\n title=h4?h4.text().trim():\"\"\n }\n if(!title){title=\"P\"+(out.length+1)}\n out.push({n:title,u:u})\n }\n return out\n}\n\nfunction H1CONTENT(java,source,result,baseUrl){\n var d=org.jsoup.Jsoup.parse(String(result))\n var vp=d.selectFirst(\"video#player\")\n if(!vp){return \"\"}\n var srcs=vp.select(\"source\")\n var pick=null;var curQ=\"720\"\n var bm=String(baseUrl).match(\/#Q(\\d+)\/)\n if(bm){curQ=bm[1]}\n for(var i=0;i<srcs.size();i++){\n var sz=String(srcs.get(i).attr(\"size\"))\n if(sz===curQ){pick=srcs.get(i);break}\n }\n if(!pick){pick=srcs.size()>0?srcs.get(0):null}\n if(!pick){var s0=String(vp.attr(\"src\")||\"\");if(s0){return s0}return \"\"}\n return String(pick.attr(\"src\"))\n}\n\nfunction H1FIX(u){\n var s=String(u||\"\")\n if(!s){return \"\"}\n if(s.indexOf(\"http\")!==0){return s}\n return s\n}",
"lastUpdateTime": "1793439001310",
"loginUi": "[{\"name\": \"📌 发布页输入框(可留空)\", \"type\": \"text\", \"action\": \"H1NOOP()\"}, {\"name\": \"🚀 一键从发布页获取线路\", \"type\": \"button\", \"action\": \"H1PUB(java)\"}, {\"name\": \"⚡ 测试延时(全部线路)\", \"type\": \"button\", \"action\": \"H1SPEED(java)\"}, {\"name\": \"─── 线路点击切换 ───\", \"type\": \"button\", \"action\": \"H1NOOP()\"}, {\"name\": \"W1\", \"type\": \"button\", \"action\": \"H1SETD(java,'www.hanime1.life')\", \"viewName\": \"'线路1 www.hanime1.life '+(source.get('h1sp1')||'')\"}, {\"name\": \"W2\", \"type\": \"button\", \"action\": \"H1SETD(java,'www.hanime103.net')\", \"viewName\": \"'线路2 www.hanime103.net '+(source.get('h1sp2')||'')\"}, {\"name\": \"W3\", \"type\": \"button\", \"action\": \"H1SETD(java,'www.hanime103.com')\", \"viewName\": \"'线路3 www.hanime103.com '+(source.get('h1sp3')||'')\"}, {\"name\": \"W4\", \"type\": \"button\", \"action\": \"H1SETD(java,'www.hanime104.com')\", \"viewName\": \"'线路4 www.hanime104.com '+(source.get('h1sp4')||'')\"}, {\"name\": \"─── 诊断 ───\", \"type\": \"button\", \"action\": \"H1NOOP()\"}, {\"name\": \"🔍 检查登录状态\", \"type\": \"button\", \"action\": \"H1CK(java)\"}, {\"name\": \"🌐 用浏览器打开站点\", \"type\": \"button\", \"action\": \"H1BR(java)\"}]",
"loginUrl": "function H1L(m){try{java.longToast(String(m))}catch(e){try{java.toast(String(m))}catch(e2){}}}\nfunction H1T(m){try{java.toast(String(m))}catch(e){try{java.longToast(String(m))}catch(e2){}}}\nfunction H1G(k){var v=\"\";try{v=source.get(k)}catch(e){try{v=java.get(k)}catch(e2){}};if(v===\"null\"||v===\"undefined\")v=\"\";return String(v||\"\")}\nfunction H1P(k,v){try{source.put(k,String(v))}catch(e){try{java.put(k,String(v))}catch(e2){}}}\nfunction H1DOM(){var d=H1G(\"h1dom\");if(!d){return \"https:\/\/www.hanime1.life\"}return \"https:\/\/\"+d}\nfunction H1NOOP(){H1T(\"H1T: 提示行无需点击\")}\nfunction H1SETD(jv,d){H1P(\"h1dom\",d);H1L(\"H1L: ✔ 已切换到 \"+d+\",立即生效\");try{java.reLoginView(false)}catch(e){}}\nfunction H1BR(jv){var u=H1DOM()+\"\/enter\";H1T(\"H1T: 正在打开 \"+u);try{java.openUrl(u)}catch(e){H1L(\"H1L: 打开失败 \"+e)}}\nfunction H1CK(jv){\n var d=H1G(\"h1dom\");if(!d){H1L(\"H1L: 请先选择线路\");return}\n H1T(\"H1T: 正在检查登录状态…\")\n var u=\"https:\/\/\"+d+\"\/enter\"\n var r=\"\"\n try{r=String(java.ajax(u))}catch(e){H1L(\"H1L: ✘ 线路不可达: \"+e);return}\n if(r.indexOf(\"hanime1\")<0){H1L(\"H1L: ✘ 线路异常,请换线路\");return}\n var c=\"\"\n try{c=String(java.getCookie(u))}catch(e){c=\"\"}\n var hasS=c.indexOf(\"hanime1_session\")>=0;var hasR=c.indexOf(\"remember_web\")>=0\n if(hasS&&hasR){H1L(\"H1L: ✔ 登录Cookie完好(本站游客也可看)\")}\n else{if(hasS){H1L(\"H1L: ✔ 会话Cookie存在(游客可看)\")}else{H1L(\"H1L: ✔ 未登录,游客可直接搜索观看;需登录请点「用浏览器打开站点」\")}}\n}\nfunction H1SPEED(jv){\n H1T(\"H1T: ⚡ 开始测试 4 条线路延时…\")\n var ds=[\"www.hanime1.life\",\"www.hanime103.net\",\"www.hanime103.com\",\"www.hanime104.com\"]\n var urls=[]\n for(var i=0;i<ds.length;i++){urls.push(\"https:\/\/\"+ds[i]+\"\/enter\")}\n var t0Arr=[];for(var i=0;i<urls.length;i++){t0Arr.push(Date.now())}\n var res=null\n try{res=java.appCache!==undefined?java.ajaxAll(urls):java.ajaxAll(urls)}catch(e){H1L(\"H1L: 测速失败 \"+e);return}\n var ms=[];var okAny=false\n for(var i=0;i<ds.length;i++){\n var ok=false;var t=999999\n try{var r=res[i];var b=String(r.body());var bl=b.length;t=(r.callTime&&r.callTime.call)?r.callTime():(Date.now()-t0Arr[i]);var code=0;try{code=r.raw.code()}catch(e2){try{code=r.code()}catch(e3){}}if(bl>50000||(code==200&&bl>2000)){ok=true}}catch(e){ok=false}\n H1P(\"h1sp\"+(i+1), ok?(t+\"ms\"):\"超时\")\n ms.push(ok?t:999999);if(ok){okAny=true}\n }\n var best=0\n for(var i=1;i<ms.length;i++){if(ms[i]<ms[best])best=i}\n if(okAny){H1P(\"h1dom\",ds[best]);H1L(\"H1L: ⚡ 最快线路 \"+ds[best]+\" \"+ms[best]+\"ms,已自动切换\")}\n else{H1L(\"H1L: ✘ 全部线路超时,请检查网络\/代理\")}\n try{java.reLoginView(false)}catch(e){}\n}\nfunction H1PUB(jv){\n H1T(\"H1T: 🚀 正在从发布页探测线路…\")\n var cur=H1G(\"h1dom\");if(!cur){cur=\"www.hanime1.life\"}\n var pool=[\"www.hanime1.life\",\"www.hanime103.net\",\"www.hanime103.com\",\"www.hanime104.com\"]\n var seed=\"https:\/\/\"+cur+\"\/enter\";var html=\"\"\n try{html=String(java.ajax(seed))}catch(e){html=\"\"}\n if(html.length>50000){\n var rx=\/https?:\\\/\\\/([a-z0-9.-]*hanime[0-9a-z.-]*)\\\/enter\/g;var mm;var extra=[]\n while((mm=rx.exec(html))!==null){var d=mm[1].toLowerCase();if(pool.indexOf(d)<0&&extra.indexOf(d)<0){extra.push(d)}}\n for(var i=0;i<extra.length&&pool.length<8;i++){pool.push(extra[i])}\n }\n H1T(\"H1T: 共 \"+pool.length+\" 条候选,逐个探活…\")\n var live=[];var lat=[]\n for(var i=0;i<pool.length;i++){\n var u=\"https:\/\/\"+pool[i]+\"\/enter\";var t0=Date.now();var ok=false;var body=\"\"\n try{body=String(java.ajax(u))}catch(e){body=\"\"}\n var dt=Date.now()-t0\n if(body.length>50000&&body.indexOf(\"hanime1\")>=0){ok=true}\n if(ok){live.push(pool[i]);lat.push(dt)}\n }\n if(live.length===0){H1L(\"H1L: ✘ 无存活线路;请检查网络或在发布页框填新域名再点本按钮\");return}\n var minI=0\n for(var i=1;i<lat.length;i++){if(lat[i]<lat[minI])minI=i}\n H1P(\"h1pubdoms\",live.join(\",\"))\n for(var i=0;i<pool.length;i++){\n var li=live.indexOf(pool[i])\n H1P(\"h1sp\"+(i+1), li>=0?(lat[li]+\"ms\"):\"超时\")\n }\n H1P(\"h1dom\",live[minI])\n H1L(\"H1L: ✔ 存活 \"+live.length+\" 条:\"+live.join(\" | \")+\"; 最快 \"+live[minI]+\" 已切换\")\n try{java.reLoginView(false)}catch(e){}\n}\nfunction login(){return \"ok\"}",
"respondTime": 180000,
"ruleBookInfo": {
"author": "author",
"coverUrl": "cover",
"init": "@js:H1CUR(java,source,result,baseUrl)",
"intro": "introStr",
"kind": "kindStr",
"lastChapter": "durStr",
"name": "name",
"tocUrl": "@js:(function(){var u=String(baseUrl);return u})()"
},
"ruleContent": {
"content": "@js:H1CONTENT(java,source,String(result),baseUrl)",
"sourceRegex": "\/jmpres\/.*\\.mp4"
},
"ruleExplore": {
"author": "author",
"bookList": "@js:H1LIST(java,source,String(result))",
"bookUrl": "u",
"coverUrl": "cover",
"intro": "date",
"kind": "du",
"name": "name",
"wordCount": "views"
},
"ruleSearch": {
"author": "author",
"bookList": "@js:H1LIST(java,source,String(result))",
"bookUrl": "u",
"checkKeyWord": "催眠",
"coverUrl": "cover",
"intro": "date",
"kind": "du",
"name": "name",
"wordCount": "views"
},
"ruleToc": {
"chapterList": "@js:H1CHAP(java,source,book,String(result),baseUrl)",
"chapterName": "n",
"chapterUrl": "u"
},
"searchUrl": "\/search?query={{key}}&page={{page}}",
"variableComment": "h1dom=\\u5f53\\u524d\\u7ebf\\u8def\\u57df\\u540d(\\u4e0d\\u8981\\u624b\\u6539,\\u7528\\u767b\\u5f55\\u9762\\u677f\\u5207\\u6362);h1sp1~4=\\u5404\\u7ebf\\u8def\\u6d4b\\u901f\\u7ed3\\u679c",
"weight": 0
}