基於Node.js的裁判文書網爬蟲分析

黑哈哈發表於2018-10-06

因為筆者線上上實習時的需求,需要做一個裁判文書網的爬蟲,本以為,一個政府網站爬蟲嘛會有多難?但當筆者開始爬的時候,筆者發現自己錯了,困難重重!好在最後解決了,筆者將程式碼重構放在github上之後在這裡寫下了寫這個爬蟲的整個思路。

筆者實現的爬蟲地址:裁判文書網爬蟲

原理分析

獲取列表

首先,開啟裁判文書網的頁面,進入我們眼簾的是這樣的畫面

基於Node.js的裁判文書網爬蟲分析
一個大大的搜尋框,我們的思路大致也從這裡開始。 我們開啟開發者工具,進行一次搜尋,看看都會發生哪些事情。 我們在這裡搜尋買票
基於Node.js的裁判文書網爬蟲分析

然後我們點選搜尋,看看開發者工具裡所抓到的包

基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析
我們看到,整個搜尋,經過了GetCode 、TreeList、 ListContent這三個關鍵的請求,我們分別對這三個請求進行分析看看。
基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析

首先是GetCode,我們可以看到瀏覽器向http://wenshu.court.gov.cn/ValiCode/GetCode這個地址傳送了一個Post請求,傳送了一個含有guid項的表單過去,那麼這個guid是什麼呢?我們暫時先不表。

另外這個請求還為我們反回了一串字元,這個字串是什麼?很奇怪不是嗎,但是既然我們傳送了這個請求,那麼這個應該是有用的,我們之後看。

基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析

再看看ListContent這個請求,瀏覽器向http://wenshu.court.gov.cn/List/ListContent傳送了一個post請求,post過去的表單裡包含param 、 index 、 direction、vl5x、number、guid、order這幾項。似乎,這個和我們的搜尋有什麼聯絡,我們再看看返回的資料,是一串非常非常非常長的JSON,我擷取了其中的開頭和結尾,在開頭處我們可以看到RunEval這一項,奇奇怪怪的,我們再看結尾處,嘶,似乎,這就是我們所要找的資料了。我們先不管,我們先看看TreeList請求。

基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析

我們同樣是傳送了Post請求,我們看得到的結果,似乎是 網站中關鍵詞的列表,這並不是我們所要的資料。

既然知道了整個搜尋請求的流程和我們所需要的一些資料值,那麼接下來我們分析一下這些值究竟來源於哪裡。

首先是getCode裡的guid值,這個guid值在之後的請求中也有用到。

基於Node.js的裁判文書網爬蟲分析

我們在原始碼中進行搜尋,在其中lsTree這個檔案中找到了如下定義,guid是由一個名為createGuid的函式拼接生成的,這個函式的功能就是用來生成隨機字串的。

var createGuid = function () {
      return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
複製程式碼

我們找到了guid的生成辦法

var guid = createGuid() + createGuid() + "-" + createGuid() + "-" + createGuid() + createGuid() + "-" + createGuid() + createGuid() + createGuid(); 
複製程式碼

好了,這下找到了guid的生成方案,對於Node來說,我們只需要直接拿來使用就好啦。

找到了guid,我們接下來看number的生成辦法

可以翻看一下GetCode請求,所拿到的一串字串的前四位正是我們進行ListContent請求時的前四位(配圖中的圖片是重新整理之後的,第一次請求中會進行ListContent請求)。

所以我們想要拿到number的話,需要對伺服器發起GetCode請求,將我們的guid發給伺服器。我們就可以從中取得我們所需要的number。

繼續向下看,我們發現一個奇奇怪怪的值vl5x,那麼這個值又是從哪裡來的呢?

我們用同樣的搜尋原始碼的辦法,來找找看有沒有相關的原始碼。

基於Node.js的裁判文書網爬蟲分析

我們在原始碼中看到了這樣一段,在傳送ajax請求時,呼叫了getKey()這個函式。

我們通過找找看getKey的原始碼。我們通過控制檯提供給我們的原始碼檢視的辦法找到了它的原始碼。

並且這段程式碼是依賴於一個叫做vjkl5的值,我們通過分析發現這個vjkl5來自於cookie

function getKey() {
    eval(de("eval(_fxxx('e n(7){9 d=0;j(9 i=0;i<7.k;i++){d+=(7.g(i)<<(i%m))}f d}e p(7){9 d=0;j(9 i=0;i<7.k;i++){d+=(7.g(i)<<(i%m))+i}f d}e E(7,o){9 d=0;j(9 i=0;i<7.k;i++){d+=(7.g(i)<<(i%m))+(i*o)}f d}e x(7,o){9 d=0;j(9 i=0;i<7.k;i++){d+=(7.g(i)<<(i%m))+(i+o-7.g(i))}f d}e z(7){9 7=7.8(5,5*5)+7.8((5+1)*(5+1),3);9 a=7.8(5)+7.8(-4);9 b=7.8(4)+a.8(-6);f h(7).8(4,l)}e w(7){9 7=7.8(5,5*5)+\"5\"+7.8(1,2)+\"1\"+7.8((5+1)*(5+1),3);9 a=7.8(5)+7.8(4);9 b=7.8(t)+a.8(-6);9 c=7.8(4)+a.8(6);f h(c).8(4,l)}e A(7){9 7=7.8(5,5*5)+\"r\"+7.8(1,2)+7.8((5+1)*(5+1),3);9 a=n(7.8(5))+7.8(4);9 b=n(7.8(5))+7.8(4);9 c=7.8(4)+b.8(5);f h(c).8(1,l)}e y(7){9 7=7.8(5,5*5)+\"r\"+7.8(1,2)+7.8((5+1)*(5+1),3);9 a=p(7.8(5))+7.8(4);9 b=7.8(4)+a.8(5);9 c=n(7.8(5))+7.8(4);f h(b).8(3,l)}e B(7){9 7=7.8(5,5*5)+\"2\"+7.8(1,2)+7.8((5+1)*(5+1),3);9 d=0;j(9 i=0;i<7.8(1).k;i++){d+=(7.g(i)<<(i%m))}9 s=d+7.8(4);9 d=0;9 a=7.8(5);j(9 i=0;i<a.k;i++){d+=(a.g(i)<<(i%m))+i}a=d+\"\"+7.8(4);9 b=h(7.8(1))+n(a.8(5));f h(b).8(3,l)}e v(7){9 q=u C();9 7=q.F(7.8(5,5*5)+7.8(1,2)+\"1\")+7.8((5+1)*(5+1),3);9 a=p(7.8(4,D))+7.8(-4);9 b=h(7.8(4))+a.8(2);9 a=7.8(3);9 c=n(7.8(5))+7.8(4);9 s=d+7.8(4);9 d=0;j(9 i=0;i<a.k;i++){d+=(a.g(i)<<(i%t))+i}a=d+\"\"+7.8(4);f h(7).8(4,l)}', 42, 42, '|||||||str|substr|var||||long|{0}|return|charCodeAt|hex_md5||for|length|24|16|strToLong|step|strToLongEn|base|15|aa|12|new|{1}5|{1}1|strToLongEn3|{1}3|{1}0|{1}2|{1}4|Base64|10|strToLongEn2|encode'.split('|'), 0, {}))", 4, "function|makeKey_|(k(0)+|(c(0)+"))
    eval(_fxxx('o B(8){d j=p q();d 8=8.9(5,5*5)+8.9((5+1)*(5+1),3);d a=j.s(8.9(4,G))+8.9(2);d b=8.9(6)+a.9(2);d c=x(8.9(5))+8.9(4);d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))+i}a=e+""+8.9(4);n l(b).9(2,m)}o F(8){d j=p q();d 8=j.s(8.9(5,5*4)+"E"+8.9(1,2))+8.9((5+1)*(5+1),3);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%k+5))+3+5}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))}a=e+""+8.9(4);d b=l(8.9(1))+x(a.9(5));n l(b).9(3,m)}o H(8){d j=p q();d 8=j.s(8.9(5,5*5-1)+"5"+"-"+"5")+8.9(1,2)+8.9((5+1)*(5+1),3);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%k))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))}a=e+""+8.9(4);d b=l(8.9(1))+K(a.9(5));n l(b).9(4,m)}o J(8){d 8=8.9(5,5*5)+"5"+8.9(1,2)+"1"+8.9((5+1)*(5+1),3);d a=8.9(5)+8.9(4);d b=8.9(I)+a.9(-6);d c=t(8.9(4))+a.9(6);n l(c).9(4,m)}o w(8){d j=p q();d 8=j.s(8.9(5,5*5-1)+"5")+8.9(1,2)+8.9((5+1)*(5+1),3);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%k))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))}a=e+""+8.9(4);d b=l(8.9(1))+t(a.9(5));n l(b).9(4,m)}o D(8){d j=p q();d 8=8.9(5,5*5-1)+"2"+8.9(1,2)+8.9((5+1)*(5+1),3);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%k))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))}a=e+""+8.9(2);d b=8.9(1)+t(a.9(5));n l(b).9(2,m)}o y(8){d j=p q();d 8=8.9(5,5*5-1)+8.9((5+1)*(5+1),3)+"2"+8.9(1,2);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%k))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))}a=e+""+8.9(2);d b=8.9(1)+t(8.9(5));n l(b).9(1,m)}o z(8){d j=p q();d 8=8.9(5,5*5-1)+"2"+8.9(1,2);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%k))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))}a=e+""+8.9(2);d b=j.s(8.9(1)+t(8.9(5)));n l(b).9(1,m)}o C(8){d j=p q();d 8=8.9(5,5*5-1)+"2"+8.9(1,2);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%k))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))}a=e+""+8.9(2);d b=j.s(8.9(1)+8.9(5)+8.9(1,3));n t(b).9(1,m)}o A(8){d j=p q();d 8=8.9(5,5*5-1)+"2"+8.9(1,2);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%k))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))}a=e+""+8.9(2);d b=j.s(a.9(1)+8.9(5)+8.9(2,3));n t(b).9(1,m)}o N(8){d j=p q();d 8=8.9(5,5*5-1)+"2"+8.9(1,2)+"-"+"5";d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%u))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))+i}a=e+""+8.9(2);d b=j.s(a.9(1))+v(8.9(5),5)+8.9(2,3);n l(b).9(2,m)}o L(8){d j=p q();d 8=8.9(5,5*5-1)+"7"+8.9(1,2)+"-"+"5";d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%u))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))+i}a=e+""+8.9(2);d b=j.s(a.9(1))+v(8.9(5),5+1)+8.9(2+5,3);n l(b).9(0,m)}o R(8){d j=p q();d 8=8.9(5,5*5-1)+"7"+8.9(1,2)+"5"+8.9(2+5,3);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%u))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))+i}a=e+""+8.9(2);d b=a.9(1)+v(8.9(5),5+1)+8.9(2+5,3);n l(b).9(0,m)}o P(8){d j=p q();d 8=8.9(5,5*5-1)+"7"+8.9(5,2)+"5"+8.9(2+5,3);d e=0;h(d i=0;i<8.9(1).g;i++){e+=(8.f(i)<<(i%u))}d r=e+8.9(4);d e=0;d a=8.9(5);h(d i=0;i<a.g;i++){e+=(a.f(i)<<(i%k))+i}a=e+""+8.9(2);d b=a.9(1)+O(8.9(5),5-1)+8.9(2+5,3);n l(b).9(0,m)}o M(8){n l(w(8)+Q(8)).9(1,m)}', 54, 54, '||||||||str|substr||||var|long|charCodeAt|length|for||base|16|hex_md5|24|return|function|new|Base64|aa|encode|hex_sha1|11|strToLongEn2|makeKey_10|strToLong|makeKey_12|makeKey_13|makeKey_15|makeKey_6|makeKey_14|makeKey_11|55|makeKey_7|10|makeKey_8|12|makeKey_9|strToLongEn|makeKey_17|makeKey_20|makeKey_16|strToLongEn3|makeKey_19|makeKey_5|makeKey_18'.split('|'), 0, {}))
    eval(_fxxx('6 3f(0){7 5(1v(0)+g(0)).8(2,24)}6 1w(0){7 5(k(0)+b(0)).8(3,24)}6 1x(0){7 5(i(0)+9(0)).8(4,24)}6 1s(0){7 5(j(0)+a(0)).8(1,24)}6 1t(0){7 5(h(0)+c(0)).8(2,24)}6 1u(0){7 5(f(0)+m(0)).8(3,24)}6 1y(0){7 5(e(0)+g(0)).8(4,24)}6 1C(0){7 5(d(0)+l(0)).8(1,24)}6 1D(0){7 5(b(0)+g(0)).8(2,24)}6 1E(0){7 5(9(0)+l(0)).8(3,24)}6 1z(0){7 5(a(0)+n(0)).8(4,24)}6 1A(0){7 5(c(0)+k(0)).8(3,24)}6 1B(0){7 5(m(0)+i(0)).8(4,24)}6 1i(0){7 5(g(0)+j(0)).8(1,24)}6 1j(0){7 5(l(0)+h(0)).8(2,24)}6 1k(0){7 5(n(0)+f(0)).8(3,24)}6 1f(0){7 5(1g(0)+e(0)).8(1,24)}6 1h(0){7 5(o(0)+d(0)).8(2,24)}6 1l(0){7 5(k(0)+b(0)).8(3,24)}6 1p(0){7 5(i(0)+9(0)).8(4,24)}6 1q(0){7 5(j(0)+a(0)).8(3,24)}6 1r(0){7 5(h(0)+c(0)).8(4,24)}6 1m(0){7 5(f(0)+m(0)).8(1,24)}6 1n(0){7 5(e(0)+g(0)).8(2,24)}6 1o(0){7 5(d(0)+l(0)).8(3,24)}6 1V(0){7 5(b(0)+e(0)).8(4,24)}6 1W(0){7 5(9(0)+d(0)).8(1,24)}6 1X(0){7 5(a(0)+b(0)).8(2,24)}6 1S(0){7 5(c(0)+9(0)).8(3,24)}6 1T(0){7 5(m(0)+a(0)).8(4,24)}6 1U(0){7 5(g(0)+c(0)).8(1,24)}6 1Y(0){7 5(l(0)+k(0)).8(2,24)}6 22(0){7 5(o(0)+i(0)).8(3,24)}6 23(0){7 5(k(0)+j(0)).8(4,24)}6 25(0){7 5(i(0)+h(0)).8(3,24)}6 1Z(0){7 5(j(0)+f(0)).8(4,24)}6 20(0){7 5(h(0)+e(0)).8(1,24)}6 21(0){7 5(f(0)+d(0)).8(2,24)}6 1I(0){7 5(e(0)+b(0)).8(3,24)}6 1J(0){7 5(d(0)+9(0)).8(1,24)}6 1K(0){7 5(b(0)+a(0)).8(2,24)}6 1F(0){7 5(9(0)+c(0)).8(3,24)}6 1G(0){7 5(a(0)+b(0)).8(4,24)}6 1H(0){7 5(c(0)+9(0)).8(3,24)}6 1L(0){7 5(k(0)+a(0)).8(1,24)}6 1P(0){7 5(i(0)+c(0)).8(2,24)}6 1Q(0){7 5(j(0)+m(0)).8(3,24)}6 1R(0){7 5(h(0)+g(0)).8(4,24)}6 1M(0){7 5(f(0)+l(0)).8(1,24)}6 1N(0){7 5(e(0)+9(0)).8(2,24)}6 1O(0){7 5(d(0)+a(0)).8(3,24)}6 1e(0){7 5(b(0)+c(0)).8(4,24)}6 M(0){7 5(9(0)+e(0)).8(1,24)}6 D(0){7 5(a(0)+d(0)).8(2,24)}6 E(0){7 5(k(0)+b(0)).8(3,24)}6 F(0){7 5(i(0)+9(0)).8(4,24)}6 C(0){7 5(j(0)+a(0)).8(3,24)}6 z(0){7 5(h(0)+c(0)).8(4,24)}6 A(0){7 5(f(0)+h(0)).8(1,24)}6 B(0){7 5(e(0)+f(0)).8(2,24)}6 K(0){7 5(d(0)+e(0)).8(3,24)}6 L(0){7 5(k(0)+d(0)).8(1,24)}6 J(0){7 5(i(0)+b(0)).8(4,24)}6 G(0){7 5(j(0)+9(0)).8(1,24)}6 H(0){7 5(h(0)+a(0)).8(2,24)}6 I(0){7 5(f(0)+c(0)).8(3,24)}6 s(0){7 5(k(0)+k(0)).8(4,24)}6 x(0){7 5(i(0)+i(0)).8(1,24)}6 u(0){7 5(j(0)+j(0)).8(2,24)}6 p(0){7 5(h(0)+h(0)).8(3,24)}6 t(0){7 5(f(0)+f(0)).8(4,24)}6 w(0){7 5(e(0)+e(0)).8(3,24)}6 v(0){7 5(d(0)+d(0)).8(4,24)}6 y(0){7 5(b(0)+b(0)).8(1,24)}6 q(0){7 5(9(0)+9(0)).8(2,24)}6 r(0){7 5(a(0)+a(0)).8(3,24)}6 N(0){7 5(c(0)+c(0)).8(4,24)}6 14(0){7 5(m(0)+m(0)).8(3,24)}6 15(0){7 5(g(0)+g(0)).8(4,24)}6 16(0){7 5(l(0)+g(0)).8(1,24)}6 11(0){7 5(f(0)+l(0)).8(2,24)}6 12(0){7 5(e(0)+d(0)).8(1,24)}6 13(0){7 5(d(0)+b(0)).8(2,24)}6 17(0){7 5(b(0)+9(0)).8(3,24)}6 1b(0){7 5(9(0)+9(0)).8(4,24)}6 1c(0){7 5(a(0)+a(0)).8(1,24)}6 1d(0){7 5(k(0)+k(0)).8(2,24)}6 18(0){7 5(i(0)+i(0)).8(3,24)}6 19(0){7 5(j(0)+j(0)).8(4,24)}6 1a(0){7 5(h(0)+h(0)).8(1,24)}6 R(0){7 5(f(0)+f(0)).8(2,24)}6 S(0){7 5(e(0)+e(0)).8(3,24)}6 T(0){7 5(d(0)+d(0)).8(4,24)}6 O(0){7 5(b(0)+b(0)).8(3,24)}6 P(0){7 5(9(0)+9(0)).8(4,24)}6 Q(0){7 5(a(0)+a(0)).8(1,24)}6 U(0){7 5(c(0)+c(0)).8(2,24)}6 Y(0){7 5(m(0)+i(0)).8(3,24)}6 Z(0){7 5(g(0)+j(0)).8(1,24)}6 10(0){7 5(b(0)+h(0)).8(1,24)}6 V(0){7 5(9(0)+f(0)).8(2,24)}6 W(0){7 5(a(0)+e(0)).8(3,24)}6 X(0){7 5(c(0)+d(0)).8(4,24)}6 26(0){7 5(m(0)+b(0)).8(1,24)}6 3c(0){7 5(g(0)+9(0)).8(2,24)}6 3d(0){7 5(l(0)+a(0)).8(3,24)}6 3e(0){7 5(g(0)+c(0)).8(4,24)}6 39(0){7 5(l(0)+m(0)).8(1,24)}6 3a(0){7 5(n(0)+g(0)).8(2,24)}6 3b(0){7 5(k(0)+l(0)).8(3,24)}6 3i(0){7 5(i(0)+f(0)).8(4,24)}6 3j(0){7 5(j(0)+e(0)).8(3,24)}6 3k(0){7 5(h(0)+d(0)).8(4,24)}6 2E(0){7 5(f(0)+b(0)).8(1,24)}6 3g(0){7 5(e(0)+9(0)).8(2,24)}6 3h(0){7 5(d(0)+a(0)).8(1,24)}6 38(0){7 5(b(0)+k(0)).8(2,24)}6 2Z(0){7 5(9(0)+i(0)).8(3,24)}6 30(0){7 5(a(0)+j(0)).8(4,24)}6 31(0){7 5(c(0)+h(0)).8(1,24)}6 2W(0){7 5(m(0)+f(0)).8(2,24)}6 2X(0){7 5(g(0)+e(0)).8(3,24)}6 2Y(0){7 5(l(0)+d(0)).8(4,24)}6 35(0){7 5(e(0)+b(0)).8(1,24)}6 36(0){7 5(d(0)+9(0)).8(2,24)}6 37(0){7 5(b(0)+a(0)).8(3,24)}6 32(0){7 5(9(0)+c(0)).8(4,24)}6 33(0){7 5(a(0)+m(0)).8(3,24)}6 34(0){7 5(c(0)+g(0)).8(4,24)}6 3D(0){7 5(k(0)+b(0)).8(1,24)}6 3B(0){7 5(i(0)+9(0)).8(2,24)}6 3C(0){7 5(j(0)+a(0)).8(3,24)}6 3y(0){7 5(h(0)+c(0)).8(1,24)}6 3z(0){7 5(f(0)+m(0)).8(1,24)}6 3A(0){7 5(e(0)+g(0)).8(2,24)}6 3I(0){7 5(d(0)+l(0)).8(3,24)}6 3J(0){7 5(b(0)+g(0)).8(4,24)}6 3H(0){7 5(9(0)+l(0)).8(1,24)}6 3E(0){7 5(a(0)+n(0)).8(2,24)}6 3F(0){7 5(c(0)+k(0)).8(3,24)}6 3G(0){7 5(b(0)+i(0)).8(4,24)}6 3x(0){7 5(9(0)+j(0)).8(1,24)}6 3o(0){7 5(a(0)+h(0)).8(2,24)}6 3p(0){7 5(c(0)+f(0)).8(3,24)}6 3q(0){7 5(m(0)+e(0)).8(4,24)}6 3l(0){7 5(g(0)+d(0)).8(3,24)}6 3m(0){7 5(l(0)+b(0)).8(4,24)}6 3n(0){7 5(9(0)+9(0)).8(1,24)}6 3u(0){7 5(a(0)+a(0)).8(2,24)}6 3v(0){7 5(c(0)+c(0)).8(3,24)}6 3w(0){7 5(e(0)+m(0)).8(1,24)}6 3r(0){7 5(d(0)+g(0)).8(2,24)}6 3s(0){7 5(b(0)+l(0)).8(3,24)}6 3t(0){7 5(9(0)+e(0)).8(4,24)}6 2V(0){7 5(a(0)+d(0)).8(1,24)}6 2n(0){7 5(c(0)+b(0)).8(2,24)}6 2o(0){7 5(h(0)+9(0)).8(3,24)}6 2p(0){7 5(f(0)+a(0)).8(4,24)}6 2k(0){7 5(e(0)+c(0)).8(1,24)}6 2l(0){7 5(d(0)+k(0)).8(3,24)}6 2m(0){7 5(b(0)+i(0)).8(1,24)}6 2t(0){7 5(9(0)+j(0)).8(2,24)}6 2u(0){7 5(a(0)+h(0)).8(3,24)}6 2v(0){7 5(c(0)+f(0)).8(4,24)}6 2q(0){7 5(k(0)+e(0)).8(3,24)}6 2r(0){7 5(i(0)+d(0)).8(4,24)}6 2s(0){7 5(j(0)+b(0)).8(4,24)}6 2j(0){7 5(h(0)+9(0)).8(1,24)}6 2a(0){7 5(f(0)+a(0)).8(2,24)}6 2b(0){7 5(e(0)+c(0)).8(3,24)}6 2c(0){7 5(d(0)+b(0)).8(4,24)}6 27(0){7 5(b(0)+9(0)).8(1,24)}6 28(0){7 5(9(0)+a(0)).8(2,24)}6 29(0){7 5(a(0)+c(0)).8(3,24)}6 2g(0){7 5(c(0)+k(0)).8(4,24)}6 2h(0){7 5(m(0)+i(0)).8(3,24)}6 2i(0){7 5(g(0)+j(0)).8(4,24)}6 2d(0){7 5(g(0)+h(0)).8(1,24)}6 2e(0){7 5(l(0)+a(0)).8(2,24)}6 2f(0){7 5(d(0)+b(0)).8(2,24)}6 2M(0){7 5(b(0)+9(0)).8(3,24)}6 2N(0){7 5(9(0)+a(0)).8(1,24)}6 2O(0){7 5(a(0)+c(0)).8(2,24)}6 2J(0){7 5(c(0)+m(0)).8(3,24)}6 2K(0){7 5(k(0)+g(0)).8(4,24)}6 2L(0){7 5(i(0)+l(0)).8(1,24)}6 2S(0){7 5(j(0)+e(0)).8(2,24)}6 2T(0){7 5(h(0)+d(0)).8(3,24)}6 2U(0){7 5(f(0)+b(0)).8(4,24)}6 2P(0){7 5(e(0)+9(0)).8(1,24)}6 2Q(0){7 5(d(0)+a(0)).8(3,24)}6 2R(0){7 5(b(0)+c(0)).8(1,24)}6 2I(0){7 5(9(0)+k(0)).8(2,24)}6 2z(0){7 5(a(0)+i(0)).8(3,24)}6 2A(0){7 5(c(0)+j(0)).8(4,24)}6 2B(0){7 5(b(0)+h(0)).8(3,24)}6 2w(0){7 5(9(0)+f(0)).8(4,24)}6 2x(0){7 5(a(0)+e(0)).8(4,24)}6 2y(0){7 5(c(0)+d(0)).8(1,24)}6 2F(0){7 5(m(0)+b(0)).8(2,24)}6 2G(0){7 5(g(0)+9(0)).8(3,24)}6 2H(0){7 5(l(0)+a(0)).8(4,24)}6 2C(0){7 5(9(0)+c(0)).8(1,24)}6 2D(0){7 5(a(0)+m(0)).8(2,24)}', 62, 232, 'str|||||hex_md5|function|return|substr|makeKey_0|makeKey_1|makeKey_19|makeKey_4|makeKey_18|makeKey_17|makeKey_10|makeKey_3|makeKey_9|makeKey_15|makeKey_16|makeKey_14|makeKey_7|makeKey_5|makeKey_8|makeKey_12|makeKey_90|makeKey_95|makeKey_96|makeKey_87|makeKey_91|makeKey_89|makeKey_93|makeKey_92|makeKey_88|makeKey_94|makeKey_78|makeKey_79|makeKey_80|makeKey_77|makeKey_74|makeKey_75|makeKey_76|makeKey_84|makeKey_85|makeKey_86|makeKey_83|makeKey_81|makeKey_82|makeKey_73|makeKey_97|makeKey_114|makeKey_115|makeKey_116|makeKey_111|makeKey_112|makeKey_113|makeKey_117|makeKey_121|makeKey_122|makeKey_123|makeKey_118|makeKey_119|makeKey_120|makeKey_101|makeKey_102|makeKey_103|makeKey_98|makeKey_99|makeKey_100|makeKey_104|makeKey_108|makeKey_109|makeKey_110|makeKey_105|makeKey_106|makeKey_107|makeKey_72|makeKey_37|makeKey_6|makeKey_38|makeKey_34|makeKey_35|makeKey_36|makeKey_39|makeKey_43|makeKey_44|makeKey_45|makeKey_40|makeKey_41|makeKey_42|makeKey_24|makeKey_25|makeKey_26|makeKey_11|makeKey_22|makeKey_23|makeKey_27|makeKey_31|makeKey_32|makeKey_33|makeKey_28|makeKey_29|makeKey_30|makeKey_62|makeKey_63|makeKey_64|makeKey_59|makeKey_60|makeKey_61|makeKey_65|makeKey_69|makeKey_70|makeKey_71|makeKey_66|makeKey_67|makeKey_68|makeKey_49|makeKey_50|makeKey_51|makeKey_46|makeKey_47|makeKey_48|makeKey_52|makeKey_56|makeKey_57|makeKey_58|makeKey_53|makeKey_54||makeKey_55|makeKey_124|makeKey_192|makeKey_193|makeKey_194|makeKey_189|makeKey_190|makeKey_191|makeKey_198|makeKey_199|makeKey_200|makeKey_195|makeKey_196|makeKey_197|makeKey_188|makeKey_179|makeKey_180|makeKey_181|makeKey_176|makeKey_177|makeKey_178|makeKey_185|makeKey_186|makeKey_187|makeKey_182|makeKey_183|makeKey_184|makeKey_217|makeKey_218|makeKey_219|makeKey_214|makeKey_215|makeKey_216|makeKey_223|makeKey_224|makeKey_134|makeKey_220|makeKey_221|makeKey_222|makeKey_213|makeKey_204|makeKey_205|makeKey_206|makeKey_201|makeKey_202|makeKey_203|makeKey_210|makeKey_211|makeKey_212|makeKey_207|makeKey_208|makeKey_209|makeKey_175|makeKey_141|makeKey_142|makeKey_143|makeKey_138|makeKey_139|makeKey_140|makeKey_147|makeKey_148|makeKey_149|makeKey_144|makeKey_145|makeKey_146|makeKey_137|makeKey_128|makeKey_129|makeKey_130|makeKey_125|makeKey_126|makeKey_127|makeKey_21|makeKey_135|makeKey_136|makeKey_131|makeKey_132|makeKey_133|makeKey_166|makeKey_167|makeKey_168|makeKey_163|makeKey_164|makeKey_165|makeKey_172|makeKey_173|makeKey_174|makeKey_169|makeKey_170|makeKey_171|makeKey_162|makeKey_153|makeKey_154|makeKey_155|makeKey_151|makeKey_152|makeKey_150|makeKey_159|makeKey_160|makeKey_161|makeKey_158|makeKey_156|makeKey_157'.split('|'), 0, {}))
    eval(_fxxx('5 y(0){7 6(d(0)+m(0)).9(3,8)}5 z(0){7 6(e(0)+l(0)).9(4,8)}5 w(0){7 6(f(0)+e(0)).9(2,8)}5 x(0){7 6(a(0)+f(0)).9(3,8)}5 C(0){7 6(b(0)+a(0)).9(1,8)}5 D(0){7 6(c(0)+b(0)).9(2,8)}5 A(0){7 6(d(0)+c(0)).9(3,8)}5 B(0){7 6(h(0)+d(0)).9(4,8)}5 v(0){7 6(i(0)+j(0)).9(1,8)}5 p(0){7 6(e(0)+g(0)).9(2,8)}5 q(0){7 6(f(0)+k(0)).9(3,8)}5 n(0){7 6(a(0)+h(0)).9(4,8)}5 o(0){7 6(b(0)+i(0)).9(1,8)}5 t(0){7 6(c(0)+e(0)).9(3,8)}5 u(0){7 6(d(0)+a(0)).9(1,8)}5 r(0){7 6(j(0)+b(0)).9(2,8)}5 s(0){7 6(g(0)+c(0)).9(3,8)}5 N(0){7 6(k(0)+d(0)).9(4,8)}5 O(0){7 6(h(0)+M(0)).9(3,8)}5 Q(0){7 6(i(0)+m(0)).9(4,8)}5 G(0){7 6(e(0)+l(0)).9(4,8)}5 F(0){7 6(f(0)+e(0)).9(2,8)}5 H(0){7 6(a(0)+f(0)).9(3,8)}5 K(0){7 6(b(0)+a(0)).9(1,8)}5 J(0){7 6(c(0)+b(0)).9(2,8)}5 I(0){7 6(d(0)+c(0)).9(3,8)}5 E(0){7 6(a(0)+d(0)).9(4,8)}5 L(0){7 6(b(0)+j(0)).9(1,8)}5 P(0){7 6(c(0)+g(0)).9(2,8)}', 53, 53, 'str|||||function|hex_md5|return|24|substr|makeKey_19|makeKey_0|makeKey_1|makeKey_4|makeKey_17|makeKey_18|makeKey_15|makeKey_9|makeKey_10|makeKey_14|makeKey_16|makeKey_7|makeKey_3|makeKey_236|makeKey_237|makeKey_234|makeKey_235|makeKey_240|makeKey_241|makeKey_238|makeKey_239|makeKey_233|makeKey_227|makeKey_228|makeKey_225|makeKey_226|makeKey_231|makeKey_232|makeKey_229|makeKey_230|makeKey_251|makeKey_246|makeKey_245|makeKey_247|makeKey_250|makeKey_249|makeKey_248|makeKey_252|makeKey_5|makeKey_242|makeKey_243|makeKey_253|makeKey_244'.split('|'), 0, {}))
    eval(_fxxx('7 p(0){6 5(a(0)+a(0)).8(3,9)}7 G(0){6 5(n(0)+i(0)).8(4,9)}7 E(0){6 5(l(0)+j(0)).8(1,9)}7 I(0){6 5(m(0)+h(0)).8(3,9)}7 z(0){6 5(c(0)+g(0)).8(1,9)}7 C(0){6 5(b(0)+k(0)).8(2,9)}7 B(0){6 5(a(0)+f(0)).8(3,9)}7 D(0){6 5(f(0)+e(0)).8(4,9)}7 y(0){6 5(e(0)+d(0)).8(3,9)}7 A(0){6 5(d(0)+c(0)).8(4,9)}7 H(0){6 5(c(0)+b(0)).8(4,9)}7 J(0){6 5(b(0)+a(0)).8(1,9)}7 F(0){6 5(a(0)+d(0)).8(2,9)}7 x(0){6 5(g(0)+c(0)).8(3,9)}7 r(0){6 5(k(0)+b(0)).8(4,9)}7 q(0){6 5(f(0)+a(0)).8(1,9)}7 o(0){6 5(e(0)+i(0)).8(2,9)}7 v(0){6 5(d(0)+j(0)).8(3,9)}7 u(0){6 5(c(0)+h(0)).8(4,9)}7 s(0){6 5(b(0)+g(0)).8(3,9)}7 t(0){6 5(d(0)+b(0)).8(4,9)}7 w(0){6 5(c(0)+d(0)).8(1,9)}7 K(0){6 5(b(0)+c(0)).8(2,9)}7 U(0){6 5(a(0)+b(0)).8(2,9)}7 Y(0){6 5(n(0)+a(0)).8(3,9)}7 W(0){6 5(l(0)+n(0)).8(1,9)}7 X(0){6 5(m(0)+l(0)).8(2,9)}7 V(0){6 5(f(0)+m(0)).8(3,9)}7 11(0){6 5(e(0)+f(0)).8(4,9)}7 12(0){6 5(d(0)+e(0)).8(1,9)}7 Z(0){6 5(c(0)+d(0)).8(2,9)}7 10(0){6 5(b(0)+c(0)).8(3,9)}7 N(0){6 5(a(0)+b(0)).8(4,9)}7 O(0){6 5(i(0)+a(0)).8(1,9)}7 L(0){6 5(j(0)+i(0)).8(3,9)}7 M(0){6 5(h(0)+j(0)).8(1,9)}7 P(0){6 5(g(0)+h(0)).8(2,9)}7 S(0){6 5(k(0)+g(0)).8(3,9)}7 T(0){6 5(f(0)+k(0)).8(4,9)}7 Q(0){6 5(e(0)+f(0)).8(3,9)}7 R(0){6 5(e(0)+e(0)).8(4,9)}', 62, 65, 'str|||||hex_md5|return|function|substr|24|makeKey_4|makeKey_1|makeKey_0|makeKey_19|makeKey_18|makeKey_17|makeKey_9|makeKey_16|makeKey_14|makeKey_15|makeKey_10|makeKey_3|makeKey_7|makeKey_5|makeKey_270|makeKey_254|makeKey_269|makeKey_268|makeKey_273|makeKey_274|makeKey_272|makeKey_271|makeKey_275|makeKey_267|makeKey_262|makeKey_258|makeKey_263|makeKey_260|makeKey_259|makeKey_261|makeKey_256|makeKey_266|makeKey_255|makeKey_264|makeKey_257|makeKey_265|makeKey_276|makeKey_288|makeKey_289|makeKey_286|makeKey_287|makeKey_290|makeKey_293|makeKey_294|makeKey_291|makeKey_292|makeKey_277|makeKey_281|makeKey_279|makeKey_280|makeKey_278|makeKey_284|makeKey_285|makeKey_282|makeKey_283'.split('|'), 0, {}))
 
 
    eval(de("eval(_fxxx('6 1F(0){5 7(b(0)+b(0)).8(4,24)}6 W(0){5 7(9(0)+9(0)).8(1,24)}6 V(0){5 7(a(0)+a(0)).8(2,24)}6 U(0){5 7{3}c(0)).8(3,24)}6 X(0){5 7(h(0)+h(0)).8(4,24)}6 10(0){5 7(g(0)+g(0)).8(1,24)}6 Z(0){5 7(f(0)+f(0)).8(2,24)}6 Y(0){5 7(d(0)+d(0)).8(3,24)}6 P(0){5 7(e(0)+e(0)).8(4,24)}6 O(0){5 7(b(0)+b(0)).8(3,24)}6 N(0){5 7(9(0)+9(0)).8(4,24)}6 Q(0){5 7(a(0)+a(0)).8(1,24)}6 T(0){5 7{3}c(0)).8(2,24)}6 S(0){5 7{2}k(0)).8(2,24)}6 R(0){5 7(m(0)+m(0)).8(3,24)}6 1a(0){5 7(l(0)+l(0)).8(1,24)}6 19(0){5 7(i(0)+i(0)).8(2,24)}6 18(0){5 7(j(0)+j(0)).8(3,24)}6 1b(0){5 7(d(0)+d(0)).8(4,24)}6 1e(0){5 7(b(0)+b(0)).8(1,24)}6 1d(0){5 7(9(0)+9(0)).8(2,24)}6 1c(0){5 7(a(0)+a(0)).8(3,24)}6 13(0){5 7{3}c(0)).8(4,24)}6 12(0){5 7(h(0)+h(0)).8(1,24)}6 11(0){5 7(g(0)+g(0)).8(3,24)}6 14(0){5 7(f(0)+f(0)).8(1,24)}6 17(0){5 7(d(0)+d(0)).8(2,24)}6 16(0){5 7(e(0)+e(0)).8(3,24)}6 15(0){5 7(b(0)+b(0)).8(4,24)}6 M(0){5 7(9(0)+9(0)).8(3,24)}6 w(0){5 7(a(0)+a(0)).8(4,24)}6 s(0){5 7{3}c(0)).8(4,24)}6 o(0){5 7(b(0)+k(0)).8(1,24)}6 t(0){5 7(9(0)+m(0)).8(2,24)}6 r(0){5 7(a(0)+l(0)).8(3,24)}6 v(0){5 7{3}i(0)).8(4,24)}6 u(0){5 7(b(0)+j(0)).8(1,24)}6 q(0){5 7(9(0)+d(0)).8(2,24)}6 n(0){5 7(a(0)+e(0)).8(3,24)}6 p(0){5 7{3}e(0)).8(4,24)}6 H(0){5 7(h(0)+b(0)).8(3,24)}6 G(0){5 7(g(0)+9(0)).8(4,24)}6 F(0){5 7(f(0)+a(0)).8(2,24)}6 I(0){5 7(9(0)+c(0)).8(3,24)}6 L(0){5 7(a(0)+h(0)).8(1,24)}6 J(0){5 7{3}g(0)).8(2,24)}6 E(0){5 7(d(0)+f(0)).8(3,24)}6 z(0){5 7(e(0)+d(0)).8(4,24)}6 y(0){5 7(b(0)+e(0)).8(1,24)}6 x(0){5 7(9(0)+b(0)).8(2,24)}6 A(0){5 7(a(0)+9(0)).8(3,24)}6 D(0){5 7{3}a(0)).8(4,24)}6 C(0){5 7(i(0)+c(0)).8(1,24)}6 B(0){5 7(j(0)+k(0)).8(3,24)}6 K(0){5 7(d(0)+m(0)).8(1,24)}6 1f(0){5 7(e(0)+l(0)).8(2,24)}6 1N(0){5 7(b(0)+i(0)).8(3,24)}6 1M(0){5 7(9(0)+j(0)).8(4,24)}6 1L(0){5 7(a(0)+d(0)).8(3,24)}6 1Q(0){5 7(e(0)+b(0)).8(4,24)}6 1P(0){5 7(b(0)+9(0)).8(4,24)}6 1O(0){5 7(9(0)+a(0)).8(1,24)}6 1H(0){5 7(a(0)+c(0)).8(2,24)}6 1G(0){5 7{3}h(0)).8(3,24)}6 1w(0){5 7(h(0)+g(0)).8(4,24)}6 1K(0){5 7(g(0)+f(0)).8(2,24)}6 1J(0){5 7(f(0)+d(0)).8(3,24)}6 1I(0){5 7(d(0)+e(0)).8(1,24)}6 1R(0){5 7(e(0)+b(0)).8(2,24)}6 20(0){5 7(b(0)+9(0)).8(3,24)}6 1Y(0){5 7(9(0)+a(0)).8(4,24)}6 21(0){5 7(a(0)+c(0)).8(1,24)}6 1Z(0){5 7{3}f(0)).8(2,24)}6 23(0){5 7{2}d(0)).8(3,24)}6 22(0){5 7(m(0)+e(0)).8(4,24)}6 1U(0){5 7(l(0)+b(0)).8(1,24)}6 1T(0){5 7(i(0)+9(0)).8(3,24)}6 1S(0){5 7(j(0)+a(0)).8(1,24)}6 1X(0){5 7(d(0)+c(0)).8(2,24)}6 1W(0){5 7(b(0)+d(0)).8(3,24)}6 1V(0){5 7(9(0)+e(0)).8(4,24)}6 1o(0){5 7(a(0)+b(0)).8(3,24)}6 1n(0){5 7{3}9(0)).8(4,24)}6 1m(0){5 7(h(0)+a(0)).8(4,24)}6 1r(0){5 7(g(0)+c(0)).8(1,24)}6 1q(0){5 7(f(0)+i(0)).8(2,24)}6 1p(0){5 7(d(0)+j(0)).8(3,24)}6 1i(0){5 7(e(0)+d(0)).8(4,24)}6 1h(0){5 7(b(0)+e(0)).8(1,24)}6 1g(0){5 7(9(0)+b(0)).8(2,24)}6 1l(0){5 7(a(0)+9(0)).8(3,24)}6 1k(0){5 7{3}a(0)).8(4,24)}6 1j(0){5 7(d(0)+a(0)).8(2,24)}6 1s(0){5 7(e(0)+c(0)).8(3,24)}6 1B(0){5 7(b(0)+f(0)).8(1,24)}6 1A(0){5 7(9(0)+d(0)).8(2,24)}6 1z(0){5 7(a(0)+e(0)).8(3,24)}6 1E(0){5 7{3}b(0)).8(4,24)}6 1D(0){5 7(i(0)+9(0)).8(1,24)}6 1C(0){5 7(j(0)+a(0)).8(2,24)}6 1v(0){5 7(d(0)+c(0)).8(3,24)}6 1u(0){5 7(e(0)+d(0)).8(4,24)}6 1t(0){5 7(b(0)+e(0)).8(1,24)}6 1y(0){5 7(9(0)+b(0)).8(3,24)}6 1x(0){5 7(a(0)+9(0)).8(1,24)}', 62, 129, 'str|||||return|{0}|hex_md5|substr|{1}0|{1}1|{1}19|{1}4|{1}17|{1}18|{1}7|{1}3|{1}5|{1}9|{1}10|{1}14|{1}16|{1}15|{1}333|{1}327|{1}334|{1}332|{1}329|{1}326|{1}328|{1}331|{1}330|{1}325|{1}344|{1}343|{1}342|{1}345|{1}348|{1}347|{1}346|{1}341|{1}337|{1}336|{1}335|{1}338|{1}340|{1}349|{1}339|{1}324|{1}305|{1}304|{1}303|{1}306|{1}309|{1}308|{1}307|{1}298|{1}297|{1}296|{1}299|{1}302|{1}301|{1}300|{1}319|{1}318|{1}317|{1}320|{1}323|{1}322|{1}321|{1}312|{1}311|{1}310|{1}313|{1}316|{1}315|{1}314|{1}350|{1}384|{1}383|{1}382|{1}387|{1}386|{1}385|{1}378|{1}377|{1}376|{1}381|{1}380|{1}379|{1}388|{1}397|{1}396|{1}395|{1}359|{1}399|{1}398|{1}391|{1}390|{1}389|{1}394|{1}393|{1}392|{1}295|{1}358|{1}357|{1}362|{1}361|{1}360|{1}353|{1}352|{1}351|{1}356|{1}355|{1}354|{1}363|{1}372|{1}371|{1}370|{1}375|{1}374|{1}373|{1}365|{1}367|{1}364|{1}366|{1}369|{1}368|'.split('|'), 0, {}))", 4, "function|makeKey_|(k(0)+|(c(0)+"))
 
    eval(_fxxx('0 2=2f(\'2e\');0 1=[2d,2i,2h,2g,29,28,27,2c,2b,2a,2j,2s,2r,2q,2v,2u,2t,2m,2l,2k,2p,2o,2n,1Q,1P,1O,1T,1S,1R,1K,1J,1I,1N,1M,1L,1U,23,22,21,26,25,24,1X,1W,1V,20,1Z,1Y,2w,34,33,32,37,36,35,2Y,2X,2W,31,30,2Z,38,3h,3g,3f,3k,3j,3i,3b,3a,39,3e,3d,3c,2F,2E,2D,2I,2H,2G,2z,2y,2x,2C,2B,2A,2J,2S,2R,2Q,2V,2U,2T,2M,2L,2K,2P,2O,2N,C,B,A,F,E,D,w,v,u,z,y,x,G,P,O,N,S,R,Q,J,I,H,M,L,K,d,c,b,g,f,e,7,6,5,a,9,8,h,q,p,o,t,s,r,k,j,i,n,m,l,T,1r,1q,1p,1u,1t,1s,1l,1k,1j,1o,1n,1m,1v,1E,1D,1C,1H,1G,1F,1y,1x,1w,1B,1A,1z,12,11,10,15,14,13,W,V,U,Z,Y,X,16,1f,1e,1d,1i,1h,1g,19,18,17,1c,1b,1a,3l,5w,5v,5u,5z,5y,5x,5q,5p,5o,5t,5s,5r,5A,5J,5I,5H,5M,5L,5K,5D,5C,5B,5G,5F,5E,57,56,55,5a,59,58,51,50,4Z,54,53,52,5b,5k,5j,5i,5n,5m,5l,5e,5d,5c,5h,5g,5f,5N,6l,6k,6j,6o,6n,6m,6f,6e,6d,6i,6h,6g,6p,6y,6x,6w,6B,6A,6z,6s,6r,6q,6v,6u,6t,5W,5V,5U,5Z,5Y,5X,5Q,5P,5O,5T,5S,5R,60,69,68,67,6c,6b,6a,63,62,61,66,65,64,3T,3S,3R,3W,3V,3U,3N,3M,3L,3Q,3P,3O,3X,46,45,44,49,48,47,40,3Z,3Y,43,42,41,3u,3t,3s,3x,3w,3v,3o,3n,3m,3r,3q,3p,3y,3H,3G,3F,3K,3J,3I,3B,3A,3z,3E,3D,3C,4a,4I,4H,4G,4L,4K,4J,4C,4B,4A,4F,4E,4D,4M,4V,4U,4T,4Y,4X,4W,4P,4O,4N,4S,4R,4Q,4j,4i,4h,4m,4l,4k,4d,4c,4b,4g,4f,4e,4n,4w,4v,4u,4z,4y,4x,4q,4p,4o];0 3=4t(2)%1.4s;0 4=1[3];0 4r=4(2);', 62, 410, eval(de("'var|arrFun|cookie|funIndex|fun|{0}132|{0}131|{0}130|{0}135|{0}134|{0}133|{0}126|{0}125|{0}124|{0}129|{0}128|{0}127|{0}136|{0}145|{0}144|{0}143|{0}148|{0}147|{0}146|{0}139|{0}138|{0}137|{0}142|{0}141|{0}140|{0}107|{0}106|{0}105|{0}110|{0}109|{0}108|{0}101|{0}100|{0}99|{0}104|{0}103|{0}102|{0}111|{0}120|{0}119|{0}118|{0}123|{0}122|{0}121|{0}114|{0}113|{0}112|{0}117|{0}116|{0}115|{0}149|{0}183|{0}182|{0}181|{0}186|{0}185|{0}184|{0}177|{0}176|{0}175|{0}180|{0}179|{0}178|{0}187|{0}196|{0}195|{0}194|{0}199|{0}198|{0}197|{0}190|{0}189|{0}188|{0}193|{0}192|{0}191|{0}158|{0}157|{0}156|{0}161|{0}160|{0}159|{0}152|{0}151|{0}150|{0}155|{0}154|{0}153|{0}162|{0}171|{0}170|{0}169|{0}174|{0}173|{0}172|{0}165|{0}164|{0}163|{0}168|{0}167|{0}166|{0}31|{0}30|{0}29|{0}34|{0}33|{0}32|{0}25|{0}24|{0}23|{0}28|{0}27|{0}26|{0}35|{0}44|{0}43|{0}42|{0}47|{0}46|{0}45|{0}38|{0}37|{0}36|{0}41|{0}40|{0}39|{0}6|{0}5|{0}4|{0}9|{0}8|{0}7|{0}0|vjkl5|getCookie|{0}3|{0}2|{0}1|{0}10|{0}19|{0}18|{0}17|{0}22|{0}21|{0}20|{0}13|{0}12|{0}11|{0}16|{0}15|{0}14|{0}48|{0}82|{0}81|{0}80|{0}85|{0}84|{0}83|{0}76|{0}75|{0}74|{0}79|{0}78|{0}77|{0}86|{0}95|{0}94|{0}93|{0}98|{0}97|{0}96|{0}89|{0}88|{0}87|{0}92|{0}91|{0}90|{0}57|{0}56|{0}55|{0}60|{0}59|{0}58|{0}51|{0}50|{0}49|{0}54|{0}53|{0}52|{0}61|{0}70|{0}69|{0}68|{0}73|{0}72|{0}71|{0}64|{0}63|{0}62|{0}67|{0}66|{0}65|{0}200|{0}335|{0}334|{0}333|{0}338|{0}337|{0}336|{0}329|{0}328|{0}327|{0}332|{0}331|{0}330|{0}339|{0}348|{0}347|{0}346|{0}351|{0}350|{0}349|{0}342|{0}341|{0}340|{0}345|{0}344|{0}343|{0}310|{0}309|{0}308|{0}313|{0}312|{0}311|{0}304|{0}303|{0}302|{0}307|{0}306|{0}305|{0}314|{0}323|{0}322|{0}321|{0}326|{0}325|{0}324|{0}317|{0}316|{0}315|{0}320|{0}319|{0}318|{0}352|{0}386|{0}385|{0}384|{0}389|{0}388|{0}387|{0}380|{0}379|{0}378|{0}383|{0}382|{0}381|{0}390|{0}399|{0}398|{0}397|result|length|strToLong|{0}393|{0}392|{0}391|{0}396|{0}395|{0}394|{0}361|{0}360|{0}359|{0}364|{0}363|{0}362|{0}355|{0}354|{0}353|{0}358|{0}357|{0}356|{0}365|{0}374|{0}373|{0}372|{0}377|{0}376|{0}375|{0}368|{0}367|{0}366|{0}371|{0}370|{0}369|{0}234|{0}233|{0}232|{0}237|{0}236|{0}235|{0}228|{0}227|{0}226|{0}231|{0}230|{0}229|{0}238|{0}247|{0}246|{0}245|{0}250|{0}249|{0}248|{0}241|{0}240|{0}239|{0}244|{0}243|{0}242|{0}209|{0}208|{0}207|{0}212|{0}211|{0}210|{0}203|{0}202|{0}201|{0}206|{0}205|{0}204|{0}213|{0}222|{0}221|{0}220|{0}225|{0}224|{0}223|{0}216|{0}215|{0}214|{0}219|{0}218|{0}217|{0}251|{0}285|{0}284|{0}283|{0}288|{0}287|{0}286|{0}279|{0}278|{0}277|{0}282|{0}281|{0}280|{0}289|{0}298|{0}297|{0}296|{0}301|{0}300|{0}299|{0}292|{0}291|{0}290|{0}295|{0}294|{0}293|{0}260|{0}259|{0}258|{0}263|{0}262|{0}261|{0}254|{0}253|{0}252|{0}257|{0}256|{0}255|{0}264|{0}273|{0}272|{0}271|{0}276|{0}275|{0}274|{0}267|{0}266|{0}265|{0}270|{0}269|{0}268'", 1, "makeKey_")).split('|'), 0, {}))
 
    return result;
}
複製程式碼

我們通過對這段原始碼打斷點可知,這段原始碼實際依賴於

var _fxxx = function (p, a, c, k, e, d) { e = function (c) { return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) }; if (!''.replace(/^/, String)) { while (c--) d[e(c)] = k[c] || e(c); k = [function (e) { return d[e] } ]; e = function () { return '\\w+' }; c = 1; }; while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]); return p; };
function de(str, count, strReplace) {
    var arrReplace = strReplace.split('|');
    for (var i = 0; i < count; i++) {
        str = str.replace(new RegExp('\\{' + i + '\\}', 'g'), arrReplace[i]);
    }
    return str;
}&emsp;&emsp;
複製程式碼

通過對程式碼的分析,我們可以得知這些程式碼依賴於base64.js md5.js sha1.js 方便起見,我們可以直接將它的原始碼下載下來直接使用。

我們繼續分析剩下的值,param很明顯是搜尋引數,並且以,隔開,Index為頁碼,Order為排序方式,我們按照預設法院層級,Direction暫時不知為何用,我們按照預設asc,這下我們就知道所有的引數來源了。

至此,我們就可以構造請求去獲取列表了。

全文內容獲取

接下來到了另外一個坑非常多的地方:獲取全文內容。

在獲取到列表後,我們發現一件事情,列表的內容只是縮略,很可能不能滿足我們的需求,所以,我們就必須要想辦法去獲取到全文,那麼我們該怎麼辦呢?

我們先開啟一個詳情頁,看看它都做了什麼事情。

我們首先看URL,詳情頁的URL的一個例子在這裡

wenshu.court.gov.cn/content/con…

基於Node.js的裁判文書網爬蟲分析

分析其格式,大致為

wenshu.court.gov.cn/content/con… 加上DocID 再看請求

基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析

發現這樣一個請求

它的返回結果正是文章的內容(需要正規表示式提取)

我們在列表頁載入完後我們去用選中開啟詳情頁的連結

基於Node.js的裁判文書網爬蟲分析

發現其呼叫了一個名為Navi的函式,好吧,我們再來看看Navi函式是個什麼鬼東西

同樣的辦法,我們拿到了Navi的函式本體

哈哈,還有這道反爬蟲程式作者留下的註釋~

//增加7道爬蟲防禦 段智峰 20180807
function Navi(id, keyword) {
    var unzipid = unzip(id);
    try {
        var realid = com.str.Decrypt(unzipid);
        if (realid == "") {
            setTimeout("Navi('" + id + "','" + keyword + "')", 1000);
        } else {
            var url = "/content/content?DocID=" + realid + "&KeyWord=" + encodeURI(keyword);
            openWin(url);
        }
    } catch (ex) {
        setTimeout("Navi('" + id + "','" + keyword + "')", 1000);
    }
}
複製程式碼

分析得知,Navi函式先將id解碼,之後進行解密得到

我們看看unzip函式是什麼

function unzip(b64Data) {
        var strData ;
        if(!window.atob){
        //  strData = $.base64.atob(b64Data)
        }else{
        //  strData = atob(b64Data)
        }
        var charData ;
        if (!Array.prototype.map) {
         //  charData =iemap( strData.split(''),function (x) { return x.charCodeAt(0); },null);
        }else{
        //  charData = strData.split('').map(function (x) { return x.charCodeAt(0); });
        }
         
        strData = Base64_Zip.btou(RawDeflate.inflate(Base64_Zip.fromBase64(b64Data)));
       // var binData = new Uint8Array(charData);
      //  var data = pako.inflate(binData);
      //  strData = String.fromCharCode.apply(null, new Uint16Array(data));
        return strData;
}
複製程式碼

對字串進行了base64解碼,在之前我們請求拿到的資料中有文書的ID,我們要做的就是把ID先進行Base64解碼,之後再進行解密,我們接著往下看,可以在同一個檔案裡發現解密所需要的函式。

var com = {};
com.str = {
    _KEY: "12345678900000001234567890000000",//32λ
    _IV: "abcd134556abcedf",//16λ
    /**************************************************************
    *�ַ�������
    *   str����Ҫ���ܵ��ַ���
    ****************************************************************/
    Encrypt: function (str) {
        var key = CryptoJS.enc.Utf8.parse(this._KEY);
        var iv = CryptoJS.enc.Utf8.parse(this._IV);
 
        var encrypted = '';
 
        var srcs = CryptoJS.enc.Utf8.parse(str);
        encrypted = CryptoJS.AES.encrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
 
        return encrypted.ciphertext.toString();
    },
 
    /**************************************************************
    *�ַ�������
    *   str����Ҫ���ܵ��ַ���
    ****************************************************************/
    Decrypt: function (str) {
        var result =  com.str.DecryptInner(str);
         try {
            var newstr =  com.str.DecryptInner(result);
            if(newstr!=""){
                result = newstr;
            }
          } catch (ex) {
            var msg = ex;
        }
        return result;
    },
     DecryptInner: function (str) {
        var key = CryptoJS.enc.Utf8.parse(this._KEY);
        var iv = CryptoJS.enc.Utf8.parse(this._IV);
        var encryptedHexStr = CryptoJS.enc.Hex.parse(str);
        var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
        var decrypt = CryptoJS.AES.decrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
        var result =  decryptedStr.toString();
         try {
            result =  Decrypt(result);
          } catch (ex) {
            var msg = ex;
        }
        return result;
    }
}
 
 
  function iemap(myarray ,callback, thisArg) {
  
        var T, A, k;
  
        if (myarray == null) {
            throw new TypeError(" this is null or not defined");
        }
        var O = Object(myarray);
  
        var len = O.length >>> 0;
        if (typeof callback !== "function") {
            throw new TypeError(callback + " is not a function");
        }
  
        // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
        if (thisArg) {
            T = thisArg;
        }
       
        A = new Array(len);
        k = 0;
        while(k < len) {
            var kValue, mappedValue;
            if (k in O) {              
                kValue = O[ k ];
                mappedValue = callback.call(T, kValue, k, O);
  
                A[ k ] = mappedValue;
            }
            k++;
        }
        return A;
    };&emsp;
複製程式碼

分析可得,在對字串進行Base64解碼之後,我們還需要對這個字串進行兩次AES解密就可以得到docID

但是

到這裡還沒有完,在經過嘗試之後,筆者發現此處的iv向量不會發生變化,但是,進行AES解密的key會發生改變,這個key是哪裡來呢?

經過一步一步打斷點測試可得,

我們在第一次進行請求列表時,得到的RunEval值需要被我們進行Base64解碼後執行,這段原始碼會改變Key的值,讓我們可以正確的解析。

筆者在解碼後發現,神奇的Fuckjs在此處現身了

基於Node.js的裁判文書網爬蟲分析
基於Node.js的裁判文書網爬蟲分析

到這裡,我們就基本解決了整個分析破解過程。

但是當筆者在用Node去實現整個解密過程時,遇到了更多的坑,包括Node執行時與瀏覽器執行時的差異。

文書網潛在的坑和解決方案

坑:

  • 每種搜尋條件下,給出的只有兩百條資料,之後的頁面以200條中最後的資料填充
  • 請求列表時,有時候會出現remind key

解決方案:

  • 採用多種請求模式,筆者爬取了全國幾乎所有的中級以上人民法院名單列表,分別加在引數末尾進行請求,按照每種條件最多200條,可以獲得最多200*3500=700000資料,足夠大部分情況使用。另外的一種方案是按照時間,時間可以出現更多種組合,適合百萬以上的資料量。
  • 出現remind key時重新獲取引數,再次請求。

Node爬蟲實現時的坑

  • Node中沒有全域性物件是global,而瀏覽器是window,在改寫時,需要替換window為global 文書網上AES解密用的原始碼直接移植在Node時會出現奇怪的問題,筆者用Crypto模組進行了重寫
  • Node中的setTimeout和瀏覽器中setTimeout表現不一致,瀏覽器中支援執行字串引數,但是Node中只支援函式,在fuckjs被解析後得到的結果即為字串。

筆者對於setTimeout問題的解決方案是覆蓋了setTimeout,直接解析執行了setTimeout,但是帶來的問題是,讓Node實現sleep函式與定時變得非常困難。

暢想

筆者在此次重構中並沒有實現儲存過程與解析文章具體內容過程,並且覆蓋setTimeout的方法不見得多麼優雅,非常希望能夠得到大家的指正。

筆者實現的爬蟲地址:裁判文書網爬蟲

歡迎大家提出issue和提pr~~~

給個star吧~

相關文章