Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
57a5cc0b2d | ||
|
|
dcf180e00b | ||
|
|
e5f494cec7 | ||
|
|
6aa8e187c6 | ||
|
|
f69a34cddd | ||
|
|
6d4de04fc8 | ||
|
|
cfc5a09cfe | ||
|
|
2da53e277d | ||
|
|
5d00c5045e | ||
|
|
1e4f38b3d4 | ||
|
|
4228340855 | ||
|
|
762e4490ef | ||
|
|
a43360ecc3 | ||
|
|
3a432c2f7a | ||
|
|
10ff996602 | ||
|
|
5848464627 | ||
|
|
9189438495 | ||
|
|
7aa06ec2a7 | ||
|
|
2aa48ae37e | ||
|
|
bede432cde | ||
|
|
6d81587b54 | ||
|
|
d9cfa25742 | ||
|
|
ea0889c8af | ||
|
|
b8164f1582 | ||
|
|
1009fc90b2 | ||
|
|
0541293d01 | ||
|
|
3cd0db8a6b | ||
|
|
47863fa05f | ||
|
|
7c94415165 | ||
|
|
8fd769d984 | ||
|
|
9f59c03698 | ||
|
|
b23eb07a0d | ||
|
|
7d79f6ef13 | ||
|
|
46e109a404 | ||
|
|
deda71e9fd | ||
|
|
1532d31051 | ||
|
|
f1eecc368f | ||
|
|
ad68a71951 | ||
|
|
822599dfe0 | ||
|
|
f27c8b3817 | ||
|
|
cc984bd049 | ||
|
|
859fdf590d | ||
|
|
4b022d4387 | ||
|
|
73b8120cf4 | ||
|
|
04ab676fc3 | ||
|
|
5d8b4e68d2 | ||
|
|
19e08186dd | ||
|
|
39a4b5c836 | ||
|
|
47aee84271 | ||
|
|
fddeeaaff3 | ||
|
|
57fc61d6b7 | ||
|
|
e679d08480 | ||
|
|
ae20a3641b | ||
|
|
9fd6f82e82 | ||
|
|
a105f53f2f | ||
|
|
891a91b416 | ||
|
|
11f3fef029 | ||
|
|
e320b047c0 | ||
|
|
5c3dc12628 | ||
|
|
ac3dfbca49 | ||
|
|
21dd3d5346 | ||
|
|
a15c6340f6 | ||
|
|
7ed90dd4f4 | ||
|
|
3c26f03b45 | ||
|
|
25e2206333 | ||
|
|
47d502b2d9 | ||
|
|
87f4aba7c0 | ||
|
|
4a8ffd3b29 | ||
|
|
45c9dc6b66 | ||
|
|
59ac945b05 | ||
|
|
70041ac332 | ||
|
|
2644c3c73d | ||
|
|
508d63f0df | ||
|
|
168329bc14 | ||
|
|
224dda6e33 | ||
|
|
5a5b5e0f6f | ||
|
|
a81bc4e3ee | ||
|
|
0b7bbb8662 | ||
|
|
3a140ba616 | ||
|
|
28aed2c601 | ||
|
|
c4576931ef | ||
|
|
b8e8b0ee3f | ||
|
|
7579e92651 | ||
|
|
43e283879b | ||
|
|
cfc81ce142 | ||
|
|
4ee39a9df6 | ||
|
|
15c14de89c | ||
|
|
eec1f45089 | ||
|
|
e5dafcab91 | ||
|
|
0d8c537a26 | ||
|
|
4301536f04 | ||
|
|
222eb4030c | ||
|
|
d68669211e | ||
|
|
3ade06eaf3 | ||
|
|
29c1ff4248 | ||
|
|
ac8d30eee4 | ||
|
|
b379057a81 | ||
|
|
d9725d851c | ||
|
|
789093c9f6 | ||
|
|
4ce34a4794 | ||
|
|
a23a15a4c4 | ||
|
|
427e1442dd | ||
|
|
77123e6afa | ||
|
|
78c29ec765 | ||
|
|
6c1037621a | ||
|
|
98862441be | ||
|
|
c253b73d60 | ||
|
|
7b8aa60798 | ||
|
|
20002d607a | ||
|
|
414bf8182d | ||
|
|
f0623bb5b5 | ||
|
|
67e7ce8abd | ||
|
|
5bae028c68 | ||
|
|
58baa11f11 | ||
|
|
4f74ed9f20 | ||
|
|
04f423ee7d | ||
|
|
ab786a67d0 | ||
|
|
83cd240d82 | ||
|
|
5f4c6ee387 | ||
|
|
cf0b932b18 | ||
|
|
30b2a73c33 | ||
|
|
c9fe510fd2 | ||
|
|
9d61e8ab36 | ||
|
|
8519800c00 | ||
|
|
772a9ce406 | ||
|
|
0e04751753 | ||
|
|
4fcc0cc9d7 | ||
|
|
9ff5131375 | ||
|
|
5973b4cade | ||
|
|
62e18c8e38 | ||
|
|
acaece514e | ||
|
|
306d5c8957 | ||
|
|
b2e90e16a2 | ||
|
|
36a4a3822d | ||
|
|
13af4cc7c6 | ||
|
|
0d685f5ca0 | ||
|
|
36547d7f58 | ||
|
|
49677f1072 | ||
|
|
0fcd460535 | ||
|
|
c6fec04aff | ||
|
|
04279cad20 | ||
|
|
27a2b232d4 | ||
|
|
8ee4acc443 | ||
|
|
a8f03018c4 | ||
|
|
e4470a242b | ||
|
|
374d95875e | ||
|
|
8babb90280 | ||
|
|
5c16f86a13 | ||
|
|
112b5e61ee | ||
|
|
9fcf2f50a2 | ||
|
|
2804cb159d | ||
|
|
3b154185f5 | ||
|
|
e27326db56 | ||
|
|
ce799e4e51 | ||
|
|
ca2b45c8db | ||
|
|
d38fed9999 | ||
|
|
686f672f84 | ||
|
|
4bc6107f61 | ||
|
|
1764683eb2 | ||
|
|
e2246bacb6 | ||
|
|
95d9f7dc02 | ||
|
|
488f264fbb | ||
|
|
b3f144c5bb | ||
|
|
8bc126c8b9 | ||
|
|
28e63c667b | ||
|
|
bffec9a75b | ||
|
|
536362f174 | ||
|
|
d2414055fd | ||
|
|
1d8919ac14 | ||
|
|
0de24671e7 | ||
|
|
305bdbc76b | ||
|
|
ceee09c294 | ||
|
|
557dd96686 | ||
|
|
ca4a616dbf | ||
|
|
541f71e6f2 | ||
|
|
97c02e163a | ||
|
|
5e847572db | ||
|
|
569ffe210c | ||
|
|
39fffe0801 | ||
|
|
248d4032c1 | ||
|
|
e7a7a06620 | ||
|
|
08a2d74ff5 | ||
|
|
69d094ed97 | ||
|
|
95b94057d3 | ||
|
|
5ee09be9c8 | ||
|
|
f591c8b2c7 | ||
|
|
e352cf6ea0 | ||
|
|
8ccd14d398 | ||
|
|
6ec4ddd7db | ||
|
|
8b15349ed0 | ||
|
|
95562ebafc | ||
|
|
8cf13f49b2 | ||
|
|
87ba039942 | ||
|
|
2d584a7ae4 | ||
|
|
7fa0017822 | ||
|
|
09744f7e2b | ||
|
|
eea9118026 | ||
|
|
37b6d66f7b | ||
|
|
79a9974504 | ||
|
|
2edf1d803b | ||
|
|
9e40c42ff3 | ||
|
|
4560c70495 | ||
|
|
cc7ec2a22e | ||
|
|
078e547efd | ||
|
|
e2cccd5f68 | ||
|
|
f6538c80da | ||
|
|
a906bd9d45 | ||
|
|
bddc4ee50f | ||
|
|
da784beee1 | ||
|
|
d3e2979bd0 | ||
|
|
ab3c74ca4a | ||
|
|
768dcb4a9d | ||
|
|
3346bc51ec | ||
|
|
c34c6068a4 | ||
|
|
73f480a8f1 | ||
|
|
866e4e929e | ||
|
|
f94f421197 | ||
|
|
a96367f3ae | ||
|
|
e869eea2c9 | ||
|
|
3177844b43 | ||
|
|
0a34f961ba | ||
|
|
3cac065ef3 | ||
|
|
4f7ae1e93d | ||
|
|
405ad54707 | ||
|
|
b970042f63 | ||
|
|
cac31a8e68 | ||
|
|
d7927f7fcf | ||
|
|
03505da2cb | ||
|
|
ee6fee90a4 | ||
|
|
b7444dcc01 | ||
|
|
fe6e3d6c14 | ||
|
|
44acdb9567 | ||
|
|
8780d4b1e4 | ||
|
|
1c278a3180 | ||
|
|
ec2a090538 | ||
|
|
001145cb81 | ||
|
|
4680adc0d9 | ||
|
|
e6a8ae7e78 | ||
|
|
04b43abf15 | ||
|
|
f02209aa58 | ||
|
|
6a8d4d0611 | ||
|
|
39d83cb20f | ||
|
|
4c7356757a | ||
|
|
a5215bede1 | ||
|
|
ffc0fb8587 | ||
|
|
7a3501a6a5 | ||
|
|
f436060a68 | ||
|
|
782d27f5d7 | ||
|
|
b94f3657d3 | ||
|
|
a311727515 | ||
|
|
2c32e7548d | ||
|
|
aa4b5129bc | ||
|
|
55468bce60 | ||
|
|
825b4d8bde | ||
|
|
36dcd52daa | ||
|
|
864aa43005 | ||
|
|
fc0211c1af | ||
|
|
4894ff8ed0 | ||
|
|
56b3f9ee25 | ||
|
|
2d3554faaa | ||
|
|
c90252b7a9 | ||
|
|
5735c835e7 | ||
|
|
80bf5b08e6 | ||
|
|
16687c32ee | ||
|
|
849dce82ea | ||
|
|
9e9906bde5 | ||
|
|
97684901ce | ||
|
|
16bad1f873 | ||
|
|
cd08d48bf4 | ||
|
|
7760efbcfb | ||
|
|
472ca74b65 | ||
|
|
5b4cc5fed7 | ||
|
|
72b0b3ace1 | ||
|
|
a1dc68f359 | ||
|
|
1b567f6ab7 | ||
|
|
c7ad546a28 | ||
|
|
3ea400709f | ||
|
|
a7146a3be3 | ||
|
|
7bab9d5c1e | ||
|
|
8b0b12e95b | ||
|
|
01eb7634af | ||
|
|
1f5ed23b19 | ||
|
|
8138757fab | ||
|
|
01a6c5e3ba | ||
|
|
537f0d2c15 | ||
|
|
6927a222d6 | ||
|
|
e9b38c5d76 | ||
|
|
139722e1a5 | ||
|
|
ac0a0d7a33 | ||
|
|
41745ce995 | ||
|
|
1863ffb587 | ||
|
|
45e47a4d79 | ||
|
|
aeb4d947ab | ||
|
|
71a7f9caa6 | ||
|
|
b8b652ed0a | ||
|
|
830397a918 | ||
|
|
0f90f2a071 | ||
|
|
80a55496f7 | ||
|
|
19ca5f5a51 | ||
|
|
76fbe322d0 | ||
|
|
5cc7e0c842 | ||
|
|
4bf45037b6 | ||
|
|
3e5681bd6b | ||
|
|
dc6c6818fd | ||
|
|
34e39377a3 | ||
|
|
0b01cc95f9 | ||
|
|
7e25e3964f | ||
|
|
5f160dbe83 | ||
|
|
5c68fe326e | ||
|
|
12ee0897c9 | ||
|
|
c0455eee97 | ||
|
|
fef6f6ff2d | ||
|
|
200a122790 | ||
|
|
f7b74dc3ef | ||
|
|
084fe2cfc1 | ||
|
|
6d5afd0f03 | ||
|
|
e6845e6803 | ||
|
|
cb6be9d91f | ||
|
|
9bfe99eef6 | ||
|
|
1a6eeb2bfd | ||
|
|
e2d37f7451 | ||
|
|
1f45122bc4 | ||
|
|
6013bdb8ce | ||
|
|
34bb7a8b9c | ||
|
|
625259d3f5 | ||
|
|
2c1bdbbd90 | ||
|
|
7fa90289ba | ||
|
|
dd07cf2cce | ||
|
|
da98c2a2ee | ||
|
|
64e607453e | ||
|
|
0e76eda6c7 | ||
|
|
b1d85b0416 | ||
|
|
7d83e7ce85 | ||
|
|
3b325c4964 | ||
|
|
225670a2dc | ||
|
|
a6a327631d | ||
|
|
2935dbbd39 | ||
|
|
e0338a4db3 | ||
|
|
8f0e56e3ba | ||
|
|
7d5ab59438 | ||
|
|
2086721e22 | ||
|
|
20ba128488 | ||
|
|
cd2968c087 | ||
|
|
58d34bd8c7 | ||
|
|
96dbb16634 | ||
|
|
95db1ac3c5 | ||
|
|
e89d87aa7c | ||
|
|
6d9165442d | ||
|
|
c68a181f58 | ||
|
|
72bb5f150c | ||
|
|
30891118ef | ||
|
|
9685396b91 | ||
|
|
c9c500b013 | ||
|
|
5bc17e4bdf | ||
|
|
29ecd7d097 | ||
|
|
a61dbeef61 | ||
|
|
040c35cf4b | ||
|
|
2cb7750d40 | ||
|
|
68669ad46f | ||
|
|
221622aba3 | ||
|
|
d5602cd239 | ||
|
|
829b6659a5 | ||
|
|
9894e97c0e | ||
|
|
63beb13fa9 | ||
|
|
71680f8dea | ||
|
|
ce7a8ac015 | ||
|
|
f0234b26dc | ||
|
|
2ab91472c3 | ||
|
|
b377a95372 | ||
|
|
5fc111bed8 | ||
|
|
109b70aeaa | ||
|
|
648a35ceec | ||
|
|
a17c859556 | ||
|
|
1945533acc | ||
|
|
43b8935357 | ||
|
|
81852b34d7 | ||
|
|
c9940c5688 | ||
|
|
fdc7e45671 | ||
|
|
b013fa94d6 | ||
|
|
3b980ce1e0 | ||
|
|
150384ec37 | ||
|
|
6043bc6e5b | ||
|
|
c976fce177 | ||
|
|
99d752a7c5 | ||
|
|
a915b20992 | ||
|
|
832731b164 | ||
|
|
e64d77bdd6 | ||
|
|
f1cfc3c328 | ||
|
|
a5666e704d | ||
|
|
4420ef5f20 | ||
|
|
baae9a28e7 | ||
|
|
922a9fc206 | ||
|
|
c81d10f7f4 | ||
|
|
a82a9cec11 | ||
|
|
4494d77cf0 | ||
|
|
b1a65d97d8 | ||
|
|
9759374308 | ||
|
|
d48a68b8fe | ||
|
|
9c1a75e943 | ||
|
|
a68d14bb69 | ||
|
|
5dc59a7673 | ||
|
|
7d1331f2ec | ||
|
|
d1fdf7f213 | ||
|
|
844e6c8293 | ||
|
|
dd5aa37870 | ||
|
|
ff78c71492 | ||
|
|
1bbc88a5bd | ||
|
|
64d51de950 | ||
|
|
c8a2e8669a | ||
|
|
4005ffd08f | ||
|
|
e02cc802fd | ||
|
|
c5f7f9a835 | ||
|
|
d957925c84 | ||
|
|
290fa3c3c3 | ||
|
|
5ddfdf9346 | ||
|
|
cf3e0dd55c | ||
|
|
ed08186e76 | ||
|
|
b08bb3cc1d | ||
|
|
689c5739a7 | ||
|
|
37a6d5c9ea | ||
|
|
82eb0e0f1f | ||
|
|
c477b0027e | ||
|
|
84b6886052 | ||
|
|
216f1a5632 | ||
|
|
604ecd782e | ||
|
|
19450356b0 | ||
|
|
a489719b1f | ||
|
|
93d5bc2094 | ||
|
|
6bee0cd256 | ||
|
|
22245fcb73 | ||
|
|
1e0f56c8ce | ||
|
|
5afc6e3397 | ||
|
|
36bd1e4ebc | ||
|
|
809388beb5 | ||
|
|
c83400c051 | ||
|
|
d697a0829a | ||
|
|
5e5a5cba01 | ||
|
|
daad5e4fc4 | ||
|
|
559f6a49ed | ||
|
|
07c894759b | ||
|
|
fc2214ab87 | ||
|
|
d756292d80 | ||
|
|
056d3624bb | ||
|
|
a46bdb4279 | ||
|
|
28f93fd798 | ||
|
|
ee6241be68 | ||
|
|
c343effd7c | ||
|
|
6ffc926f7e | ||
|
|
c6be838edc | ||
|
|
3035102978 | ||
|
|
a0031cf597 | ||
|
|
80dbca5a2a | ||
|
|
6aed6863b4 | ||
|
|
011dcf0bff | ||
|
|
3a713f71b5 | ||
|
|
7f147c32f1 | ||
|
|
c87af5466b | ||
|
|
56abc4e927 | ||
|
|
26599e779b | ||
|
|
2289a48b34 | ||
|
|
6d154f4d9f | ||
|
|
d67e4fcde4 | ||
|
|
ddcf366796 | ||
|
|
09a958ec1c | ||
|
|
3adebe1623 | ||
|
|
5b1666f96c | ||
|
|
3d3478f305 | ||
|
|
2f3472cf3f | ||
|
|
28ee4cce72 | ||
|
|
9a4f167840 | ||
|
|
b74308e687 | ||
|
|
7d44f7f6b3 | ||
|
|
6d5f6d4dc8 | ||
|
|
52db970be1 | ||
|
|
324496b776 | ||
|
|
c57d5f5bba | ||
|
|
d44a60cf3c | ||
|
|
5bad69210c | ||
|
|
625e9569fa | ||
|
|
b24f005d46 | ||
|
|
4aaa615f25 | ||
|
|
2da54d4ec3 | ||
|
|
55aaaac69f | ||
|
|
27120d79e9 | ||
|
|
5ddf8402ff | ||
|
|
7fcef5a831 | ||
|
|
18e060d13e | ||
|
|
d2a524ac21 | ||
|
|
8f2a466f1b | ||
|
|
6c4ee834df | ||
|
|
370cdce1d7 | ||
|
|
f9796e2656 | ||
|
|
c079d119f5 | ||
|
|
0d4cbcb1bf | ||
|
|
fcaaff1777 | ||
|
|
0c6d1f7b9b | ||
|
|
cf0c80f8a9 | ||
|
|
284dbbfdfd | ||
|
|
70b1b1add8 | ||
|
|
c4bec295b3 | ||
|
|
5ad5cea1ed | ||
|
|
6bb04f162e | ||
|
|
6ba3313e7b | ||
|
|
0aebfb13dd | ||
|
|
63c2e1f39a | ||
|
|
4c1b4a333a | ||
|
|
8a4566ec66 | ||
|
|
deaa8d9a6d | ||
|
|
966df06950 | ||
|
|
464bed9cfe | ||
|
|
0100805130 | ||
|
|
9776a8126c | ||
|
|
93e5f56d61 | ||
|
|
92139bce2a | ||
|
|
46eff41421 | ||
|
|
8de5f8ec74 | ||
|
|
1b1c6f93e9 | ||
|
|
52c918454b | ||
|
|
04a8376812 | ||
|
|
70b541f145 | ||
|
|
d019cd0450 | ||
|
|
022ac712ea | ||
|
|
2459aa333d | ||
|
|
df6f111ba2 | ||
|
|
85af8648af | ||
|
|
9d1f929682 | ||
|
|
e3c0804162 | ||
|
|
6417b27215 | ||
|
|
ee6435cc30 | ||
|
|
63a4ebc293 | ||
|
|
aaaac0ec47 | ||
|
|
c966d39b95 | ||
|
|
2496e8f70a | ||
|
|
3716dc9a44 | ||
|
|
d598b36903 | ||
|
|
6e3f20995c | ||
|
|
e14b49a181 | ||
|
|
d351285da8 | ||
|
|
cb2323ade7 | ||
|
|
291f312318 | ||
|
|
e948c4ff31 | ||
|
|
879097dd31 | ||
|
|
83ff287793 | ||
|
|
25f6fabdb6 | ||
|
|
8652130da1 | ||
|
|
d53b76b196 | ||
|
|
ff20a75fd9 | ||
|
|
98d48f3305 | ||
|
|
7b7e5f7421 | ||
|
|
acf9666ace | ||
|
|
55e15994d6 | ||
|
|
c876c1b5e6 | ||
|
|
b9eb5fea8b | ||
|
|
fe5fc685b2 | ||
|
|
b0c28d8afb | ||
|
|
5d1b461866 | ||
|
|
1354e909a7 | ||
|
|
0c83377a98 | ||
|
|
9108c8dea3 | ||
|
|
a5c573b1b6 | ||
|
|
541fc3c777 | ||
|
|
2850f4b4ec | ||
|
|
c3d8fc679c | ||
|
|
d48c01b62d | ||
|
|
9133ccc3f0 | ||
|
|
e0323a44f5 | ||
|
|
7c326a51a8 | ||
|
|
5fafcdab0a |
@@ -1,189 +1,122 @@
|
|||||||
package com.github.catvod.parser;
|
package com.github.catvod.parser;
|
||||||
|
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
public class MixDemo {
|
public class MixDemo {
|
||||||
|
public static HashMap<String, ArrayList<String>> I = new HashMap<>();
|
||||||
|
static HashMap<String, ArrayList<String>> V7 = null;
|
||||||
|
|
||||||
/*
|
private static String I(String str, String str2) {
|
||||||
"parses": [
|
int indexOf;
|
||||||
{
|
if (str2.trim().length() <= 0 || (indexOf = str.indexOf("?")) <= 0) {
|
||||||
"name": "聚合",
|
return str;
|
||||||
"type": 3,
|
}
|
||||||
"url": "Demo"
|
StringBuilder sb = new StringBuilder();
|
||||||
},
|
int i = indexOf + 1;
|
||||||
{
|
sb.append(str.substring(0, i));
|
||||||
"name": "解析",
|
sb.append("cat_ext=");
|
||||||
"type": 1,
|
sb.append(Base64.encodeToString(str2.getBytes(), 10));
|
||||||
"url": "https://192.168.10.88/jx.php?url=",
|
sb.append("&");
|
||||||
"ext": {
|
sb.append(str.substring(i));
|
||||||
"flag": [
|
return sb.toString();
|
||||||
"qq",
|
}
|
||||||
"iqiyi",
|
|
||||||
"qiyi",
|
|
||||||
"爱奇艺",
|
|
||||||
"腾讯",
|
|
||||||
"letv",
|
|
||||||
"sohu",
|
|
||||||
"tudou",
|
|
||||||
"pptv",
|
|
||||||
"mgtv",
|
|
||||||
"wasu",
|
|
||||||
"bilibili"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
*/
|
|
||||||
|
|
||||||
public static HashMap<String, ArrayList<String>> flagWebJx = new HashMap<>();
|
public static Object[] loadHtml(String str, String str2) {
|
||||||
|
|
||||||
static HashMap<String, ArrayList<String>> configs = null;
|
|
||||||
|
|
||||||
public static JSONObject parse(LinkedHashMap<String, HashMap<String, String>> jx, String nameMe, String flag, String url) {
|
|
||||||
try {
|
try {
|
||||||
if (configs == null) {
|
String str3 = new String(Base64.decode(str2, 10), "UTF-8");
|
||||||
configs = new HashMap<>();
|
StringBuilder sb = new StringBuilder();
|
||||||
Iterator<String> keys = jx.keySet().iterator();
|
if (I.containsKey(str)) {
|
||||||
while (keys.hasNext()) {
|
ArrayList<String> arrayList = I.get(str);
|
||||||
String key = keys.next();
|
for (int i = 0; i < arrayList.size(); i++) {
|
||||||
HashMap<String, String> parseBean = jx.get(key);
|
sb.append("\"");
|
||||||
String type = parseBean.get("type");
|
sb.append(arrayList.get(i));
|
||||||
if (type.equals("1") || type.equals("0")) {
|
sb.append("\"");
|
||||||
try {
|
if (i < arrayList.size() - 1) {
|
||||||
JSONArray flags = new JSONObject(parseBean.get("ext")).getJSONArray("flag");
|
sb.append(",");
|
||||||
for (int j = 0; j < flags.length(); j++) {
|
}
|
||||||
String flagKey = flags.getString(j);
|
}
|
||||||
ArrayList<String> flagJx = configs.get(flagKey);
|
}
|
||||||
if (flagJx == null) {
|
return new Object[]{200, "text/html; charset=\"UTF-8\"", new ByteArrayInputStream("\n<!doctype html>\n<html>\n<head>\n<title>解析</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE10\" />\n<meta name=\"renderer\" content=\"webkit|ie-comp|ie-stand\">\n<meta name=\"viewport\" content=\"width=device-width\">\n</head>\n<body>\n<script>\nvar apiArray=[#jxs#];\nvar urlPs=\"#url#\";\nvar iframeHtml=\"\";\nfor(var i=0;i<apiArray.length;i++){\nvar URL=apiArray[i]+urlPs;\niframeHtml=iframeHtml+\"<iframe sandbox='allow-scripts allow-same-origin allow-forms' frameborder='0' allowfullscreen='true' webkitallowfullscreen='true' mozallowfullscreen='true' src=\"+URL+\"></iframe>\";\n}\ndocument.write(iframeHtml);\n</script>\n</body>\n</html>".replace("#url#", str3).replace("#jxs#", sb.toString()).toString().getBytes("UTF-8"))};
|
||||||
flagJx = new ArrayList<>();
|
} catch (Throwable th) {
|
||||||
configs.put(flagKey, flagJx);
|
th.printStackTrace();
|
||||||
}
|
return null;
|
||||||
flagJx.add(key);
|
}
|
||||||
}
|
}
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
|
public static JSONObject parse(LinkedHashMap<String, HashMap<String, String>> linkedHashMap, String str, String str2, String str3) {
|
||||||
|
ArrayList<String> arrayList;
|
||||||
|
JSONObject parse;
|
||||||
|
try {
|
||||||
|
if (V7 == null) {
|
||||||
|
V7 = new HashMap<>();
|
||||||
|
for (String str4 : linkedHashMap.keySet()) {
|
||||||
|
HashMap<String, String> hashMap = linkedHashMap.get(str4);
|
||||||
|
String str5 = hashMap.get("type");
|
||||||
|
if (str5.equals("1") || str5.equals("0")) {
|
||||||
|
try {
|
||||||
|
JSONArray jSONArray = new JSONObject(hashMap.get("ext")).getJSONArray("flag");
|
||||||
|
for (int i = 0; i < jSONArray.length(); i++) {
|
||||||
|
String string = jSONArray.getString(i);
|
||||||
|
ArrayList<String> arrayList2 = V7.get(string);
|
||||||
|
if (arrayList2 == null) {
|
||||||
|
arrayList2 = new ArrayList<>();
|
||||||
|
V7.put(string, arrayList2);
|
||||||
|
}
|
||||||
|
arrayList2.add(str4);
|
||||||
|
}
|
||||||
|
} catch (Throwable unused) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 通过上面的配置获得解析列表
|
LinkedHashMap linkedHashMap2 = new LinkedHashMap();
|
||||||
LinkedHashMap<String, String> jsonJx = new LinkedHashMap<>();
|
arrayList = new ArrayList<>();
|
||||||
ArrayList<String> webJx = new ArrayList<>();
|
ArrayList<String> arrayList3 = V7.get(str2);
|
||||||
ArrayList<String> flagJx = configs.get(flag);
|
if (arrayList3 == null || arrayList3.isEmpty()) {
|
||||||
if (flagJx != null && !flagJx.isEmpty()) {
|
for (String str6 : linkedHashMap.keySet()) {
|
||||||
for (int i = 0; i < flagJx.size(); i++) {
|
HashMap<String, String> hashMap2 = linkedHashMap.get(str6);
|
||||||
String key = flagJx.get(i);
|
String str7 = hashMap2.get("type");
|
||||||
HashMap<String, String> parseBean = jx.get(key);
|
if (str7.equals("1")) {
|
||||||
String type = parseBean.get("type");
|
linkedHashMap2.put(str6, I(hashMap2.get("url"), hashMap2.get("ext")));
|
||||||
if (type.equals("1")) {
|
} else if (str7.equals("0")) {
|
||||||
jsonJx.put(key, mixUrl(parseBean.get("url"), parseBean.get("ext")));
|
arrayList.add(hashMap2.get("url"));
|
||||||
} else if (type.equals("0")) {
|
|
||||||
webJx.add(parseBean.get("url"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Iterator<String> keys = jx.keySet().iterator();
|
for (int i2 = 0; i2 < arrayList3.size(); i2++) {
|
||||||
while (keys.hasNext()) {
|
String str8 = arrayList3.get(i2);
|
||||||
String key = keys.next();
|
HashMap<String, String> hashMap3 = linkedHashMap.get(str8);
|
||||||
HashMap<String, String> parseBean = jx.get(key);
|
String str9 = hashMap3.get("type");
|
||||||
String type = parseBean.get("type");
|
if (str9.equals("1")) {
|
||||||
if (type.equals("1")) {
|
linkedHashMap2.put(str8, I(hashMap3.get("url"), hashMap3.get("ext")));
|
||||||
jsonJx.put(key, mixUrl(parseBean.get("url"), parseBean.get("ext")));
|
} else if (str9.equals("0")) {
|
||||||
} else if (type.equals("0")) {
|
arrayList.add(hashMap3.get("url"));
|
||||||
webJx.add(parseBean.get("url"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!webJx.isEmpty()) {
|
if (!arrayList.isEmpty()) {
|
||||||
flagWebJx.put(flag, webJx);
|
I.put(str2, arrayList);
|
||||||
}
|
|
||||||
// 优先使用json并发解析
|
|
||||||
JSONObject jsonResult = JsonParallel.parse(jsonJx, url);
|
|
||||||
if (jsonResult != null && jsonResult.has("url")) {
|
|
||||||
return jsonResult;
|
|
||||||
}
|
|
||||||
// json解析没有得到结果 用webview解析
|
|
||||||
if (!webJx.isEmpty()) {
|
|
||||||
JSONObject webResult = new JSONObject();
|
|
||||||
webResult.put("url", "proxy://do=MixDemo&flag=" + flag + "&url=" + Base64.encodeToString(url.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP));
|
|
||||||
webResult.put("parse", 1);
|
|
||||||
return webResult;
|
|
||||||
}
|
}
|
||||||
|
parse = JsonParallel.parse(linkedHashMap2, str3);
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
SpiderDebug.log(th);
|
SpiderDebug.log(th);
|
||||||
}
|
}
|
||||||
|
if (parse != null && parse.has("url")) {
|
||||||
|
return parse;
|
||||||
|
}
|
||||||
|
if (!arrayList.isEmpty()) {
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
jSONObject.put("url", "proxy://do=MixDemo&flag=" + str2 + "&url=" + Base64.encodeToString(str3.getBytes(), 10));
|
||||||
|
jSONObject.put("parse", 1);
|
||||||
|
return jSONObject;
|
||||||
|
}
|
||||||
return new JSONObject();
|
return new JSONObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String mixUrl(String url, String ext) {
|
|
||||||
if (ext.trim().length() > 0) {
|
|
||||||
int idx = url.indexOf("?");
|
|
||||||
if (idx > 0) {
|
|
||||||
return url.substring(0, idx + 1) + "cat_ext=" + Base64.encodeToString(ext.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP) + "&" + url.substring(idx + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Object[] loadHtml(String flag, String url) {
|
|
||||||
try {
|
|
||||||
url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8");
|
|
||||||
String html = "\n" +
|
|
||||||
"<!doctype html>\n" +
|
|
||||||
"<html>\n" +
|
|
||||||
"<head>\n" +
|
|
||||||
"<title>解析</title>\n" +
|
|
||||||
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" +
|
|
||||||
"<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE10\" />\n" +
|
|
||||||
"<meta name=\"renderer\" content=\"webkit|ie-comp|ie-stand\">\n" +
|
|
||||||
"<meta name=\"viewport\" content=\"width=device-width\">\n" +
|
|
||||||
"</head>\n" +
|
|
||||||
"<body>\n" +
|
|
||||||
"<script>\n" +
|
|
||||||
"var apiArray=[#jxs#];\n" +
|
|
||||||
"var urlPs=\"#url#\";\n" +
|
|
||||||
"var iframeHtml=\"\";\n" +
|
|
||||||
"for(var i=0;i<apiArray.length;i++){\n" +
|
|
||||||
"var URL=apiArray[i]+urlPs;\n" +
|
|
||||||
"iframeHtml=iframeHtml+\"<iframe sandbox='allow-scripts allow-same-origin allow-forms' frameborder='0' allowfullscreen='true' webkitallowfullscreen='true' mozallowfullscreen='true' src=\"+URL+\"></iframe>\";\n" +
|
|
||||||
"}\n" +
|
|
||||||
"document.write(iframeHtml);\n" +
|
|
||||||
"</script>\n" +
|
|
||||||
"</body>\n" +
|
|
||||||
"</html>";
|
|
||||||
|
|
||||||
StringBuilder jxs = new StringBuilder();
|
|
||||||
if (flagWebJx.containsKey(flag)) {
|
|
||||||
ArrayList<String> jxUrls = flagWebJx.get(flag);
|
|
||||||
for (int i = 0; i < jxUrls.size(); i++) {
|
|
||||||
jxs.append("\"");
|
|
||||||
jxs.append(jxUrls.get(i));
|
|
||||||
jxs.append("\"");
|
|
||||||
if (i < jxUrls.size() - 1) {
|
|
||||||
jxs.append(",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
html = html.replace("#url#", url).replace("#jxs#", jxs.toString());
|
|
||||||
Object[] result = new Object[3];
|
|
||||||
result[0] = 200;
|
|
||||||
result[1] = "text/html; charset=\"UTF-8\"";
|
|
||||||
ByteArrayInputStream baos = new ByteArrayInputStream(html.toString().getBytes("UTF-8"));
|
|
||||||
result[2] = baos;
|
|
||||||
return result;
|
|
||||||
} catch (Throwable th) {
|
|
||||||
th.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,108 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
|
|
||||||
public class AliPS extends Spider {
|
|
||||||
private PushAgent pushAgent;
|
|
||||||
private static String b = "https://www.alipansou.com";
|
|
||||||
private static Pattern a = Pattern.compile("(https:\\/\\/www.aliyundrive.com\\/s\\/[^\\\"]+)");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
pushAgent = new PushAgent();
|
|
||||||
pushAgent.init(context, extend);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> list) {
|
|
||||||
try {
|
|
||||||
Pattern pattern = a;
|
|
||||||
if (pattern.matcher(list.get(0)).find()) {
|
|
||||||
return pushAgent.detailContent(list);
|
|
||||||
}
|
|
||||||
Matcher matcher = pattern.matcher(OkHttpUtil.string("https://www.alipansou.com" + list.get(0), null));
|
|
||||||
if (!matcher.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
list.set(0, matcher.group(1).replaceAll("\\\\",""));
|
|
||||||
return pushAgent.detailContent(list);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String str, String str2, List<String> list) {
|
|
||||||
return pushAgent.playerContent(str, str2, list);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static HashMap<String, String> sHeaders() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean z) {
|
|
||||||
try {
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
hashMap.put("7", "文件夹");
|
|
||||||
hashMap.put("1", "视频");
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
Iterator entries = hashMap.entrySet().iterator();
|
|
||||||
while (entries.hasNext()) {
|
|
||||||
Map.Entry entry = (Map.Entry) entries.next();
|
|
||||||
String str2 = (String) entry.getValue();
|
|
||||||
String sb2 = b + "/search?k=" + URLEncoder.encode(key) + "&t=" + (String) entry.getKey();
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(sb2, sHeaders()));
|
|
||||||
Elements Data = doc.select("van-row a");
|
|
||||||
for (int i = 0; i < Data.size(); i++) {
|
|
||||||
Element next = Data.get(i);
|
|
||||||
String filename = next.select("template div").text();
|
|
||||||
Pattern pattern = Pattern.compile("(时间: \\S+)");
|
|
||||||
Matcher matcher = pattern.matcher(filename);
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String remark = matcher.group(1);
|
|
||||||
if (filename.contains(key)) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
String id = next.attr("href");
|
|
||||||
String title = "[" + str2 + "]" + filename;
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("remark", remark);
|
|
||||||
v.put("vod_pic", "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000");
|
|
||||||
jSONArray.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("list", jSONArray);
|
|
||||||
return jSONObject2.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,1124 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* M浏览器中的App影视
|
|
||||||
* <p>
|
|
||||||
* Author: 群友 不负此生
|
|
||||||
*/
|
|
||||||
public class AppYs extends Spider {
|
|
||||||
|
|
||||||
private String extString = "";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
this.extString = extend;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
String url = getCateUrl(extString);
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
if (!url.isEmpty()) {
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
} else { // 通过filter列表读分类
|
|
||||||
String filterStr = getFilterTypes(url, null);
|
|
||||||
String[] classes = filterStr.split("\n")[0].split("\\+");
|
|
||||||
jsonArray = new JSONArray();
|
|
||||||
for (int i = 1; i < classes.length; i++) {
|
|
||||||
String[] kv = classes[i].trim().split("=");
|
|
||||||
if (kv.length < 2)
|
|
||||||
continue;
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_name", kv[0].trim());
|
|
||||||
newCls.put("type_id", kv[1].trim());
|
|
||||||
jsonArray.put(newCls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject jObj = jsonArray.getJSONObject(i);
|
|
||||||
String typeName = jObj.getString("type_name");
|
|
||||||
if (isBan(typeName))
|
|
||||||
continue;
|
|
||||||
String typeId = jObj.getString("type_id");
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_id", typeId);
|
|
||||||
newCls.put("type_name", typeName);
|
|
||||||
JSONObject typeExtend = jObj.optJSONObject("type_extend");
|
|
||||||
if (filter) {
|
|
||||||
String filterStr = getFilterTypes(url, typeExtend);
|
|
||||||
String[] filters = filterStr.split("\n");
|
|
||||||
JSONArray filterArr = new JSONArray();
|
|
||||||
for (int k = url.isEmpty() ? 1 : 0; k < filters.length; k++) {
|
|
||||||
String l = filters[k].trim();
|
|
||||||
if (l.isEmpty())
|
|
||||||
continue;
|
|
||||||
String[] oneLine = l.split("\\+");
|
|
||||||
String type = oneLine[0].trim();
|
|
||||||
String typeN = type;
|
|
||||||
if (type.contains("筛选")) {
|
|
||||||
type = type.replace("筛选", "");
|
|
||||||
if (type.equals("class"))
|
|
||||||
typeN = "类型";
|
|
||||||
else if (type.equals("area"))
|
|
||||||
typeN = "地区";
|
|
||||||
else if (type.equals("lang"))
|
|
||||||
typeN = "语言";
|
|
||||||
else if (type.equals("year"))
|
|
||||||
typeN = "年份";
|
|
||||||
}
|
|
||||||
JSONObject jOne = new JSONObject();
|
|
||||||
jOne.put("key", type);
|
|
||||||
jOne.put("name", typeN);
|
|
||||||
JSONArray valueArr = new JSONArray();
|
|
||||||
for (int j = 1; j < oneLine.length; j++) {
|
|
||||||
JSONObject kvo = new JSONObject();
|
|
||||||
String kv = oneLine[j].trim();
|
|
||||||
int sp = kv.indexOf("=");
|
|
||||||
if (sp == -1) {
|
|
||||||
if (isBan(kv))
|
|
||||||
continue;
|
|
||||||
kvo.put("n", kv);
|
|
||||||
kvo.put("v", kv);
|
|
||||||
} else {
|
|
||||||
String n = kv.substring(0, sp);
|
|
||||||
if (isBan(n))
|
|
||||||
continue;
|
|
||||||
kvo.put("n", n.trim());
|
|
||||||
kvo.put("v", kv.substring(sp + 1).trim());
|
|
||||||
}
|
|
||||||
valueArr.put(kvo);
|
|
||||||
}
|
|
||||||
jOne.put("value", valueArr);
|
|
||||||
filterArr.put(jOne);
|
|
||||||
}
|
|
||||||
if (!result.has("filters")) {
|
|
||||||
result.put("filters", new JSONObject());
|
|
||||||
}
|
|
||||||
result.getJSONObject("filters").put(typeId, filterArr);
|
|
||||||
}
|
|
||||||
classes.put(newCls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String url = getRecommendUrl(apiUrl);
|
|
||||||
boolean isTV = false;
|
|
||||||
if (url.isEmpty()) {
|
|
||||||
url = getCateFilterUrlPrefix(apiUrl) + "movie&page=1&area=&type=&start=";
|
|
||||||
isTV = true;
|
|
||||||
}
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (isTV) {
|
|
||||||
JSONArray jsonArray = obj.getJSONArray("data");
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ArrayList<JSONArray> arrays = new ArrayList<>();
|
|
||||||
findJsonArray(obj, "vlist", arrays);
|
|
||||||
if (arrays.isEmpty()) {
|
|
||||||
findJsonArray(obj, "vod_list", arrays);
|
|
||||||
}
|
|
||||||
List<String> ids = new ArrayList<>();
|
|
||||||
for (JSONArray jsonArray : arrays) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
String vid = vObj.getString("vod_id");
|
|
||||||
if (ids.contains(vid))
|
|
||||||
continue;
|
|
||||||
ids.add(vid);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vid);
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String url = getCateFilterUrlPrefix(apiUrl) + tid + getCateFilterUrlSuffix(apiUrl);
|
|
||||||
url = url.replace("#PN#", pg);
|
|
||||||
url = url.replace("筛选class", (extend != null && extend.containsKey("class")) ? extend.get("class") : "");
|
|
||||||
url = url.replace("筛选area", (extend != null && extend.containsKey("area")) ? extend.get("area") : "");
|
|
||||||
url = url.replace("筛选lang", (extend != null && extend.containsKey("lang")) ? extend.get("lang") : "");
|
|
||||||
url = url.replace("筛选year", (extend != null && extend.containsKey("year")) ? extend.get("year") : "");
|
|
||||||
url = url.replace("排序", (extend != null && extend.containsKey("排序")) ? extend.get("排序") : "");
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
int totalPg = Integer.MAX_VALUE;
|
|
||||||
try {
|
|
||||||
if (obj.has("totalpage") && obj.get("totalpage") instanceof Integer) {
|
|
||||||
totalPg = obj.getInt("totalpage");
|
|
||||||
} else if (obj.has("pagecount") && obj.get("pagecount") instanceof Integer) {
|
|
||||||
totalPg = obj.getInt("pagecount");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject &&
|
|
||||||
(obj.getJSONObject("data").has("total") && obj.getJSONObject("data").get("total") instanceof Integer &&
|
|
||||||
obj.getJSONObject("data").has("limit") && obj.getJSONObject("data").get("limit") instanceof Integer)) {
|
|
||||||
int limit = obj.getJSONObject("data").getInt("limit");
|
|
||||||
int total = obj.getJSONObject("data").getInt("total");
|
|
||||||
totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
if (vObj.has("vod_id")) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("vod_id"));
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
} else {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("page", pg);
|
|
||||||
result.put("pagecount", totalPg);
|
|
||||||
result.put("limit", 90);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String url = getPlayUrlPrefix(apiUrl) + ids.get(0);
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vod = new JSONObject();
|
|
||||||
genPlayList(apiUrl, obj, json, vod, ids.get(0));
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vod);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String url = getSearchUrl(apiUrl, URLEncoder.encode(key));
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
if (vObj.has("vod_id")) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("vod_id"));
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
} else {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String parseUrl = getParseUrl(apiUrl, flag);
|
|
||||||
String playerUrl = getPlayerUrl(apiUrl, parseUrl, id);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
getFinalVideo(playerUrl, result);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void findJsonArray(JSONObject obj, String match, ArrayList<JSONArray> result) {
|
|
||||||
Iterator<String> keys = obj.keys();
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String k = keys.next();
|
|
||||||
try {
|
|
||||||
Object o = obj.get(k);
|
|
||||||
if (k.equals(match) && o instanceof JSONArray)
|
|
||||||
result.add((JSONArray) o);
|
|
||||||
if (o instanceof JSONObject) {
|
|
||||||
findJsonArray((JSONObject) o, match, result);
|
|
||||||
} else if (o instanceof JSONArray) {
|
|
||||||
JSONArray array = (JSONArray) o;
|
|
||||||
for (int i = 0; i < array.length(); i++) {
|
|
||||||
findJsonArray(array.getJSONObject(i), match, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String jsonArr2Str(JSONArray array) {
|
|
||||||
try {
|
|
||||||
ArrayList<String> strings = new ArrayList<>();
|
|
||||||
for (int i = 0; i < array.length(); i++) {
|
|
||||||
strings.add(array.getString(i));
|
|
||||||
}
|
|
||||||
return TextUtils.join(",", strings);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static HashMap<String, String> fakeVips = null;
|
|
||||||
private static final Object lock = new Object();
|
|
||||||
|
|
||||||
private static String stopVipFlag(String flag) {
|
|
||||||
synchronized (lock) {
|
|
||||||
if (fakeVips == null) {
|
|
||||||
fakeVips = new HashMap<>();
|
|
||||||
fakeVips.put("youku", "优酷M");
|
|
||||||
fakeVips.put("qq", "腾讯M");
|
|
||||||
fakeVips.put("iqiyi", "爱奇艺M");
|
|
||||||
fakeVips.put("qiyi", "奇艺M");
|
|
||||||
fakeVips.put("letv", "乐视M");
|
|
||||||
fakeVips.put("sohu", "搜狐M");
|
|
||||||
fakeVips.put("tudou", "土豆M");
|
|
||||||
fakeVips.put("pptv", "PPTVM");
|
|
||||||
fakeVips.put("mgtv", "芒果TVM");
|
|
||||||
fakeVips.put("wasu", "华数M");
|
|
||||||
fakeVips.put("bilibili", "哔哩M");
|
|
||||||
}
|
|
||||||
if (fakeVips.containsKey(flag)) {
|
|
||||||
return fakeVips.get(flag);
|
|
||||||
}
|
|
||||||
return flag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private HashMap<String, String> getHeaders(String URL) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", UA(URL));
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBan(String key) {
|
|
||||||
return key.equals("伦理") || key.equals("情色") || key.equals("福利");
|
|
||||||
}
|
|
||||||
|
|
||||||
// M 扩展方法
|
|
||||||
|
|
||||||
// ######重组搜索
|
|
||||||
private String getSearchUrl(String URL, String KEY) {
|
|
||||||
if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun.com")) {
|
|
||||||
return URL + "/list?wd=" + KEY + "&page=";
|
|
||||||
} else {
|
|
||||||
return URL + "?wd=" + KEY + "&page=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "search?text=" + KEY + "&pg=";
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
if (URL.contains("esellauto")
|
|
||||||
|| URL.contains("1.14.63.101")
|
|
||||||
|| URL.contains("zjys")
|
|
||||||
|| URL.contains("dcd")
|
|
||||||
|| URL.contains("lxue")
|
|
||||||
|| URL.contains("weetai.cn")
|
|
||||||
|| URL.contains("haokanju1")
|
|
||||||
|| URL.contains("fit:8")
|
|
||||||
|| URL.contains("zjj.life")
|
|
||||||
|| URL.contains("love9989")
|
|
||||||
|| URL.contains("8d8q")
|
|
||||||
|| URL.contains("lk.pxun")
|
|
||||||
|| URL.contains("hgyx")
|
|
||||||
|| URL.contains("521x5")
|
|
||||||
|| URL.contains("lxyyy")
|
|
||||||
|| URL.contains("0818tv")
|
|
||||||
|| URL.contains("diyoui")
|
|
||||||
|| URL.contains("diliktv")
|
|
||||||
|| URL.contains("ppzhu")
|
|
||||||
|| URL.contains("aitesucai")
|
|
||||||
|| URL.contains("zz.ci")
|
|
||||||
|| URL.contains("chxjon")
|
|
||||||
|| URL.contains("watchmi")
|
|
||||||
|| URL.contains("vipbp")
|
|
||||||
|| URL.contains("bhtv")
|
|
||||||
|| URL.contains("xfykl")) {
|
|
||||||
return URL + "?ac=list&" + "wd=" + KEY + "&page=";
|
|
||||||
} else {
|
|
||||||
return URL + "?ac=list&" + "zm=" + KEY + "&page=";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######UA
|
|
||||||
private static final Pattern urlPattern1 = Pattern.compile("api\\.php/.*?/vod");
|
|
||||||
private static final Pattern urlPattern2 = Pattern.compile("api\\.php/.+?\\.vod");
|
|
||||||
private static final Pattern parsePattern = Pattern.compile("/.+\\?.+=");
|
|
||||||
private static final Pattern parsePattern1 = Pattern.compile(".*(url|v|vid|php\\?id)=");
|
|
||||||
private static final Pattern parsePattern2 = Pattern.compile("https?://[^/]*");
|
|
||||||
private static final Pattern[] parseMatchForDotVod = new Pattern[]{
|
|
||||||
Pattern.compile("jx\\.+huimaojia\\.+com/player"),
|
|
||||||
Pattern.compile("py\\.+789pan\\.+cn/player/tm\\.php\\?url="),
|
|
||||||
Pattern.compile("ztys\\.+waruanzy\\.+com/player/\\?url="),
|
|
||||||
Pattern.compile("yingshi\\.+waruanzy\\.+com/789pan/\\?url="),
|
|
||||||
Pattern.compile("vip\\.+parwix\\.+com:4433/player/\\?url="),
|
|
||||||
Pattern.compile("api\\.+cxitco\\.+cn"),
|
|
||||||
Pattern.compile("/vip\\.+renrenmi.cc"),
|
|
||||||
Pattern.compile("yanbing\\.+parwix\\.+com:4433/player"),
|
|
||||||
Pattern.compile("json\\.+cantin\\.+cc/apijson\\.php"),
|
|
||||||
Pattern.compile("ffdm\\.+miaoletv\\.+com/\\?url="),
|
|
||||||
Pattern.compile("vip\\.+sylwl\\.+cn/api/\\?key="),
|
|
||||||
Pattern.compile("jx\\.+dikotv\\.+com/\\?url="),
|
|
||||||
Pattern.compile("zly\\.+xjqxz\\.+top/player/\\?url="),
|
|
||||||
Pattern.compile("5znn\\.+xyz/m3u8\\.+php"),
|
|
||||||
Pattern.compile("uid=1735&my="),
|
|
||||||
Pattern.compile("api\\.+xkvideo\\.+design/m3u8\\.+php\\?url="),
|
|
||||||
Pattern.compile("play\\.+szbodankyy\\.+com/xxoocnmb"),
|
|
||||||
Pattern.compile("vip\\.+fj6080\\.+xyz/player/\\?url="),
|
|
||||||
Pattern.compile("a\\.+dxzj88\\.+com/jiexi"),
|
|
||||||
Pattern.compile("host\\.+q-q\\.+wang/api"),
|
|
||||||
Pattern.compile("保佑")
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final Pattern[] htmlVideoKeyMatch = new Pattern[]{
|
|
||||||
Pattern.compile("player=new"),
|
|
||||||
Pattern.compile("<div id=\"video\""),
|
|
||||||
Pattern.compile("<div id=\"[^\"]*?player\""),
|
|
||||||
Pattern.compile("//视频链接"),
|
|
||||||
Pattern.compile("HlsJsPlayer\\("),
|
|
||||||
Pattern.compile("<iframe[\\s\\S]*?src=\"[^\"]+?\""),
|
|
||||||
Pattern.compile("<video[\\s\\S]*?src=\"[^\"]+?\"")
|
|
||||||
};
|
|
||||||
|
|
||||||
private String UA(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp") || URL.contains("freekan")) {
|
|
||||||
return "Dart/2.14 (dart:io)";
|
|
||||||
} else if (URL.contains("zsb") || URL.contains("fkxs") || URL.contains("xays") || URL.contains("xcys") || URL.contains("szys") || URL.contains("dxys") || URL.contains("ytys") || URL.contains("qnys")) {
|
|
||||||
return "Dart/2.15 (dart:io)";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "okhttp/4.1.0";
|
|
||||||
} else {
|
|
||||||
return "Dalvik/2.1.0";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######POST
|
|
||||||
String post(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return "";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "";
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######cookie
|
|
||||||
String cookie(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return "";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "";
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######获取分类地址
|
|
||||||
String getCateUrl(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "nav?token=";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun.com")) {
|
|
||||||
return URL + "/list?type";
|
|
||||||
} else {
|
|
||||||
return URL + "/types";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######分类筛选前缀地址
|
|
||||||
String getCateFilterUrlPrefix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
if (URL.contains("dijiaxia")) {
|
|
||||||
URL = "http://www.dijiaxia.com/api.php/app/";
|
|
||||||
return URL + "video?tid=";
|
|
||||||
} else {
|
|
||||||
return URL + "video?tid=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun")) {
|
|
||||||
return URL + "/list?type=";
|
|
||||||
} else {
|
|
||||||
return URL + "?type=";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return URL + "?ac=list&class=";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######分类筛选后缀地址
|
|
||||||
String getCateFilterUrlSuffix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&limit=18&pg=#PN#";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&by=排序&limit=18&page=#PN#";
|
|
||||||
} else {
|
|
||||||
return "&page=#PN#&area=筛选area&type=筛选class&start=筛选year";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######筛选内容
|
|
||||||
String getFilterTypes(String URL, JSONObject typeExtend) {
|
|
||||||
String str = "";
|
|
||||||
if (typeExtend != null) {
|
|
||||||
Iterator<String> typeExtendKeys = typeExtend.keys();
|
|
||||||
while (typeExtendKeys.hasNext()) {
|
|
||||||
String key = typeExtendKeys.next();
|
|
||||||
if (key.equals("class") || key.equals("area") || key.equals("lang") || key.equals("year")) {
|
|
||||||
try {
|
|
||||||
str = str + "筛选" + key + "+全部=+" + typeExtend.getString(key).replace(",", "+") + "\n";
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (URL.contains(".vod")) {
|
|
||||||
str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score";
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
} else {
|
|
||||||
str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000";
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######推荐地址
|
|
||||||
String getRecommendUrl(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "index_video?token=";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return URL + "/vodPhbAll";
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######播放器前缀地址
|
|
||||||
String getPlayUrlPrefix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
if (URL.contains("dijiaxia")) {
|
|
||||||
URL = "https://www.dijiaxia.com/api.php/app/";
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
} else if (URL.contains("1010dy")) {
|
|
||||||
URL = "http://www.1010dy.cc/api.php/app/";
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
} else {
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun")) {
|
|
||||||
return URL + "/detailID?vod_id=";
|
|
||||||
} else {
|
|
||||||
return URL + "/detail?vod_id=";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######选集
|
|
||||||
private final HashMap<String, String> parseUrlMap = new HashMap<>();
|
|
||||||
|
|
||||||
private void genPlayList(String URL, JSONObject object, String json, JSONObject vod, String vid) throws JSONException {
|
|
||||||
ArrayList<String> playUrls = new ArrayList<>();
|
|
||||||
ArrayList<String> playFlags = new ArrayList<>();
|
|
||||||
if (URL.contains("api.php/app/")) {
|
|
||||||
JSONObject data = object.getJSONObject("data");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = stopVipFlag(from.getString("name"));
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
String purl = from.optString("parse_api");
|
|
||||||
if (purl.contains("jpg.hou.lu/jm/za/index.php")) {
|
|
||||||
purl = "http://vip.mengx.vip/home/api?type=ys&uid=3249696&key=aefqrtuwxyEFHKNOQY&url=";
|
|
||||||
}
|
|
||||||
parseUrlMap.put(flag, purl);
|
|
||||||
}
|
|
||||||
} else if (URL.contains("xgapp")) {
|
|
||||||
JSONObject data = object.getJSONObject("data").getJSONObject("vod_info");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = stopVipFlag(from.getString("name"));
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
String purl = from.optString("parse_api");
|
|
||||||
if (purl.contains("jpg.hou.lu/jm/za/index.php")) {
|
|
||||||
purl = "http://vip.mengx.vip/home/api?type=ys&uid=3249696&key=aefqrtuwxyEFHKNOQY&url=";
|
|
||||||
}
|
|
||||||
parseUrlMap.put(flag, purl);
|
|
||||||
}
|
|
||||||
} else if (/*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) {
|
|
||||||
JSONObject data = object.getJSONObject("data");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_play_list");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = stopVipFlag(from.getJSONObject("player_info").getString("show"));
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
try {
|
|
||||||
ArrayList<String> parses = new ArrayList<>();
|
|
||||||
String[] parse1 = from.getJSONObject("player_info").optString("parse").split(",");
|
|
||||||
String[] parse2 = from.getJSONObject("player_info").optString("parse2").split(",");
|
|
||||||
for (String p : parse1) {
|
|
||||||
if (parsePattern.matcher(p).find()) {
|
|
||||||
boolean add = true;
|
|
||||||
for (Pattern pt : parseMatchForDotVod) {
|
|
||||||
if (pt.matcher(p).find()) {
|
|
||||||
add = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (add) {
|
|
||||||
parses.add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (String p : parse2) {
|
|
||||||
if (parsePattern.matcher(p).find()) {
|
|
||||||
boolean add = true;
|
|
||||||
for (Pattern pt : parseMatchForDotVod) {
|
|
||||||
if (pt.matcher(p).find()) {
|
|
||||||
add = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (add) {
|
|
||||||
parses.add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (parses.size() > 0 && parses.get(0).contains("=")) {
|
|
||||||
String purl = parses.get(0);
|
|
||||||
if (purl.contains("http")) {
|
|
||||||
Matcher matcher = parsePattern1.matcher(purl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
purl = matcher.group(0).replace("..", ".").replace("vip.aotian.love", "vip.gaotian.love");
|
|
||||||
}
|
|
||||||
} else if (purl.contains("//")) {
|
|
||||||
Matcher matcher = parsePattern1.matcher(purl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
purl = "http:" + matcher.group(0).replace("..", ".");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Matcher matcher = parsePattern2.matcher(URL);
|
|
||||||
if (matcher.find()) {
|
|
||||||
Matcher matcher1 = parsePattern1.matcher(URL);
|
|
||||||
if (matcher1.find()) {
|
|
||||||
purl = matcher.group(0) + matcher1.group(0).replace("..", ".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parseUrlMap.put(flag, purl);
|
|
||||||
} else {
|
|
||||||
parseUrlMap.put(flag, "http://1.117.152.239:39000/?url=");
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
JSONObject data = object;
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("title"));
|
|
||||||
vod.put("vod_pic", data.getString("img_url"));
|
|
||||||
vod.put("type_name", jsonArr2Str(data.optJSONArray("type")));
|
|
||||||
vod.put("vod_year", data.optString("pubtime"));
|
|
||||||
vod.put("vod_area", jsonArr2Str(data.optJSONArray("area")));
|
|
||||||
vod.put("vod_remarks", data.optString("trunk"));
|
|
||||||
vod.put("vod_actor", jsonArr2Str(data.optJSONArray("actor")));
|
|
||||||
vod.put("vod_director", jsonArr2Str(data.optJSONArray("director")));
|
|
||||||
vod.put("vod_content", data.optString("intro"));
|
|
||||||
JSONObject playList = data.getJSONObject("videolist");
|
|
||||||
Iterator<String> playListKeys = playList.keys();
|
|
||||||
while (playListKeys.hasNext()) {
|
|
||||||
String from = playListKeys.next();
|
|
||||||
JSONArray playListUrls = playList.getJSONArray(from);
|
|
||||||
ArrayList<String> urls = new ArrayList<>();
|
|
||||||
for (int j = 0; j < playListUrls.length(); j++) {
|
|
||||||
JSONObject urlObj = playListUrls.getJSONObject(j);
|
|
||||||
urls.add(urlObj.getString("title") + "$" + urlObj.getString("url"));
|
|
||||||
}
|
|
||||||
playFlags.add(stopVipFlag(from));
|
|
||||||
playUrls.add(TextUtils.join("#", urls));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for (int i = 0; i < playFlags.size(); i++) {
|
|
||||||
// String pu = playUrls.get(i).split("#")[0].split("\\$")[1];
|
|
||||||
// System.out.println(pu + " is video?" + isVideoFormat(pu));
|
|
||||||
// playerContent(playFlags.get(i), pu, new ArrayList<>());
|
|
||||||
// }
|
|
||||||
vod.put("vod_play_from", TextUtils.join("$$$", playFlags));
|
|
||||||
vod.put("vod_play_url", TextUtils.join("$$$", playUrls));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getParseUrl(String URL, String flag) {
|
|
||||||
String parseUrl = "";
|
|
||||||
if (urlPattern2.matcher(URL).find()) {
|
|
||||||
if (parseUrlMap.containsKey(flag))
|
|
||||||
parseUrl = parseUrlMap.get(flag);
|
|
||||||
} else if (URL.contains("api.php/app/") || URL.contains("xgapp")) {
|
|
||||||
if (parseUrlMap.containsKey(flag))
|
|
||||||
parseUrl = parseUrlMap.get(flag);
|
|
||||||
} else {
|
|
||||||
parseUrl = URL;
|
|
||||||
}
|
|
||||||
if (parseUrl.contains("svip.jhyun.jx.cn") || parseUrl.contains("svip.jhdyw.vip")) {
|
|
||||||
if (flag.contains("人人迷")) {
|
|
||||||
parseUrl = "http://www.1080kan.cc/jiexi/rrmi.php?url=";
|
|
||||||
} else if (flag.contains("人人")) {
|
|
||||||
parseUrl = "http://www.1080kan.cc/jiexi/rr.php?url=";
|
|
||||||
} else if (flag.contains("番茄")) {
|
|
||||||
parseUrl = "http://www.1080kan.cc/jiexi/fq.php?url=";
|
|
||||||
} else {
|
|
||||||
parseUrl = "https://jx.parwix.com:4433/player/?url=";
|
|
||||||
}
|
|
||||||
} else if (parseUrl.contains("jhsj.manduhu.com") || parseUrl.contains("v.jhdyw.vip/nhdz666")) {
|
|
||||||
parseUrl = "https://jx.parwix.com:4433/player/?url=";
|
|
||||||
} else if (parseUrl.contains("x-n.cc")) {
|
|
||||||
parseUrl = "https://jx.parwix.com:4433/player/?url=";
|
|
||||||
}
|
|
||||||
return parseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getPlayerUrl(String URL, String parseUrl, String playUrl) {
|
|
||||||
if (URL.contains("xgapp") || URL.contains("api.php/app/") || /*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) {
|
|
||||||
if (playUrl.indexOf(".m3u8") > 15 || playUrl.indexOf(".mp4") > 15 || playUrl.contains("/obj/tos")) {
|
|
||||||
if (playUrl.contains("url=")) {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl.split("url=")[1];
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl;
|
|
||||||
}
|
|
||||||
} else if (!parseUrl.contains("url=") && playUrl.contains("RongXingVR")) {
|
|
||||||
return "https://www.baidu.com/s?wd=https://fast.rongxingvr.cn:8866/api/?key=nShWumGdMIbTwngTbI&url=" + playUrl;
|
|
||||||
} else if (!parseUrl.contains("url=") && playUrl.contains("LT")) {
|
|
||||||
return "https://www.baidu.com/s?wd=https://f7.pyxddc.com/bcjx/4k.php?url=" + playUrl;
|
|
||||||
} else if (!parseUrl.contains("url=") && playUrl.contains("renrenmi")) {
|
|
||||||
return "https://www.baidu.com/s?wd=https://kuba.renrenmi.cc:2266/api/?key=Y6UYLYtjImTCKe98JD&url=" + playUrl;
|
|
||||||
} else if (!parseUrl.contains("url=") && playUrl.contains(".html")) {
|
|
||||||
return "https://www.baidu.com/s?wd=http://1.117.152.239:39000/?url=" + playUrl;
|
|
||||||
} else if (playUrl.contains("xfy")) {
|
|
||||||
return "https://www.baidu.com/s?wd=http://jiexi.yunl.cc/api/?key=xYNESYSvHp1DV2ckKs&url=" + playUrl;
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + parseUrl + playUrl;
|
|
||||||
}
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
if (playUrl.indexOf(".m3u8") > 15 || playUrl.indexOf(".mp4") > 15 || playUrl.contains("/obj/tos")) {
|
|
||||||
if (playUrl.contains("url=")) {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl.split("url=")[1];
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl;
|
|
||||||
}
|
|
||||||
} else if (playUrl.contains("xfy")) {
|
|
||||||
if (playUrl.contains("url=")) {
|
|
||||||
return "https://www.baidu.com/s?wd=http://cache.dmtt.xyz/xfyjx/xfyjx.php?url=" + playUrl.split("url=")[1];
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=https://json.hfyrw.com/mao.go?url=" + playUrl;
|
|
||||||
}
|
|
||||||
} else if (playUrl.contains("www.bilibili.com")) {
|
|
||||||
String spUrl = playUrl.split("url=")[1];
|
|
||||||
return "https://www.baidu.com/s?wd=https://jx.parwix.com:4433/player/?url=" + spUrl;
|
|
||||||
} else if (URL.contains("zhenfy") || URL.contains("cztv") || URL.contains("1.14.63.101") || URL.contains("fit:8") || URL.contains("diliktv.xyz") || URL.contains("ppzhu.vip") || URL.contains("api.8d8q.com") || URL.contains("haokanju1.cc") || URL.contains("cztv")) {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl + "&app=10000&account=272775028&password=qq272775028";
|
|
||||||
} else if (URL.contains("lxyyy") || URL.contains("j.zjj.life") || URL.contains("lktv") || URL.contains("0818tv") || URL.contains("ruoxinew")) {
|
|
||||||
return "https://www.baidu.com/s?wd=https://play.tkys.tv/?url=" + playUrl.split("url=")[1];
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######视频地址
|
|
||||||
private void getFinalVideo(String uu, JSONObject result) throws JSONException {
|
|
||||||
if (uu.contains("baidu.com")) {
|
|
||||||
String playurl = uu.split("wd=")[1];
|
|
||||||
if (playurl.contains("duoduozy.com") || playurl.contains("suoyo.cc")) {
|
|
||||||
String uuu = "https://www.6080kan.cc/app.php?url=" + playurl;
|
|
||||||
String content = OkHttpUtil.string(uuu, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", obj.getString("url"));
|
|
||||||
result.put("header", "{\"User-Agent\":\" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0\",\"referer\":\" https://player.duoduozy.com\",\"origin\":\" https://dp.duoduozy.com\",\"Host\":\" cache.m3u8.suoyo.cc\"}");
|
|
||||||
} else if (playurl.contains("xfy")) {
|
|
||||||
String content = OkHttpUtil.string(playurl, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", obj.getString("url"));
|
|
||||||
result.put("header", "{\"referer\":\" appguapi.lihaoyun.top:11543\",\"User-Agent\":\" Dart/2.14 (dart:io)\"}}");
|
|
||||||
} else if (playurl.contains("api.iopenyun.com:88")) {
|
|
||||||
if (playurl.contains("html")) {
|
|
||||||
String content = OkHttpUtil.string("https://api.m3u8.tv:5678/home/api?type=ys&uid=233711&key=dgilouvFKNRSWX2467&url=" + playurl.split("=")[1], null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String ppurl = obj.getString("url");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", ppurl);
|
|
||||||
} else {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
result.put("ua", "Mozilla/5.0 Windows10");
|
|
||||||
result.put("header", "{\"Referer\":\"https://user.iopenyun.com:520/user/video/\"}");
|
|
||||||
}
|
|
||||||
} else if (playurl.contains("cat.wkfile.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
result.put("header", "{\"User-Agent\":\" Lavf/58.12.100\",\"Referer\":\" wkfile.com\"}");
|
|
||||||
} else if (!playurl.contains("=") && playurl.indexOf(".m3u8") > 15 || playurl.indexOf(".mp4") > 15 || playurl.contains("/obj/tos")) {
|
|
||||||
if (playurl.contains("hsl.ysgc.xyz")) {
|
|
||||||
String content = OkHttpUtil.string("https://jx.ysgc.xyz/?url=" + playurl, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String ppurl = obj.getString("url");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", ppurl);
|
|
||||||
result.put("header", "{\"Referer\":\" https://ysgc.cc\"}");
|
|
||||||
} else if (playurl.contains("1.ruifenglb.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
result.put("header", "{\"Referer\":\" https://1.ruifenglb.com\"}");
|
|
||||||
} else {
|
|
||||||
Matcher matcher = Pattern.compile(".*(http.*)").matcher(playurl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", matcher.group(1));
|
|
||||||
} else {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (playurl.contains("=")) {
|
|
||||||
HashMap<String, String> headers = new HashMap();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 Android");
|
|
||||||
Map<String, List<String>> respHeaders = new TreeMap<>();
|
|
||||||
String content = OkHttpUtil.stringNoRedirect(playurl, headers, respHeaders);
|
|
||||||
String redLoc = OkHttpUtil.getRedirectLocation(respHeaders);
|
|
||||||
if (redLoc != null) {
|
|
||||||
String finalurl = "";
|
|
||||||
while (redLoc != null) {
|
|
||||||
finalurl = redLoc;
|
|
||||||
if (redLoc.indexOf(".mp4") > 30) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 Android");
|
|
||||||
content = OkHttpUtil.stringNoRedirect(finalurl, headers, respHeaders);
|
|
||||||
redLoc = OkHttpUtil.getRedirectLocation(respHeaders);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String realurl = finalurl;
|
|
||||||
if (realurl.contains("=http") || realurl.contains("url=")) {
|
|
||||||
if (content.contains("<html")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
} else {
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String ppurl = obj.getString("url");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", ppurl);
|
|
||||||
if (realurl.contains("mgtv.com")) {
|
|
||||||
result.put("header", "{\"User-Agent\":\" Mozilla/5.0\", \"Referer\":\" \"}");
|
|
||||||
} else if (realurl.contains("bilibili.com")) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (playurl.contains("www.mgtv.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
result.put("header", "{\"User-Agent\":\" Mozilla/5.0\", \"Referer\":\" \"}");
|
|
||||||
} else {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (content.contains("<html")) {
|
|
||||||
boolean sniffer = false;
|
|
||||||
for (Pattern p : htmlVideoKeyMatch) {
|
|
||||||
if (p.matcher(content).find()) {
|
|
||||||
sniffer = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sniffer) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
} else {
|
|
||||||
if (playurl.split("url=")[1].contains("http")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "http://1.117.152.239:39000/?url=" + playurl.split("url=")[1]);
|
|
||||||
} else if (playurl.split("url=")[1].contains("renrenmi")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "http://www.1080kan.cc/jiexi/rrmi.php?url=" + playurl.split("url=")[1]);
|
|
||||||
result.put("header", "{\"Referer\":\"http://www.1080kan.cc/\"}");
|
|
||||||
} else {
|
|
||||||
String id = playurl.split("url=")[1];
|
|
||||||
/*
|
|
||||||
String uuu = "https://vip.gaotian.love/api/?key=sRy0QAq8hqXRlrEtrq&url=" + id;
|
|
||||||
content = OkHttpUtil.string(uuu, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String realurl = obj.optString("url", "");
|
|
||||||
if (realurl.isEmpty())
|
|
||||||
realurl = obj.optString("msg", "");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
*/
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "https://jx.banyung.xyz:7799/player/?url=" + playurl.split("url=")[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
String jsonUrl = "";
|
|
||||||
try {
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
jsonUrl = obj.optString("url");
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
if (jsonUrl.length() > 1) {
|
|
||||||
String realurl = jsonUrl;
|
|
||||||
if (playurl.contains("mgtv.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
result.put("header", "{\"User-Agent\":\" Mozilla/5.0\", \"Referer\":\" \"}");
|
|
||||||
} else if (playurl.contains("bilibili.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
} else {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
}
|
|
||||||
} else if (playurl.split("url=")[1].contains("http")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "http://1.117.152.239:39000/?url=" + playurl.split("url=")[1]);
|
|
||||||
} else if (playurl.split("url=")[1].contains("renrenmi")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "http://www.1080kan.cc/jiexi/rrmi.php?url=" + playurl.split("url=")[1]);
|
|
||||||
result.put("header", "{\"Referer\":\"http://www.1080kan.cc/\"}");
|
|
||||||
} else {
|
|
||||||
String id = playurl.split("url=")[1];
|
|
||||||
/*
|
|
||||||
String uuu = "https://vip.gaotian.love/api/?key=sRy0QAq8hqXRlrEtrq&url=" + id;
|
|
||||||
content = OkHttpUtil.string(uuu, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String realurl = obj.optString("url", "");
|
|
||||||
if (realurl.isEmpty())
|
|
||||||
realurl = obj.optString("msg", "");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
*/
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "https://jx.banyung.xyz:7799/player/?url=" + playurl.split("url=")[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", uu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean manualVideoCheck() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVideoFormat(String url) {
|
|
||||||
return Misc.isVideoFormat(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,845 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* M浏览器中的App影视
|
|
||||||
* <p>
|
|
||||||
* Author: 群友 不负此生
|
|
||||||
*/
|
|
||||||
public class AppYsV2 extends Spider {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
try {
|
|
||||||
extInfos = extend.split("###");
|
|
||||||
} catch (Throwable th) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
String url = getCateUrl(getApiUrl());
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
if (!url.isEmpty()) {
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 0);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
} else { // 通过filter列表读分类
|
|
||||||
String filterStr = getFilterTypes(url, null);
|
|
||||||
String[] classes = filterStr.split("\n")[0].split("\\+");
|
|
||||||
jsonArray = new JSONArray();
|
|
||||||
for (int i = 1; i < classes.length; i++) {
|
|
||||||
String[] kv = classes[i].trim().split("=");
|
|
||||||
if (kv.length < 2)
|
|
||||||
continue;
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_name", kv[0].trim());
|
|
||||||
newCls.put("type_id", kv[1].trim());
|
|
||||||
jsonArray.put(newCls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject jObj = jsonArray.getJSONObject(i);
|
|
||||||
String typeName = jObj.getString("type_name");
|
|
||||||
if (isBan(typeName))
|
|
||||||
continue;
|
|
||||||
String typeId = jObj.getString("type_id");
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_id", typeId);
|
|
||||||
newCls.put("type_name", typeName);
|
|
||||||
JSONObject typeExtend = jObj.optJSONObject("type_extend");
|
|
||||||
if (filter) {
|
|
||||||
String filterStr = getFilterTypes(url, typeExtend);
|
|
||||||
String[] filters = filterStr.split("\n");
|
|
||||||
JSONArray filterArr = new JSONArray();
|
|
||||||
for (int k = url.isEmpty() ? 1 : 0; k < filters.length; k++) {
|
|
||||||
String l = filters[k].trim();
|
|
||||||
if (l.isEmpty())
|
|
||||||
continue;
|
|
||||||
String[] oneLine = l.split("\\+");
|
|
||||||
String type = oneLine[0].trim();
|
|
||||||
String typeN = type;
|
|
||||||
if (type.contains("筛选")) {
|
|
||||||
type = type.replace("筛选", "");
|
|
||||||
if (type.equals("class"))
|
|
||||||
typeN = "类型";
|
|
||||||
else if (type.equals("area"))
|
|
||||||
typeN = "地区";
|
|
||||||
else if (type.equals("lang"))
|
|
||||||
typeN = "语言";
|
|
||||||
else if (type.equals("year"))
|
|
||||||
typeN = "年份";
|
|
||||||
}
|
|
||||||
JSONObject jOne = new JSONObject();
|
|
||||||
jOne.put("key", type);
|
|
||||||
jOne.put("name", typeN);
|
|
||||||
JSONArray valueArr = new JSONArray();
|
|
||||||
for (int j = 1; j < oneLine.length; j++) {
|
|
||||||
JSONObject kvo = new JSONObject();
|
|
||||||
String kv = oneLine[j].trim();
|
|
||||||
int sp = kv.indexOf("=");
|
|
||||||
if (sp == -1) {
|
|
||||||
if (isBan(kv))
|
|
||||||
continue;
|
|
||||||
kvo.put("n", kv);
|
|
||||||
kvo.put("v", kv);
|
|
||||||
} else {
|
|
||||||
String n = kv.substring(0, sp);
|
|
||||||
if (isBan(n))
|
|
||||||
continue;
|
|
||||||
kvo.put("n", n.trim());
|
|
||||||
kvo.put("v", kv.substring(sp + 1).trim());
|
|
||||||
}
|
|
||||||
valueArr.put(kvo);
|
|
||||||
}
|
|
||||||
jOne.put("value", valueArr);
|
|
||||||
filterArr.put(jOne);
|
|
||||||
}
|
|
||||||
if (!result.has("filters")) {
|
|
||||||
result.put("filters", new JSONObject());
|
|
||||||
}
|
|
||||||
result.getJSONObject("filters").put(typeId, filterArr);
|
|
||||||
}
|
|
||||||
classes.put(newCls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
String apiUrl = getApiUrl();
|
|
||||||
String url = getRecommendUrl(apiUrl);
|
|
||||||
boolean isTV = false;
|
|
||||||
if (url.isEmpty()) {
|
|
||||||
url = getCateFilterUrlPrefix(apiUrl) + "movie&page=1&area=&type=&start=";
|
|
||||||
isTV = true;
|
|
||||||
}
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 1);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (isTV) {
|
|
||||||
JSONArray jsonArray = obj.getJSONArray("data");
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ArrayList<JSONArray> arrays = new ArrayList<>();
|
|
||||||
findJsonArray(obj, "vlist", arrays);
|
|
||||||
if (arrays.isEmpty()) {
|
|
||||||
findJsonArray(obj, "vod_list", arrays);
|
|
||||||
}
|
|
||||||
List<String> ids = new ArrayList<>();
|
|
||||||
for (JSONArray jsonArray : arrays) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
String vid = vObj.getString("vod_id");
|
|
||||||
if (ids.contains(vid))
|
|
||||||
continue;
|
|
||||||
ids.add(vid);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vid);
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String apiUrl = getApiUrl();
|
|
||||||
String url = getCateFilterUrlPrefix(apiUrl) + tid + getCateFilterUrlSuffix(apiUrl);
|
|
||||||
url = url.replace("#PN#", pg);
|
|
||||||
url = url.replace("筛选class", (extend != null && extend.containsKey("class")) ? extend.get("class") : "");
|
|
||||||
url = url.replace("筛选area", (extend != null && extend.containsKey("area")) ? extend.get("area") : "");
|
|
||||||
url = url.replace("筛选lang", (extend != null && extend.containsKey("lang")) ? extend.get("lang") : "");
|
|
||||||
url = url.replace("筛选year", (extend != null && extend.containsKey("year")) ? extend.get("year") : "");
|
|
||||||
url = url.replace("排序", (extend != null && extend.containsKey("排序")) ? extend.get("排序") : "");
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 2);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
int totalPg = Integer.MAX_VALUE;
|
|
||||||
try {
|
|
||||||
if (obj.has("totalpage") && obj.get("totalpage") instanceof Integer) {
|
|
||||||
totalPg = obj.getInt("totalpage");
|
|
||||||
} else if (obj.has("pagecount") && obj.get("pagecount") instanceof Integer) {
|
|
||||||
totalPg = obj.getInt("pagecount");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject &&
|
|
||||||
(obj.getJSONObject("data").has("total") && obj.getJSONObject("data").get("total") instanceof Integer &&
|
|
||||||
obj.getJSONObject("data").has("limit") && obj.getJSONObject("data").get("limit") instanceof Integer)) {
|
|
||||||
int limit = obj.getJSONObject("data").getInt("limit");
|
|
||||||
int total = obj.getJSONObject("data").getInt("total");
|
|
||||||
totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
if (vObj.has("vod_id")) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("vod_id"));
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
} else {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("page", pg);
|
|
||||||
result.put("pagecount", totalPg);
|
|
||||||
result.put("limit", 90);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
String apiUrl = getApiUrl();
|
|
||||||
String url = getPlayUrlPrefix(apiUrl) + ids.get(0);
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 3);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vod = new JSONObject();
|
|
||||||
genPlayList(apiUrl, obj, json, vod, ids.get(0));
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vod);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String apiUrl = getApiUrl();
|
|
||||||
String url = getSearchUrl(apiUrl, URLEncoder.encode(key));
|
|
||||||
//System.out.println(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 5);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
if (vObj.has("vod_id")) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("vod_id"));
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
} else {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null)
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
if (!parseUrls.isEmpty()) {
|
|
||||||
JSONObject result = getFinalVideo(flag, parseUrls, id);
|
|
||||||
if (result != null)
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
if (Misc.isVideoFormat(id)) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
} else {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("jx", "1");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void findJsonArray(JSONObject obj, String match, ArrayList<JSONArray> result) {
|
|
||||||
Iterator<String> keys = obj.keys();
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String k = keys.next();
|
|
||||||
try {
|
|
||||||
Object o = obj.get(k);
|
|
||||||
if (k.equals(match) && o instanceof JSONArray)
|
|
||||||
result.add((JSONArray) o);
|
|
||||||
if (o instanceof JSONObject) {
|
|
||||||
findJsonArray((JSONObject) o, match, result);
|
|
||||||
} else if (o instanceof JSONArray) {
|
|
||||||
JSONArray array = (JSONArray) o;
|
|
||||||
for (int i = 0; i < array.length(); i++) {
|
|
||||||
findJsonArray(array.getJSONObject(i), match, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String jsonArr2Str(JSONArray array) {
|
|
||||||
try {
|
|
||||||
ArrayList<String> strings = new ArrayList<>();
|
|
||||||
for (int i = 0; i < array.length(); i++) {
|
|
||||||
strings.add(array.getString(i));
|
|
||||||
}
|
|
||||||
return TextUtils.join(",", strings);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private HashMap<String, String> getHeaders(String URL) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", UA(URL));
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBan(String key) {
|
|
||||||
return key.equals("伦理") || key.equals("情色") || key.equals("福利");
|
|
||||||
}
|
|
||||||
|
|
||||||
// M 扩展方法
|
|
||||||
|
|
||||||
// ######重组搜索
|
|
||||||
private String getSearchUrl(String URL, String KEY) {
|
|
||||||
if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun.com")) {
|
|
||||||
return URL + "/list?wd=" + KEY + "&page=";
|
|
||||||
} else {
|
|
||||||
return URL + "?wd=" + KEY + "&page=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "search?text=" + KEY + "&pg=";
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
if (URL.contains("esellauto")
|
|
||||||
|| URL.contains("1.14.63.101")
|
|
||||||
|| URL.contains("zjys")
|
|
||||||
|| URL.contains("dcd")
|
|
||||||
|| URL.contains("lxue")
|
|
||||||
|| URL.contains("weetai.cn")
|
|
||||||
|| URL.contains("haokanju1")
|
|
||||||
|| URL.contains("fit:8")
|
|
||||||
|| URL.contains("zjj.life")
|
|
||||||
|| URL.contains("love9989")
|
|
||||||
|| URL.contains("8d8q")
|
|
||||||
|| URL.contains("lk.pxun")
|
|
||||||
|| URL.contains("hgyx")
|
|
||||||
|| URL.contains("521x5")
|
|
||||||
|| URL.contains("lxyyy")
|
|
||||||
|| URL.contains("0818tv")
|
|
||||||
|| URL.contains("diyoui")
|
|
||||||
|| URL.contains("diliktv")
|
|
||||||
|| URL.contains("ppzhu")
|
|
||||||
|| URL.contains("aitesucai")
|
|
||||||
|| URL.contains("zz.ci")
|
|
||||||
|| URL.contains("chxjon")
|
|
||||||
|| URL.contains("watchmi")
|
|
||||||
|| URL.contains("vipbp")
|
|
||||||
|| URL.contains("bhtv")
|
|
||||||
|| URL.contains("xfykl")) {
|
|
||||||
return URL + "?ac=list&" + "wd=" + KEY + "&page=";
|
|
||||||
} else {
|
|
||||||
return URL + "?ac=list&" + "zm=" + KEY + "&page=";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######UA
|
|
||||||
private static final Pattern urlPattern1 = Pattern.compile("api\\.php/.*?/vod");
|
|
||||||
private static final Pattern urlPattern2 = Pattern.compile("api\\.php/.+?\\.vod");
|
|
||||||
private static final Pattern parsePattern = Pattern.compile("/.+\\?.+=");
|
|
||||||
private static final Pattern parsePattern1 = Pattern.compile(".*(url|v|vid|php\\?id)=");
|
|
||||||
private static final Pattern parsePattern2 = Pattern.compile("https?://[^/]*");
|
|
||||||
|
|
||||||
protected static final Pattern[] htmlVideoKeyMatch = new Pattern[]{
|
|
||||||
Pattern.compile("player=new"),
|
|
||||||
Pattern.compile("<div id=\"video\""),
|
|
||||||
Pattern.compile("<div id=\"[^\"]*?player\""),
|
|
||||||
Pattern.compile("//视频链接"),
|
|
||||||
Pattern.compile("HlsJsPlayer\\("),
|
|
||||||
Pattern.compile("<iframe[\\s\\S]*?src=\"[^\"]+?\""),
|
|
||||||
Pattern.compile("<video[\\s\\S]*?src=\"[^\"]+?\"")
|
|
||||||
};
|
|
||||||
|
|
||||||
private String UA(String URL) {
|
|
||||||
if (URL.contains("vod.9e03.com")) {
|
|
||||||
return "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36";
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp") || URL.contains("freekan")) {
|
|
||||||
return "Dart/2.14 (dart:io)";
|
|
||||||
} else if (URL.contains("zsb") || URL.contains("fkxs") || URL.contains("xays") || URL.contains("xcys") || URL.contains("szys") || URL.contains("dxys") || URL.contains("ytys") || URL.contains("qnys")) {
|
|
||||||
return "Dart/2.15 (dart:io)";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "okhttp/4.1.0";
|
|
||||||
} else {
|
|
||||||
return "Dalvik/2.1.0";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######获取分类地址
|
|
||||||
String getCateUrl(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "nav?token=";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun.com")) {
|
|
||||||
return URL + "/list?type";
|
|
||||||
} else {
|
|
||||||
return URL + "/types";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######分类筛选前缀地址
|
|
||||||
String getCateFilterUrlPrefix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
if (URL.contains("dijiaxia")) {
|
|
||||||
URL = "http://www.dijiaxia.com/api.php/app/";
|
|
||||||
return URL + "video?tid=";
|
|
||||||
} else {
|
|
||||||
return URL + "video?tid=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun")) {
|
|
||||||
return URL + "/list?type=";
|
|
||||||
} else {
|
|
||||||
return URL + "?type=";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return URL + "?ac=list&class=";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######分类筛选后缀地址
|
|
||||||
String getCateFilterUrlSuffix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&limit=18&pg=#PN#";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&by=排序&limit=18&page=#PN#";
|
|
||||||
} else {
|
|
||||||
return "&page=#PN#&area=筛选area&type=筛选class&start=筛选year";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######筛选内容
|
|
||||||
String getFilterTypes(String URL, JSONObject typeExtend) {
|
|
||||||
String str = "";
|
|
||||||
if (typeExtend != null) {
|
|
||||||
Iterator<String> typeExtendKeys = typeExtend.keys();
|
|
||||||
while (typeExtendKeys.hasNext()) {
|
|
||||||
String key = typeExtendKeys.next();
|
|
||||||
if (key.equals("class") || key.equals("area") || key.equals("lang") || key.equals("year")) {
|
|
||||||
try {
|
|
||||||
str = str + "筛选" + key + "+全部=+" + typeExtend.getString(key).replace(",", "+") + "\n";
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (URL.contains(".vod")) {
|
|
||||||
str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score";
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
} else {
|
|
||||||
str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000";
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######推荐地址
|
|
||||||
String getRecommendUrl(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "index_video?token=";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return URL + "/vodPhbAll";
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######播放器前缀地址
|
|
||||||
String getPlayUrlPrefix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
if (URL.contains("dijiaxia")) {
|
|
||||||
URL = "https://www.dijiaxia.com/api.php/app/";
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
} else if (URL.contains("1010dy")) {
|
|
||||||
URL = "http://www.1010dy.cc/api.php/app/";
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
} else {
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun")) {
|
|
||||||
return URL + "/detailID?vod_id=";
|
|
||||||
} else {
|
|
||||||
return URL + "/detail?vod_id=";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######选集
|
|
||||||
protected final HashMap<String, ArrayList<String>> parseUrlMap = new HashMap<>();
|
|
||||||
|
|
||||||
private void genPlayList(String URL, JSONObject object, String json, JSONObject vod, String vid) throws JSONException {
|
|
||||||
ArrayList<String> playUrls = new ArrayList<>();
|
|
||||||
ArrayList<String> playFlags = new ArrayList<>();
|
|
||||||
if (URL.contains("api.php/app/")) {
|
|
||||||
JSONObject data = object.getJSONObject("data");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = from.optString("code").trim();
|
|
||||||
if (flag.isEmpty())
|
|
||||||
flag = from.getString("name").trim();
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
String purl = from.optString("parse_api").trim();
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null) {
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
parseUrlMap.put(flag, parseUrls);
|
|
||||||
}
|
|
||||||
if (!purl.isEmpty() && !parseUrls.contains(purl))
|
|
||||||
parseUrls.add(purl);
|
|
||||||
}
|
|
||||||
} else if (URL.contains("xgapp")) {
|
|
||||||
JSONObject data = object.getJSONObject("data").getJSONObject("vod_info");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = from.optString("code").trim();
|
|
||||||
if (flag.isEmpty())
|
|
||||||
flag = from.getString("name").trim();
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
String purl = from.optString("parse_api").trim();
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null) {
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
parseUrlMap.put(flag, parseUrls);
|
|
||||||
}
|
|
||||||
if (!purl.isEmpty() && !parseUrls.contains(purl))
|
|
||||||
parseUrls.add(purl);
|
|
||||||
}
|
|
||||||
} else if (/*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) {
|
|
||||||
JSONObject data = object.getJSONObject("data");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_play_list");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = from.getJSONObject("player_info").optString("from").trim();
|
|
||||||
if (flag.isEmpty())
|
|
||||||
flag = from.getJSONObject("player_info").optString("show").trim();
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
try {
|
|
||||||
ArrayList<String> parses = new ArrayList<>();
|
|
||||||
String[] parse1 = from.getJSONObject("player_info").optString("parse").split(",");
|
|
||||||
String[] parse2 = from.getJSONObject("player_info").optString("parse2").split(",");
|
|
||||||
parses.addAll(Arrays.asList(parse1));
|
|
||||||
parses.addAll(Arrays.asList(parse2));
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null) {
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
parseUrlMap.put(flag, parseUrls);
|
|
||||||
}
|
|
||||||
for (String purl : parses) {
|
|
||||||
if (purl.contains("http")) {
|
|
||||||
Matcher matcher = parsePattern1.matcher(purl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
purl = matcher.group(0);
|
|
||||||
}
|
|
||||||
} else if (purl.contains("//")) {
|
|
||||||
Matcher matcher = parsePattern1.matcher(purl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
purl = "http:" + matcher.group(0);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Matcher matcher = parsePattern2.matcher(URL);
|
|
||||||
if (matcher.find()) {
|
|
||||||
Matcher matcher1 = parsePattern1.matcher(URL);
|
|
||||||
if (matcher1.find()) {
|
|
||||||
purl = matcher.group(0) + matcher1.group(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
purl = purl.replace("..", ".").trim();
|
|
||||||
if (!purl.isEmpty() && !parseUrls.contains(purl))
|
|
||||||
parseUrls.add(purl);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
JSONObject data = object;
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("title"));
|
|
||||||
vod.put("vod_pic", data.getString("img_url"));
|
|
||||||
vod.put("type_name", jsonArr2Str(data.optJSONArray("type")));
|
|
||||||
vod.put("vod_year", data.optString("pubtime"));
|
|
||||||
vod.put("vod_area", jsonArr2Str(data.optJSONArray("area")));
|
|
||||||
vod.put("vod_remarks", data.optString("trunk"));
|
|
||||||
vod.put("vod_actor", jsonArr2Str(data.optJSONArray("actor")));
|
|
||||||
vod.put("vod_director", jsonArr2Str(data.optJSONArray("director")));
|
|
||||||
vod.put("vod_content", data.optString("intro"));
|
|
||||||
JSONObject playList = data.getJSONObject("videolist");
|
|
||||||
Iterator<String> playListKeys = playList.keys();
|
|
||||||
while (playListKeys.hasNext()) {
|
|
||||||
String flag = playListKeys.next();
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null) {
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
parseUrlMap.put(flag, parseUrls);
|
|
||||||
}
|
|
||||||
JSONArray playListUrls = playList.getJSONArray(flag);
|
|
||||||
ArrayList<String> urls = new ArrayList<>();
|
|
||||||
for (int j = 0; j < playListUrls.length(); j++) {
|
|
||||||
JSONObject urlObj = playListUrls.getJSONObject(j);
|
|
||||||
String url = urlObj.getString("url");
|
|
||||||
if (url.contains("url=")) {
|
|
||||||
int spIdx = url.indexOf("url=") + 4;
|
|
||||||
String pUrl = url.substring(0, spIdx).trim();
|
|
||||||
if (!pUrl.isEmpty() && !parseUrls.contains(pUrl))
|
|
||||||
parseUrls.add(pUrl);
|
|
||||||
urls.add(urlObj.getString("title") + "$" + url.substring(spIdx).trim());
|
|
||||||
} else {
|
|
||||||
urls.add(urlObj.getString("title") + "$" + url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(TextUtils.join("#", urls));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vod.put("vod_play_from", TextUtils.join("$$$", playFlags));
|
|
||||||
vod.put("vod_play_url", TextUtils.join("$$$", playUrls));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######视频地址
|
|
||||||
protected JSONObject getFinalVideo(String flag, ArrayList<String> parseUrls, String url) throws JSONException {
|
|
||||||
String htmlPlayUrl = "";
|
|
||||||
for (String parseUrl : parseUrls) {
|
|
||||||
if (parseUrl.isEmpty() || parseUrl.equals("null"))
|
|
||||||
continue;
|
|
||||||
String playUrl = parseUrl + url;
|
|
||||||
String content = desc(OkHttpUtil.string(playUrl, null), (byte) 4);
|
|
||||||
if (parseUrl.contains("49.233.47.42:9898")) {
|
|
||||||
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
OkHttpUtil.stringNoRedirect(playUrl,null, hashMap);
|
|
||||||
String d = OkHttpUtil.getRedirectLocation(hashMap);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", d);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
JSONObject tryJson = null;
|
|
||||||
try {
|
|
||||||
tryJson = Misc.jsonParse(url, content);
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
if (tryJson != null && tryJson.has("url") && tryJson.has("header")) {
|
|
||||||
tryJson.put("header", tryJson.getJSONObject("header").toString());
|
|
||||||
return tryJson;
|
|
||||||
}
|
|
||||||
if (content.contains("<html")) {
|
|
||||||
boolean sniffer = false;
|
|
||||||
for (Pattern p : htmlVideoKeyMatch) {
|
|
||||||
if (p.matcher(content).find()) {
|
|
||||||
sniffer = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sniffer) {
|
|
||||||
htmlPlayUrl = parseUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!htmlPlayUrl.isEmpty()) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", htmlPlayUrl);
|
|
||||||
result.put("url", url);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean manualVideoCheck() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVideoFormat(String url) {
|
|
||||||
return Misc.isVideoFormat(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getApiUrl() {
|
|
||||||
if (extInfos == null || extInfos.length < 1)
|
|
||||||
return "";
|
|
||||||
return extInfos[0].trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String[] extInfos = null;
|
|
||||||
|
|
||||||
protected String desc(String src, byte type) {
|
|
||||||
if (extInfos.length > 1) {
|
|
||||||
String descFlag = extInfos[1];
|
|
||||||
if (descFlag.equals("nftv")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,540 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class Auete extends Spider {
|
|
||||||
private static final String siteUrl = "https://auete.com";
|
|
||||||
private static final String siteHost = "auete.com";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 播放源配置
|
|
||||||
*/
|
|
||||||
private JSONObject playerConfig;
|
|
||||||
/**
|
|
||||||
* 筛选配置
|
|
||||||
*/
|
|
||||||
private JSONObject filterConfig;
|
|
||||||
//分类页URL规则
|
|
||||||
private Pattern regexCategory = Pattern.compile("/(\\w+)/index.html");
|
|
||||||
//详情页URL规则
|
|
||||||
private Pattern regexVid = Pattern.compile("/(\\w+/\\w+/\\w+)/");
|
|
||||||
//播放页URL规则
|
|
||||||
private Pattern regexPlay = Pattern.compile("(/\\w+/\\w+/\\w+/play-\\d+-\\d+.html)");
|
|
||||||
//筛选页URL规则
|
|
||||||
//private Pattern regexPage = Pattern.compile("/\\w+/\\w+/index(\\d+).html");
|
|
||||||
private Pattern regexPage = Pattern.compile("/index(\\d+).html");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
playerConfig = new JSONObject("{\"byun\":{\"sh\":\"云播B线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dphd\":{\"sh\":\"云播A线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cyun\":{\"sh\":\"云播C线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dbm3u8\":{\"sh\":\"云播D线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"i8i\":{\"sh\":\"云播E线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"m3u8hd\":{\"sh\":\"云播F线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"languang\":{\"sh\":\"云播G线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"hyun\":{\"sh\":\"云播H线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"kyun\":{\"sh\":\"云播K线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"bpyueyu\":{\"sh\":\"云播粤语\",\"pu\":\"\",\"sn\":0,\"or\":999},\"bpguoyu\":{\"sh\":\"云播国语\",\"pu\":\"\",\"sn\":0,\"or\":999},\"lyun\":{\"sh\":\"云播L线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"myun\":{\"sh\":\"云播M线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dp\":{\"sh\":\"Dplayer\",\"pu\":\"\",\"sn\":0,\"or\":999}}");
|
|
||||||
filterConfig = new JSONObject("{\"Movie\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧片\",\"v\":\"xjp\"},{\"n\":\"动作片\",\"v\":\"dzp\"},{\"n\":\"爱情片\",\"v\":\"aqp\"},{\"n\":\"科幻片\",\"v\":\"khp\"},{\"n\":\"恐怖片\",\"v\":\"kbp\"},{\"n\":\"惊悚片\",\"v\":\"jsp\"},{\"n\":\"战争片\",\"v\":\"zzp\"},{\"n\":\"剧情片\",\"v\":\"jqp\"}]}],\"Tv\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"美剧\",\"v\":\"oumei\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"泰剧\",\"v\":\"yataiju\"},{\"n\":\"网剧\",\"v\":\"wangju\"},{\"n\":\"台剧\",\"v\":\"taiju\"},{\"n\":\"国产\",\"v\":\"neidi\"},{\"n\":\"港剧\",\"v\":\"tvbgj\"}]}],\"Zy\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国综\",\"v\":\"guozong\"},{\"n\":\"韩综\",\"v\":\"hanzong\"},{\"n\":\"美综\",\"v\":\"meizong\"}]}],\"Dm\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"日漫\",\"v\":\"riman\"},{\"n\":\"国漫\",\"v\":\"guoman\"},{\"n\":\"美漫\",\"v\":\"meiman\"}]}],\"qita\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"纪录片\",\"v\":\"Jlp\"},{\"n\":\"经典片\",\"v\":\"Jdp\"},{\"n\":\"经典剧\",\"v\":\"Jdj\"},{\"n\":\"网大电影\",\"v\":\"wlp\"},{\"n\":\"国产老电影\",\"v\":\"laodianying\"}]}]}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 爬虫headers
|
|
||||||
*
|
|
||||||
* @param url
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("method", "GET");
|
|
||||||
headers.put("Host", siteHost);
|
|
||||||
headers.put("Upgrade-Insecure-Requests", "1");
|
|
||||||
headers.put("DNT", "1");
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
|
|
||||||
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类数据 + 首页最近更新视频列表数据
|
|
||||||
*
|
|
||||||
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
|
||||||
// 分类节点
|
|
||||||
Elements elements = doc.select("ul[class='navbar-nav mr-auto']> li a");
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (Element ele : elements) {
|
|
||||||
//分类名
|
|
||||||
String name = ele.text();
|
|
||||||
boolean show = name.equals("电影") ||
|
|
||||||
name.equals("电视剧") ||
|
|
||||||
name.equals("综艺") ||
|
|
||||||
name.equals("动漫") ||
|
|
||||||
name.equals("其他");
|
|
||||||
if (show) {
|
|
||||||
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
|
||||||
if (!mather.find())
|
|
||||||
continue;
|
|
||||||
// 把分类的id和名称取出来加到列表里
|
|
||||||
String id = mather.group(1).trim();
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
try {
|
|
||||||
// 取首页推荐视频列表
|
|
||||||
Element homeList = doc.select("ul.threadlist").get(0);
|
|
||||||
Elements list = homeList.select("li");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.selectFirst("h2 a").attr("title");
|
|
||||||
String cover = vod.selectFirst("a img").attr("src");
|
|
||||||
String remark = vod.selectFirst("a button").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst("a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类信息数据
|
|
||||||
*
|
|
||||||
* @param tid 分类id
|
|
||||||
* @param pg 页数
|
|
||||||
* @param filter 同homeContent方法中的filter
|
|
||||||
* @param extend 筛选参数{k:v, k1:v1}
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
// 获取分类数据的url
|
|
||||||
String url = "";
|
|
||||||
try {
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value != null && value.length() != 0 && value != " ") {
|
|
||||||
url = siteUrl + "/" + tid + "/" + value;
|
|
||||||
} else {
|
|
||||||
url = siteUrl + "/" + tid;
|
|
||||||
}
|
|
||||||
;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
url = siteUrl + "/" + tid;
|
|
||||||
}
|
|
||||||
;
|
|
||||||
if (pg.equals("1")) {
|
|
||||||
url = url + "/index.html";
|
|
||||||
} else {
|
|
||||||
url = url + "/index" + pg + ".html";
|
|
||||||
}
|
|
||||||
//System.out.println(url);
|
|
||||||
String html = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
Document doc = Jsoup.parse(html);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int pageCount = 0;
|
|
||||||
int page = -1;
|
|
||||||
|
|
||||||
// 取页码相关信息
|
|
||||||
Elements pageInfo = doc.select("ul.pagination li");
|
|
||||||
if (pageInfo.size() == 0) {
|
|
||||||
page = Integer.parseInt(pg);
|
|
||||||
pageCount = page;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < pageInfo.size(); i++) {
|
|
||||||
Element li = pageInfo.get(i);
|
|
||||||
Element a = li.selectFirst("a");
|
|
||||||
if (a == null)
|
|
||||||
continue;
|
|
||||||
String name = a.text();
|
|
||||||
//System.out.println("名称"+name);
|
|
||||||
if (page == -1 && li.hasClass("active")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
//System.out.println("哈哈"+matcher.group(1));
|
|
||||||
page = Integer.parseInt(matcher.group(1));
|
|
||||||
} else {
|
|
||||||
Elements list = doc.select("ul.threadlist li");
|
|
||||||
if (list.size() > 0) {
|
|
||||||
page = 1;
|
|
||||||
} else {
|
|
||||||
page = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (name.equals("尾页")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
//System.out.println("尾页" + matcher.group(1));
|
|
||||||
pageCount = Integer.parseInt(matcher.group(1));
|
|
||||||
} else {
|
|
||||||
pageCount = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (!html.contains("没有找到您想要的结果哦")) {
|
|
||||||
// 取当前分类页的视频列表
|
|
||||||
Elements list = doc.select("ul.threadlist li");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.selectFirst("h2 a").attr("title");
|
|
||||||
String cover = vod.selectFirst("a img").attr("src");
|
|
||||||
String remark = vod.selectFirst("a button").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst("a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", 20);
|
|
||||||
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 20);
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频详情信息
|
|
||||||
*
|
|
||||||
* @param ids 视频id
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
// 视频详情url
|
|
||||||
String url = siteUrl + "/" + ids.get(0) + "/";
|
|
||||||
//System.out.println(url);
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vodList = new JSONObject();
|
|
||||||
|
|
||||||
// 取基本数据
|
|
||||||
String cover = doc.selectFirst("div.cover a").attr("href");
|
|
||||||
String title = doc.selectFirst("div.cover a").attr("title");
|
|
||||||
Elements list1 = doc.select("div.message>p");
|
|
||||||
String desc = doc.select("div.message>p").get(list1.size() - 1).text();
|
|
||||||
String category = "", area = "", year = "", remark = "", director = "", actor = "";
|
|
||||||
Elements span_text_muted = doc.select("div.message>p");
|
|
||||||
for (int i = 0; i < span_text_muted.size() - 2; i++) {
|
|
||||||
Element text = span_text_muted.get(i);
|
|
||||||
String info = text.text();
|
|
||||||
if (info.contains("分类")) {
|
|
||||||
try {
|
|
||||||
category = text.text().split(": ")[1];
|
|
||||||
} catch (Exception e) {
|
|
||||||
category = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("年份")) {
|
|
||||||
try {
|
|
||||||
year = text.text().split(": ")[1];
|
|
||||||
} catch (Exception e) {
|
|
||||||
year = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("地区")) {
|
|
||||||
try {
|
|
||||||
area = text.text().split(": ")[1];
|
|
||||||
} catch (Exception e) {
|
|
||||||
area = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("影片备注")) {
|
|
||||||
try {
|
|
||||||
remark = text.text().split(": ")[1];
|
|
||||||
} catch (Exception e) {
|
|
||||||
remark = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("导演")) {
|
|
||||||
try {
|
|
||||||
director = text.text().split(": ")[1];
|
|
||||||
} catch (Exception e) {
|
|
||||||
director = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("主演")) {
|
|
||||||
try {
|
|
||||||
actor = text.text().split(": ")[1];
|
|
||||||
} catch (Exception e) {
|
|
||||||
actor = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vodList.put("vod_id", ids.get(0));
|
|
||||||
vodList.put("vod_name", title);
|
|
||||||
vodList.put("vod_pic", cover);
|
|
||||||
vodList.put("type_name", category);
|
|
||||||
vodList.put("vod_year", year);
|
|
||||||
vodList.put("vod_area", area);
|
|
||||||
vodList.put("vod_remarks", remark);
|
|
||||||
vodList.put("vod_actor", actor);
|
|
||||||
vodList.put("vod_director", director);
|
|
||||||
vodList.put("vod_content", desc);
|
|
||||||
//System.out.println(vodList.toString());
|
|
||||||
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
|
||||||
@Override
|
|
||||||
public int compare(String o1, String o2) {
|
|
||||||
try {
|
|
||||||
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
|
||||||
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
|
||||||
|
|
||||||
if (sort1 == sort2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return sort1 - sort2 > 0 ? 1 : -1;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 取播放列表数据
|
|
||||||
Elements sources = doc.select("div#player_list>h2");
|
|
||||||
//System.out.println(sources.size());
|
|
||||||
Elements sourceList = doc.select("div#player_list>ul");
|
|
||||||
//System.out.println(sourceList.size());
|
|
||||||
for (int i = 0; i < sources.size(); i++) {
|
|
||||||
Element source = sources.get(i);
|
|
||||||
//System.out.println(sources.text().split(":")[0].split("』")[1]);
|
|
||||||
String sourceName = source.text().split("』")[1].split(":")[0];
|
|
||||||
boolean found = false;
|
|
||||||
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
|
||||||
String flag = it.next();
|
|
||||||
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
|
|
||||||
sourceName = flag;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
String playList = "";
|
|
||||||
Elements playListA = sourceList.get(i).select("li > a");
|
|
||||||
//System.out.println(playListA.size());
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String playURL = matcher.group(1);
|
|
||||||
vodItems.add(vod.text() + "$" + playURL);
|
|
||||||
}
|
|
||||||
if (vodItems.size() > 0)
|
|
||||||
playList = TextUtils.join("#", vodItems);
|
|
||||||
|
|
||||||
if (playList.length() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vod_play.put(sourceName, playList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vod_play.size() > 0) {
|
|
||||||
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
|
||||||
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
|
||||||
vodList.put("vod_play_from", vod_play_from);
|
|
||||||
vodList.put("vod_play_url", vod_play_url);
|
|
||||||
}
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vodList);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取视频播放信息
|
|
||||||
*
|
|
||||||
* @param flag 播放源
|
|
||||||
* @param id 视频id
|
|
||||||
* @param vipFlags 所有可能需要vip解析的源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
// 播放页 url
|
|
||||||
String url = siteUrl + id;
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
/*取得script下面的JS变量*/
|
|
||||||
Elements e = doc.select("div>script");
|
|
||||||
/*循环遍历script下面的JS变量*/
|
|
||||||
String player = "";
|
|
||||||
String pn = "";
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
for (Element element : e) {
|
|
||||||
/*取得JS变量数组*/
|
|
||||||
String[] data = element.data().toString().split("var");
|
|
||||||
/*取得单个JS变量*/
|
|
||||||
for (String variable : data) {
|
|
||||||
/*过滤variable为空的数据*/
|
|
||||||
if (variable.contains("=")) {
|
|
||||||
/*取到满足条件的JS变量*/
|
|
||||||
if (variable.contains("now")) {
|
|
||||||
String[] kvp = variable.split("=");
|
|
||||||
player = kvp[1].replaceAll("\"", "").replaceAll(";", "");
|
|
||||||
if (player.startsWith("base64")) {
|
|
||||||
String[] plist1 = player.split("\\(");
|
|
||||||
String[] plist2 = plist1[1].split("\\)");
|
|
||||||
// 解码
|
|
||||||
player = new String(Base64.decode(plist2[0].getBytes(), Base64.DEFAULT));
|
|
||||||
//byte[] base64Data = Base64.getDecoder().decode(plist2[0]);
|
|
||||||
//player = new String(base64Data, "utf-8");
|
|
||||||
}
|
|
||||||
if (player.startsWith("http")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", player);
|
|
||||||
result.put("header", "");
|
|
||||||
} else if (player.contains("m3u8")) {
|
|
||||||
String finalvideo = "https://datas-s8pwfqdu9yystn90fb----------------cache.haozhansou.com/" + player;
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", finalvideo);
|
|
||||||
result.put("header", "");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (variable.contains("pn")) {
|
|
||||||
String[] kvp = variable.split("=");
|
|
||||||
pn = kvp[1].replaceAll("\"", "").replaceAll(";", "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (playerConfig.has(pn)) {
|
|
||||||
JSONObject pCfg = playerConfig.getJSONObject(pn);
|
|
||||||
String videoUrl = player;
|
|
||||||
String playUrl = pCfg.getString("pu");
|
|
||||||
result.put("parse", pCfg.getInt("sn"));
|
|
||||||
result.put("playUrl", playUrl);
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
result.put("header", "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 搜索
|
|
||||||
*
|
|
||||||
* @param key
|
|
||||||
* @param quick 是否播放页的快捷搜索
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/search.php?searchword=" + key;
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
Elements list = doc.select("div.card-body>ul>li.media");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.select("div.media-body>div.subject>a>span").text();
|
|
||||||
String cover = "";
|
|
||||||
String remark = vod.selectFirst("div.media-body>div.d-flex>div.text-muted>span").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.select("div.media-body>div.subject>a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
|
|
||||||
// 视频封面
|
|
||||||
String vodurl = siteUrl + "/" + id + "/";
|
|
||||||
Document voddoc = Jsoup.parse(OkHttpUtil.string(vodurl, getHeaders(vodurl)));
|
|
||||||
cover = voddoc.selectFirst("div.cover a").attr("href");
|
|
||||||
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,273 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class Bili extends Spider {
|
|
||||||
|
|
||||||
protected JSONObject ext = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
try {
|
|
||||||
String content = OkHttpUtil.string(extend, null);
|
|
||||||
ext = new JSONObject(content);
|
|
||||||
} catch (JSONException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
JSONObject results = new JSONObject();
|
|
||||||
try {
|
|
||||||
results.put("class", ext.getJSONArray("classes"));
|
|
||||||
if (filter) {
|
|
||||||
results.put("filters", ext.getJSONObject("filter"));
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return results.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
try {
|
|
||||||
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=窗 白噪音";
|
|
||||||
String content = OkHttpUtil.string(url, null);
|
|
||||||
JSONObject data = new JSONObject(content).getJSONObject("data");
|
|
||||||
JSONArray RArray = data.getJSONArray("result");
|
|
||||||
for (int i = 0; i < RArray.length(); i++) {
|
|
||||||
JSONObject info = RArray.getJSONObject(i);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
String pic = info.getString("pic");
|
|
||||||
if (pic.startsWith("//")) {
|
|
||||||
pic = "https:" + pic;
|
|
||||||
}
|
|
||||||
result.put("vod_id", info.getString("bvid"));
|
|
||||||
String title = info.getString("title");
|
|
||||||
Document KS = Jsoup.parse(title);
|
|
||||||
String name = KS.text();
|
|
||||||
result.put("vod_name", name);
|
|
||||||
result.put("vod_pic", pic);
|
|
||||||
String duration = info.getString("duration");
|
|
||||||
String words = duration.split(":")[0];
|
|
||||||
String remark = words + "分钟";
|
|
||||||
result.put("vod_remarks", remark);
|
|
||||||
videos.put(result);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=";
|
|
||||||
if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
|
|
||||||
url += extend.get("tid");
|
|
||||||
} else {
|
|
||||||
url += tid;
|
|
||||||
}
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value.length() > 0) {
|
|
||||||
url += "&" + key + "=" + URLEncoder.encode(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
url += "&page=" + pg;
|
|
||||||
String content = OkHttpUtil.string(url, null);
|
|
||||||
JSONObject data = new JSONObject(content).getJSONObject("data");
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
JSONArray RSArray = data.getJSONArray("result");
|
|
||||||
for (int i = 0; i < RSArray.length(); i++) {
|
|
||||||
JSONObject info = RSArray.getJSONObject(i);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
String pic = info.getString("pic");
|
|
||||||
if (pic.startsWith("//")) {
|
|
||||||
pic = "https:" + pic;
|
|
||||||
}
|
|
||||||
result.put("vod_id", info.getString("bvid"));
|
|
||||||
String title = info.getString("title");
|
|
||||||
Document doc = Jsoup.parse(title);
|
|
||||||
String name = doc.text();
|
|
||||||
result.put("vod_name", name);
|
|
||||||
result.put("vod_pic", pic);
|
|
||||||
String duration = info.getString("duration");
|
|
||||||
String Split = duration.split(":")[0];
|
|
||||||
String remark = Split + "分钟";
|
|
||||||
result.put("vod_remarks", remark);
|
|
||||||
list.put(result);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int limit = 20;
|
|
||||||
int page = Integer.parseInt(pg);
|
|
||||||
result.put("page", page);
|
|
||||||
int pageCount = list.length() == limit ? page + 1 : page;
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", limit);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
int i = 0;
|
|
||||||
try {
|
|
||||||
String str = ids.get(0);
|
|
||||||
String sb2 = "https://api.bilibili.com/x/web-interface/archive/stat?bvid=" + str;
|
|
||||||
JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
|
|
||||||
JSONObject jSONObject2 = jSONObject.getJSONObject("data");
|
|
||||||
long j = jSONObject2.getLong("aid");
|
|
||||||
String sb4 = j + "";
|
|
||||||
String sb6 = "https://api.bilibili.com/x/web-interface/view?aid=" + sb4;
|
|
||||||
JSONObject jSONObject3 = new JSONObject(OkHttpUtil.string(sb6, null));
|
|
||||||
JSONObject jSONObject4 = jSONObject3.getJSONObject("data");
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", str);
|
|
||||||
String string = jSONObject4.getString("title");
|
|
||||||
v.put("vod_name", string);
|
|
||||||
String string2 = jSONObject4.getString("pic");
|
|
||||||
v.put("vod_pic", string2);
|
|
||||||
String string3 = jSONObject4.getString("tname");
|
|
||||||
v.put("type_name", string3);
|
|
||||||
v.put("vod_year", "");
|
|
||||||
v.put("vod_area", "");
|
|
||||||
String sb7 = jSONObject4.getLong("duration") / 60 + "分钟";
|
|
||||||
v.put("vod_remarks", sb7);
|
|
||||||
v.put("vod_actor", "");
|
|
||||||
v.put("vod_director", "");
|
|
||||||
String string4 = jSONObject4.getString("desc");
|
|
||||||
v.put("vod_content", string4);
|
|
||||||
v.put("vod_play_from", "B站");
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
JSONArray jSONArray = jSONObject4.getJSONArray("pages");
|
|
||||||
while (true) {
|
|
||||||
int length = jSONArray.length();
|
|
||||||
if (i < length) {
|
|
||||||
JSONObject jSONObject6 = jSONArray.getJSONObject(i);
|
|
||||||
String string5 = jSONObject6.getString("part");
|
|
||||||
String replace = string5.replace("$", "_").replace("#", "_");
|
|
||||||
StringBuilder sb8 = new StringBuilder();
|
|
||||||
sb8.append(replace);
|
|
||||||
sb8.append("$");
|
|
||||||
sb8.append(sb4);
|
|
||||||
sb8.append("+ ");
|
|
||||||
long j2 = jSONObject6.getLong("cid");
|
|
||||||
sb8.append(j2);
|
|
||||||
String sb9 = sb8.toString();
|
|
||||||
arrayList.add(sb9);
|
|
||||||
i++;
|
|
||||||
} else {
|
|
||||||
v.put("vod_play_url", TextUtils.join("#", arrayList));
|
|
||||||
JSONArray jSONArray2 = new JSONArray();
|
|
||||||
jSONArray2.put(v);
|
|
||||||
JSONObject jSONObject7 = new JSONObject();
|
|
||||||
jSONObject7.put("list", jSONArray2);
|
|
||||||
return jSONObject7.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String str, String str2, List<String> list) {
|
|
||||||
try {
|
|
||||||
String[] split = str2.split("\\+");
|
|
||||||
String str3 = split[0];
|
|
||||||
String str4 = split[1];
|
|
||||||
String sb2 = "https://api.bilibili.com/x/player/playurl?avid=" + str3 + "&cid= " + str4 + "&qn=120&fourk=1";
|
|
||||||
JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("parse", "0");
|
|
||||||
jSONObject2.put("playUrl", "");
|
|
||||||
JSONObject jSONObject3 = jSONObject.getJSONObject("data");
|
|
||||||
JSONObject jSONObject4 = jSONObject3.getJSONArray("durl").getJSONObject(0);
|
|
||||||
String string = jSONObject4.getString("url");
|
|
||||||
jSONObject2.put("url", string);
|
|
||||||
jSONObject2.put("header", "{\"Referer\":\"https://www.bilibili.com\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36\"}");
|
|
||||||
jSONObject2.put("contentType", "video/x-flv");
|
|
||||||
return jSONObject2.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(key);
|
|
||||||
String content = OkHttpUtil.string(url, null);
|
|
||||||
JSONObject data = new JSONObject(content).getJSONObject("data");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
JSONArray RSArray = data.getJSONArray("result");
|
|
||||||
for (int i = 0; i < RSArray.length(); i++) {
|
|
||||||
JSONObject info = RSArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
String pic = info.getString("pic");
|
|
||||||
if (pic.startsWith("//")) {
|
|
||||||
pic = "https:" + pic;
|
|
||||||
}
|
|
||||||
v.put("vod_id", info.getString("bvid"));
|
|
||||||
String title = info.getString("title");
|
|
||||||
Document doc = Jsoup.parse(title);
|
|
||||||
String name = doc.text();
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
String duration = info.getString("duration");
|
|
||||||
String Split = duration.split(":")[0];
|
|
||||||
String remark = Split + "分钟";
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -429,7 +429,7 @@ public class Cokemv extends Spider {
|
|||||||
@Override
|
@Override
|
||||||
public String searchContent(String key, boolean quick) {
|
public String searchContent(String key, boolean quick) {
|
||||||
try {
|
try {
|
||||||
String url = "https://shitu.paodekuaiweixinqun.com/search?q=site%3Acokemv.me%2Fvoddetail+" + URLEncoder.encode(key);
|
String url = "https://www.sogou.com/web?query=site%3Acokemv.me%2Fvoddetail+" + URLEncoder.encode(key);
|
||||||
Document docs = Jsoup.parse(OkHttpUtil.string(url, sHeaders()));
|
Document docs = Jsoup.parse(OkHttpUtil.string(url, sHeaders()));
|
||||||
JSONObject result = new JSONObject();
|
JSONObject result = new JSONObject();
|
||||||
JSONArray videos = new JSONArray();
|
JSONArray videos = new JSONArray();
|
||||||
|
|||||||
@@ -1,435 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.AES;
|
|
||||||
import com.github.catvod.utils.CBC;
|
|
||||||
import com.github.catvod.utils.gZip;
|
|
||||||
import com.github.catvod.utils.okhttp.OKCallBack;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.StringReader;
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.security.MessageDigest;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import javax.crypto.Cipher;
|
|
||||||
import javax.crypto.spec.IvParameterSpec;
|
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
|
||||||
import okhttp3.Call;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import okhttp3.Response;
|
|
||||||
import okhttp3.ResponseBody;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
public class Czsapp extends Spider {
|
|
||||||
private static final Pattern Y = Pattern.compile("\"([^\"]+)\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\"([\\d\\w]+)\".*md5.enc.Utf8.parse\\(([\\d]+)\\)");
|
|
||||||
private static final Pattern pY = Pattern.compile("video: \\{url: \"([^\"]+)\"");
|
|
||||||
private static final Pattern m = Pattern.compile("subtitle: \\{url:\"([^\"]+\\.vtt)\"");
|
|
||||||
private static final Pattern Q = Pattern.compile("src: '([^']+\\.css)',");
|
|
||||||
private static final Pattern Db = Pattern.compile("/movie/(\\d+).html");
|
|
||||||
private static final Pattern I = Pattern.compile("/page/(\\d+)");
|
|
||||||
private static final Pattern d = Pattern.compile("/v_play/(.*)\\.html");
|
|
||||||
private static final Pattern K = Pattern.compile("var vkey = ['\"]([^'\"]+)['\"]");
|
|
||||||
private static final Pattern Oe = Pattern.compile("var fvkey = ['\"]([^'\"]+)['\"]");
|
|
||||||
private static final Pattern fi = Pattern.compile("var ua = ['\"]([^'\"]+)['\"]");
|
|
||||||
private static final Pattern M = Pattern.compile("var cip = ['\"]([^'\"]+)['\"]");
|
|
||||||
private static final Pattern X = Pattern.compile("var time = ['\"]([^'\"]+)['\"]");
|
|
||||||
private static final Pattern a = Pattern.compile("var url = ['\"]([^'\"]+)['\"]");
|
|
||||||
|
|
||||||
|
|
||||||
private String mmd5(String str) {
|
|
||||||
try {
|
|
||||||
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
|
|
||||||
messageDigest.update(str.getBytes());
|
|
||||||
byte[] digest = messageDigest.digest();
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (byte b : digest) {
|
|
||||||
String hexString = Integer.toHexString(b & 255);
|
|
||||||
while (hexString.length() < 2) {
|
|
||||||
hexString = "0" + hexString;
|
|
||||||
}
|
|
||||||
sb.append(hexString);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Object[] loadsub(String sub) {
|
|
||||||
try {
|
|
||||||
OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
|
|
||||||
@Override
|
|
||||||
protected void onFailure(Call call, Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResponse(Response response) {
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
OkHttpClient YM = OkHttpUtil.defaultClient();
|
|
||||||
OkHttpUtil.get(YM, sub, null, Headers(), callBack);
|
|
||||||
Response result = callBack.getResult();
|
|
||||||
int code = result.code();
|
|
||||||
if (code == 404) {
|
|
||||||
return new Object[]{200, "application/octet-stream", new ByteArrayInputStream("WEBVTT".getBytes())};
|
|
||||||
}
|
|
||||||
ResponseBody body = result.body();
|
|
||||||
byte[] bytes = body.bytes();
|
|
||||||
byte[] tokenkey = Arrays.copyOfRange(bytes, 0, 16);
|
|
||||||
byte[] data = Arrays.copyOfRange(bytes, 16, bytes.length);
|
|
||||||
byte[] KS = CBC.CBC(data, tokenkey, tokenkey);
|
|
||||||
String vtt = gZip.KS(KS);
|
|
||||||
|
|
||||||
|
|
||||||
vtt = vtt.replaceAll("(\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}).*", "$1");
|
|
||||||
vtt = vtt.replaceAll("(\\d{2}:\\d{2}.\\d{3}).*?( --> )(\\d{2}:\\d{2}.\\d{3}).*", "00:$1$200:$3");
|
|
||||||
vtt = vtt.replaceAll("<.*><.*>(.*)<.*><.*>", "$1");
|
|
||||||
vtt = vtt.replaceAll("&(.*);", "");
|
|
||||||
vtt = vtt.replaceAll(".*NOTE.*", "");
|
|
||||||
BufferedReader br = new BufferedReader(new StringReader(vtt));
|
|
||||||
ArrayList<String> lines = new ArrayList<>();
|
|
||||||
int captionNumber = 1;
|
|
||||||
String line = br.readLine();
|
|
||||||
while (line != null) {
|
|
||||||
if (line.matches("\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}")) {
|
|
||||||
if (lines.get(lines.size() - 1).trim().isEmpty()) {
|
|
||||||
lines.add(captionNumber + "");
|
|
||||||
captionNumber++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lines.add(line);
|
|
||||||
line = br.readLine();
|
|
||||||
}
|
|
||||||
String join = TextUtils.join("\n", lines);
|
|
||||||
|
|
||||||
return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(join.getBytes())};
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String categoryContent(String str, String str2, boolean z, HashMap<String, String> hashMap) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com/" + str + "/page/" + str2, Headers()));
|
|
||||||
int parseInt = Integer.parseInt(str2);
|
|
||||||
int parseInt2 = Integer.parseInt(str2);
|
|
||||||
Matcher matcher = I.matcher(doc.select("div.pagenavi_txt > a.extend").last().attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
parseInt2 = Integer.parseInt(matcher.group(1));
|
|
||||||
}
|
|
||||||
Elements jS = doc.select("div.mi_ne_kd > ul > li");
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
for (Element next : jS) {
|
|
||||||
Matcher matcher2 = Db.matcher(next.select("a").attr("href"));
|
|
||||||
if (matcher2.find()) {
|
|
||||||
String group = matcher2.group(1);
|
|
||||||
String trim = next.select("img").attr("alt").trim();
|
|
||||||
String trim2 = next.select("img").attr("data-original").trim();
|
|
||||||
String trim3 = next.select("div.hdinfo > span").text().trim();
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("vod_id", group);
|
|
||||||
jSONObject2.put("vod_name", trim);
|
|
||||||
jSONObject2.put("vod_pic", trim2);
|
|
||||||
jSONObject2.put("vod_remarks", trim3);
|
|
||||||
jSONArray.put(jSONObject2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jSONObject.put("list", jSONArray);
|
|
||||||
jSONObject.put("page", parseInt);
|
|
||||||
jSONObject.put("pagecount", parseInt2);
|
|
||||||
jSONObject.put("limit", 24);
|
|
||||||
jSONObject.put("total", parseInt2 <= 1 ? jSONArray.length() : parseInt2 * 24);
|
|
||||||
return jSONObject.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String detailContent(List<String> list) {
|
|
||||||
String str2 = "";
|
|
||||||
try {
|
|
||||||
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com/movie/" + list.get(0) + ".html", Headers()));
|
|
||||||
String trim = doc.select("div.moviedteail_tt > h1").text().trim();
|
|
||||||
String pY2 = doc.select("div.dyimg > img").attr("src");
|
|
||||||
Iterator<Element> it = doc.select("ul.moviedteail_list > li").iterator();
|
|
||||||
String str3 = str2;
|
|
||||||
String str4 = str3;
|
|
||||||
String str5 = str4;
|
|
||||||
String str6 = str5;
|
|
||||||
String str7 = str6;
|
|
||||||
String str8 = str7;
|
|
||||||
while (it.hasNext()) {
|
|
||||||
String trim2 = it.next().text().trim();
|
|
||||||
if (trim2.length() >= 4) {
|
|
||||||
try {
|
|
||||||
String substring = trim2.substring(0, 2);
|
|
||||||
String substring2 = trim2.substring(3);
|
|
||||||
if (substring.equals("类型")) {
|
|
||||||
str3 = substring2;
|
|
||||||
} else if (substring.equals("地区")) {
|
|
||||||
str5 = substring2;
|
|
||||||
} else if (substring.equals("年份")) {
|
|
||||||
str4 = substring2;
|
|
||||||
} else if (substring.equals("导演")) {
|
|
||||||
str8 = substring2;
|
|
||||||
} else if (substring.equals("主演")) {
|
|
||||||
str7 = substring2;
|
|
||||||
} else if (substring.equals("豆瓣")) {
|
|
||||||
str6 = substring2;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jSONObject2.put("vod_id", list.get(0));
|
|
||||||
jSONObject2.put("vod_name", trim);
|
|
||||||
jSONObject2.put("vod_pic", pY2);
|
|
||||||
jSONObject2.put("type_name", str3);
|
|
||||||
jSONObject2.put("vod_year", str4);
|
|
||||||
jSONObject2.put("vod_area", str5);
|
|
||||||
jSONObject2.put("vod_remarks", str6);
|
|
||||||
jSONObject2.put("vod_actor", str7);
|
|
||||||
jSONObject2.put("vod_director", str8);
|
|
||||||
jSONObject2.put("vod_content", doc.select("div.yp_context").text().trim());
|
|
||||||
jSONObject2.put("vod_play_from", "厂长资源");
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
for (Element next : doc.select("div.paly_list_btn > a")) {
|
|
||||||
Matcher matcher = d.matcher(next.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
arrayList.add(next.text() + "$" + matcher.group(1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jSONObject2.put("vod_play_url", TextUtils.join("#", arrayList));
|
|
||||||
jSONArray.put(jSONObject2);
|
|
||||||
jSONObject.put("list", jSONArray);
|
|
||||||
return jSONObject.toString();
|
|
||||||
} catch (Exception e3) {
|
|
||||||
}return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public String homeContent(boolean z) {
|
|
||||||
try {
|
|
||||||
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string("https://czspp.com", Headers()));
|
|
||||||
Elements jS = doc.select(".navlist > li > a");
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
for (Element next : jS) {
|
|
||||||
String pY2 = next.attr("href");
|
|
||||||
if (pY2.length() > 1) {
|
|
||||||
String substring = pY2.substring(1);
|
|
||||||
String trim = next.text().trim();
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("type_id", substring);
|
|
||||||
jSONObject2.put("type_name", trim);
|
|
||||||
jSONArray.put(jSONObject2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jSONObject.put("class", jSONArray);
|
|
||||||
Elements jS2 = doc.select("div.mi_ne_kd > ul > li");
|
|
||||||
JSONArray jSONArray2 = new JSONArray();
|
|
||||||
for (Element next2 : jS2) {
|
|
||||||
Matcher matcher = Db.matcher(next2.select("a").attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
String group = matcher.group(1);
|
|
||||||
String trim2 = next2.select("img").attr("alt").trim();
|
|
||||||
String trim3 = next2.select("img").attr("data-original").trim();
|
|
||||||
String trim4 = next2.select("div.hdinfo > span").text().trim();
|
|
||||||
JSONObject jSONObject3 = new JSONObject();
|
|
||||||
jSONObject3.put("vod_id", group);
|
|
||||||
jSONObject3.put("vod_name", trim2);
|
|
||||||
jSONObject3.put("vod_pic", trim3);
|
|
||||||
jSONObject3.put("vod_remarks", trim4);
|
|
||||||
jSONArray2.put(jSONObject3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jSONObject.put("list", jSONArray2);
|
|
||||||
return jSONObject.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static HashMap<String, String> Headers() {
|
|
||||||
HashMap<String, String> hashMap = new HashMap<>();
|
|
||||||
hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36");
|
|
||||||
return hashMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String playerContent(String str, String str2, List<String> list) {
|
|
||||||
String str3;
|
|
||||||
String str4;
|
|
||||||
Elements G8;
|
|
||||||
try {
|
|
||||||
String K2 = OkHttpUtil.string("https://czspp.com/v_play/" + str2 + ".html", Headers());
|
|
||||||
Document UR = Jsoup.parse(K2);
|
|
||||||
Matcher matcher = Y.matcher(K2);
|
|
||||||
if (matcher.find()) {
|
|
||||||
String group = matcher.group(1);
|
|
||||||
String KEY = matcher.group(2);
|
|
||||||
String IV = matcher.group(3);
|
|
||||||
String str5 = AES.CBC(group, KEY, IV);
|
|
||||||
Matcher matcher2 = pY.matcher(str5);
|
|
||||||
str3 = matcher2.find() ? matcher2.group(1) : "";
|
|
||||||
Matcher matcher3 = m.matcher(str5);
|
|
||||||
str4 = matcher3.find() ? matcher3.group(1) : "";
|
|
||||||
} else {
|
|
||||||
str4 = "";
|
|
||||||
str3 = str4;
|
|
||||||
}
|
|
||||||
if (TextUtils.isEmpty(str3) && (G8 = UR.select("iframe.viframe")) != null) {
|
|
||||||
String pY2 = G8.attr("src");
|
|
||||||
if (pY2.contains("jx.xmflv.com")) {
|
|
||||||
String K3 = OkHttpUtil.string(pY2, Headers());
|
|
||||||
Matcher matcher4 = X.matcher(K3);
|
|
||||||
if (!matcher4.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String group2 = matcher4.group(1);
|
|
||||||
Matcher matcher5 = a.matcher(K3);
|
|
||||||
if (!matcher5.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String group3 = matcher5.group(1);
|
|
||||||
String K4 = OkHttpUtil.string("https://jx.xmflv.com/player.php?time=" + group2 + "&url=" + group3, Headers());
|
|
||||||
Matcher matcher6 = K.matcher(K4);
|
|
||||||
if (!matcher6.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String group4 = matcher6.group(1);
|
|
||||||
Matcher matcher7 = Oe.matcher(K4);
|
|
||||||
if (!matcher7.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String group5 = matcher7.group(1);
|
|
||||||
Matcher matcher8 = fi.matcher(K4);
|
|
||||||
if (!matcher8.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String group6 = matcher8.group(1);
|
|
||||||
Matcher matcher9 = M.matcher(K4);
|
|
||||||
if (!matcher9.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String group7 = matcher9.group(1);
|
|
||||||
Matcher matcher10 = X.matcher(K4);
|
|
||||||
if (!matcher10.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String group8 = matcher10.group(1);
|
|
||||||
byte[] bytes3 = mmd5(group5).getBytes();
|
|
||||||
byte[] bytes4 = "UVE1NTY4MDY2NQ==".getBytes();
|
|
||||||
Cipher cipher2 = Cipher.getInstance("AES/CBC/NoPadding");
|
|
||||||
cipher2.init(1, new SecretKeySpec(bytes3, "AES"), new IvParameterSpec(bytes4));
|
|
||||||
String encodeToString = Base64.encodeToString(cipher2.doFinal(group5.getBytes()), 0);
|
|
||||||
OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
|
|
||||||
|
|
||||||
public void onResponse(Response response) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
hashMap.put("url", group3);
|
|
||||||
hashMap.put("time", group8);
|
|
||||||
hashMap.put("ua", group6);
|
|
||||||
hashMap.put("cip", group7);
|
|
||||||
hashMap.put("vkey", group4);
|
|
||||||
hashMap.put("fvkey", encodeToString);
|
|
||||||
OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://jx.xmflv.com/xmflv-1.SVG", hashMap, Headers(), callBack);
|
|
||||||
str3 = new JSONObject(callBack.getResult().body().string()).getString("url");
|
|
||||||
} else {
|
|
||||||
Matcher matcher11 = Q.matcher(OkHttpUtil.string(pY2, Headers()));
|
|
||||||
if (matcher11.find()) {
|
|
||||||
str3 = matcher11.group(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
jSONObject.put("parse", "0");
|
|
||||||
jSONObject.put("playUrl", "");
|
|
||||||
jSONObject.put("url", str3);
|
|
||||||
jSONObject.put("header", "");
|
|
||||||
if (!TextUtils.isEmpty(str4)) {
|
|
||||||
jSONObject.put("subf", "/vtt/utf-8");
|
|
||||||
jSONObject.put("subt", Proxy.localProxyUrl() + "?do=czspp&url=" + URLEncoder.encode(str4));
|
|
||||||
}
|
|
||||||
return jSONObject.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String searchContent(String str, boolean z) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
Elements jS = Jsoup.parse(OkHttpUtil.string("https://czspp.com/xssearch?q=" + URLEncoder.encode(str), Headers())).select("div.mi_ne_kd > ul > li");
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
for (Element next : jS) {
|
|
||||||
Matcher matcher = Db.matcher(next.select("a").attr("href"));
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
if (matcher.find()) {
|
|
||||||
String group = matcher.group(1);
|
|
||||||
String trim = next.select("img").attr("alt").trim();
|
|
||||||
if (trim.contains(str)) {
|
|
||||||
String trim2 = next.select("img").attr("src").trim();
|
|
||||||
if (next.hasClass(".jidi")) {
|
|
||||||
String remark = next.select(".jidi span").text();
|
|
||||||
jSONObject2.put("vod_remarks", remark);
|
|
||||||
} else {
|
|
||||||
String id = next.select("a").attr("href");
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(id, Headers()));
|
|
||||||
String remark = doc.select("ul.moviedteail_list li span").get(0).text();
|
|
||||||
jSONObject2.put("vod_id", group);
|
|
||||||
jSONObject2.put("vod_name", trim);
|
|
||||||
jSONObject2.put("vod_pic", trim2);
|
|
||||||
jSONObject2.put("vod_remarks", remark);
|
|
||||||
jSONArray.put(jSONObject2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jSONObject.put("list", jSONArray);
|
|
||||||
return jSONObject.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,309 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.util.TimeUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
public class Gitcafe extends Spider {
|
|
||||||
private Map<String, JSONObject> a;
|
|
||||||
private List<String> b;
|
|
||||||
private PushAgent pushAgent;
|
|
||||||
private JSONObject d;
|
|
||||||
private JSONObject Home;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
pushAgent = new PushAgent();
|
|
||||||
pushAgent.init(context, extend);
|
|
||||||
try {
|
|
||||||
d = new JSONObject("{\"hyds\":\"华语电视\",\"rhds\":\"日韩电视\",\"omds\":\"欧美电视\",\"qtds\":\"其他电视\",\"hydy\":\"华语电影\",\"rhdy\":\"日韩电影\",\"omdy\":\"欧美电影\",\"qtdy\":\"其他电影\",\"hydm\":\"华语动漫\",\"rhdm\":\"日韩动漫\",\"omdm\":\"欧美动漫\",\"jlp\":\"纪录片\",\"zyp\":\"综艺片\",\"jypx\":\"教育培训\",\"qtsp\":\"其他视频\",\"hyyy\":\"华语音乐\",\"rhyy\":\"日韩音乐\",\"omyy\":\"欧美音乐\",\"qtyy\":\"其他音乐\",\"kfrj\":\"娱乐软件\",\"xtrj\":\"系统软件\",\"wlrj\":\"网络软件\",\"bgrj\":\"办公软件\",\"qtrj\":\"其他软件\",\"mh\":\"漫画\",\"xs\":\"小说\",\"cbs\":\"出版书\",\"zspx\":\"知识培训\",\"qtwd\":\"其他文档\",\"bz\":\"壁纸\",\"rw\":\"人物\",\"fj\":\"风景\",\"qttp\":\"其他图片\",\"qt\":\"其他\"}");
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
this.b = arrayList;
|
|
||||||
arrayList.add("hydm");
|
|
||||||
List<String> list = this.b;
|
|
||||||
list.add("hyds");
|
|
||||||
List<String> list2 = this.b;
|
|
||||||
list2.add("hydy");
|
|
||||||
List<String> list3 = this.b;
|
|
||||||
list3.add("omdm");
|
|
||||||
List<String> list4 = this.b;
|
|
||||||
list4.add("omds");
|
|
||||||
List<String> list5 = this.b;
|
|
||||||
list5.add("omdy");
|
|
||||||
List<String> list6 = this.b;
|
|
||||||
list6.add("rhdm");
|
|
||||||
List<String> list7 = this.b;
|
|
||||||
list7.add("rhds");
|
|
||||||
List<String> list8 = this.b;
|
|
||||||
list8.add("rhdy");
|
|
||||||
List<String> list9 = this.b;
|
|
||||||
list9.add("qtds");
|
|
||||||
List<String> list10 = this.b;
|
|
||||||
list10.add("qtdy");
|
|
||||||
List<String> list11 = this.b;
|
|
||||||
list11.add("qtsp");
|
|
||||||
List<String> list12 = this.b;
|
|
||||||
list12.add("jlp");
|
|
||||||
List<String> list13 = this.b;
|
|
||||||
list13.add("zyp");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected HashMap<String, String> LT() {
|
|
||||||
HashMap<String, String> hashMap = new HashMap<>();
|
|
||||||
hashMap.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
|
|
||||||
return hashMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String str, String str2, boolean z, HashMap<String, String> hashMap) {
|
|
||||||
try {
|
|
||||||
Map allData = getAllData(this, this, this);
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
Set<String> keySet = allData.keySet();
|
|
||||||
for (String str3 : keySet) {
|
|
||||||
JSONObject jSONObject = (JSONObject) allData.get(str3);
|
|
||||||
if (jSONObject.has("cat")) {
|
|
||||||
String string = jSONObject.getString("cat");
|
|
||||||
if (string.equals(str)) {
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
String sb2 = "https://www.aliyundrive.com/s/" + jSONObject.getString("key");
|
|
||||||
jSONObject2.put("vod_id", sb2);
|
|
||||||
String string2 = jSONObject.getString("title");
|
|
||||||
jSONObject2.put("vod_name", string2);
|
|
||||||
jSONObject2.put("vod_pic", "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg");
|
|
||||||
jSONArray.put(jSONObject2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject jSONObject3 = new JSONObject();
|
|
||||||
jSONObject3.put("page", 1);
|
|
||||||
jSONObject3.put("pagecount", 1);
|
|
||||||
int length = jSONArray.length();
|
|
||||||
jSONObject3.put("limit", length);
|
|
||||||
TimeUtils.getTimeZoneDatabaseVersion();
|
|
||||||
int length2 = jSONArray.length();
|
|
||||||
jSONObject3.put("total", length2);
|
|
||||||
jSONObject3.put("list", jSONArray);
|
|
||||||
return jSONObject3.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> list) {
|
|
||||||
try {
|
|
||||||
Map allData = getAllData(this, this, this);
|
|
||||||
JSONObject jSONObject = new JSONObject(pushAgent.detailContent(list));
|
|
||||||
JSONArray jSONArray = jSONObject.getJSONArray("list");
|
|
||||||
int i = 0;
|
|
||||||
while (true) {
|
|
||||||
if (i >= list.size()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (i >= jSONArray.length()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
JSONObject jSONObject2 = jSONArray.getJSONObject(i);
|
|
||||||
Pattern pattern = PushAgent.Folder;
|
|
||||||
Matcher matcher = pattern.matcher(list.get(i));
|
|
||||||
if (matcher.find()) {
|
|
||||||
String group = matcher.group(1);
|
|
||||||
if (allData.containsKey(group)) {
|
|
||||||
JSONObject jSONObject3 = (JSONObject) allData.get(group);
|
|
||||||
jSONObject2.put("vod_pic", "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return jSONObject.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized Map getAllData(Object obj, Object obj2, Object obj3) {
|
|
||||||
Map<String, JSONObject> map;
|
|
||||||
obj.getClass();
|
|
||||||
obj2.getClass();
|
|
||||||
obj3.getClass();
|
|
||||||
synchronized (this) {
|
|
||||||
try {
|
|
||||||
if (a == null) {
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
HashMap<String, String> LT = LT();
|
|
||||||
for (Iterator<String> iter = b.iterator(); iter.hasNext(); ) {
|
|
||||||
String element = iter.next();
|
|
||||||
String content = OkHttpUtil.string("https://gitcafe.net/alipaper/data/" + element + ".json", LT);
|
|
||||||
JSONObject data = new JSONObject(content);
|
|
||||||
JSONArray jSONArray = data.getJSONArray("data");
|
|
||||||
for (int i = 0; i < jSONArray.length(); i++) {
|
|
||||||
JSONObject jSONObject = jSONArray.getJSONObject(i);
|
|
||||||
hashMap.put(jSONObject.getString("key"), jSONObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
a = hashMap;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
map = a;
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JSONObject getHomeData(Object obj) {
|
|
||||||
obj.getClass();
|
|
||||||
try {
|
|
||||||
if (Home == null) {
|
|
||||||
HashMap<String, String> LT = LT();
|
|
||||||
Home = new JSONObject(OkHttpUtil.string("https://gitcafe.net/alipaper/home.json", LT));
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return Home;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean z) {
|
|
||||||
String str = "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg";
|
|
||||||
|
|
||||||
try {
|
|
||||||
JSONObject homeData = getHomeData(this);
|
|
||||||
JSONObject jSONObject = homeData.getJSONObject("info");
|
|
||||||
JSONArray jSONArray = jSONObject.getJSONArray("new");
|
|
||||||
JSONArray jSONArray2 = new JSONArray();
|
|
||||||
List<String> list = b;
|
|
||||||
Iterator<String> it = list.iterator();
|
|
||||||
while (true) {
|
|
||||||
if (!it.hasNext()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
String next = it.next();
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("type_id", next);
|
|
||||||
JSONObject jSONObject3 = d;
|
|
||||||
String string = jSONObject3.getString(next);
|
|
||||||
jSONObject2.put("type_name", string);
|
|
||||||
jSONArray2.put(jSONObject2);
|
|
||||||
}
|
|
||||||
Map allData = getAllData(this, this, this);
|
|
||||||
JSONArray jSONArray3 = new JSONArray();
|
|
||||||
for (int i = 0; i < jSONArray.length(); i++) {
|
|
||||||
JSONObject jSONObject4 = jSONArray.getJSONObject(i);
|
|
||||||
String string2 = jSONObject4.getString("cat");
|
|
||||||
List<String> list2 = b;
|
|
||||||
if (list2.contains(string2)) {
|
|
||||||
String string3 = jSONObject4.getString("key");
|
|
||||||
if (allData.containsKey(string3)) {
|
|
||||||
JSONObject jSONObject5 = (JSONObject) allData.get(string3);
|
|
||||||
JSONObject jSONObject6 = new JSONObject();
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append("https://www.aliyundrive.com/s/");
|
|
||||||
String string4 = jSONObject4.getString("key");
|
|
||||||
sb.append(string4);
|
|
||||||
String sb2 = sb.toString();
|
|
||||||
jSONObject6.put("vod_id", sb2);
|
|
||||||
String string5 = jSONObject4.getString("title");
|
|
||||||
jSONObject6.put("vod_name", string5);
|
|
||||||
jSONObject6.put("vod_pic", str);
|
|
||||||
String string6 = jSONObject4.getString("date");
|
|
||||||
jSONObject6.put("vod_remarks", string6);
|
|
||||||
jSONArray3.put(jSONObject6);
|
|
||||||
|
|
||||||
}
|
|
||||||
JSONObject jSONObject62 = new JSONObject();
|
|
||||||
StringBuilder sb3 = new StringBuilder();
|
|
||||||
sb3.append("https://www.aliyundrive.com/s/");
|
|
||||||
String string42 = jSONObject4.getString("key");
|
|
||||||
sb3.append(string42);
|
|
||||||
String sb22 = sb3.toString();
|
|
||||||
jSONObject62.put("vod_id", sb22);
|
|
||||||
String string52 = jSONObject4.getString("title");
|
|
||||||
jSONObject62.put("vod_name", string52);
|
|
||||||
jSONObject62.put("vod_pic", str);
|
|
||||||
String string62 = jSONObject4.getString("date");
|
|
||||||
jSONObject62.put("vod_remarks", string62);
|
|
||||||
jSONArray3.put(jSONObject62);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject jSONObject7 = new JSONObject();
|
|
||||||
jSONObject7.put("class", jSONArray2);
|
|
||||||
jSONObject7.put("list", jSONArray3);
|
|
||||||
return jSONObject7.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String str, String str2, List<String> list) {
|
|
||||||
return pushAgent.playerContent(str, str2, list);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String str, boolean z) {
|
|
||||||
try {
|
|
||||||
Map allData = getAllData(this, this, this);
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
Set keySet = allData.keySet();
|
|
||||||
Iterator it = keySet.iterator();
|
|
||||||
while (true) {
|
|
||||||
if (it.hasNext()) {
|
|
||||||
Object next = it.next();
|
|
||||||
JSONObject jSONObject = (JSONObject) allData.get(next);
|
|
||||||
if (jSONObject.has("cat")) {
|
|
||||||
String string = jSONObject.getString("cat");
|
|
||||||
List<String> list = b;
|
|
||||||
if (list.contains(string)) {
|
|
||||||
String string2 = jSONObject.getString("title");
|
|
||||||
if (string2.contains(str)) {
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append("https://www.aliyundrive.com/s/");
|
|
||||||
String string3 = jSONObject.getString("key");
|
|
||||||
sb.append(string3);
|
|
||||||
String sb2 = sb.toString();
|
|
||||||
jSONObject2.put("vod_id", sb2);
|
|
||||||
jSONObject2.put("vod_name", string2);
|
|
||||||
jSONArray.put(jSONObject2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
JSONObject jSONObject3 = new JSONObject();
|
|
||||||
jSONObject3.put("list", jSONArray);
|
|
||||||
return jSONObject3.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,234 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OKCallBack;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Random;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import okhttp3.Call;
|
|
||||||
import okhttp3.Cookie;
|
|
||||||
import okhttp3.CookieJar;
|
|
||||||
import okhttp3.HttpUrl;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
|
|
||||||
public class IKan extends AppYsV2 {
|
|
||||||
private final OkHttpClient y;
|
|
||||||
private boolean K = false;
|
|
||||||
private Context cccc = null;
|
|
||||||
|
|
||||||
public IKan() {
|
|
||||||
OkHttpClient.Builder builder = new OkHttpClient.Builder();
|
|
||||||
TimeUnit timeUnit = TimeUnit.SECONDS;
|
|
||||||
y = builder.readTimeout(15L, timeUnit).writeTimeout(15L, timeUnit).connectTimeout(15L, timeUnit).cookieJar(new CookieJar() {
|
|
||||||
final List<Cookie> Mf = new ArrayList();
|
|
||||||
|
|
||||||
public List<Cookie> loadForRequest(HttpUrl httpUrl) {
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
ArrayList arrayList2 = new ArrayList();
|
|
||||||
for (Cookie cookie : Mf) {
|
|
||||||
if (cookie.expiresAt() < System.currentTimeMillis()) {
|
|
||||||
arrayList.add(cookie);
|
|
||||||
} else if (cookie.matches(httpUrl)) {
|
|
||||||
arrayList2.add(cookie);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Mf.removeAll(arrayList);
|
|
||||||
return arrayList2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
|
|
||||||
Mf.addAll(list);
|
|
||||||
}
|
|
||||||
}).retryOnConnectionFailure(true).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void S(final String str, final String str2) {
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
hashMap.put("user_name", str);
|
|
||||||
hashMap.put("user_pwd", str2);
|
|
||||||
hashMap.put("user_pwd2", str2);
|
|
||||||
try {
|
|
||||||
HashMap hashMap2 = new HashMap();
|
|
||||||
hashMap2.put("Host", "tvcms.ikan6.vip");
|
|
||||||
hashMap2.put("User-Agent", "okhttp/3.11.0");
|
|
||||||
OkHttpUtil.post(this.y, "http://tvcms.ikan6.vip/api.php/gctvapi.auth/register", hashMap, hashMap2, new OKCallBack.OKCallBackString() {
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str3) {
|
|
||||||
try {
|
|
||||||
if (new JSONObject(str3).optInt("code", 0) == 200) {
|
|
||||||
cccc.getSharedPreferences("spider_IKan", 0).edit().putString("user", str).putString("pwd", str2).commit();
|
|
||||||
login(str, str2);
|
|
||||||
}
|
|
||||||
} catch (JSONException unused) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Throwable unused) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void iq() {
|
|
||||||
SharedPreferences sharedPreferences = cccc.getSharedPreferences("spider_IKan", 0);
|
|
||||||
try {
|
|
||||||
String string = sharedPreferences.getString("user", null);
|
|
||||||
String string2 = sharedPreferences.getString("pwd", null);
|
|
||||||
if (!(string == null || string2 == null)) {
|
|
||||||
login(string, string2);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (Throwable unused) {
|
|
||||||
}
|
|
||||||
S(random(18), random(8));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String random(int i) {
|
|
||||||
Random random = new Random();
|
|
||||||
StringBuffer stringBuffer = new StringBuffer();
|
|
||||||
for (int i2 = 0; i2 < i; i2++) {
|
|
||||||
stringBuffer.append("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456".charAt(random.nextInt(59)));
|
|
||||||
}
|
|
||||||
return stringBuffer.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void init(Context context) {
|
|
||||||
cccc = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void login(String str, String str2) {
|
|
||||||
HashMap headers = new HashMap();
|
|
||||||
headers.put("user_name", str);
|
|
||||||
headers.put("user_pwd", str2);
|
|
||||||
try {
|
|
||||||
HashMap hashMap2 = new HashMap();
|
|
||||||
hashMap2.put("Host", "tvcms.ikan6.vip");
|
|
||||||
hashMap2.put("User-Agent", "okhttp/3.11.0");
|
|
||||||
OkHttpUtil.post(y, "http://tvcms.ikan6.vip/api.php/gctvapi.auth/login", headers, hashMap2, new OKCallBack.OKCallBackString() {
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str3) {
|
|
||||||
try {
|
|
||||||
if (new JSONObject(str3).optInt("code", 0) == 200) {
|
|
||||||
K = true;
|
|
||||||
}
|
|
||||||
} catch (JSONException unused) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Throwable unused) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private HashMap<String, String> getHeaders(String URL) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
String url = "http://tvcms.ikan6.vip/api.php/gctvapi.vod";
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
JSONArray jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
String vid = vObj.getString("vod_id");
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vid);
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String str, String str2, List<String> list) {
|
|
||||||
try {
|
|
||||||
if (str.equals("lekanzyw")) {
|
|
||||||
if (!K) {
|
|
||||||
iq();
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONObject headers = new JSONObject();
|
|
||||||
headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", " */*");
|
|
||||||
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
|
|
||||||
headers.put("Accept-Encoding", " gzip, deflate");
|
|
||||||
headers.put("Connection", " Keep-Alive");
|
|
||||||
|
|
||||||
String parseUrl = "https://player.4kan.top/?url=" + str2;
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(parseUrl, null));
|
|
||||||
Pattern pattern = Pattern.compile("(?<=getrandom\\S\").*?(?=\")");
|
|
||||||
Elements allScripts = doc.select("body script");
|
|
||||||
for (int j = 0; j < allScripts.size(); j++) {
|
|
||||||
String scContents = allScripts.get(j).html().trim();
|
|
||||||
Matcher matcher = pattern.matcher(scContents);
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String players = new String(Base64.decode(matcher.group(0), Base64.DEFAULT));
|
|
||||||
int start = players.indexOf("http");
|
|
||||||
int end = players.lastIndexOf("key=") + 36;
|
|
||||||
String url = players.substring(start, end);
|
|
||||||
Map<String, List<String>> respHeaders = new TreeMap<>();
|
|
||||||
OkHttpUtil.stringNoRedirect(url, null, respHeaders);
|
|
||||||
String redLoc = OkHttpUtil.getRedirectLocation(respHeaders);
|
|
||||||
|
|
||||||
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", redLoc);
|
|
||||||
result.put("header", headers.toString());
|
|
||||||
return result.toString();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String str) {
|
|
||||||
super.init(context, "http://tvcms.ikan6.vip/api.php/gctvapi.vod");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,482 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class If101 extends Spider {
|
|
||||||
private static final String siteUrl = "https://oulevod.tv";
|
|
||||||
private static final String siteHost = "oulevod.tv";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 播放源配置
|
|
||||||
*/
|
|
||||||
private JSONObject playerConfig;
|
|
||||||
/**
|
|
||||||
* 筛选配置
|
|
||||||
*/
|
|
||||||
private JSONObject filterConfig;
|
|
||||||
private Pattern regexCategory = Pattern.compile("/index.php/vod/type/id/(\\d+).html");
|
|
||||||
private Pattern regexVid = Pattern.compile("/index.php/vod/detail/id/(\\d+).html");
|
|
||||||
private Pattern regexPlay = Pattern.compile("/index.php/vod/play/id/(\\d+)/sid/(\\d+)/nid/(\\d+).html");
|
|
||||||
private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+");
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
playerConfig = new JSONObject("{\"if101\":{\"sh\":\"高清蓝光\",\"sn\":0,\"pu\":\"\",\"or\":999}}");
|
|
||||||
filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"冒险\",\"v\":\"6\"},{\"n\":\"剧情\",\"v\":\"7\"},{\"n\":\"动作\",\"v\":\"8\"},{\"n\":\"动画电影\",\"v\":\"9\"},{\"n\":\"同性\",\"v\":\"10\"},{\"n\":\"喜剧\",\"v\":\"11\"},{\"n\":\"奇幻\",\"v\":\"12\"},{\"n\":\"恐怖\",\"v\":\"20\"},{\"n\":\"悬疑\",\"v\":\"21\"},{\"n\":\"惊悚\",\"v\":\"22\"},{\"n\":\"战争\",\"v\":\"23\"},{\"n\":\"歌舞\",\"v\":\"24\"},{\"n\":\"灾难\",\"v\":\"25\"},{\"n\":\"爱情\",\"v\":\"26\"},{\"n\":\"犯罪\",\"v\":\"27\"},{\"n\":\"科幻\",\"v\":\"28\"},{\"n\":\"经典\",\"v\":\"29\"},{\"n\":\"网络电影\",\"v\":\"30\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"高清版\",\"v\":\"高清版\"},{\"n\":\"剧场版\",\"v\":\"剧场版\"},{\"n\":\"抢先版\",\"v\":\"抢先版\"},{\"n\":\"OVA\",\"v\":\"OVA\"},{\"n\":\"TV\",\"v\":\"TV\"},{\"n\":\"影院版\",\"v\":\"影院版\"}]},{\"key\":\"state\",\"name\":\"资源\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"正片\",\"v\":\"正片\"},{\"n\":\"预告片\",\"v\":\"预告片\"},{\"n\":\"花絮\",\"v\":\"花絮\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美剧\",\"v\":\"13\"},{\"n\":\"日剧\",\"v\":\"14\"},{\"n\":\"韩剧\",\"v\":\"15\"},{\"n\":\"国产剧\",\"v\":\"16\"},{\"n\":\"泰剧\",\"v\":\"31\"},{\"n\":\"港剧\",\"v\":\"32\"},{\"n\":\"台剧\",\"v\":\"33\"},{\"n\":\"新马剧\",\"v\":\"34\"},{\"n\":\"其它剧\",\"v\":\"35\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"高清版\",\"v\":\"高清版\"},{\"n\":\"剧场版\",\"v\":\"剧场版\"},{\"n\":\"抢先版\",\"v\":\"抢先版\"},{\"n\":\"OVA\",\"v\":\"OVA\"},{\"n\":\"TV\",\"v\":\"TV\"},{\"n\":\"影院版\",\"v\":\"影院版\"}]},{\"key\":\"state\",\"name\":\"资源\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"正片\",\"v\":\"正片\"},{\"n\":\"预告片\",\"v\":\"预告片\"},{\"n\":\"花絮\",\"v\":\"花絮\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美动漫\",\"v\":\"36\"},{\"n\":\"日本动漫\",\"v\":\"37\"},{\"n\":\"韩国动漫\",\"v\":\"38\"},{\"n\":\"国产动漫\",\"v\":\"39\"},{\"n\":\"新马泰动漫\",\"v\":\"40\"},{\"n\":\"港台动漫\",\"v\":\"41\"},{\"n\":\"其他动漫\",\"v\":\"42\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美综艺\",\"v\":\"43\"},{\"n\":\"日本综艺\",\"v\":\"44\"},{\"n\":\"韩国综艺\",\"v\":\"45\"},{\"n\":\"国产综艺\",\"v\":\"46\"},{\"n\":\"新马泰综艺\",\"v\":\"47\"},{\"n\":\"港台综艺\",\"v\":\"48\"},{\"n\":\"其他综艺\",\"v\":\"49\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"TV版\",\"v\":\"TV版\"},{\"n\":\"电影版\",\"v\":\"电影版\"},{\"n\":\"OVA版\",\"v\":\"OVA版\"},{\"n\":\"真人版\",\"v\":\"真人版\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"50\":[{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"51\":[{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}]}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 爬虫headers
|
|
||||||
*
|
|
||||||
* @param url
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("method", "GET");
|
|
||||||
headers.put("Host", siteHost);
|
|
||||||
headers.put("Upgrade-Insecure-Requests", "1");
|
|
||||||
headers.put("DNT", "1");
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
|
|
||||||
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类数据 + 首页最近更新视频列表数据
|
|
||||||
*
|
|
||||||
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
|
||||||
// 分类节点
|
|
||||||
Elements elements = doc.select("div.conch-nav div ul li a");
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (Element ele : elements) {
|
|
||||||
String name = ele.text();
|
|
||||||
boolean show = name.equals("电影") ||
|
|
||||||
name.equals("电视剧") ||
|
|
||||||
name.equals("动漫") ||
|
|
||||||
name.equals("综艺") ||
|
|
||||||
name.equals("纪录片") ||
|
|
||||||
name.equals("体育");
|
|
||||||
if (show) {
|
|
||||||
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
|
||||||
if (!mather.find())
|
|
||||||
continue;
|
|
||||||
// 把分类的id和名称取出来加到列表里
|
|
||||||
String id = mather.group(1).trim();
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
try {
|
|
||||||
// 取首页推荐视频列表
|
|
||||||
Element homeList = doc.select("ul.hl-vod-list").get(0);
|
|
||||||
Elements list = homeList.select("li.hl-list-item");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.selectFirst("div.hl-item-title a").text();
|
|
||||||
String cover = vod.selectFirst(".hl-item-thumb").attr("data-original");
|
|
||||||
String remark = vod.selectFirst(".hl-pic-text span").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst("div.hl-item-title a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类信息数据
|
|
||||||
*
|
|
||||||
* @param tid 分类id
|
|
||||||
* @param pg 页数
|
|
||||||
* @param filter 同homeContent方法中的filter
|
|
||||||
* @param extend 筛选参数{k:v, k1:v1}
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/index.php/vod/show/id/";
|
|
||||||
if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
|
|
||||||
url += extend.get("tid");
|
|
||||||
} else {
|
|
||||||
url += tid;
|
|
||||||
}
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value.length() > 0) {
|
|
||||||
url += "/" + key + "/" + URLEncoder.encode(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
url += "/page/" + pg + ".html";
|
|
||||||
String html = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
Document doc = Jsoup.parse(html);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int pageCount = 0;
|
|
||||||
int page = -1;
|
|
||||||
|
|
||||||
// 取页码相关信息
|
|
||||||
Elements pageInfo = doc.select("ul.hl-page-wrap");
|
|
||||||
if (pageInfo.size() == 0) {
|
|
||||||
page = Integer.parseInt(pg);
|
|
||||||
pageCount = page;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < pageInfo.size(); i++) {
|
|
||||||
Element li = pageInfo.get(i);
|
|
||||||
Element a = li.selectFirst("li a");
|
|
||||||
if (a == null)
|
|
||||||
continue;
|
|
||||||
String span = pageInfo.select("li a.active").text();
|
|
||||||
String wy = doc.select("ul.hl-page-wrap li a").last().attr("href");
|
|
||||||
if (page == -1) {
|
|
||||||
page = Integer.parseInt(span);
|
|
||||||
} else {
|
|
||||||
page = 0;
|
|
||||||
}
|
|
||||||
Matcher matcher = regexPage.matcher(wy);
|
|
||||||
if (matcher.find()) {
|
|
||||||
pageCount = Integer.parseInt(matcher.group(1).trim());
|
|
||||||
} else {
|
|
||||||
pageCount = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (!html.contains("没有找到您想要的结果哦")) {
|
|
||||||
// 取当前分类页的视频列表
|
|
||||||
Elements list = doc.select("li.hl-list-item");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.selectFirst("div.hl-item-title a").text();
|
|
||||||
String cover = vod.selectFirst(".hl-item-thumb").attr("data-original");
|
|
||||||
String remark = vod.selectFirst(".hl-pic-text span").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst("div.hl-item-title a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", 24);
|
|
||||||
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 24);
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频详情信息
|
|
||||||
*
|
|
||||||
* @param ids 视频id
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
// 视频详情url
|
|
||||||
String url = siteUrl + "/index.php/vod/detail/id/" + ids.get(0) + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vodList = new JSONObject();
|
|
||||||
|
|
||||||
// 取基本数据
|
|
||||||
String vid = doc.selectFirst("a.digg_link").attr("data-id");
|
|
||||||
|
|
||||||
String cover = doc.selectFirst("div.hl-dc-pic span").attr("data-original");
|
|
||||||
String title = doc.selectFirst("h2.hl-dc-title").text();
|
|
||||||
String desc = doc.selectFirst("span.hl-content-text em").text();
|
|
||||||
String category = "", area = "", year = "", director = "", actor = "", remark = "";
|
|
||||||
Elements span_text_muted = doc.select("li.hl-col-xs-12 em");
|
|
||||||
for (int i = 0; i < span_text_muted.size() - 2; i++) {
|
|
||||||
Element text = span_text_muted.get(i);
|
|
||||||
String info = text.text();
|
|
||||||
if (info.contains("类型")) {
|
|
||||||
try {
|
|
||||||
category = text.parent().select("a").text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
category = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("年份")) {
|
|
||||||
try {
|
|
||||||
year = text.parent().text().split(":")[1];
|
|
||||||
} catch (Exception e) {
|
|
||||||
year = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("地区")) {
|
|
||||||
try {
|
|
||||||
area = text.parent().text().split(":")[1];
|
|
||||||
} catch (Exception e) {
|
|
||||||
area = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("上映")) {
|
|
||||||
try {
|
|
||||||
remark = text.text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
remark = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("导演")) {
|
|
||||||
try {
|
|
||||||
director = text.parent().select("a").text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
director = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("主演")) {
|
|
||||||
try {
|
|
||||||
actor = text.parent().select("a").text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
actor = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vodList.put("vod_id", vid);
|
|
||||||
vodList.put("vod_name", title);
|
|
||||||
vodList.put("vod_pic", cover);
|
|
||||||
vodList.put("type_name", category);
|
|
||||||
vodList.put("vod_year", year);
|
|
||||||
vodList.put("vod_area", area);
|
|
||||||
vodList.put("vod_remarks", remark);
|
|
||||||
vodList.put("vod_actor", actor);
|
|
||||||
vodList.put("vod_director", director);
|
|
||||||
vodList.put("vod_content", desc);
|
|
||||||
|
|
||||||
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
|
||||||
@Override
|
|
||||||
public int compare(String o1, String o2) {
|
|
||||||
try {
|
|
||||||
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
|
||||||
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
|
||||||
|
|
||||||
if (sort1 == sort2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return sort1 - sort2 > 0 ? 1 : -1;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 取播放列表数据
|
|
||||||
Elements sources = doc.select("div.hl-plays-from a");
|
|
||||||
Elements sourceList = doc.select("div.hl-list-wrap");
|
|
||||||
|
|
||||||
for (int i = 0; i < sources.size(); i++) {
|
|
||||||
Element source = sources.get(i);
|
|
||||||
String sourceName = source.text();
|
|
||||||
sourceName = sourceName.replaceAll("[^\u4E00-\u9FA5]", "");
|
|
||||||
boolean found = false;
|
|
||||||
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
|
||||||
String flag = it.next();
|
|
||||||
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
|
|
||||||
sourceName = flag;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
String playList = "";
|
|
||||||
Elements playListA = sourceList.get(i).select("ul>li>a");
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String playURL = matcher.group(1) + "/sid/" + matcher.group(2) + "/nid/" + matcher.group(3);
|
|
||||||
vodItems.add(vod.text() + "$" + playURL);
|
|
||||||
}
|
|
||||||
if (vodItems.size() > 0)
|
|
||||||
playList = TextUtils.join("#", vodItems);
|
|
||||||
|
|
||||||
if (playList.length() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vod_play.put(sourceName, playList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vod_play.size() > 0) {
|
|
||||||
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
|
||||||
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
|
||||||
vodList.put("vod_play_from", vod_play_from);
|
|
||||||
vodList.put("vod_play_url", vod_play_url);
|
|
||||||
}
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vodList);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取视频播放信息
|
|
||||||
*
|
|
||||||
* @param flag 播放源
|
|
||||||
* @param id 视频id
|
|
||||||
* @param vipFlags 所有可能需要vip解析的源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
// 播放页 url
|
|
||||||
String url = siteUrl + "/index.php/vod/play/id/" + id + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
Elements allScript = doc.select("script");
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) { // 取直链
|
|
||||||
int start = scContent.indexOf('{');
|
|
||||||
int end = scContent.lastIndexOf('}') + 1;
|
|
||||||
String json = scContent.substring(start, end);
|
|
||||||
JSONObject player = new JSONObject(json);
|
|
||||||
if (playerConfig.has(player.getString("from"))) {
|
|
||||||
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
|
|
||||||
String videoUrl = player.getString("url");
|
|
||||||
String playUrl = pCfg.getString("pu");
|
|
||||||
result.put("parse", pCfg.getInt("sn"));
|
|
||||||
result.put("playUrl", playUrl);
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
result.put("header", "");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
long currentTime = System.currentTimeMillis();
|
|
||||||
String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime;
|
|
||||||
JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (searchResult.getInt("total") > 0) {
|
|
||||||
JSONArray lists = new JSONArray(searchResult.getString("list"));
|
|
||||||
for (int i = 0; i < lists.length(); i++) {
|
|
||||||
JSONObject vod = lists.getJSONObject(i);
|
|
||||||
String id = vod.getString("id");
|
|
||||||
String title = vod.getString("name");
|
|
||||||
String cover = vod.getString("pic");
|
|
||||||
if (title.contains(key)) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String doReplaceRegex(Pattern pattern, String src) {
|
|
||||||
if (pattern == null)
|
|
||||||
return src;
|
|
||||||
try {
|
|
||||||
Matcher matcher = pattern.matcher(src);
|
|
||||||
if (matcher.find()) {
|
|
||||||
return matcher.group(1).trim();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,681 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Base64;
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OKCallBack;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.security.KeyFactory;
|
|
||||||
import java.security.MessageDigest;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.security.PrivateKey;
|
|
||||||
import java.security.interfaces.RSAPublicKey;
|
|
||||||
import java.security.spec.PKCS8EncodedKeySpec;
|
|
||||||
import java.security.spec.X509EncodedKeySpec;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
import javax.crypto.Cipher;
|
|
||||||
import javax.crypto.spec.IvParameterSpec;
|
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
|
||||||
import okhttp3.Call;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
public class Kuaikan extends Spider {
|
|
||||||
private static String Cb;
|
|
||||||
private static long QH;
|
|
||||||
private static String dW;
|
|
||||||
private HashMap<String, ArrayList<String>> Ji = new HashMap<>();
|
|
||||||
|
|
||||||
private void Q() {
|
|
||||||
if (System.currentTimeMillis() > QH) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
long currentTimeMillis = System.currentTimeMillis() / 1000;
|
|
||||||
String f = f("bf70a456195ae394184b2e0b1b471cae1000300001dc431681b806089dac1153fb13960f87" + currentTimeMillis + "notice");
|
|
||||||
jSONObject.put("appId", "1000300001");
|
|
||||||
jSONObject.put("sign", f);
|
|
||||||
jSONObject.put("timestamp", currentTimeMillis);
|
|
||||||
String O = Decrypt("bf70a456195ae394", "184b2e0b1b471cae", jSONObject.toString());
|
|
||||||
String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", "bf70a456195ae394184b2e0b1b471cae");
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("body", O);
|
|
||||||
jSONObject2.put("ticket", tg);
|
|
||||||
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/login.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() {
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject3 = new JSONObject(str);
|
|
||||||
String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket"));
|
|
||||||
JSONObject jSONObject4 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body")));
|
|
||||||
long unused = Kuaikan.QH = jSONObject4.getLong("duration") * 1000;
|
|
||||||
String unused2 = Kuaikan.Cb = jSONObject4.getString("data");
|
|
||||||
Kuaikan.this.Uf();
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Throwable th) {
|
|
||||||
th.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Uf() {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
long currentTimeMillis = System.currentTimeMillis() / 1000;
|
|
||||||
String f = f("1000300001dc431681b806089dac1153fb13960f8700" + dW + currentTimeMillis + "notice");
|
|
||||||
jSONObject.put("adv", 0);
|
|
||||||
jSONObject.put("appId", "1000300001");
|
|
||||||
jSONObject.put("nav", 0);
|
|
||||||
jSONObject.put("sign", f);
|
|
||||||
jSONObject.put("timestamp", currentTimeMillis);
|
|
||||||
jSONObject.put("umId", dW);
|
|
||||||
String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
|
|
||||||
String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("body", O);
|
|
||||||
jSONObject2.put("ticket", tg);
|
|
||||||
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/config.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.1
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject3 = new JSONObject(str);
|
|
||||||
String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket"));
|
|
||||||
JSONArray jSONArray = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body"))).getJSONObject("data").getJSONArray("newAnalysis");
|
|
||||||
Kuaikan.this.Ji.clear();
|
|
||||||
for (int i = 0; i < jSONArray.length(); i++) {
|
|
||||||
JSONObject jSONObject4 = jSONArray.getJSONObject(i);
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
Kuaikan.this.Ji.put(jSONObject4.getString("id"), arrayList);
|
|
||||||
JSONArray jSONArray2 = jSONObject4.getJSONArray("analyses");
|
|
||||||
for (int i2 = 0; i2 < jSONArray2.length(); i2++) {
|
|
||||||
arrayList.add(jSONArray2.getJSONObject(i2).getString("url"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Throwable th) {
|
|
||||||
th.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<String, String> j(long j) {
|
|
||||||
HashMap<String, String> hashMap = new HashMap<>();
|
|
||||||
hashMap.put("appId", "1000300001");
|
|
||||||
hashMap.put("version", "4");
|
|
||||||
hashMap.put("timestamp", j + "");
|
|
||||||
hashMap.put("token", f("1000300001dc431681b806089dac1153fb13960f874" + j + "notice"));
|
|
||||||
hashMap.put("User-Agent", "okhttp/5.0.0-alpha.2");
|
|
||||||
return hashMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
String Decrypt(String str, String str2, String str3) {
|
|
||||||
try {
|
|
||||||
SecretKeySpec secretKeySpec = new SecretKeySpec(str.getBytes(), "AES");
|
|
||||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
|
||||||
cipher.init(1, secretKeySpec, new IvParameterSpec(str2.getBytes()));
|
|
||||||
return Base64.encodeToString(cipher.doFinal(str3.getBytes()), 2);
|
|
||||||
} catch (Throwable th) {
|
|
||||||
th.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String UO(String str, String str2, String str3) {
|
|
||||||
try {
|
|
||||||
SecretKeySpec secretKeySpec = new SecretKeySpec(str.getBytes(), "AES");
|
|
||||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
|
||||||
cipher.init(2, secretKeySpec, new IvParameterSpec(str2.getBytes()));
|
|
||||||
return new String(cipher.doFinal(Base64.decode(str3, 0)), "UTF-8");
|
|
||||||
} catch (Throwable th) {
|
|
||||||
th.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String categoryContent(String str, final String str2, boolean z, HashMap<String, String> hashMap) {
|
|
||||||
try {
|
|
||||||
Q();
|
|
||||||
int parseInt = hashMap.containsKey("areaId") ? Integer.parseInt(hashMap.get("areaId")) : 0;
|
|
||||||
int parseInt2 = hashMap.containsKey("tagId") ? Integer.parseInt(hashMap.get("tagId")) : 0;
|
|
||||||
int parseInt3 = hashMap.containsKey("yearId") ? Integer.parseInt(hashMap.get("yearId")) : 0;
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
long currentTimeMillis = System.currentTimeMillis() / 1000;
|
|
||||||
String f = f("1000300001dc431681b806089dac1153fb13960f87" + str2 + 18 + str + parseInt2 + parseInt + parseInt3 + currentTimeMillis + "notice");
|
|
||||||
jSONObject.put("appId", "1000300001");
|
|
||||||
jSONObject.put("typeId", str);
|
|
||||||
jSONObject.put("areaId", parseInt);
|
|
||||||
jSONObject.put("tagId", parseInt2);
|
|
||||||
jSONObject.put("yearId", parseInt3);
|
|
||||||
jSONObject.put("page", Integer.parseInt(str2));
|
|
||||||
jSONObject.put("pageSize", 18);
|
|
||||||
jSONObject.put("sign", f);
|
|
||||||
jSONObject.put("timestamp", currentTimeMillis);
|
|
||||||
String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
|
|
||||||
String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("body", O);
|
|
||||||
jSONObject2.put("ticket", tg);
|
|
||||||
final JSONObject jSONObject3 = new JSONObject();
|
|
||||||
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/video.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.5
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str3) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject4 = new JSONObject(str3);
|
|
||||||
String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
|
|
||||||
JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body")));
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
JSONArray jSONArray2 = jSONObject5.getJSONArray("results");
|
|
||||||
for (int i = 0; i < jSONArray2.length(); i++) {
|
|
||||||
JSONObject jSONObject6 = jSONArray2.getJSONObject(i);
|
|
||||||
JSONObject jSONObject7 = new JSONObject();
|
|
||||||
jSONObject7.put("vod_id", jSONObject6.getString("id"));
|
|
||||||
jSONObject7.put("vod_name", jSONObject6.getString("name"));
|
|
||||||
jSONObject7.put("vod_pic", jSONObject6.getString("pic"));
|
|
||||||
jSONObject7.put("vod_remarks", jSONObject6.getString("progress"));
|
|
||||||
jSONArray.put(jSONObject7);
|
|
||||||
}
|
|
||||||
jSONObject3.put("page", Integer.parseInt(str2));
|
|
||||||
int i2 = jSONObject5.getInt("count");
|
|
||||||
int i3 = 20;
|
|
||||||
jSONObject3.put("pagecount", i2 % i3 == 0 ? i2 / i3 : (i2 / i3) + 1);
|
|
||||||
jSONObject3.put("limit", i3);
|
|
||||||
jSONObject3.put("total", i2);
|
|
||||||
jSONObject3.put("list", jSONArray);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return jSONObject3.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String detailContent(final List<String> list) {
|
|
||||||
try {
|
|
||||||
Q();
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
long currentTimeMillis = System.currentTimeMillis() / 1000;
|
|
||||||
String f = f("1000300001dc431681b806089dac1153fb13960f87" + list.get(0) + currentTimeMillis + "notice");
|
|
||||||
jSONObject.put("appId", "1000300001");
|
|
||||||
jSONObject.put("id", list.get(0));
|
|
||||||
jSONObject.put("sign", f);
|
|
||||||
jSONObject.put("timestamp", currentTimeMillis);
|
|
||||||
String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
|
|
||||||
String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("body", O);
|
|
||||||
jSONObject2.put("ticket", tg);
|
|
||||||
final JSONObject jSONObject3 = new JSONObject();
|
|
||||||
OkHttpClient QH2 = OkHttpUtil.defaultClient();
|
|
||||||
OkHttpUtil.postJson(QH2, "http://ctlook.facaishiyi.com/api/v1/video/play/" + list.get(0) + ".do ", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.6
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject4 = new JSONObject(str);
|
|
||||||
String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
|
|
||||||
JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))).getJSONObject("data");
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
JSONObject jSONObject6 = new JSONObject();
|
|
||||||
jSONObject6.put("vod_id", jSONObject5.getString("id"));
|
|
||||||
jSONObject6.put("vod_name", jSONObject5.getString("name"));
|
|
||||||
jSONObject6.put("vod_pic", jSONObject5.getString("pic"));
|
|
||||||
jSONObject6.put("vod_year", jSONObject5.getString("year"));
|
|
||||||
jSONObject6.put("vod_remarks", jSONObject5.getString("progress"));
|
|
||||||
jSONObject6.put("vod_actor", jSONObject5.getString("actor"));
|
|
||||||
jSONObject6.put("vod_director", jSONObject5.getString("director"));
|
|
||||||
jSONObject6.put("vod_content", jSONObject5.getString("content").trim());
|
|
||||||
JSONArray jSONArray2 = new JSONArray(Kuaikan.this.UO("5551e2a82a21a9a1", "a586c5236206a2cb", jSONObject5.getString("newPlayback")));
|
|
||||||
LinkedHashMap linkedHashMap = new LinkedHashMap();
|
|
||||||
for (int i = 0; i < jSONArray2.length(); i++) {
|
|
||||||
JSONObject jSONObject7 = jSONArray2.getJSONObject(i);
|
|
||||||
String string = jSONObject7.getString("name");
|
|
||||||
String string2 = jSONObject7.getString("id");
|
|
||||||
JSONArray jSONArray3 = jSONObject7.getJSONArray("episodes");
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
for (int i2 = 0; i2 < jSONArray3.length(); i2++) {
|
|
||||||
JSONObject jSONObject8 = jSONArray3.getJSONObject(i2);
|
|
||||||
String string3 = jSONObject8.getString("title");
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append(string3);
|
|
||||||
sb.append("|");
|
|
||||||
sb.append((String) list.get(0));
|
|
||||||
sb.append("|");
|
|
||||||
sb.append(string2);
|
|
||||||
sb.append("|");
|
|
||||||
sb.append(jSONObject8.getString("url"));
|
|
||||||
String encodeToString = Base64.encodeToString(sb.toString().getBytes("UTF-8"), 10);
|
|
||||||
arrayList.add(string3 + "$" + encodeToString);
|
|
||||||
}
|
|
||||||
linkedHashMap.put(string, TextUtils.join("#", arrayList));
|
|
||||||
}
|
|
||||||
String join = TextUtils.join("$$$", linkedHashMap.keySet());
|
|
||||||
String join2 = TextUtils.join("$$$", linkedHashMap.values());
|
|
||||||
jSONObject6.put("vod_play_from", join);
|
|
||||||
jSONObject6.put("vod_play_url", join2);
|
|
||||||
jSONArray.put(jSONObject6);
|
|
||||||
jSONObject3.put("list", jSONArray);
|
|
||||||
} catch (Throwable th) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return jSONObject3.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String f(String str) {
|
|
||||||
try {
|
|
||||||
byte[] digest = MessageDigest.getInstance("MD5").digest(str.getBytes());
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (byte b : digest) {
|
|
||||||
String hexString = Integer.toHexString(b & 255);
|
|
||||||
if (hexString.length() < 2) {
|
|
||||||
sb.append(0);
|
|
||||||
}
|
|
||||||
sb.append(hexString);
|
|
||||||
}
|
|
||||||
return sb.toString().toLowerCase();
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String homeContent(boolean z) {
|
|
||||||
try {
|
|
||||||
Q();
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
long currentTimeMillis = System.currentTimeMillis() / 1000;
|
|
||||||
String f = f("1000300001dc431681b806089dac1153fb13960f87" + currentTimeMillis + "notice");
|
|
||||||
jSONObject.put("appId", "1000300001");
|
|
||||||
jSONObject.put("sign", f);
|
|
||||||
jSONObject.put("timestamp", currentTimeMillis);
|
|
||||||
String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
|
|
||||||
String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("body", O);
|
|
||||||
jSONObject2.put("ticket", tg);
|
|
||||||
final JSONObject jSONObject3 = new JSONObject();
|
|
||||||
final JSONArray jSONArray = new JSONArray();
|
|
||||||
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/genres.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.3
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject4 = new JSONObject(str);
|
|
||||||
String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
|
|
||||||
JSONArray jSONArray2 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))).getJSONArray("genres");
|
|
||||||
for (int i = 0; i < jSONArray2.length(); i++) {
|
|
||||||
JSONObject jSONObject5 = jSONArray2.getJSONObject(i);
|
|
||||||
String string = jSONObject5.getString("name");
|
|
||||||
final int i2 = jSONObject5.getInt("typeId");
|
|
||||||
if (i2 > 0) {
|
|
||||||
JSONObject jSONObject6 = new JSONObject();
|
|
||||||
jSONObject6.put("type_id", i2 + "");
|
|
||||||
jSONObject6.put("type_name", string);
|
|
||||||
jSONArray.put(jSONObject6);
|
|
||||||
JSONObject jSONObject7 = new JSONObject();
|
|
||||||
long currentTimeMillis2 = System.currentTimeMillis() / 1000;
|
|
||||||
Kuaikan kuaikan = Kuaikan.this;
|
|
||||||
String f2 = kuaikan.f("1000300001dc431681b806089dac1153fb13960f87" + i2 + currentTimeMillis2 + "notice");
|
|
||||||
jSONObject7.put("appId", "1000300001");
|
|
||||||
jSONObject7.put("tid", i2);
|
|
||||||
jSONObject7.put("sign", f2);
|
|
||||||
jSONObject7.put("timestamp", currentTimeMillis2);
|
|
||||||
String O2 = Kuaikan.this.Decrypt(Kuaikan.Cb.substring(0, 16), Kuaikan.Cb.substring(16, 32), jSONObject7.toString());
|
|
||||||
String tg2 = Kuaikan.this.tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Kuaikan.Cb);
|
|
||||||
JSONObject jSONObject8 = new JSONObject();
|
|
||||||
jSONObject8.put("body", O2);
|
|
||||||
jSONObject8.put("ticket", tg2);
|
|
||||||
new JSONArray();
|
|
||||||
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/category.do", jSONObject8.toString(), Kuaikan.this.j(currentTimeMillis2), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.3.1
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str2) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject9 = new JSONObject(str2);
|
|
||||||
String lX2 = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject9.getString("ticket"));
|
|
||||||
JSONObject jSONObject10 = new JSONObject(Kuaikan.this.UO(lX2.substring(0, 16), lX2.substring(16, 32), jSONObject9.getString("body")));
|
|
||||||
JSONArray jSONArray3 = jSONObject10.getJSONArray("areas");
|
|
||||||
JSONArray jSONArray4 = jSONObject10.getJSONArray("years");
|
|
||||||
JSONArray jSONArray5 = jSONObject10.getJSONArray("tags");
|
|
||||||
JSONArray jSONArray6 = new JSONArray();
|
|
||||||
JSONObject jSONObject11 = new JSONObject();
|
|
||||||
jSONObject11.put("key", "tagId");
|
|
||||||
jSONObject11.put("name", "类型");
|
|
||||||
JSONArray jSONArray7 = new JSONArray();
|
|
||||||
for (int i3 = 0; i3 < jSONArray5.length(); i3++) {
|
|
||||||
JSONObject jSONObject12 = jSONArray5.getJSONObject(i3);
|
|
||||||
JSONObject jSONObject13 = new JSONObject();
|
|
||||||
jSONObject13.put("n", jSONObject12.getString("name"));
|
|
||||||
jSONObject13.put("v", jSONObject12.getString("id"));
|
|
||||||
jSONArray7.put(jSONObject13);
|
|
||||||
}
|
|
||||||
jSONObject11.put("value", jSONArray7);
|
|
||||||
jSONArray6.put(jSONObject11);
|
|
||||||
JSONObject jSONObject14 = new JSONObject();
|
|
||||||
jSONObject14.put("key", "areaId");
|
|
||||||
jSONObject14.put("name", "地区");
|
|
||||||
JSONArray jSONArray8 = new JSONArray();
|
|
||||||
for (int i4 = 0; i4 < jSONArray3.length(); i4++) {
|
|
||||||
JSONObject jSONObject15 = jSONArray3.getJSONObject(i4);
|
|
||||||
JSONObject jSONObject16 = new JSONObject();
|
|
||||||
jSONObject16.put("n", jSONObject15.getString("name"));
|
|
||||||
jSONObject16.put("v", jSONObject15.getString("id"));
|
|
||||||
jSONArray8.put(jSONObject16);
|
|
||||||
}
|
|
||||||
jSONObject14.put("value", jSONArray8);
|
|
||||||
jSONArray6.put(jSONObject14);
|
|
||||||
JSONObject jSONObject17 = new JSONObject();
|
|
||||||
jSONObject17.put("key", "yearId");
|
|
||||||
jSONObject17.put("name", "年份");
|
|
||||||
JSONArray jSONArray9 = new JSONArray();
|
|
||||||
for (int i5 = 0; i5 < jSONArray4.length(); i5++) {
|
|
||||||
JSONObject jSONObject18 = jSONArray4.getJSONObject(i5);
|
|
||||||
JSONObject jSONObject19 = new JSONObject();
|
|
||||||
jSONObject19.put("n", jSONObject18.getString("name"));
|
|
||||||
jSONObject19.put("v", jSONObject18.getString("id"));
|
|
||||||
jSONArray9.put(jSONObject19);
|
|
||||||
}
|
|
||||||
jSONObject17.put("value", jSONArray9);
|
|
||||||
jSONArray6.put(jSONObject17);
|
|
||||||
jSONObject3.put(i2 + "", jSONArray6);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
JSONObject jSONObject4 = new JSONObject();
|
|
||||||
jSONObject4.put("class", jSONArray);
|
|
||||||
if (z) {
|
|
||||||
jSONObject4.put("filters", jSONObject3);
|
|
||||||
}
|
|
||||||
return jSONObject4.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
Q();
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
long currentTimeMillis = System.currentTimeMillis() / 1000;
|
|
||||||
String f = f("1000300001dc431681b806089dac1153fb13960f87115" + currentTimeMillis + "notice");
|
|
||||||
jSONObject.put("appId", "1000300001");
|
|
||||||
jSONObject.put("id", 115);
|
|
||||||
jSONObject.put("sign", f);
|
|
||||||
jSONObject.put("timestamp", currentTimeMillis);
|
|
||||||
String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
|
|
||||||
String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("body", O);
|
|
||||||
jSONObject2.put("ticket", tg);
|
|
||||||
final JSONArray jSONArray = new JSONArray();
|
|
||||||
OkHttpClient QH2 = OkHttpUtil.defaultClient();
|
|
||||||
OkHttpUtil.postJson(QH2, "http://ctlook.facaishiyi.com/api/v1/user/genre/115.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.4
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject3 = new JSONObject(str);
|
|
||||||
String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket"));
|
|
||||||
JSONArray jSONArray2 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body"))).getJSONArray("subGenres");
|
|
||||||
for (int i = 0; i < jSONArray2.length(); i++) {
|
|
||||||
if (jSONArray2.getJSONObject(i).getInt("template") == 1) {
|
|
||||||
JSONArray jSONArray3 = jSONArray2.getJSONObject(i).getJSONArray("video");
|
|
||||||
for (int i2 = 0; i2 < jSONArray3.length(); i2++) {
|
|
||||||
JSONObject jSONObject4 = jSONArray3.getJSONObject(i2);
|
|
||||||
JSONObject jSONObject5 = new JSONObject();
|
|
||||||
jSONObject5.put("vod_id", jSONObject4.getString("id"));
|
|
||||||
jSONObject5.put("vod_name", jSONObject4.getString("name"));
|
|
||||||
jSONObject5.put("vod_pic", jSONObject4.getString("pic"));
|
|
||||||
jSONObject5.put("vod_remarks", jSONObject4.getString("progress"));
|
|
||||||
jSONArray.put(jSONObject5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
JSONObject jSONObject3 = new JSONObject();
|
|
||||||
jSONObject3.put("list", jSONArray);
|
|
||||||
return jSONObject3.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(Context context, String str) {
|
|
||||||
Kuaikan.super.init(context, str);
|
|
||||||
SharedPreferences sharedPreferences = context.getSharedPreferences("spider_Kuaikan", 0);
|
|
||||||
try {
|
|
||||||
String string = sharedPreferences.getString("umId", null);
|
|
||||||
dW = string;
|
|
||||||
if (string != null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (Throwable th) {
|
|
||||||
if (dW != null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dW = f(UUID.randomUUID().toString()).toLowerCase();
|
|
||||||
sharedPreferences.edit().putString("umId", dW).commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
String lX(String str, String str2) {
|
|
||||||
int i = 0;
|
|
||||||
try {
|
|
||||||
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
|
||||||
cipher.init(2, (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(str, 0))));
|
|
||||||
byte[] decode = Base64.decode(str2, 0);
|
|
||||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
||||||
if (decode.length <= 256) {
|
|
||||||
byteArrayOutputStream.write(cipher.doFinal(decode));
|
|
||||||
} else {
|
|
||||||
int length = decode.length;
|
|
||||||
while (i < length) {
|
|
||||||
int i2 = i + 256;
|
|
||||||
byteArrayOutputStream.write(cipher.doFinal(decode, i, i2 > length ? length - i : 256));
|
|
||||||
i = i2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
byteArrayOutputStream.flush();
|
|
||||||
byteArrayOutputStream.close();
|
|
||||||
return new String(byteArrayOutputStream.toByteArray(), "UTF-8");
|
|
||||||
} catch (Exception e) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String playerContent(String str, String str2, List<String> list) {
|
|
||||||
try {
|
|
||||||
Q();
|
|
||||||
String[] split = new String(Base64.decode(str2, 10), "UTF-8").split("\\|");
|
|
||||||
ArrayList<String> arrayList = this.Ji.get(split[2]);
|
|
||||||
final JSONObject jSONObject = new JSONObject();
|
|
||||||
if (arrayList != null && arrayList.size() > 0) {
|
|
||||||
Iterator<String> it = arrayList.iterator();
|
|
||||||
while (it.hasNext()) {
|
|
||||||
String next = it.next();
|
|
||||||
if (jSONObject.has("url")) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
long currentTimeMillis = System.currentTimeMillis() / 1000;
|
|
||||||
String f = f("1000300001dc431681b806089dac1153fb13960f87" + split[1] + split[0] + split[3] + currentTimeMillis + "notice");
|
|
||||||
jSONObject2.put("appId", "1000300001");
|
|
||||||
jSONObject2.put("id", split[1]);
|
|
||||||
jSONObject2.put("title", split[0]);
|
|
||||||
jSONObject2.put("url", split[3]);
|
|
||||||
jSONObject2.put("sign", f);
|
|
||||||
jSONObject2.put("timestamp", currentTimeMillis);
|
|
||||||
String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject2.toString());
|
|
||||||
String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
|
|
||||||
JSONObject jSONObject3 = new JSONObject();
|
|
||||||
jSONObject3.put("body", O);
|
|
||||||
jSONObject3.put("ticket", tg);
|
|
||||||
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), next, jSONObject3.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.7
|
|
||||||
@Override // com.github.catvod.spider.merge.OKCallBack
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str3) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject4 = new JSONObject(str3);
|
|
||||||
String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
|
|
||||||
JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body")));
|
|
||||||
if (jSONObject5.optString("msg", "").equals("success") && jSONObject5.optInt("code", -1) == 0) {
|
|
||||||
jSONObject.put("parse", 0);
|
|
||||||
jSONObject.put("header", "");
|
|
||||||
jSONObject.put("playUrl", "");
|
|
||||||
jSONObject.put("url", jSONObject5.getString("url"));
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (jSONObject.has("url")) {
|
|
||||||
return jSONObject.toString();
|
|
||||||
}
|
|
||||||
if (!Misc.isVideoFormat(split[3])) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
jSONObject.put("parse", 0);
|
|
||||||
jSONObject.put("header", "");
|
|
||||||
jSONObject.put("playUrl", "");
|
|
||||||
jSONObject.put("url", split[3]);
|
|
||||||
return jSONObject.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String searchContent(String str, boolean z) {
|
|
||||||
try {
|
|
||||||
Q();
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
long currentTimeMillis = System.currentTimeMillis() / 1000;
|
|
||||||
String f = f("1000300001dc431681b806089dac1153fb13960f87112" + str + currentTimeMillis + "notice");
|
|
||||||
jSONObject.put("appId", "1000300001");
|
|
||||||
jSONObject.put("keyword", str);
|
|
||||||
jSONObject.put("page", 1);
|
|
||||||
jSONObject.put("pageSize", 12);
|
|
||||||
jSONObject.put("sign", f);
|
|
||||||
jSONObject.put("timestamp", currentTimeMillis);
|
|
||||||
String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString());
|
|
||||||
String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb);
|
|
||||||
JSONObject jSONObject2 = new JSONObject();
|
|
||||||
jSONObject2.put("body", O);
|
|
||||||
jSONObject2.put("ticket", tg);
|
|
||||||
final JSONObject jSONObject3 = new JSONObject();
|
|
||||||
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/page.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.8
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str2) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject4 = new JSONObject(str2);
|
|
||||||
String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket"));
|
|
||||||
JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body")));
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
JSONArray jSONArray2 = jSONObject5.getJSONArray("results");
|
|
||||||
for (int i = 0; i < jSONArray2.length(); i++) {
|
|
||||||
JSONObject jSONObject6 = jSONArray2.getJSONObject(i);
|
|
||||||
JSONObject jSONObject7 = new JSONObject();
|
|
||||||
jSONObject7.put("vod_id", jSONObject6.getString("id"));
|
|
||||||
jSONObject7.put("vod_name", jSONObject6.getString("name"));
|
|
||||||
jSONObject7.put("vod_pic", jSONObject6.getString("pic"));
|
|
||||||
jSONArray.put(jSONObject7);
|
|
||||||
}
|
|
||||||
jSONObject3.put("list", jSONArray);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return jSONObject3.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String tg(String str, String str2) {
|
|
||||||
int i = 0;
|
|
||||||
try {
|
|
||||||
PrivateKey generatePrivate = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(str, 0)));
|
|
||||||
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
|
||||||
cipher.init(1, generatePrivate);
|
|
||||||
byte[] bytes = str2.getBytes();
|
|
||||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
||||||
if (bytes.length <= 256) {
|
|
||||||
byteArrayOutputStream.write(cipher.doFinal(bytes));
|
|
||||||
} else {
|
|
||||||
int length = bytes.length;
|
|
||||||
while (i < bytes.length) {
|
|
||||||
int i2 = i + 256;
|
|
||||||
byteArrayOutputStream.write(cipher.doFinal(bytes, i, i2 > length ? length - i : 256));
|
|
||||||
i = i2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
byteArrayOutputStream.flush();
|
|
||||||
byteArrayOutputStream.close();
|
|
||||||
return Base64.encodeToString(byteArrayOutputStream.toByteArray(), 2);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,370 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.os.Build;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author: @SDL
|
|
||||||
*/
|
|
||||||
public class Kunyu77 extends Spider {
|
|
||||||
private static final String siteUrl = "http://api.kunyu77.com";
|
|
||||||
|
|
||||||
private String uAgent = "Dalvik/2.1.0 (Linux; U; Android " + Build.VERSION.RELEASE + "; " + Build.MODEL + " Build/" + Build.ID + ")";
|
|
||||||
|
|
||||||
private HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("user-agent", uAgent);
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/api.php/provide/filter";
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject jsonObject = new JSONObject(decryptResponse(content)).getJSONObject("data");
|
|
||||||
Iterator<String> keys = jsonObject.keys();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
JSONObject filterConfig = new JSONObject();
|
|
||||||
JSONArray extendsAll = null;
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String typeId = keys.next();
|
|
||||||
String typeName = jsonObject.getJSONArray(typeId).getJSONObject(0).getString("cat");
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_id", typeId);
|
|
||||||
newCls.put("type_name", typeName);
|
|
||||||
classes.put(newCls);
|
|
||||||
try {
|
|
||||||
if (extendsAll == null) {
|
|
||||||
String filterUrl = siteUrl + "/api.php/provide/searchFilter?type_id=0&pagenum=1&pagesize=1";
|
|
||||||
String filterContent = OkHttpUtil.string(filterUrl, getHeaders(filterUrl));
|
|
||||||
JSONObject filterObj = new JSONObject(filterContent).getJSONObject("data").getJSONObject("conditions");
|
|
||||||
extendsAll = new JSONArray();
|
|
||||||
// 年份
|
|
||||||
JSONObject newTypeExtend = new JSONObject();
|
|
||||||
newTypeExtend.put("key", "year");
|
|
||||||
newTypeExtend.put("name", "年份");
|
|
||||||
JSONArray newTypeExtendKV = new JSONArray();
|
|
||||||
JSONObject kv = new JSONObject();
|
|
||||||
kv.put("n", "全部");
|
|
||||||
kv.put("v", "");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "2022");
|
|
||||||
kv.put("v", "2022");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "2021");
|
|
||||||
kv.put("v", "2021");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
JSONArray years = filterObj.getJSONArray("y");
|
|
||||||
for (int j = 0; j < years.length(); j++) {
|
|
||||||
JSONObject child = years.getJSONObject(j);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", child.getString("name"));
|
|
||||||
kv.put("v", child.getString("value"));
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
}
|
|
||||||
newTypeExtend.put("value", newTypeExtendKV);
|
|
||||||
extendsAll.put(newTypeExtend);
|
|
||||||
// 地区
|
|
||||||
newTypeExtend = new JSONObject();
|
|
||||||
newTypeExtend.put("key", "area");
|
|
||||||
newTypeExtend.put("name", "地区");
|
|
||||||
newTypeExtendKV = new JSONArray();
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "全部");
|
|
||||||
kv.put("v", "");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
JSONArray areas = filterObj.getJSONArray("a");
|
|
||||||
for (int j = 0; j < areas.length(); j++) {
|
|
||||||
JSONObject child = areas.getJSONObject(j);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", child.getString("name"));
|
|
||||||
kv.put("v", child.getString("value"));
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
}
|
|
||||||
newTypeExtend.put("value", newTypeExtendKV);
|
|
||||||
extendsAll.put(newTypeExtend);
|
|
||||||
// 类型
|
|
||||||
newTypeExtend = new JSONObject();
|
|
||||||
newTypeExtend.put("key", "category");
|
|
||||||
newTypeExtend.put("name", "类型");
|
|
||||||
newTypeExtendKV = new JSONArray();
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "全部");
|
|
||||||
kv.put("v", "");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
JSONArray scat = filterObj.getJSONArray("scat");
|
|
||||||
for (int j = 0; j < scat.length(); j++) {
|
|
||||||
JSONObject child = scat.getJSONObject(j);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", child.getString("name"));
|
|
||||||
kv.put("v", child.getString("value"));
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
}
|
|
||||||
newTypeExtend.put("value", newTypeExtendKV);
|
|
||||||
extendsAll.put(newTypeExtend);
|
|
||||||
}
|
|
||||||
if (extendsAll != null && extendsAll.length() > 0) {
|
|
||||||
filterConfig.put(typeId, extendsAll);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("class", classes);
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/api.php/provide/homeBlock?type_id=0";
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject jsonObject = new JSONObject(decryptResponse(content));
|
|
||||||
JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("blocks");
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject blockObj = jsonArray.getJSONObject(i);
|
|
||||||
String blockName = blockObj.getString("block_name");
|
|
||||||
if (!blockName.startsWith("热播")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
JSONArray contents = blockObj.getJSONArray("contents");
|
|
||||||
for (int j = 0; j < contents.length() && j < 3; j++) {
|
|
||||||
JSONObject vObj = contents.getJSONObject(j);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("id"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("videoCover"));
|
|
||||||
v.put("vod_remarks", vObj.getString("msg"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/api.php/provide/searchFilter?type_id=" + tid + "&pagenum=" + pg + "&pagesize=24";
|
|
||||||
Set<String> keys = extend.keySet();
|
|
||||||
for (String key : keys) {
|
|
||||||
String val = extend.get(key).trim();
|
|
||||||
if (val.length() == 0)
|
|
||||||
continue;
|
|
||||||
url += "&" + key + "=" + URLEncoder.encode(val);
|
|
||||||
}
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject dataObject = new JSONObject(decryptResponse(content)).getJSONObject("data");
|
|
||||||
JSONArray jsonArray = dataObject.getJSONArray("result");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("id"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("videoCover"));
|
|
||||||
v.put("vod_remarks", vObj.getString("msg"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int limit = 24;
|
|
||||||
int page = Integer.parseInt(dataObject.getString("page"));
|
|
||||||
int total = dataObject.getInt("total");
|
|
||||||
int pageCount = dataObject.getInt("pagesize");
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", limit);
|
|
||||||
result.put("total", total);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/api.php/provide/videoDetail?ids=" + ids.get(0);
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject dataObject = new JSONObject(decryptResponse(content));
|
|
||||||
JSONObject vObj = dataObject.getJSONObject("data");
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
String title = vObj.getString("videoName");
|
|
||||||
vodAtom.put("vod_id", vObj.getString("id"));
|
|
||||||
vodAtom.put("vod_name", title);
|
|
||||||
vodAtom.put("vod_pic", vObj.getString("videoCover"));
|
|
||||||
vodAtom.put("type_name", vObj.getString("subCategory"));
|
|
||||||
vodAtom.put("vod_year", vObj.getString("year"));
|
|
||||||
vodAtom.put("vod_area", vObj.getString("area"));
|
|
||||||
vodAtom.put("vod_remarks", vObj.getString("msg"));
|
|
||||||
vodAtom.put("vod_actor", vObj.getString("actor"));
|
|
||||||
vodAtom.put("vod_director", vObj.getString("director"));
|
|
||||||
vodAtom.put("vod_content", vObj.getString("brief").trim());
|
|
||||||
|
|
||||||
url = siteUrl + "/api.php/provide/videoPlaylist?ids=" + ids.get(0);
|
|
||||||
content = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONArray episodes = new JSONObject(content).getJSONObject("data").getJSONArray("episodes");
|
|
||||||
LinkedHashMap<String, ArrayList<String>> playlist = new LinkedHashMap<>();
|
|
||||||
for (int i = 0; i < episodes.length(); i++) {
|
|
||||||
JSONArray playurls = episodes.getJSONObject(i).getJSONArray("playurls");
|
|
||||||
for (int j = 0; j < playurls.length(); j++) {
|
|
||||||
JSONObject purl = playurls.getJSONObject(j);
|
|
||||||
String from = purl.getString("playfrom");
|
|
||||||
ArrayList<String> urls = playlist.get(from);
|
|
||||||
if (urls == null) {
|
|
||||||
urls = new ArrayList<>();
|
|
||||||
playlist.put(from, urls);
|
|
||||||
}
|
|
||||||
String name = purl.getString("title").replace(title, "").trim();
|
|
||||||
if (name.isEmpty()) {
|
|
||||||
name = (i + 1) + "";
|
|
||||||
}
|
|
||||||
String pid = purl.getString("playurl");
|
|
||||||
urls.add(name + "$" + pid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String vod_play_from = TextUtils.join("$$$", playlist.keySet());
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
Iterator<ArrayList<String>> iter = playlist.values().iterator();
|
|
||||||
short fromSize = (short) playlist.size();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
fromSize--;
|
|
||||||
ArrayList<String> urls = iter.next();
|
|
||||||
sb.append(TextUtils.join("#", urls));
|
|
||||||
if (fromSize > 0)
|
|
||||||
sb.append("$$$");
|
|
||||||
}
|
|
||||||
vodAtom.put("vod_play_from", vod_play_from);
|
|
||||||
vodAtom.put("vod_play_url", sb.toString());
|
|
||||||
list.put(vodAtom);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
String videoUrl = id;
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/api.php/provide/parserUrl?url=" + id;
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject dataObj = new JSONObject(decryptResponse(content)).getJSONObject("data");
|
|
||||||
JSONObject playHeader = dataObj.optJSONObject("playHeader");
|
|
||||||
String jxUrl = dataObj.getString("url");
|
|
||||||
content = OkHttpUtil.string(jxUrl, getHeaders(jxUrl));
|
|
||||||
JSONObject result = Misc.jsonParse(jxUrl, content);
|
|
||||||
if (result != null) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
if (playHeader != null) {
|
|
||||||
JSONObject header = result.getJSONObject("header");
|
|
||||||
Iterator<String> iter = playHeader.keys();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
String key = iter.next();
|
|
||||||
header.put(key, " " + playHeader.getString(key));
|
|
||||||
}
|
|
||||||
result.put("header", header.toString());
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
if (Misc.isVip(videoUrl)) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("jx", "1");
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/api.php/provide/searchVideo?searchName=" + URLEncoder.encode(key);
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject dataObject = new JSONObject(decryptResponse(content));
|
|
||||||
JSONArray jsonArray = dataObject.getJSONArray("data");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
String title = vObj.getString("videoName");
|
|
||||||
if (!title.contains(key))
|
|
||||||
continue;
|
|
||||||
v.put("vod_id", vObj.getString("id"));
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", vObj.getString("videoCover"));
|
|
||||||
v.put("vod_remarks", vObj.getString("msg"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String decryptResponse(String src) {
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,504 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class Lib extends Spider {
|
|
||||||
private static final String siteUrl = "https://www.libvio.me/";
|
|
||||||
private static final String siteHost = "www.libvio.me";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 播放源配置
|
|
||||||
*/
|
|
||||||
private JSONObject playerConfig;
|
|
||||||
/**
|
|
||||||
* 筛选配置
|
|
||||||
*/
|
|
||||||
private JSONObject filterConfig;
|
|
||||||
private Pattern regexCategory = Pattern.compile("/type/(\\d+).html");
|
|
||||||
private Pattern regexVid = Pattern.compile("/detail/(\\d+).html");
|
|
||||||
private Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html");
|
|
||||||
private Pattern regexPage = Pattern.compile("/show/(\\S+).html");
|
|
||||||
|
|
||||||
protected String ext = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
playerConfig = new JSONObject("{\"LINE405\":{\"sh\":\"LINE405\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"LINE406\":{\"sh\":\"LINE406\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/zm.php?url=\",\"sn\":1,\"or\":999},\"LINE407\":{\"sh\":\"LINE407\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"LINE408\":{\"sh\":\"LINE408\",\"pu\":\"\",\"sn\":0,\"or\":999},\"p300\":{\"sh\":\"LINE300\",\"pu\":\"\",\"sn\":0,\"or\":999},\"p301\":{\"sh\":\"LINE301\",\"pu\":\"\",\"sn\":0,\"or\":999},\"line402-日语\":{\"sh\":\"LINE402\",\"pu\":\"\",\"sn\":0,\"or\":999},\"LINE400\":{\"sh\":\"LINE400\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"line401\":{\"sh\":\"LINE401\",\"pu\":\"\",\"sn\":0,\"or\":999}}");
|
|
||||||
filterConfig = new JSONObject("{\"1\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国\",\"v\":\"中国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"15\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"16\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected static HashMap<String, String> Headers() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
|
|
||||||
headers.put("Referer", siteUrl);
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 爬虫headers
|
|
||||||
*
|
|
||||||
* @param url
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("method", "GET");
|
|
||||||
headers.put("Upgrade-Insecure-Requests", "1");
|
|
||||||
headers.put("DNT", "1");
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
|
|
||||||
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类数据 + 首页最近更新视频列表数据
|
|
||||||
*
|
|
||||||
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
|
||||||
// 分类节点
|
|
||||||
Elements elements = doc.select("ul.stui-header__menu li a");
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (Element ele : elements) {
|
|
||||||
String name = ele.text();
|
|
||||||
boolean show = name.equals("电影") ||
|
|
||||||
name.equals("剧集") ||
|
|
||||||
name.equals("动漫") ||
|
|
||||||
name.equals("日韩剧") ||
|
|
||||||
name.equals("欧美剧");
|
|
||||||
if (show) {
|
|
||||||
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
|
||||||
if (!mather.find())
|
|
||||||
continue;
|
|
||||||
// 把分类的id和名称取出来加到列表里
|
|
||||||
String id = mather.group(1).trim();
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
try {
|
|
||||||
// 取首页推荐视频列表
|
|
||||||
Element homeList = doc.select("ul.stui-vodlist").get(0);
|
|
||||||
Elements list = homeList.select("div.stui-vodlist__box");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.select("a").attr("title");
|
|
||||||
String cover = vod.select("a").attr("data-original");
|
|
||||||
String remark = vod.select("a .pic-text").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类信息数据
|
|
||||||
*
|
|
||||||
* @param tid 分类id
|
|
||||||
* @param pg 页数
|
|
||||||
* @param filter 同homeContent方法中的filter
|
|
||||||
* @param extend 筛选参数{k:v, k1:v1}
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
|
|
||||||
urlParams[0] = tid;
|
|
||||||
urlParams[8] = pg;
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 获取分类数据的url
|
|
||||||
String url = siteUrl + "show/" + TextUtils.join("-", urlParams) + ".html";
|
|
||||||
String html = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
Document doc = Jsoup.parse(html);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int pageCount = 0;
|
|
||||||
int page = -1;
|
|
||||||
|
|
||||||
// 取页码相关信息
|
|
||||||
Elements pageInfo = doc.select("ul.stui-page__item li");
|
|
||||||
if (pageInfo.size() == 0) {
|
|
||||||
page = Integer.parseInt(pg);
|
|
||||||
pageCount = page;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < pageInfo.size(); i++) {
|
|
||||||
Element li = pageInfo.get(i);
|
|
||||||
Element a = li.selectFirst("a");
|
|
||||||
if (a == null)
|
|
||||||
continue;
|
|
||||||
String name = a.text();
|
|
||||||
if (page == -1 && li.hasClass("active")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
//System.out.println("哈哈"+matcher.group(1));
|
|
||||||
page = Integer.parseInt(matcher.group(1).split("-")[8]);
|
|
||||||
} else {
|
|
||||||
page = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (name.equals("尾页")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
//System.out.println("尾页" + matcher.group(1));
|
|
||||||
pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
|
|
||||||
} else {
|
|
||||||
pageCount = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (!html.contains("没有找到您想要的结果哦")) {
|
|
||||||
// 取当前分类页的视频列表
|
|
||||||
Elements list = doc.select("div.stui-vodlist__box");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.select("a").attr("title");
|
|
||||||
String cover = vod.select("a").attr("data-original");
|
|
||||||
String remark = vod.select("a .pic-text").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", 48);
|
|
||||||
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频详情信息
|
|
||||||
*
|
|
||||||
* @param ids 视频id
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
// 视频详情url
|
|
||||||
String url = siteUrl + "/detail/" + ids.get(0) + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vodList = new JSONObject();
|
|
||||||
|
|
||||||
// 取基本数据
|
|
||||||
String cover = doc.select("div.stui-content__thumb a img").attr("data-original");
|
|
||||||
String title = doc.select("div.stui-content__detail h1").text();
|
|
||||||
String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
|
|
||||||
Elements data = doc.select("p.data");
|
|
||||||
Pattern cate = Pattern.compile("类型:(\\S+)");
|
|
||||||
category = doReplaceRegex(cate, data.get(0).text());
|
|
||||||
Pattern areas = Pattern.compile("地区:(\\S+)");
|
|
||||||
area = doReplaceRegex(areas, data.get(0).text());
|
|
||||||
Pattern years = Pattern.compile("年份:(\\S+)");
|
|
||||||
year = doReplaceRegex(years, data.get(0).text());
|
|
||||||
Pattern rms = Pattern.compile("更新:(\\S+)");
|
|
||||||
remark = doReplaceRegex(rms, data.get(3).text());
|
|
||||||
Pattern acs = Pattern.compile("主演:(\\S+)");
|
|
||||||
actor = doReplaceRegex(acs, data.get(1).text());
|
|
||||||
Pattern dis = Pattern.compile("导演:(\\S+)");
|
|
||||||
director = doReplaceRegex(dis, data.get(1).text());
|
|
||||||
|
|
||||||
desc = doc.selectFirst("span.detail-content").text().trim();
|
|
||||||
|
|
||||||
vodList.put("vod_id", ids.get(0));
|
|
||||||
vodList.put("vod_name", title);
|
|
||||||
vodList.put("vod_pic", cover);
|
|
||||||
vodList.put("type_name", category);
|
|
||||||
vodList.put("vod_year", year);
|
|
||||||
vodList.put("vod_area", area);
|
|
||||||
vodList.put("vod_remarks", remark);
|
|
||||||
vodList.put("vod_actor", actor);
|
|
||||||
vodList.put("vod_director", director);
|
|
||||||
vodList.put("vod_content", desc);
|
|
||||||
|
|
||||||
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
|
||||||
@Override
|
|
||||||
public int compare(String o1, String o2) {
|
|
||||||
try {
|
|
||||||
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
|
||||||
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
|
||||||
|
|
||||||
if (sort1 == sort2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return sort1 - sort2 > 0 ? 1 : -1;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 取播放列表数据
|
|
||||||
Elements sources = doc.select("div.stui-vodlist__head h3");
|
|
||||||
Elements sourceList = doc.select("ul.stui-content__playlist");
|
|
||||||
|
|
||||||
for (int i = 0; i < sources.size(); i++) {
|
|
||||||
Element source = sources.get(i);
|
|
||||||
String sourceName = source.text();
|
|
||||||
boolean found = false;
|
|
||||||
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
|
||||||
String flag = it.next();
|
|
||||||
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
|
|
||||||
sourceName = flag;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
String playList = "";
|
|
||||||
Elements playListA = sourceList.get(i).select("li a");
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
|
|
||||||
vodItems.add(vod.text() + "$" + playURL);
|
|
||||||
}
|
|
||||||
if (vodItems.size() > 0)
|
|
||||||
playList = TextUtils.join("#", vodItems);
|
|
||||||
|
|
||||||
if (playList.length() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vod_play.put(sourceName, playList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vod_play.size() > 0) {
|
|
||||||
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
|
||||||
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
|
||||||
vodList.put("vod_play_from", vod_play_from);
|
|
||||||
vodList.put("vod_play_url", vod_play_url);
|
|
||||||
}
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vodList);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取视频播放信息
|
|
||||||
*
|
|
||||||
* @param flag 播放源
|
|
||||||
* @param id 视频id
|
|
||||||
* @param vipFlags 所有可能需要vip解析的源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
//定义播放用的headers
|
|
||||||
JSONObject headers = new JSONObject();
|
|
||||||
headers.put("origin", " https://www.libvio.me/");
|
|
||||||
headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", " */*");
|
|
||||||
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
|
|
||||||
headers.put("Accept-Encoding", " gzip, deflate");
|
|
||||||
headers.put("referer", " https://www.libvio.me/");
|
|
||||||
// 播放页 url
|
|
||||||
String url = siteUrl + "/play/" + id + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
|
|
||||||
Elements allScript = doc.select("script");
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) { // 取直链
|
|
||||||
int start = scContent.indexOf('{');
|
|
||||||
int end = scContent.lastIndexOf('}') + 1;
|
|
||||||
String json = scContent.substring(start, end);
|
|
||||||
JSONObject player = new JSONObject(json);
|
|
||||||
if (playerConfig.has(player.getString("from"))) {
|
|
||||||
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
|
|
||||||
if (player.getString("from").contains("LINE")) {
|
|
||||||
String videoUrl = pCfg.getString("pu") + player.getString("url");
|
|
||||||
Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, Headers()));
|
|
||||||
Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')");
|
|
||||||
Elements allScripts = docs.select("body script");
|
|
||||||
for (int j = 0; j < allScripts.size(); j++) {
|
|
||||||
String scContents = allScripts.get(j).html().trim();
|
|
||||||
Matcher matcher = pattern.matcher(scContents);
|
|
||||||
if (matcher.find()) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
String players = matcher.group(0);
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", players);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", url);
|
|
||||||
// result.put("header", "{\"Referer\", \"https://www.libvio.me/\"}");
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static HashMap<String, String> sHeaders() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
|
|
||||||
headers.put("Accept-encoding", "gzip, deflate, br");
|
|
||||||
headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String url = "https://shitu.paodekuaiweixinqun.com/search?q=site%3Alibvio.me%2Fdetail+" + URLEncoder.encode(key);
|
|
||||||
Document docs = Jsoup.parse(OkHttpUtil.string(url, sHeaders()));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
Elements list = docs.select("div.NJo7tc div.yuRUbf");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element doc = list.get(i);
|
|
||||||
String sourceName = doc.select("div.yuRUbf a h3").text();
|
|
||||||
if (sourceName.contains(key)) {
|
|
||||||
String list1 = doc.select("div.yuRUbf a").attr("href");
|
|
||||||
Document link = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(url)));
|
|
||||||
Matcher matcher = regexVid.matcher(list1);
|
|
||||||
Elements data = link.select("p.data");
|
|
||||||
if (matcher.find()) {
|
|
||||||
|
|
||||||
String group = matcher.group(1);
|
|
||||||
String cover = link.select("div.stui-content__thumb a img").attr("data-original");
|
|
||||||
String title = link.select("div.stui-content__detail h1").text();
|
|
||||||
Pattern rms = Pattern.compile("更新:(\\S+)");
|
|
||||||
String remark = doReplaceRegex(rms, data.get(3).text());
|
|
||||||
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
v.put("vod_id", group);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String doReplaceRegex(Pattern pattern, String src) {
|
|
||||||
if (pattern == null)
|
|
||||||
return src;
|
|
||||||
try {
|
|
||||||
Matcher matcher = pattern.matcher(src);
|
|
||||||
if (matcher.find()) {
|
|
||||||
return matcher.group(1).trim();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,466 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OKCallBack;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.math.BigInteger;
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.security.MessageDigest;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import okhttp3.Call;
|
|
||||||
|
|
||||||
public class LiteApple extends Spider {
|
|
||||||
private static final String siteUrl = "http://ht.grelighting.cn/api.php";
|
|
||||||
|
|
||||||
private HashMap<String, String> getHeaders(String url, String data) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
if (data != null) {
|
|
||||||
String token = "";
|
|
||||||
try {
|
|
||||||
token = Base64.encodeToString(b(fakeDevice.getBytes("UTF-8"), tokenKey == null ? "XPINGGUO" : tokenKey), 2);
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
int currentTimeMillis = (int) (System.currentTimeMillis() / ((long) 1000));
|
|
||||||
String hash = md5(fakeDevice + data + currentTimeMillis).substring(8, 12);
|
|
||||||
headers.put("token", token);
|
|
||||||
headers.put("hash", hash);
|
|
||||||
headers.put("timestamp", currentTimeMillis + "");
|
|
||||||
if (tokenKey == null) {
|
|
||||||
headers.put("version", "ANDROID cn.grelighting.xpg1.1.5");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
headers.put("User-Agent", "okhttp/4.9.1");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String fakeDevice = null;
|
|
||||||
private String tokenKey = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
SharedPreferences sharedPreferences = context.getSharedPreferences("spider_LiteApple", Context.MODE_PRIVATE);
|
|
||||||
try {
|
|
||||||
fakeDevice = sharedPreferences.getString("didd", null);
|
|
||||||
} catch (Throwable th) {
|
|
||||||
} finally {
|
|
||||||
if (fakeDevice == null) {
|
|
||||||
fakeDevice = fakeDid();
|
|
||||||
sharedPreferences.edit().putString("didd", fakeDevice).commit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void getTokenKey() {
|
|
||||||
if (tokenKey != null)
|
|
||||||
return;
|
|
||||||
String url = siteUrl + "/v2.user/tokenlogin";
|
|
||||||
OkHttpUtil.post(OkHttpUtil.defaultClient(), url, null, getHeaders(url, "ANDROID cn.grelighting.xpg1.1.5"), new OKCallBack.OKCallBackString() {
|
|
||||||
@Override
|
|
||||||
protected void onFailure(Call call, Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResponse(String response) {
|
|
||||||
try {
|
|
||||||
tokenKey = new JSONObject(response).getJSONObject("data").getString("user_title");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
getTokenKey();
|
|
||||||
String url = siteUrl + "/v2.vod/androidtypes";
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url, null));
|
|
||||||
JSONObject jsonObject = new JSONObject(decryptResponse(content));
|
|
||||||
JSONArray jsonArray = jsonObject.getJSONArray("data");
|
|
||||||
|
|
||||||
JSONObject filterConfig = new JSONObject();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject jObj = jsonArray.getJSONObject(i);
|
|
||||||
String typeName = jObj.getString("type_name");
|
|
||||||
String typeId = jObj.getString("type_id");
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_id", typeId);
|
|
||||||
newCls.put("type_name", typeName);
|
|
||||||
classes.put(newCls);
|
|
||||||
|
|
||||||
JSONArray clses = jObj.getJSONArray("classes");
|
|
||||||
JSONArray areas = jObj.getJSONArray("areas");
|
|
||||||
JSONArray years = jObj.getJSONArray("years");
|
|
||||||
|
|
||||||
JSONArray extendsAll = new JSONArray();
|
|
||||||
// 类型
|
|
||||||
JSONObject newTypeExtend;
|
|
||||||
JSONArray newTypeExtendKV;
|
|
||||||
JSONObject kv;
|
|
||||||
newTypeExtend = new JSONObject();
|
|
||||||
newTypeExtend.put("key", "class");
|
|
||||||
newTypeExtend.put("name", "类型");
|
|
||||||
newTypeExtendKV = new JSONArray();
|
|
||||||
for (int j = 0; j < clses.length(); j++) {
|
|
||||||
String v = clses.getString(j);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", v);
|
|
||||||
kv.put("v", v);
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
}
|
|
||||||
newTypeExtend.put("value", newTypeExtendKV);
|
|
||||||
extendsAll.put(newTypeExtend);
|
|
||||||
// 地区
|
|
||||||
newTypeExtend = new JSONObject();
|
|
||||||
newTypeExtend.put("key", "area");
|
|
||||||
newTypeExtend.put("name", "地区");
|
|
||||||
newTypeExtendKV = new JSONArray();
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "全部");
|
|
||||||
kv.put("v", "");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
for (int j = 0; j < areas.length(); j++) {
|
|
||||||
String area = areas.getString(j);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", area);
|
|
||||||
kv.put("v", area);
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
}
|
|
||||||
newTypeExtend.put("value", newTypeExtendKV);
|
|
||||||
extendsAll.put(newTypeExtend);
|
|
||||||
// 年份
|
|
||||||
newTypeExtend = new JSONObject();
|
|
||||||
newTypeExtend.put("key", "year");
|
|
||||||
newTypeExtend.put("name", "年份");
|
|
||||||
newTypeExtendKV = new JSONArray();
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "全部");
|
|
||||||
kv.put("v", "");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
for (int j = 0; j < years.length(); j++) {
|
|
||||||
String year = years.getString(j);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", year);
|
|
||||||
kv.put("v", year);
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
}
|
|
||||||
newTypeExtend.put("value", newTypeExtendKV);
|
|
||||||
extendsAll.put(newTypeExtend);
|
|
||||||
filterConfig.put(typeId, extendsAll);
|
|
||||||
// 排序
|
|
||||||
newTypeExtend = new JSONObject();
|
|
||||||
newTypeExtend.put("key", "sortby");
|
|
||||||
newTypeExtend.put("name", "排序");
|
|
||||||
newTypeExtendKV = new JSONArray();
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "时间");
|
|
||||||
kv.put("v", "updatetime");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "人气");
|
|
||||||
kv.put("v", "hits");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
kv = new JSONObject();
|
|
||||||
kv.put("n", "评分");
|
|
||||||
kv.put("v", "score");
|
|
||||||
newTypeExtendKV.put(kv);
|
|
||||||
newTypeExtend.put("value", newTypeExtendKV);
|
|
||||||
extendsAll.put(newTypeExtend);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("class", classes);
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int id = 1; id < 5; id++) {
|
|
||||||
if (videos.length() > 30)
|
|
||||||
break;
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/v2.main/androidhome";
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url, null));
|
|
||||||
JSONObject jsonObject = new JSONObject(decryptResponse(content));
|
|
||||||
JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("list");
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONArray jsonArraySub = jsonArray.getJSONObject(i).getJSONArray("list");
|
|
||||||
for (int j = 0; j < jsonArraySub.length() && j < 4; j++) {
|
|
||||||
JSONObject vObj = jsonArraySub.getJSONObject(j);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("id"));
|
|
||||||
v.put("vod_name", vObj.getString("name"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("updateInfo"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
getTokenKey();
|
|
||||||
String area = extend.containsKey("area") ? extend.get("area") : "";
|
|
||||||
String year = extend.containsKey("year") ? extend.get("year") : "";
|
|
||||||
String url = siteUrl + "/v2.vod/androidfilter?page=" + pg + "&type=" + tid;
|
|
||||||
Set<String> keys = extend.keySet();
|
|
||||||
for (String key : keys) {
|
|
||||||
String val = extend.get(key).trim();
|
|
||||||
if (val.length() == 0)
|
|
||||||
continue;
|
|
||||||
url += "&" + key + "=" + URLEncoder.encode(val);
|
|
||||||
}
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url, area + year));
|
|
||||||
JSONObject dataObject = new JSONObject(decryptResponse(content));
|
|
||||||
JSONArray jsonArray = dataObject.getJSONArray("data");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("id"));
|
|
||||||
v.put("vod_name", vObj.getString("name"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("updateInfo"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int limit = 20;
|
|
||||||
int page = Integer.parseInt(pg);
|
|
||||||
result.put("page", page);
|
|
||||||
int pageCount = videos.length() == limit ? page + 1 : page;
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", limit);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/v2.vod/androiddetail?vod_id=" + ids.get(0);
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url, ids.get(0)));
|
|
||||||
JSONObject dataObject = new JSONObject(decryptResponse(content));
|
|
||||||
JSONObject vObj = dataObject.getJSONObject("data");
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
vodAtom.put("vod_id", vObj.getString("id"));
|
|
||||||
vodAtom.put("vod_name", vObj.getString("name"));
|
|
||||||
vodAtom.put("vod_pic", vObj.getString("pic"));
|
|
||||||
vodAtom.put("type_name", vObj.getString("className"));
|
|
||||||
vodAtom.put("vod_year", vObj.getString("year"));
|
|
||||||
vodAtom.put("vod_area", vObj.getString("area"));
|
|
||||||
vodAtom.put("vod_remarks", vObj.getString("updateInfo"));
|
|
||||||
vodAtom.put("vod_actor", vObj.getString("actor"));
|
|
||||||
vodAtom.put("vod_content", vObj.getString("content").trim());
|
|
||||||
|
|
||||||
ArrayList<String> playUrls = new ArrayList<>();
|
|
||||||
|
|
||||||
JSONArray urls = vObj.getJSONArray("urls");
|
|
||||||
for (int i = 0; i < urls.length(); i++) {
|
|
||||||
JSONObject u = urls.getJSONObject(i);
|
|
||||||
playUrls.add(u.getString("key") + "$" + u.getString("url"));
|
|
||||||
}
|
|
||||||
|
|
||||||
vodAtom.put("vod_play_from", "LiteApple");
|
|
||||||
vodAtom.put("vod_play_url", TextUtils.join("#", playUrls));
|
|
||||||
list.put(vodAtom);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
if (Misc.isVideoFormat(id)) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("header", "");
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
getTokenKey();
|
|
||||||
String url = siteUrl + "/v2.vod/androidsearch?page=1&wd=" + URLEncoder.encode(key);
|
|
||||||
String content = OkHttpUtil.string(url, getHeaders(url, key));
|
|
||||||
JSONObject dataObject = new JSONObject(decryptResponse(content));
|
|
||||||
JSONArray jsonArray = dataObject.getJSONArray("data");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
String title = vObj.getString("name");
|
|
||||||
if (!title.contains(key))
|
|
||||||
continue;
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("id"));
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("updateInfo"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String decryptResponse(String src) {
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] a(String str) {
|
|
||||||
byte[] bytes = str.getBytes();
|
|
||||||
byte[] bArr = new byte[333];
|
|
||||||
for (int i9 = 0; i9 < 333; i9++) {
|
|
||||||
bArr[i9] = (byte) i9;
|
|
||||||
}
|
|
||||||
if (bytes.length == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
int i10 = 0;
|
|
||||||
int i11 = 0;
|
|
||||||
for (int i12 = 0; i12 < 333; i12++) {
|
|
||||||
i11 = (((bytes[i10] & 255) + (bArr[i12] & 255)) + i11) % 333;
|
|
||||||
byte b = bArr[i12];
|
|
||||||
bArr[i12] = bArr[i11];
|
|
||||||
bArr[i11] = b;
|
|
||||||
i10 = (i10 + 1) % bytes.length;
|
|
||||||
}
|
|
||||||
return bArr;
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] b(byte[] bArr, String str) {
|
|
||||||
byte[] a = a(str);
|
|
||||||
byte[] bArr2 = new byte[bArr.length];
|
|
||||||
int i9 = 0;
|
|
||||||
int i10 = 0;
|
|
||||||
for (int i11 = 0; i11 < bArr.length; i11++) {
|
|
||||||
i9 = (i9 + 1) % 333;
|
|
||||||
i10 = ((a[i9] & 255) + i10) % 333;
|
|
||||||
byte b = a[i9];
|
|
||||||
a[i9] = a[i10];
|
|
||||||
a[i10] = b;
|
|
||||||
bArr2[i11] = (byte) (a[((a[i9] & 255) + (a[i10] & 255)) % 333] ^ bArr[i11]);
|
|
||||||
}
|
|
||||||
return bArr2;
|
|
||||||
}
|
|
||||||
|
|
||||||
String randomString(int length) {
|
|
||||||
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456";
|
|
||||||
Random random = new Random();
|
|
||||||
StringBuffer sb = new StringBuffer();
|
|
||||||
for (int i = 0; i < length; i++) {
|
|
||||||
int number = random.nextInt(str.length());
|
|
||||||
sb.append(str.charAt(number));
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
String randomMACAddress() {
|
|
||||||
Random rand = new Random();
|
|
||||||
byte[] macAddr = new byte[6];
|
|
||||||
rand.nextBytes(macAddr);
|
|
||||||
macAddr[0] = (byte) (macAddr[0] & (byte) 254); //zeroing last 2 bytes to make it unicast and locally adminstrated
|
|
||||||
StringBuilder sb = new StringBuilder(18);
|
|
||||||
for (byte b : macAddr) {
|
|
||||||
sb.append(String.format("%02X", b));
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
String fakeDid() {
|
|
||||||
String i = "";
|
|
||||||
String f = "";
|
|
||||||
String d = "N/A";
|
|
||||||
try {
|
|
||||||
d = Build.class.getField("SERIAL").get((Object) null).toString();
|
|
||||||
} catch (Exception unused) {
|
|
||||||
}
|
|
||||||
String e = "";
|
|
||||||
try {
|
|
||||||
e = (String) Class.forName("android.os.SystemProperties").getDeclaredMethod("get", new Class[]{String.class}).invoke((Object) null, new Object[]{"ro.build.fingerprint"});
|
|
||||||
} catch (Exception unused) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return (((((((((("" + i) + "||") + f) + "||") + randomMACAddress()) + "||") + randomString(16)) + "||") + d) + "||") + e;
|
|
||||||
}
|
|
||||||
|
|
||||||
String md5(String str) {
|
|
||||||
try {
|
|
||||||
MessageDigest instance = MessageDigest.getInstance("MD5");
|
|
||||||
instance.update(str.getBytes());
|
|
||||||
return new BigInteger(1, instance.digest()).toString(16);
|
|
||||||
} catch (Exception e9) {
|
|
||||||
e9.printStackTrace();
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,503 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class Nfyun extends Spider {
|
|
||||||
private static final String siteUrl = "https://yanaifei.cn";
|
|
||||||
private static final String siteHost = "yanaifei.cn";
|
|
||||||
private static Pattern pic = Pattern.compile("(?<=url=).*");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 播放源配置
|
|
||||||
*/
|
|
||||||
private JSONObject playerConfig;
|
|
||||||
/**
|
|
||||||
* 筛选配置
|
|
||||||
*/
|
|
||||||
private JSONObject filterConfig;
|
|
||||||
private Pattern regexCategory = Pattern.compile("/vod/type/(\\d+).html");
|
|
||||||
private Pattern regexVid = Pattern.compile("/vod/detail/(\\d+).html");
|
|
||||||
private Pattern regexPlay = Pattern.compile("/vod/play/(\\d+)-(\\d+)-(\\d+).html");
|
|
||||||
private Pattern regexPage = Pattern.compile("/vod/show/(\\S+).html");
|
|
||||||
|
|
||||||
protected String ext = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
playerConfig = new JSONObject("{\"VIP\":{\"sh\":\"VIP\",\"pu\":\"https://yanaifei.cn/player/?url=\",\"sn\":0,\"or\":999}}");
|
|
||||||
filterConfig = new JSONObject("{\"1\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"动画片\",\"v\":\"32\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"泰国剧\",\"v\":\"20\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"3\"},{\"n\":\"大陆综艺\",\"v\":\"22\"},{\"n\":\"港台综艺\",\"v\":\"23\"},{\"n\":\"日韩综艺\",\"v\":\"24\"},{\"n\":\"欧美综艺\",\"v\":\"25\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"大陆动漫\",\"v\":\"26\"},{\"n\":\"港台动漫\",\"v\":\"27\"},{\"n\":\"日韩动漫\",\"v\":\"28\"},{\"n\":\"欧美动漫\",\"v\":\"29\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected static HashMap<String, String> Headers() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
|
|
||||||
headers.put("Referer", siteUrl);
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 爬虫headers
|
|
||||||
*
|
|
||||||
* @param url
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("method", "GET");
|
|
||||||
headers.put("Upgrade-Insecure-Requests", "1");
|
|
||||||
headers.put("DNT", "1");
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
|
|
||||||
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类数据 + 首页最近更新视频列表数据
|
|
||||||
*
|
|
||||||
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
Pattern redL = Pattern.compile("(?<=location.href =\").*?(?=\")");
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
|
||||||
/* Elements X = A.select("script");
|
|
||||||
String url = "";
|
|
||||||
for (int i = 0; i < X.size(); i++) {
|
|
||||||
String finalUrl = X.get(i).html().trim();
|
|
||||||
Matcher matcher3 = redL.matcher(finalUrl);
|
|
||||||
if (matcher3.find()) {
|
|
||||||
url = siteUrl + matcher3.group(0);
|
|
||||||
} else {
|
|
||||||
url = siteUrl;
|
|
||||||
}
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); */
|
|
||||||
// 分类节点
|
|
||||||
Elements elements = doc.select("ul.navbar-items li a");
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (Element ele : elements) {
|
|
||||||
String name = ele.attr("title");
|
|
||||||
boolean show = name.equals("电影") ||
|
|
||||||
name.equals("连续剧") ||
|
|
||||||
name.equals("综艺") ||
|
|
||||||
name.equals("动漫");
|
|
||||||
if (show) {
|
|
||||||
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
|
||||||
if (!mather.find())
|
|
||||||
continue;
|
|
||||||
// 把分类的id和名称取出来加到列表里
|
|
||||||
String id = mather.group(1).trim();
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
try {
|
|
||||||
// 取首页推荐视频列表
|
|
||||||
Element homeList = doc.select("div.module").get(0);
|
|
||||||
Elements list = homeList.select("div.module-main div.module-items a");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int j = 0; j < list.size(); j++) {
|
|
||||||
Element vod = list.get(j);
|
|
||||||
String title = vod.attr("title");
|
|
||||||
String cover = FixUrl(pic, vod.select("div.module-item-pic img").attr("data-original"));
|
|
||||||
String remark = vod.select("div.module-item-note").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
// }
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类信息数据
|
|
||||||
*
|
|
||||||
* @param tid 分类id
|
|
||||||
* @param pg 页数
|
|
||||||
* @param filter 同homeContent方法中的filter
|
|
||||||
* @param extend 筛选参数{k:v, k1:v1}
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
|
|
||||||
urlParams[0] = tid;
|
|
||||||
urlParams[8] = pg;
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 获取分类数据的url
|
|
||||||
String url = siteUrl + "/vod/show/" + TextUtils.join("-", urlParams) + ".html";
|
|
||||||
String html = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
Document doc = Jsoup.parse(html);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int pageCount = 0;
|
|
||||||
int page = -1;
|
|
||||||
|
|
||||||
// 取页码相关信息
|
|
||||||
Elements pageInfo = doc.select("div[id=page]");
|
|
||||||
if (pageInfo.size() == 0) {
|
|
||||||
page = Integer.parseInt(pg);
|
|
||||||
pageCount = page;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < pageInfo.size(); i++) {
|
|
||||||
Element li = pageInfo.get(i);
|
|
||||||
Element a = li.selectFirst("a");
|
|
||||||
if (a == null)
|
|
||||||
continue;
|
|
||||||
String span = doc.select("span.page-current").text();
|
|
||||||
String wy = doc.select("div[id=page] a").last().attr("href");
|
|
||||||
if (page == -1) {
|
|
||||||
page = Integer.parseInt(span);
|
|
||||||
} else {
|
|
||||||
page = 0;
|
|
||||||
}
|
|
||||||
Matcher matcher = regexPage.matcher(wy);
|
|
||||||
if (matcher.find()) {
|
|
||||||
pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
|
|
||||||
} else {
|
|
||||||
pageCount = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (!html.contains("没有找到您想要的结果哦")) {
|
|
||||||
// 取当前分类页的视频列表
|
|
||||||
Elements list = doc.select("div.module-main div.module-items a");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.attr("title");
|
|
||||||
String cover = FixUrl(pic, vod.select("div.module-item-pic img").attr("data-original"));
|
|
||||||
String remark = vod.select("div.module-item-note").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", 48);
|
|
||||||
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频详情信息
|
|
||||||
*
|
|
||||||
* @param ids 视频id
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
// 视频详情url
|
|
||||||
String url = siteUrl + "/vod/detail/" + ids.get(0) + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vodList = new JSONObject();
|
|
||||||
|
|
||||||
String cover = FixUrl(pic, doc.selectFirst("div.module-info-poster div div img").attr("data-original"));
|
|
||||||
String title = doc.selectFirst("div.module-info-heading h1").text();
|
|
||||||
|
|
||||||
String category = "", area = "", year = "", director = "", actor = "", remark = "", desc = "";
|
|
||||||
|
|
||||||
category = doc.select("div.module-info-tag-link").get(2).text();
|
|
||||||
year = doc.select("div.module-info-tag-link a").get(0).text();
|
|
||||||
area = doc.select("div.module-info-tag-link a").get(1).text();
|
|
||||||
desc = doc.select("div.module-info-introduction-content p").text();
|
|
||||||
|
|
||||||
Elements span_text_muted = doc.select("div.module-info-item span");
|
|
||||||
for (int i = 0; i < span_text_muted.size() - 2; i++) {
|
|
||||||
Element Spantext = span_text_muted.get(i);
|
|
||||||
String info = Spantext.text();
|
|
||||||
if (info.contains("更新:")) {
|
|
||||||
try {
|
|
||||||
remark = Spantext.parent().select("div").text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
remark = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("导演:")) {
|
|
||||||
try {
|
|
||||||
director = Spantext.parent().select("div a").text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
director = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("主演:")) {
|
|
||||||
try {
|
|
||||||
actor = Spantext.parent().select("div a").text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
actor = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vodList.put("vod_id", ids.get(0));
|
|
||||||
vodList.put("vod_name", title);
|
|
||||||
vodList.put("vod_pic", cover);
|
|
||||||
vodList.put("type_name", category);
|
|
||||||
vodList.put("vod_year", year);
|
|
||||||
vodList.put("vod_area", area);
|
|
||||||
vodList.put("vod_remarks", remark);
|
|
||||||
vodList.put("vod_actor", actor);
|
|
||||||
vodList.put("vod_director", director);
|
|
||||||
vodList.put("vod_content", desc);
|
|
||||||
|
|
||||||
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
|
||||||
@Override
|
|
||||||
public int compare(String o1, String o2) {
|
|
||||||
try {
|
|
||||||
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
|
||||||
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
|
||||||
|
|
||||||
if (sort1 == sort2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return sort1 - sort2 > 0 ? 1 : -1;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 取播放列表数据
|
|
||||||
Elements sources = doc.select("div.module-tab-items-box div span");
|
|
||||||
Elements sourceList = doc.select("div.module-play-list");
|
|
||||||
|
|
||||||
for (int i = 0; i < sources.size(); i++) {
|
|
||||||
Element source = sources.get(i);
|
|
||||||
String sourceName = source.text();
|
|
||||||
boolean found = false;
|
|
||||||
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
|
||||||
String flag = it.next();
|
|
||||||
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
|
|
||||||
sourceName = flag;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
String playList = "";
|
|
||||||
Elements playListA = sourceList.get(i).select("div a");
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
|
|
||||||
String vodName = vod.select("span").text();
|
|
||||||
vodItems.add(vodName + "$" + playURL);
|
|
||||||
}
|
|
||||||
if (vodItems.size() > 0)
|
|
||||||
playList = TextUtils.join("#", vodItems);
|
|
||||||
|
|
||||||
if (playList.length() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vod_play.put(sourceName, playList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vod_play.size() > 0) {
|
|
||||||
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
|
||||||
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
|
||||||
vodList.put("vod_play_from", vod_play_from);
|
|
||||||
vodList.put("vod_play_url", vod_play_url);
|
|
||||||
}
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vodList);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取视频播放信息
|
|
||||||
*
|
|
||||||
* @param flag 播放源
|
|
||||||
* @param id 视频id
|
|
||||||
* @param vipFlags 所有可能需要vip解析的源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
//定义播放用的headers
|
|
||||||
JSONObject headers = new JSONObject();
|
|
||||||
//headers.put("Host", " cokemv.co");
|
|
||||||
headers.put("origin", siteUrl);
|
|
||||||
headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", " */*");
|
|
||||||
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
|
|
||||||
headers.put("Accept-Encoding", " gzip, deflate");
|
|
||||||
|
|
||||||
|
|
||||||
// 播放页 url
|
|
||||||
String url = siteUrl + "/vod/play/" + id + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
|
|
||||||
Elements allScript = doc.select("script");
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) { // 取直链
|
|
||||||
int start = scContent.indexOf('{');
|
|
||||||
int end = scContent.lastIndexOf('}') + 1;
|
|
||||||
String json = scContent.substring(start, end);
|
|
||||||
JSONObject player = new JSONObject(json);
|
|
||||||
if (playerConfig.has(player.getString("from"))) {
|
|
||||||
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
|
|
||||||
String videoUrl = pCfg.getString("pu") + player.getString("url");
|
|
||||||
Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, getHeaders(videoUrl)));
|
|
||||||
Pattern pattern = Pattern.compile("(?<=url\"\\S\").*?(?=\")");
|
|
||||||
Elements allScripts = docs.select("body script");
|
|
||||||
for (int j = 0; j < allScripts.size(); j++) {
|
|
||||||
String scContents = allScripts.get(j).html().trim();
|
|
||||||
Matcher matcher = pattern.matcher(scContents);
|
|
||||||
if (matcher.find()) {
|
|
||||||
String players = matcher.group(0);
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", players);
|
|
||||||
result.put("header", headers.toString());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
long currentTime = System.currentTimeMillis();
|
|
||||||
String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime;
|
|
||||||
JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (searchResult.getInt("total") > 0) {
|
|
||||||
JSONArray lists = new JSONArray(searchResult.getString("list"));
|
|
||||||
for (int i = 0; i < lists.length(); i++) {
|
|
||||||
JSONObject vod = lists.getJSONObject(i);
|
|
||||||
String id = vod.getString("id");
|
|
||||||
String title = vod.getString("name");
|
|
||||||
String cover = vod.getString("pic");
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String FixUrl(Pattern pattern, String src) {
|
|
||||||
if (pattern == null)
|
|
||||||
return src;
|
|
||||||
try {
|
|
||||||
Matcher matcher = pattern.matcher(src);
|
|
||||||
if (matcher.find()) {
|
|
||||||
return matcher.group(0).trim();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,503 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class Olevod extends Spider {
|
|
||||||
private static final String siteUrl = "https://olevod.com";
|
|
||||||
private static final String siteHost = "olevod.com";
|
|
||||||
|
|
||||||
|
|
||||||
boolean pron = false;
|
|
||||||
/**
|
|
||||||
* 播放源配置
|
|
||||||
*/
|
|
||||||
private JSONObject playerConfig;
|
|
||||||
/**
|
|
||||||
* 筛选配置
|
|
||||||
*/
|
|
||||||
private JSONObject filterConfig;
|
|
||||||
private Pattern regexCategory = Pattern.compile("/index.php/vod/type/id/(\\d+).html");
|
|
||||||
private Pattern regexVid = Pattern.compile("/index.php/vod/detail/id/(\\d+).html");
|
|
||||||
private Pattern regexPlay = Pattern.compile("/index.php/vod/play/id/(\\d+)/sid/(\\d+)/nid/(\\d+).html");
|
|
||||||
private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
if (extend != null && extend.trim().equals("ojbkporn")) {
|
|
||||||
pron = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
playerConfig = new JSONObject("{\"plyr\":{\"sh\":\"欧乐官方播放器\",\"sn\":0,\"pu\":\"\",\"or\":999},\"openplayer\":{\"sh\":\"欧乐影院\",\"sn\":0,\"pu\":\"\",\"or\":999},\"videojs\":{\"sh\":\"欧乐直播播放\",\"sn\":0,\"pu\":\"\",\"or\":999}}");
|
|
||||||
filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"动作片\",\"v\":\"101\"},{\"n\":\"喜剧片\",\"v\":\"102\"},{\"n\":\"爱情片\",\"v\":\"103\"},{\"n\":\"科幻片\",\"v\":\"104\"},{\"n\":\"恐怖片\",\"v\":\"105\"},{\"n\":\"剧情片\",\"v\":\"106\"},{\"n\":\"战争片\",\"v\":\"107\"},{\"n\":\"动画片\",\"v\":\"108\"},{\"n\":\"悬疑片\",\"v\":\"109\"},{\"n\":\"惊悚片\",\"v\":\"110\"},{\"n\":\"纪录片\",\"v\":\"111\"},{\"n\":\"奇幻片\",\"v\":\"112\"},{\"n\":\"犯罪片\",\"v\":\"113\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"西语\",\"v\":\"西语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印地语\",\"v\":\"印地语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"202\"},{\"n\":\"欧美剧\",\"v\":\"201\"},{\"n\":\"港台剧\",\"v\":\"203\"},{\"n\":\"日韩剧\",\"v\":\"204\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"西语\",\"v\":\"西语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印地语\",\"v\":\"印地语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}],\"3\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"真人秀\",\"v\":\"305\"},{\"n\":\"音乐\",\"v\":\"302\"},{\"n\":\"搞笑\",\"v\":\"304\"},{\"n\":\"家庭\",\"v\":\"301\"},{\"n\":\"曲艺\",\"v\":\"303\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"西语\",\"v\":\"西语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印地语\",\"v\":\"印地语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}],\"4\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"日本\",\"v\":\"401\"},{\"n\":\"国产\",\"v\":\"402\"},{\"n\":\"欧美\",\"v\":\"403\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"西语\",\"v\":\"西语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印地语\",\"v\":\"印地语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}],\"5\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"AV女优\",\"v\":\"505\"},{\"n\":\"日韩\",\"v\":\"502\"},{\"n\":\"欧美\",\"v\":\"501\"},{\"n\":\"动漫\",\"v\":\"503\"},{\"n\":\"国产\",\"v\":\"504\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}]}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 爬虫headers
|
|
||||||
*
|
|
||||||
* @param url
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("method", "GET");
|
|
||||||
headers.put("Host", siteHost);
|
|
||||||
headers.put("Upgrade-Insecure-Requests", "1");
|
|
||||||
headers.put("DNT", "1");
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
|
|
||||||
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类数据 + 首页最近更新视频列表数据
|
|
||||||
*
|
|
||||||
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
|
||||||
// 分类节点
|
|
||||||
Elements elements = doc.select("ul.top_nav li a");
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (Element ele : elements) {
|
|
||||||
String name = ele.text();
|
|
||||||
boolean show = name.equals("电影") ||
|
|
||||||
name.equals("连续剧") ||
|
|
||||||
name.equals("动漫") ||
|
|
||||||
name.equals("综艺") ||
|
|
||||||
name.equals("午夜影院");
|
|
||||||
|
|
||||||
if (name.equals("午夜影院") && !pron) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (show) {
|
|
||||||
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
|
||||||
if (!mather.find())
|
|
||||||
continue;
|
|
||||||
// 把分类的id和名称取出来加到列表里
|
|
||||||
String id = mather.group(1).trim();
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
try {
|
|
||||||
// 取首页推荐视频列表
|
|
||||||
Element homeList = doc.select("div.cbox1").get(0);
|
|
||||||
Elements list = homeList.select("ul.vodlist li.vodlist_item");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.selectFirst("a.vodlist_thumb").attr("title");
|
|
||||||
String cover = siteUrl + vod.selectFirst("a.vodlist_thumb").attr("data-original");
|
|
||||||
String remark = "";
|
|
||||||
try {
|
|
||||||
remark = vod.select("span.pic_text em").text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
remark = vod.select("span.text_dy").get(0).text();
|
|
||||||
}
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst("a.vodlist_thumb").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类信息数据
|
|
||||||
*
|
|
||||||
* @param tid 分类id
|
|
||||||
* @param pg 页数
|
|
||||||
* @param filter 同homeContent方法中的filter
|
|
||||||
* @param extend 筛选参数{k:v, k1:v1}
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/index.php/vod/show/id/";
|
|
||||||
if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
|
|
||||||
url += extend.get("tid");
|
|
||||||
} else {
|
|
||||||
url += tid;
|
|
||||||
}
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value.length() > 0) {
|
|
||||||
url += "/" + key + "/" + URLEncoder.encode(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
url += "/page/" + pg + ".html";
|
|
||||||
String html = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
Document doc = Jsoup.parse(html);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int pageCount = 0;
|
|
||||||
int page = -1;
|
|
||||||
|
|
||||||
// 取页码相关信息
|
|
||||||
Elements pageInfo = doc.select("ul.page");
|
|
||||||
if (pageInfo.size() == 0) {
|
|
||||||
page = Integer.parseInt(pg);
|
|
||||||
pageCount = page;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < pageInfo.size(); i++) {
|
|
||||||
Element li = pageInfo.get(i);
|
|
||||||
Element a = li.selectFirst("li a");
|
|
||||||
if (a == null)
|
|
||||||
continue;
|
|
||||||
String span = pageInfo.select("li.active a").text();
|
|
||||||
String wy = doc.select("ul.page li a").last().attr("href");
|
|
||||||
if (page == -1) {
|
|
||||||
page = Integer.parseInt(span);
|
|
||||||
} else {
|
|
||||||
page = 0;
|
|
||||||
}
|
|
||||||
Matcher matcher = regexPage.matcher(wy);
|
|
||||||
if (matcher.find()) {
|
|
||||||
pageCount = Integer.parseInt(matcher.group(1).trim());
|
|
||||||
} else {
|
|
||||||
pageCount = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (!html.contains("没有找到您想要的结果哦")) {
|
|
||||||
// 取当前分类页的视频列表
|
|
||||||
Elements list = doc.select("ul.vodlist li.vodlist_item");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.selectFirst("a.vodlist_thumb").attr("title");
|
|
||||||
String cover = siteUrl + vod.selectFirst("a.vodlist_thumb").attr("data-original");
|
|
||||||
String remark = "";
|
|
||||||
try {
|
|
||||||
remark = vod.select("span.pic_text em").text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
remark = vod.select("span.text_dy").get(0).text();
|
|
||||||
}
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst("a.vodlist_thumb").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", 20);
|
|
||||||
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 20);
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频详情信息
|
|
||||||
*
|
|
||||||
* @param ids 视频id
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
// 视频详情url
|
|
||||||
String url = siteUrl + "/index.php/vod/detail/id/" + ids.get(0) + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vodList = new JSONObject();
|
|
||||||
|
|
||||||
// 取基本数据
|
|
||||||
String vid = doc.selectFirst("a.digg_link").attr("data-id");
|
|
||||||
|
|
||||||
String cover = siteUrl + doc.selectFirst("div.content_thumb a").attr("data-original");
|
|
||||||
String title = doc.selectFirst("div.content_thumb a").attr("title");
|
|
||||||
String desc = doc.selectFirst("div.context span").text();
|
|
||||||
String category = "", area = "", year = "", director = "", actor = "", remark = "";
|
|
||||||
remark = doc.select("span.data_style").text();
|
|
||||||
Elements span_text_muted = doc.select("li.data span");
|
|
||||||
for (int i = 0; i < span_text_muted.size() - 2; i++) {
|
|
||||||
Element text = span_text_muted.get(i);
|
|
||||||
String info = text.text();
|
|
||||||
if (info.contains("类型")) {
|
|
||||||
try {
|
|
||||||
category = text.parent().select("a").get(2).text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
category = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("年份")) {
|
|
||||||
try {
|
|
||||||
year = text.parent().select("a").get(0).text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
year = "";
|
|
||||||
}
|
|
||||||
} else if (info.contains("地区")) {
|
|
||||||
try {
|
|
||||||
area = text.parent().select("a").get(1).text();
|
|
||||||
} catch (Exception e) {
|
|
||||||
area = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
List<String> actors = new ArrayList<>();
|
|
||||||
Elements aa = doc.select("li.data").get(3).select("a");
|
|
||||||
for (int j = 0; j < aa.size(); j++) {
|
|
||||||
actors.add(aa.get(j).text());
|
|
||||||
}
|
|
||||||
actor = TextUtils.join(",", actors);
|
|
||||||
List<String> directors = new ArrayList<>();
|
|
||||||
Elements bb = doc.select("li.data").get(2).select("a");
|
|
||||||
for (int j = 0; j < bb.size(); j++) {
|
|
||||||
directors.add(bb.get(j).text());
|
|
||||||
}
|
|
||||||
director = TextUtils.join(",", directors);
|
|
||||||
|
|
||||||
|
|
||||||
vodList.put("vod_id", vid);
|
|
||||||
vodList.put("vod_name", title);
|
|
||||||
vodList.put("vod_pic", cover);
|
|
||||||
vodList.put("type_name", category);
|
|
||||||
vodList.put("vod_year", year);
|
|
||||||
vodList.put("vod_area", area);
|
|
||||||
vodList.put("vod_remarks", remark);
|
|
||||||
vodList.put("vod_actor", actor);
|
|
||||||
vodList.put("vod_director", director);
|
|
||||||
vodList.put("vod_content", desc);
|
|
||||||
|
|
||||||
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
|
||||||
@Override
|
|
||||||
public int compare(String o1, String o2) {
|
|
||||||
try {
|
|
||||||
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
|
||||||
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
|
||||||
|
|
||||||
if (sort1 == sort2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return sort1 - sort2 > 0 ? 1 : -1;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 取播放列表数据
|
|
||||||
Elements sources = doc.select("div.play_source_tab a");
|
|
||||||
Elements sourceList = doc.select("div.playlist_full");
|
|
||||||
|
|
||||||
for (int i = 0; i < sources.size(); i++) {
|
|
||||||
Element source = sources.get(i);
|
|
||||||
String sourceName = source.attr("alt");
|
|
||||||
sourceName = sourceName.replaceAll("[^\u4E00-\u9FA5]", "");
|
|
||||||
boolean found = false;
|
|
||||||
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
|
||||||
String flag = it.next();
|
|
||||||
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
|
|
||||||
sourceName = flag;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
String playList = "";
|
|
||||||
Elements playListA = sourceList.get(i).select("ul>li>a");
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String playURL = matcher.group(1) + "/sid/" + matcher.group(2) + "/nid/" + matcher.group(3);
|
|
||||||
vodItems.add(vod.text() + "$" + playURL);
|
|
||||||
}
|
|
||||||
if (vodItems.size() > 0)
|
|
||||||
playList = TextUtils.join("#", vodItems);
|
|
||||||
|
|
||||||
if (playList.length() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vod_play.put(sourceName, playList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vod_play.size() > 0) {
|
|
||||||
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
|
||||||
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
|
||||||
vodList.put("vod_play_from", vod_play_from);
|
|
||||||
vodList.put("vod_play_url", vod_play_url);
|
|
||||||
}
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vodList);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取视频播放信息
|
|
||||||
*
|
|
||||||
* @param flag 播放源
|
|
||||||
* @param id 视频id
|
|
||||||
* @param vipFlags 所有可能需要vip解析的源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
// 播放页 url
|
|
||||||
String url = siteUrl + "/index.php/vod/play/id/" + id + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
Elements allScript = doc.select("script");
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) { // 取直链
|
|
||||||
int start = scContent.indexOf('{');
|
|
||||||
int end = scContent.lastIndexOf('}') + 1;
|
|
||||||
String json = scContent.substring(start, end);
|
|
||||||
JSONObject player = new JSONObject(json);
|
|
||||||
if (playerConfig.has(player.getString("from"))) {
|
|
||||||
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
|
|
||||||
String videoUrl = player.getString("url");
|
|
||||||
String playUrl = pCfg.getString("pu");
|
|
||||||
result.put("parse", pCfg.getInt("sn"));
|
|
||||||
result.put("playUrl", playUrl);
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
result.put("header", "");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
long currentTime = System.currentTimeMillis();
|
|
||||||
String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime;
|
|
||||||
JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (searchResult.getInt("total") > 0) {
|
|
||||||
JSONArray lists = new JSONArray(searchResult.getString("list"));
|
|
||||||
for (int i = 0; i < lists.length(); i++) {
|
|
||||||
JSONObject vod = lists.getJSONObject(i);
|
|
||||||
String id = vod.getString("id");
|
|
||||||
String title = vod.getString("name");
|
|
||||||
String cover = vod.getString("pic");
|
|
||||||
if (title.contains(key)) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String doReplaceRegex(Pattern pattern, String src) {
|
|
||||||
if (pattern == null)
|
|
||||||
return src;
|
|
||||||
try {
|
|
||||||
Matcher matcher = pattern.matcher(src);
|
|
||||||
if (matcher.find()) {
|
|
||||||
return matcher.group(1).trim();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.live.TxtSubscribe;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class Proxy extends Spider {
|
|
||||||
|
|
||||||
public static int localPort = -1;
|
|
||||||
|
|
||||||
static void adjustLocalPort() {
|
|
||||||
if (localPort > 0)
|
|
||||||
return;
|
|
||||||
int port = 9978;
|
|
||||||
while (port < 10000) {
|
|
||||||
String resp = OkHttpUtil.string("http://127.0.0.1:" + port + "/proxy?do=ck", null);
|
|
||||||
if (resp.equals("ok")) {
|
|
||||||
SpiderDebug.log("Found local server port " + port);
|
|
||||||
localPort = port;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
port++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String localProxyUrl() {
|
|
||||||
adjustLocalPort();
|
|
||||||
return "http://127.0.0.1:" + Proxy.localPort + "/proxy";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Object[] proxy(Map<String, String> params) {
|
|
||||||
try {
|
|
||||||
String what = params.get("do");
|
|
||||||
if (what.equals("live")) {
|
|
||||||
String type = params.get("type");
|
|
||||||
if (type.equals("txt")) {
|
|
||||||
String ext = params.get("ext");
|
|
||||||
if (!ext.startsWith("http")) {
|
|
||||||
ext = new String(Base64.decode(ext, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8");
|
|
||||||
}
|
|
||||||
return TxtSubscribe.load(ext);
|
|
||||||
}
|
|
||||||
} else if (what.equals("ck")) {
|
|
||||||
Object[] result = new Object[3];
|
|
||||||
result[0] = 200;
|
|
||||||
result[1] = "text/plain; charset=utf-8";
|
|
||||||
ByteArrayInputStream baos = new ByteArrayInputStream("ok".getBytes("UTF-8"));
|
|
||||||
result[2] = baos;
|
|
||||||
return result;
|
|
||||||
} else if (what.equals("push")) {
|
|
||||||
return PushAgent.vod(params);
|
|
||||||
} else if (what.equals("czspp")) {
|
|
||||||
return Czsapp.loadsub(params.get("url"));
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,656 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.net.UrlQuerySanitizer;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OKCallBack;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import okhttp3.Call;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
import okhttp3.Response;
|
|
||||||
import okhttp3.ResponseBody;
|
|
||||||
|
|
||||||
public class PushAgent extends Spider {
|
|
||||||
|
|
||||||
private static String j = "";
|
|
||||||
private static long StopRefresh;
|
|
||||||
private static final Map<String, String> l = new HashMap();
|
|
||||||
private static final Map<String, Long> q = new HashMap();
|
|
||||||
private static final Map<String, Map<String, String>> dizz = new HashMap();
|
|
||||||
private static final ReentrantLock ReentrantLock = new ReentrantLock();
|
|
||||||
private static final long n = 0;
|
|
||||||
private static final String SiteUrl = "https://api.aliyundrive.com";
|
|
||||||
private static final Pattern AliPLink = Pattern.compile("(https://www.aliyundrive.com/s/[^\"]+)");
|
|
||||||
public static Pattern Folder = Pattern.compile("www.aliyundrive.com/s/([^/]+)(/folder/([^/]+))?");
|
|
||||||
public static String Token;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
if (extend.startsWith("http")) {
|
|
||||||
Token = OkHttpUtil.string(extend, null);
|
|
||||||
} else {
|
|
||||||
Token = extend;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static long Time() {
|
|
||||||
return (System.currentTimeMillis() / 1000) + n;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Object[] ProxyMedia(Map<String, String> map) {
|
|
||||||
try {
|
|
||||||
String ShareId = map.get("share_id");
|
|
||||||
String FileId = map.get("file_id");
|
|
||||||
String MediaId = map.get("media_id");
|
|
||||||
String Token = getShareTk(ShareId, "");
|
|
||||||
ReentrantLock.lock();
|
|
||||||
String str4 = dizz.get(FileId).get(MediaId);
|
|
||||||
UrlQuerySanitizer urlQuerySanitizer = new UrlQuerySanitizer(str4);
|
|
||||||
Long l2 = new Long(urlQuerySanitizer.getValue("x-oss-expires"));
|
|
||||||
long longValue = l2.longValue();
|
|
||||||
if (longValue - Time() <= 60) {
|
|
||||||
VideoDetail(ShareId, Token, FileId);
|
|
||||||
Map<String, Map<String, String>> map3 = dizz;
|
|
||||||
str4 = map3.get(FileId).get(MediaId);
|
|
||||||
}
|
|
||||||
ReentrantLock.unlock();
|
|
||||||
new HashMap();
|
|
||||||
OKCallBack.OKCallBackDefault abVar = new OKCallBack.OKCallBackDefault() {
|
|
||||||
public void onResponse(Response response) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
OkHttpClient YM = OkHttpUtil.defaultClient();
|
|
||||||
HashMap<String, String> t = Headers();
|
|
||||||
OkHttpUtil.get(YM, str4, null, t, abVar);
|
|
||||||
ResponseBody body = abVar.getResult().body();
|
|
||||||
return new Object[]{200, "video/MP2T", body.byteStream()};
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Object[] vod(Map<String, String> map) {
|
|
||||||
String str = map.get("type");
|
|
||||||
if (str.equals("m3u8")) {
|
|
||||||
return getFile(map);
|
|
||||||
}
|
|
||||||
if (str.equals("media")) {
|
|
||||||
return ProxyMedia(map);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static Object[] getFile(Map<String, String> map) {
|
|
||||||
try {
|
|
||||||
String ShareId = map.get("share_id");
|
|
||||||
String ShareTK = getShareTk(ShareId, "");
|
|
||||||
return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(VideoDetail(ShareId, ShareTK, map.get("file_id")).getBytes())};
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String Post(String str, String str2, Map<String, String> map) {
|
|
||||||
OKCallBack.OKCallBackString acVar = new OKCallBack.OKCallBackString() {
|
|
||||||
|
|
||||||
public void onResponse(String r) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
OkHttpClient YM = OkHttpUtil.defaultClient();
|
|
||||||
OkHttpUtil.postJson(YM, str, str2, map, acVar);
|
|
||||||
return acVar.getResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static synchronized String getShareTk(String str, String str2) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
long b = Time();
|
|
||||||
Map<String, String> map = l;
|
|
||||||
String str3 = map.get(str);
|
|
||||||
Long l2 = q.get(str);
|
|
||||||
if (!TextUtils.isEmpty(str3)) {
|
|
||||||
if (l2 - b > 600) {
|
|
||||||
return str3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
jSONObject.put("share_id", str);
|
|
||||||
jSONObject.put("share_pwd", str2);
|
|
||||||
String jSONObject2 = jSONObject.toString();
|
|
||||||
JSONObject jSONObject3 = new JSONObject(Post("https://api.aliyundrive.com/v2/share_link/get_share_token", jSONObject2, Headers()));
|
|
||||||
String string = jSONObject3.getString("share_token");
|
|
||||||
Long valueOf = Long.valueOf(b + jSONObject3.getLong("expires_in"));
|
|
||||||
Map<String, Long> map2 = q;
|
|
||||||
map2.put(str, valueOf);
|
|
||||||
Map<String, String> map3 = l;
|
|
||||||
map3.put(str, string);
|
|
||||||
return string;
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static HashMap<String, String> Headers() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
|
|
||||||
headers.put("Referer", "https://www.aliyundrive.com/");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static HashMap<String, String> sHeaders() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static void refreshTk() {
|
|
||||||
long b = Time();
|
|
||||||
String str = j;
|
|
||||||
if (str.isEmpty() || StopRefresh - b <= 600) {
|
|
||||||
try {
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
jSONObject.put("refresh_token", Token);
|
|
||||||
String jSONObject2 = jSONObject.toString();
|
|
||||||
HashMap<String, String> t = Headers();
|
|
||||||
JSONObject jSONObject3 = new JSONObject(Post("https://api.aliyundrive.com/token/refresh", jSONObject2, t));
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
String string = jSONObject3.getString("token_type");
|
|
||||||
sb.append(string);
|
|
||||||
sb.append(" ");
|
|
||||||
String string2 = jSONObject3.getString("access_token");
|
|
||||||
sb.append(string2);
|
|
||||||
j = sb.toString();
|
|
||||||
long j2 = jSONObject3.getLong("expires_in");
|
|
||||||
StopRefresh = b + j2;
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static String VideoDetail(String shareid, String token, String fileid) {
|
|
||||||
int i;
|
|
||||||
try {
|
|
||||||
String url = SiteUrl + "/v2/file/get_share_link_video_preview_play_info";
|
|
||||||
JSONObject Data = new JSONObject();
|
|
||||||
Data.put("share_id", shareid);
|
|
||||||
Data.put("category", "live_transcoding");
|
|
||||||
Data.put("file_id", fileid);
|
|
||||||
Data.put("template_id", "");
|
|
||||||
HashMap<String, String> headers = Headers();
|
|
||||||
headers.put("x-share-token", token);
|
|
||||||
String str5 = j;
|
|
||||||
headers.put("authorization", str5);
|
|
||||||
String jSONObject2 = Data.toString();
|
|
||||||
JSONObject jSONObject3 = new JSONObject(Post(url, jSONObject2, headers));
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
arrayList.add("FHD");
|
|
||||||
arrayList.add("HD");
|
|
||||||
arrayList.add("SD");
|
|
||||||
JSONObject jSONObject4 = jSONObject3.getJSONObject("video_preview_play_info");
|
|
||||||
JSONArray jSONArray = jSONObject4.getJSONArray("live_transcoding_task_list");
|
|
||||||
Iterator it = arrayList.iterator();
|
|
||||||
String objectUrl = "";
|
|
||||||
while (true) {
|
|
||||||
boolean hasNext = it.hasNext();
|
|
||||||
i = 0;
|
|
||||||
if (!hasNext) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
String str7 = (String) it.next();
|
|
||||||
if (!objectUrl.isEmpty()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (true) {
|
|
||||||
if (i < jSONArray.length()) {
|
|
||||||
JSONObject jSONObject5 = jSONArray.getJSONObject(i);
|
|
||||||
String string = jSONObject5.getString("template_id");
|
|
||||||
if (string.equals(str7)) {
|
|
||||||
objectUrl = jSONObject5.getString("url");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (TextUtils.isEmpty(objectUrl)) {
|
|
||||||
JSONObject jSONObject6 = jSONArray.getJSONObject(0);
|
|
||||||
objectUrl = jSONObject6.getString("url");
|
|
||||||
}
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
HashMap<String, String> header = Headers();
|
|
||||||
OkHttpUtil.stringNoRedirect(objectUrl, header, hashMap);
|
|
||||||
String d = OkHttpUtil.getRedirectLocation(hashMap);
|
|
||||||
String i2 = OkHttpUtil.string(d, Headers());
|
|
||||||
String substring = d.substring(0, d.lastIndexOf("/")) + "/";
|
|
||||||
ArrayList arrayList2 = new ArrayList();
|
|
||||||
HashMap hashMap2 = new HashMap();
|
|
||||||
String[] split = i2.split("\n");
|
|
||||||
int length = split.length;
|
|
||||||
int i3 = 0;
|
|
||||||
while (i < length) {
|
|
||||||
String str8 = split[i];
|
|
||||||
if (str8.contains("x-oss-expires")) {
|
|
||||||
i3++;
|
|
||||||
String sb6 = substring + str8;
|
|
||||||
String sb8 = "" + i3;
|
|
||||||
hashMap2.put(sb8, sb6);
|
|
||||||
str8 = Proxy.localProxyUrl() + "?do=push&type=media&share_id=" + shareid + "&file_id=" + fileid + "&media_id=" + i3;
|
|
||||||
}
|
|
||||||
arrayList2.add(str8);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
dizz.put(fileid, hashMap2);
|
|
||||||
return TextUtils.join("\n", arrayList2);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void listFiles(Map<String, String> map, String str, String str2, String str3) {
|
|
||||||
String str4;
|
|
||||||
try {
|
|
||||||
String str5 = "https://api.aliyundrive.com/adrive/v3/file/list";
|
|
||||||
HashMap<String, String> Y2 = Headers();
|
|
||||||
Y2.put("x-share-token", str2);
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
jSONObject.put("image_thumbnail_process", "image/resize,w_160/format,jpeg");
|
|
||||||
jSONObject.put("image_url_process", "image/resize,w_1920/format,jpeg");
|
|
||||||
jSONObject.put("limit", 200);
|
|
||||||
jSONObject.put("order_by", "updated_at");
|
|
||||||
jSONObject.put("order_direction", "DESC");
|
|
||||||
jSONObject.put("parent_file_id", str3);
|
|
||||||
jSONObject.put("share_id", str);
|
|
||||||
jSONObject.put("video_thumbnail_process", "video/snapshot,t_1000,f_jpg,ar_auto,w_300");
|
|
||||||
String str6 = "";
|
|
||||||
ArrayList<String> arrayList = new ArrayList();
|
|
||||||
for (int i = 1; i <= 50 && (i < 2 || !TextUtils.isEmpty(str6)); i++) {
|
|
||||||
jSONObject.put("marker", str6);
|
|
||||||
JSONObject jSONObject2 = new JSONObject(Post(str5, jSONObject.toString(), Y2));
|
|
||||||
JSONArray jSONArray = jSONObject2.getJSONArray("items");
|
|
||||||
int i2 = 0;
|
|
||||||
while (i2 < jSONArray.length()) {
|
|
||||||
JSONObject jSONObject3 = jSONArray.getJSONObject(i2);
|
|
||||||
if (jSONObject3.getString("type").equals("folder")) {
|
|
||||||
arrayList.add(jSONObject3.getString("file_id"));
|
|
||||||
str4 = str5;
|
|
||||||
} else {
|
|
||||||
str4 = str5;
|
|
||||||
if (jSONObject3.getString("mime_type").contains("video")) {
|
|
||||||
String replace = jSONObject3.getString("name").replace("#", "_").replace("$", "_");
|
|
||||||
if (replace.length() > 20) {
|
|
||||||
replace = replace.substring(0, 10) + "..." + replace.substring(replace.length() - 10);
|
|
||||||
}
|
|
||||||
String fileIds = jSONObject3.getString("file_id");
|
|
||||||
map.put(replace, str + "+" + str2 + "+" + fileIds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i2++;
|
|
||||||
str5 = str4;
|
|
||||||
}
|
|
||||||
str6 = jSONObject2.getString("next_marker");
|
|
||||||
}
|
|
||||||
for (String str7 : arrayList) {
|
|
||||||
try {
|
|
||||||
listFiles(map, str, str2, str7);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAliContent(List<String> list) {
|
|
||||||
String str;
|
|
||||||
try {
|
|
||||||
String url = list.get(0).trim();
|
|
||||||
Pattern pattern = Folder;
|
|
||||||
Matcher matcher = pattern.matcher(url);
|
|
||||||
if (!matcher.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String group = matcher.group(1);
|
|
||||||
if (matcher.groupCount() == 3) {
|
|
||||||
str = matcher.group(3);
|
|
||||||
} else {
|
|
||||||
str = "";
|
|
||||||
}
|
|
||||||
String AnonymousUrl = SiteUrl + "/adrive/v3/share_link/get_share_by_anonymous";
|
|
||||||
JSONObject Data = new JSONObject();
|
|
||||||
Data.put("share_id", group);
|
|
||||||
HashMap<String, String> headers = Headers();
|
|
||||||
JSONObject jSONObject3 = new JSONObject(Post(AnonymousUrl, Data.toString(), headers));
|
|
||||||
JSONArray jSONArray = jSONObject3.getJSONArray("file_infos");
|
|
||||||
if (jSONArray.length() == 0) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
JSONObject jSONObject4 = null;
|
|
||||||
boolean isEmpty = TextUtils.isEmpty(str);
|
|
||||||
if (!isEmpty) {
|
|
||||||
int i = 0;
|
|
||||||
while (true) {
|
|
||||||
if (i >= jSONArray.length()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
JSONObject jSONObject5 = jSONArray.getJSONObject(i);
|
|
||||||
String string = jSONObject5.getString("file_id");
|
|
||||||
String string2 = jSONObject5.getString("file_id");
|
|
||||||
if (string.equals(string2)) {
|
|
||||||
jSONObject4 = jSONObject5;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (jSONObject4 == null) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
jSONObject4 = jSONArray.getJSONObject(0);
|
|
||||||
str = jSONObject4.getString("file_id");
|
|
||||||
}
|
|
||||||
JSONObject jSONObject6 = new JSONObject();
|
|
||||||
jSONObject6.put("vod_id", url);
|
|
||||||
String string3 = jSONObject3.getString("share_name");
|
|
||||||
jSONObject6.put("vod_name", string3);
|
|
||||||
jSONObject6.put("vod_pic", jSONObject3.getString("avatar"));
|
|
||||||
jSONObject6.put("vod_content", url);
|
|
||||||
jSONObject6.put("vod_play_from", "AliYun");
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
String string4 = jSONObject4.getString("type");
|
|
||||||
if (!string4.equals("folder")) {
|
|
||||||
String string5 = jSONObject4.getString("type");
|
|
||||||
if (string5.equals("file")) {
|
|
||||||
String string6 = jSONObject4.getString("category");
|
|
||||||
if (string6.equals("video")) {
|
|
||||||
str = "root";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
String s = getShareTk(group, "");
|
|
||||||
Map<String, String> hashMap = new HashMap<>();
|
|
||||||
listFiles(hashMap, group, s, str);
|
|
||||||
ArrayList arrayList2 = new ArrayList(hashMap.keySet());
|
|
||||||
Collections.sort(arrayList2);
|
|
||||||
Iterator it = arrayList2.iterator();
|
|
||||||
while (true) {
|
|
||||||
if (!it.hasNext()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
String str3 = (String) it.next();
|
|
||||||
String sb4 = str3 + "$" + hashMap.get(str3);
|
|
||||||
arrayList.add(sb4);
|
|
||||||
}
|
|
||||||
ArrayList arrayList3 = new ArrayList();
|
|
||||||
for (int i2 = 0; i2 < 4; i2++) {
|
|
||||||
String join = TextUtils.join("#", arrayList);
|
|
||||||
arrayList3.add(join);
|
|
||||||
}
|
|
||||||
String join2 = TextUtils.join("$$$", arrayList3);
|
|
||||||
jSONObject6.put("vod_play_url", join2);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray jSONArray2 = new JSONArray();
|
|
||||||
jSONArray2.put(jSONObject6);
|
|
||||||
result.put("list", jSONArray2);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> list) {
|
|
||||||
try {
|
|
||||||
String url = list.get(0);
|
|
||||||
Pattern pattern = Folder;
|
|
||||||
Pattern pattern2 = AliPLink;
|
|
||||||
Matcher matcher2 = pattern2.matcher(url);
|
|
||||||
Matcher matcher = pattern.matcher(url);
|
|
||||||
if (Misc.isVip(url) && !url.contains("qq.com") && !url.contains("mgtv.com")) {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, null));
|
|
||||||
String VodName = doc.select("head > title").text();
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray lists = new JSONArray();
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
vodAtom.put("vod_id", url);
|
|
||||||
vodAtom.put("vod_name", VodName);
|
|
||||||
vodAtom.put("vod_pic", "https://img.zcool.cn/community/0123545c74c5aea801213f261297df.png");
|
|
||||||
vodAtom.put("type_name", "官源");
|
|
||||||
vodAtom.put("vod_year", "");
|
|
||||||
vodAtom.put("vod_area", "");
|
|
||||||
vodAtom.put("vod_remarks", "");
|
|
||||||
vodAtom.put("vod_actor", "");
|
|
||||||
vodAtom.put("vod_director", "");
|
|
||||||
vodAtom.put("vod_content", "");
|
|
||||||
vodAtom.put("vod_play_from", "jx");
|
|
||||||
vodAtom.put("vod_play_url", "立即播放$" + url);
|
|
||||||
lists.put(vodAtom);
|
|
||||||
result.put("list", lists);
|
|
||||||
return result.toString();
|
|
||||||
} else if (Misc.isVip(url) && url.contains("qq.com")) {
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray lists = new JSONArray();
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, sHeaders()));
|
|
||||||
String VodName = doc.select("head > title").text();
|
|
||||||
Elements playListA = doc.select("div.episode-list-rect__item");
|
|
||||||
if (!playListA.isEmpty()) {
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
String a = vod.select("div").attr("data-vid");
|
|
||||||
String b = vod.select("div").attr("data-cid");
|
|
||||||
String id = "https://v.qq.com/x/cover/" + b + "/" + a;
|
|
||||||
String name = vod.select("div span").text();
|
|
||||||
vodItems.add(name + "$" + id);
|
|
||||||
}
|
|
||||||
String playList = TextUtils.join("#", vodItems);
|
|
||||||
vodAtom.put("vod_play_url", playList);
|
|
||||||
} else {
|
|
||||||
vodAtom.put("vod_play_url", "立即播放$" + url);
|
|
||||||
}
|
|
||||||
vodAtom.put("vod_id", url);
|
|
||||||
vodAtom.put("vod_name", VodName);
|
|
||||||
vodAtom.put("vod_pic", "https://img2.baidu.com/it/u=2655029475,2190949369&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=593");
|
|
||||||
vodAtom.put("type_name", "腾讯TV");
|
|
||||||
vodAtom.put("vod_year", "");
|
|
||||||
vodAtom.put("vod_area", "");
|
|
||||||
vodAtom.put("vod_remarks", "");
|
|
||||||
vodAtom.put("vod_actor", "");
|
|
||||||
vodAtom.put("vod_director", "");
|
|
||||||
vodAtom.put("vod_content", url);
|
|
||||||
vodAtom.put("vod_play_from", "jx");
|
|
||||||
lists.put(vodAtom);
|
|
||||||
result.put("list", lists);
|
|
||||||
return result.toString();
|
|
||||||
} else if (Misc.isVip(url) && url.contains("mgtv.com")) {
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray lists = new JSONArray();
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
Pattern mgtv = Pattern.compile("https://\\S+mgtv.com/b/(\\d+)/(\\d+).html.*");
|
|
||||||
Matcher mgtv1 = mgtv.matcher(url);
|
|
||||||
String VodNames = "";
|
|
||||||
if (mgtv1.find()) {
|
|
||||||
String Ep = "https://pcweb.api.mgtv.com/episode/list?video_id=" + mgtv1.group(2);
|
|
||||||
JSONObject Data = new JSONObject(OkHttpUtil.string(Ep, Headers()));
|
|
||||||
VodNames = Data.getJSONObject("data").getJSONObject("info").getString("title");
|
|
||||||
JSONArray a = new JSONArray(Data.getJSONObject("data").getString("list"));
|
|
||||||
if (a.length() > 0) {
|
|
||||||
for (int i = 0; i < a.length(); i++) {
|
|
||||||
JSONObject jObj = a.getJSONObject(i);
|
|
||||||
if (jObj.getString("isIntact").equals("1")) {
|
|
||||||
String VodName = jObj.getString("t4");
|
|
||||||
String id = jObj.getString("video_id");
|
|
||||||
String VodId = "https://www.mgtv.com/b/" + mgtv1.group(1) + "/" + id + ".html";
|
|
||||||
vodItems.add(VodName + "$" + VodId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String playList = TextUtils.join("#", vodItems);
|
|
||||||
vodAtom.put("vod_play_url", playList);
|
|
||||||
} else {
|
|
||||||
vodAtom.put("vod_play_url", "立即播放$" + url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vodAtom.put("vod_id", url);
|
|
||||||
vodAtom.put("vod_name", VodNames);
|
|
||||||
vodAtom.put("vod_pic", "https://img2.baidu.com/it/u=2562822927,704100654&fm=253&fmt=auto&app=138&f=JPEG?w=600&h=380");
|
|
||||||
vodAtom.put("type_name", "芒果TV");
|
|
||||||
vodAtom.put("vod_year", "");
|
|
||||||
vodAtom.put("vod_area", "");
|
|
||||||
vodAtom.put("vod_remarks", "");
|
|
||||||
vodAtom.put("vod_actor", "");
|
|
||||||
vodAtom.put("vod_director", "");
|
|
||||||
vodAtom.put("vod_content", url);
|
|
||||||
vodAtom.put("vod_play_from", "jx");
|
|
||||||
lists.put(vodAtom);
|
|
||||||
result.put("list", lists);
|
|
||||||
return result.toString();
|
|
||||||
} else if (Misc.isVideoFormat(url)) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray lists = new JSONArray();
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
vodAtom.put("vod_id", url);
|
|
||||||
vodAtom.put("vod_name", url);
|
|
||||||
vodAtom.put("vod_pic", "https://img.zcool.cn/community/0123545c74c5aea801213f261297df.png");
|
|
||||||
vodAtom.put("type_name", "直连");
|
|
||||||
vodAtom.put("vod_play_from", "player");
|
|
||||||
vodAtom.put("vod_play_url", "立即播放$" + url);
|
|
||||||
lists.put(vodAtom);
|
|
||||||
result.put("list", lists);
|
|
||||||
return result.toString();
|
|
||||||
} else if (url.startsWith("magnet")) {
|
|
||||||
String VodName = url;
|
|
||||||
if (url.length() > 100) {
|
|
||||||
VodName = url.substring(0, 30) + "..." + url.substring(url.length() - 10);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray lists = new JSONArray();
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
vodAtom.put("vod_id", url);
|
|
||||||
vodAtom.put("vod_name", VodName);
|
|
||||||
vodAtom.put("vod_pic", "https://img2.baidu.com/it/u=1609185522,4130752057&fm=253&f=JPEG");
|
|
||||||
vodAtom.put("type_name", "磁力");
|
|
||||||
vodAtom.put("vod_play_from", "磁力测试");
|
|
||||||
vodAtom.put("vod_play_url", "立即播放$" + url);
|
|
||||||
lists.put(vodAtom);
|
|
||||||
result.put("list", lists);
|
|
||||||
return result.toString();
|
|
||||||
} else if (url.startsWith("http") && (matcher2.find())) {
|
|
||||||
return getAliContent(list);
|
|
||||||
} else if (url.startsWith("http") && (!matcher.find()) && (!matcher2.find())) {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, null));
|
|
||||||
String VodName = doc.select("head > title").text();
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray lists = new JSONArray();
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
vodAtom.put("vod_id", url);
|
|
||||||
vodAtom.put("vod_name", VodName);
|
|
||||||
vodAtom.put("vod_pic", "https://pic.rmb.bdstatic.com/bjh/1d0b02d0f57f0a42201f92caba5107ed.jpeg");
|
|
||||||
vodAtom.put("type_name", "嗅探");
|
|
||||||
vodAtom.put("vod_content", url);
|
|
||||||
vodAtom.put("vod_play_from", "嗅探");
|
|
||||||
vodAtom.put("vod_play_url", "立即播放嗅探$" + url);
|
|
||||||
lists.put(vodAtom);
|
|
||||||
result.put("list", lists);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
} catch (Throwable throwable) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
switch (flag) {
|
|
||||||
case "jx": {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("jx", "1");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
case "player": {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
case "嗅探": {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
case "AliYun":
|
|
||||||
refreshTk();
|
|
||||||
String[] split = id.split("\\+");
|
|
||||||
String str3 = split[0];
|
|
||||||
String str5 = split[2];
|
|
||||||
String url = Proxy.localProxyUrl() + "?do=push&type=m3u8&share_id=" + str3 + "&file_id=" + str5;
|
|
||||||
JSONObject jSONObject = new JSONObject();
|
|
||||||
jSONObject.put("parse", "0");
|
|
||||||
jSONObject.put("playUrl", "");
|
|
||||||
jSONObject.put("url", url);
|
|
||||||
jSONObject.put("header", "");
|
|
||||||
return jSONObject.toString();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,345 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
|
|
||||||
public class SP360 extends Spider {
|
|
||||||
protected JSONObject ext = null;
|
|
||||||
private static final String SiteHost = "https://api.web.360kan.com/v1/rank?cat=1";
|
|
||||||
private static final String SiteFilter = "https://api.web.360kan.com/v1/filter/list";
|
|
||||||
private static final String SiteDetail = "https://api.web.360kan.com/v1/detail";
|
|
||||||
private static final String SiteSearch = "https://api.so.360kan.com/index?force_v=1&kw=%s&from=&pageno=1&v_ap=1&tab=all";
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
ext = new JSONObject("{\"classes\":[{\"type_name\":\"电影\",\"type_id\":\"1\"},{\"type_name\":\"电视剧\",\"type_id\":\"2\"},{\"type_name\":\"综艺\",\"type_id\":\"3\"},{\"type_name\":\"动漫\",\"type_id\":\"4\"}],\"filter\":{\"1\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"纪录\",\"v\":\"纪录\"},{\"n\":\"传记\",\"v\":\"传记\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"伦理\",\"v\":\"伦理\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"更早\",\"v\":\"lt_year\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"},{\"n\":\"最受好评\",\"v\":\"rankpoint\"}]}],\"2\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"言情\",\"v\":\"言情\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"伦理\",\"v\":\"伦理\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"都市\",\"v\":\"都市\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"军事\",\"v\":\"军事\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"神话\",\"v\":\"神话\"},{\"n\":\"谍战\",\"v\":\"谍战\"},{\"n\":\"青春\",\"v\":\"青春剧\"},{\"n\":\"家庭\",\"v\":\"家庭剧\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"其他\",\"v\":\"其他\"},{\"n\":\"全部\",\"v\":\"\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"更早\",\"v\":\"lt_year\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"},{\"n\":\"最受好评\",\"v\":\"rankpoint\"}]}],\"3\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"脱口秀\",\"v\":\"脱口秀\"},{\"n\":\"真人秀\",\"v\":\"真人秀\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"八卦\",\"v\":\"八卦\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"晚会\",\"v\":\"晚会\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"职场\",\"v\":\"职场\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"时尚\",\"v\":\"时尚\"},{\"n\":\"游戏\",\"v\":\"游戏\"},{\"n\":\"少儿\",\"v\":\"少儿\"},{\"n\":\"体育\",\"v\":\"体育\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"科教\",\"v\":\"科教\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"汽车\",\"v\":\"汽车\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"}]}],\"4\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"美少女\",\"v\":\"美少女\"},{\"n\":\"魔幻\",\"v\":\"魔幻\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"少儿\",\"v\":\"少儿\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"恋爱\",\"v\":\"恋爱\"},{\"n\":\"治愈\",\"v\":\"治愈\"},{\"n\":\"幻想\",\"v\":\"幻想\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动物\",\"v\":\"动物\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"儿歌\",\"v\":\"儿歌\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"怪物\",\"v\":\"怪物\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"童话\",\"v\":\"童话\"},{\"n\":\"竞技\",\"v\":\"竞技\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"友情\",\"v\":\"友情\"},{\"n\":\"真人版\",\"v\":\"真人版\"},{\"n\":\"电影版\",\"v\":\"电影版\"},{\"n\":\"OVA版\",\"v\":\"OVA版\"},{\"n\":\"TV版\",\"v\":\"TV版\"},{\"n\":\"新番动画\",\"v\":\"新番动画\"},{\"n\":\"完结动画\",\"v\":\"完结动画\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"更早\",\"v\":\"更早\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"}]}]}}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected HashMap<String, String> Headers() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
String cover;
|
|
||||||
String remark;
|
|
||||||
try {
|
|
||||||
String url = SiteFilter + "?catid=" + tid + "&pageno=" + pg;
|
|
||||||
Set<String> keys = extend.keySet();
|
|
||||||
for (String key : keys) {
|
|
||||||
String val = extend.get(key).trim();
|
|
||||||
if (val.length() == 0)
|
|
||||||
continue;
|
|
||||||
url += "&" + key + "=" + URLEncoder.encode(val);
|
|
||||||
}
|
|
||||||
String content = OkHttpUtil.string(url, Headers());
|
|
||||||
JSONObject dataObject = new JSONObject(content).getJSONObject("data");
|
|
||||||
JSONArray jsonArray = dataObject.getJSONArray("movies");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
cover = vObj.getString("cover");
|
|
||||||
if (vObj.has("upinfo")) {
|
|
||||||
remark = vObj.getString("upinfo");
|
|
||||||
v.put("vod_id", tid + "_" + vObj.getString("id"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", "https:" + cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
} else {
|
|
||||||
v.put("vod_id", tid + "_" + vObj.getString("id"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", "https:" + cover);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
}
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int limit = 24;
|
|
||||||
int page = Integer.parseInt(dataObject.getString("current_page"));
|
|
||||||
int total = dataObject.getInt("total");
|
|
||||||
int pageCount = total % limit == 0 ? (total / limit) : (total / limit + 1);
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", limit);
|
|
||||||
result.put("total", total);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
Iterator it;
|
|
||||||
String str;
|
|
||||||
String str2;
|
|
||||||
Exception e2;
|
|
||||||
ArrayList arrayList = new ArrayList();
|
|
||||||
Exception e3;
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
try {
|
|
||||||
String[] split = ids.get(0).split("_");
|
|
||||||
String format = String.format("%s?cat=%s&id=%s", SiteDetail, split[0], split[1]);
|
|
||||||
JSONObject jSONObject6 = new JSONObject(OkHttpUtil.string(format, Headers())).getJSONObject("data");
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
JSONObject list = new JSONObject();
|
|
||||||
jSONArray.put(list);
|
|
||||||
result.put("list", jSONArray);
|
|
||||||
list.put("vod_id", split[0] + "_" + jSONObject6.optString("ent_id"));
|
|
||||||
list.put("vod_name", jSONObject6.optString("title"));
|
|
||||||
list.put("vod_pic", jSONObject6.optString("cdncover"));
|
|
||||||
JSONArray optJSONArray = jSONObject6.optJSONArray("moviecategory");
|
|
||||||
ArrayList arrayList2 = new ArrayList();
|
|
||||||
for (int i = 0; i < optJSONArray.length(); i++) {
|
|
||||||
arrayList2.add(optJSONArray.getString(i));
|
|
||||||
}
|
|
||||||
list.put("type_name", TextUtils.join("/", arrayList2));
|
|
||||||
list.put("vod_year", jSONObject6.optString("pubdate"));
|
|
||||||
JSONArray optJSONArray2 = jSONObject6.optJSONArray("area");
|
|
||||||
ArrayList arrayList3 = new ArrayList();
|
|
||||||
for (int i2 = 0; i2 < optJSONArray2.length(); i2++) {
|
|
||||||
arrayList3.add(optJSONArray2.getString(i2));
|
|
||||||
}
|
|
||||||
list.put("vod_area", TextUtils.join("/", arrayList3));
|
|
||||||
list.put("vod_remarks", jSONObject6.optString("doubanscore"));
|
|
||||||
JSONArray optJSONArray3 = jSONObject6.optJSONArray("actor");
|
|
||||||
ArrayList arrayList4 = new ArrayList();
|
|
||||||
for (int i3 = 0; i3 < optJSONArray3.length(); i3++) {
|
|
||||||
arrayList4.add(optJSONArray3.getString(i3));
|
|
||||||
}
|
|
||||||
list.put("vod_actor", TextUtils.join("/", arrayList4));
|
|
||||||
JSONArray optJSONArray4 = jSONObject6.optJSONArray("director");
|
|
||||||
ArrayList arrayList5 = new ArrayList();
|
|
||||||
for (int i4 = 0; i4 < optJSONArray4.length(); i4++) {
|
|
||||||
arrayList5.add(optJSONArray4.getString(i4));
|
|
||||||
}
|
|
||||||
list.put("vod_director", TextUtils.join("/", arrayList5));
|
|
||||||
list.put("vod_content", jSONObject6.optString("description"));
|
|
||||||
JSONArray optJSONArray5 = jSONObject6.optJSONArray("playlink_sites");
|
|
||||||
ArrayList<String> arrayList6 = new ArrayList();
|
|
||||||
for (int i5 = 0; i5 < optJSONArray5.length(); i5++) {
|
|
||||||
arrayList6.add(optJSONArray5.getString(i5));
|
|
||||||
}
|
|
||||||
list.put("vod_play_from", TextUtils.join("$$$", arrayList6));
|
|
||||||
JSONObject optJSONObject = jSONObject6.optJSONObject("playlinksdetail");
|
|
||||||
JSONObject optJSONObject2 = jSONObject6.optJSONObject("allepidetail");
|
|
||||||
JSONArray optJSONArray6 = jSONObject6.optJSONArray("defaultepisode");
|
|
||||||
JSONObject optJSONObject3 = jSONObject6.optJSONObject("allupinfo");
|
|
||||||
String str7 = "vod_play_url";
|
|
||||||
if (optJSONArray6 != null) {
|
|
||||||
ArrayList arrayList7 = new ArrayList();
|
|
||||||
for (int i6 = 0; i6 < optJSONArray6.length(); i6++) {
|
|
||||||
try {
|
|
||||||
URL url2 = new URL(optJSONArray6.getJSONObject(i6).optString("url"));
|
|
||||||
arrayList7.add(optJSONArray6.getJSONObject(i6).optString("sort") + "$" + (url2.getProtocol() + "://" + url2.getHost() + url2.getPath()));
|
|
||||||
} catch (Exception e4) {
|
|
||||||
SpiderDebug.log(e4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
list.put(str7, TextUtils.join("#", arrayList7));
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
if (optJSONObject2 == null) {
|
|
||||||
ArrayList arrayList8 = new ArrayList();
|
|
||||||
for (String str8 : arrayList6) {
|
|
||||||
try {
|
|
||||||
URL url3 = new URL(optJSONObject.getJSONObject(str8).optString("default_url"));
|
|
||||||
arrayList8.add(optJSONObject.getJSONObject(str8).optString("sort") + "$" + (url3.getProtocol() + "://" + url3.getHost() + url3.getPath()));
|
|
||||||
} catch (Exception e5) {
|
|
||||||
SpiderDebug.log(e5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
list.put(str7, TextUtils.join("$$$", arrayList8));
|
|
||||||
} else {
|
|
||||||
ArrayList videos = new ArrayList();
|
|
||||||
Iterator it2 = arrayList6.iterator();
|
|
||||||
while (it2.hasNext()) {
|
|
||||||
String str9 = (String) it2.next();
|
|
||||||
int parseInt = Integer.parseInt(optJSONObject3.optString(str9, "0"));
|
|
||||||
if (parseInt > 50 || parseInt == 0) {
|
|
||||||
it = it2;
|
|
||||||
str = format + "&start=1&end=50&site=" + str9;
|
|
||||||
} else {
|
|
||||||
StringBuilder sb2 = new StringBuilder();
|
|
||||||
sb2.append(format);
|
|
||||||
it = it2;
|
|
||||||
sb2.append("&start=1&end=");
|
|
||||||
sb2.append(parseInt);
|
|
||||||
sb2.append("&site=");
|
|
||||||
sb2.append(str9);
|
|
||||||
str = sb2.toString();
|
|
||||||
}
|
|
||||||
JSONObject optJSONObject4 = new JSONObject(OkHttpUtil.string(str, Headers())).getJSONObject("data").optJSONObject("allepidetail");
|
|
||||||
ArrayList arrayList10 = new ArrayList();
|
|
||||||
JSONArray jSONArray2 = optJSONObject4.getJSONArray(str9);
|
|
||||||
int i7 = 0;
|
|
||||||
while (true) {
|
|
||||||
str2 = str7;
|
|
||||||
if (i7 >= jSONArray2.length()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
String url5 = jSONArray2.getJSONObject(i7).optString("url");
|
|
||||||
arrayList = videos;
|
|
||||||
arrayList10.add(jSONArray2.getJSONObject(i7).optString("playlink_num") + "$" + url5);
|
|
||||||
} catch (Exception e7) {
|
|
||||||
e3 = e7;
|
|
||||||
SpiderDebug.log(e3);
|
|
||||||
i7++;
|
|
||||||
}
|
|
||||||
i7++;
|
|
||||||
str7 = str2;
|
|
||||||
videos = arrayList;
|
|
||||||
}
|
|
||||||
ArrayList arrayList11 = videos;
|
|
||||||
if (parseInt >= jSONArray2.length()) {
|
|
||||||
int i8 = 51;
|
|
||||||
while (i8 < parseInt) {
|
|
||||||
int i9 = i8 + 49;
|
|
||||||
if (i9 > parseInt) {
|
|
||||||
i9 = parseInt;
|
|
||||||
}
|
|
||||||
JSONObject optJSONObject5 = new JSONObject(OkHttpUtil.string(String.format("%s?cat=%s&id=%s&start=%s&end=%s&site=%s", SiteDetail, split[0], split[1], Integer.valueOf(i8), Integer.valueOf(i9), str9), Headers())).optJSONObject("data");
|
|
||||||
if (optJSONObject5 == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
JSONArray jSONArray3 = optJSONObject5.getJSONObject("allepidetail").getJSONArray(str9);
|
|
||||||
int i10 = 0;
|
|
||||||
while (i10 < jSONArray3.length()) {
|
|
||||||
try {
|
|
||||||
String url4 = jSONArray3.getJSONObject(i10).optString("url");
|
|
||||||
try {
|
|
||||||
arrayList10.add(jSONArray3.getJSONObject(i10).optString("playlink_num") + "$" + url4);
|
|
||||||
} catch (Exception e8) {
|
|
||||||
e2 = e8;
|
|
||||||
SpiderDebug.log(e2);
|
|
||||||
i10++;
|
|
||||||
}
|
|
||||||
} catch (Exception e9) {
|
|
||||||
}
|
|
||||||
i10++;
|
|
||||||
}
|
|
||||||
i8 = i9 + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arrayList11.add(TextUtils.join("#", arrayList10));
|
|
||||||
videos = arrayList11;
|
|
||||||
it2 = it;
|
|
||||||
str7 = str2;
|
|
||||||
}
|
|
||||||
list.put(str7, TextUtils.join("$$$", videos));
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e10) {
|
|
||||||
SpiderDebug.log(e10);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
JSONObject results = new JSONObject();
|
|
||||||
try {
|
|
||||||
results.put("class", ext.getJSONArray("classes"));
|
|
||||||
if (filter) {
|
|
||||||
results.put("filters", ext.getJSONObject("filter"));
|
|
||||||
}
|
|
||||||
} catch (JSONException e2) {
|
|
||||||
SpiderDebug.log(e2);
|
|
||||||
}
|
|
||||||
return results.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
JSONObject list = new JSONObject();
|
|
||||||
try {
|
|
||||||
String str = SiteHost;
|
|
||||||
String i = OkHttpUtil.string(str, new HashMap());
|
|
||||||
SpiderDebug.log("响应请求:" + str);
|
|
||||||
JSONArray optJSONArray = new JSONObject(i).optJSONArray("data");
|
|
||||||
JSONArray jSONArray = new JSONArray();
|
|
||||||
for (int j = 0; j < optJSONArray.length(); j++) {
|
|
||||||
JSONObject jSONObject2 = optJSONArray.getJSONObject(j);
|
|
||||||
JSONObject VideoAtom = new JSONObject();
|
|
||||||
VideoAtom.put("vod_id", jSONObject2.optString("cat") + "_" + jSONObject2.optString("ent_id"));
|
|
||||||
VideoAtom.put("vod_name", jSONObject2.optString("title"));
|
|
||||||
VideoAtom.put("vod_pic", jSONObject2.optString("cover"));
|
|
||||||
VideoAtom.put("vod_remarks", jSONObject2.optString("upinfo"));
|
|
||||||
jSONArray.put(VideoAtom);
|
|
||||||
}
|
|
||||||
list.put("list", jSONArray);
|
|
||||||
} catch (Exception e2) {
|
|
||||||
SpiderDebug.log(e2);
|
|
||||||
}
|
|
||||||
return list.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String str, String str2, List<String> list) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
try {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("url", str2);
|
|
||||||
result.put("jx", "1");
|
|
||||||
result.put("playUrl", "");
|
|
||||||
} catch (Exception e2) {
|
|
||||||
SpiderDebug.log(e2);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String str, boolean filter) {
|
|
||||||
JSONObject optJSONObject;
|
|
||||||
JSONObject list = new JSONObject();
|
|
||||||
try {
|
|
||||||
JSONObject optJSONObject2 = new JSONObject(OkHttpUtil.string(String.format(SiteSearch, str), Headers())).optJSONObject("data");
|
|
||||||
if (!(optJSONObject2 == null || (optJSONObject = optJSONObject2.optJSONObject("longData")) == null)) {
|
|
||||||
JSONArray jSONArray = optJSONObject.getJSONArray("rows");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
list.put("list", videos);
|
|
||||||
for (int i = 0; i < jSONArray.length(); i++) {
|
|
||||||
JSONObject Obj = jSONArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", Obj.optString("cat_id") + "_" + Obj.optString("en_id"));
|
|
||||||
v.put("vod_name", Obj.optString("titleTxt"));
|
|
||||||
v.put("vod_pic", Obj.optString("cover"));
|
|
||||||
v.put("vod_remarks", Obj.optString("score"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e2) {
|
|
||||||
SpiderDebug.log(e2);
|
|
||||||
}
|
|
||||||
return list.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,514 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OKCallBack;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import okhttp3.Call;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 神马影院
|
|
||||||
* <p>
|
|
||||||
* Author: baddychen
|
|
||||||
*/
|
|
||||||
public class Smdyy extends Spider {
|
|
||||||
private static final String siteUrl = "https://www.smdyy.cc";
|
|
||||||
/**
|
|
||||||
* 播放源配置
|
|
||||||
*/
|
|
||||||
private JSONObject playerConfig;
|
|
||||||
/**
|
|
||||||
* 筛选配置
|
|
||||||
*/
|
|
||||||
private JSONObject filterConfig;
|
|
||||||
private Pattern regexCategory = Pattern.compile("/list/(\\d+).html");
|
|
||||||
private Pattern regexVid = Pattern.compile("/kan/(\\d+).html");
|
|
||||||
private Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html");
|
|
||||||
private Pattern regexPage = Pattern.compile("/show/(\\S+).html");
|
|
||||||
|
|
||||||
protected String ext = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
playerConfig = new JSONObject("{\"duoduozy\":{\"show\":\"高清线路\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"sohu\":{\"show\":\"优选7\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"qq\":{\"show\":\"优选3\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"bilibili\":{\"show\":\"bilibili\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"youku\":{\"show\":\"优选1\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"qiyi\":{\"show\":\"优选2\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"letv\":{\"show\":\"优选6\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"xigua\":{\"show\":\"西瓜视频\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"mgtv\":{\"show\":\"优选4\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"tkm3u8\":{\"show\":\"备用\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"pptv\":{\"show\":\"优选5\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"}}");
|
|
||||||
filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"犯罪片\",\"v\":\"20\"},{\"n\":\"惊悚片\",\"v\":\"21\"},{\"n\":\"冒险片\",\"v\":\"22\"},{\"n\":\"悬疑片\",\"v\":\"23\"},{\"n\":\"武侠片\",\"v\":\"24\"},{\"n\":\"奇幻片\",\"v\":\"25\"},{\"n\":\"纪录片\",\"v\":\"26\"},{\"n\":\"动画片\",\"v\":\"27\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"泰国剧\",\"v\":\"28\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"3\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"}]}]}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 爬虫headers
|
|
||||||
*
|
|
||||||
* @param url
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("method", "GET");
|
|
||||||
if (!TextUtils.isEmpty(url)) {
|
|
||||||
headers.put("Referer", url);
|
|
||||||
}
|
|
||||||
headers.put("Accept-Encoding", "gzip, deflate, br");
|
|
||||||
headers.put("Upgrade-Insecure-Requests", "1");
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
|
|
||||||
headers.put("Accept-Language", "zh-CN,zh;q=0.9");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类数据 + 首页最近更新视频列表数据
|
|
||||||
*
|
|
||||||
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
|
||||||
// 分类节点
|
|
||||||
Elements elements = doc.select("ul.stui-header__menu > li a");
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (Element ele : elements) {
|
|
||||||
String name = ele.text();
|
|
||||||
boolean show = true;
|
|
||||||
if (filter) {
|
|
||||||
show = name.equals("电影") ||
|
|
||||||
name.equals("电视剧") ||
|
|
||||||
name.equals("动漫");
|
|
||||||
}
|
|
||||||
if (show) {
|
|
||||||
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
|
||||||
if (!mather.find())
|
|
||||||
continue;
|
|
||||||
String id = mather.group(1).trim();
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
try {
|
|
||||||
Elements list = doc.select("div.stui-pannel div.stui-pannel__bd ul.stui-vodlist li div.stui-vodlist__box");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String title = vod.selectFirst(".stui-vodlist__thumb").attr("title");
|
|
||||||
String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original");
|
|
||||||
String remark = vod.selectFirst("span.pic-text").text();
|
|
||||||
if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) {
|
|
||||||
cover = siteUrl + cover;
|
|
||||||
}
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类信息数据
|
|
||||||
*
|
|
||||||
* @param tid 分类id
|
|
||||||
* @param pg 页数
|
|
||||||
* @param filter 同homeContent方法中的filter
|
|
||||||
* @param extend 筛选参数{k:v, k1:v1}
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
|
|
||||||
urlParams[0] = tid;
|
|
||||||
urlParams[8] = pg;
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value.trim().length() == 0)
|
|
||||||
continue;
|
|
||||||
urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 获取分类数据的url
|
|
||||||
String url = siteUrl + "/show/" + TextUtils.join("-", urlParams) + "/";
|
|
||||||
String html = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
Document doc = Jsoup.parse(html);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int pageCount = 0;
|
|
||||||
int page = -1;
|
|
||||||
|
|
||||||
Elements pageInfo = doc.select("ul.stui-page__item li");
|
|
||||||
if (pageInfo.size() == 0) {
|
|
||||||
page = Integer.parseInt(pg);
|
|
||||||
pageCount = page;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < pageInfo.size(); i++) {
|
|
||||||
Element li = pageInfo.get(i);
|
|
||||||
Element a = li.selectFirst("a");
|
|
||||||
if (a == null)
|
|
||||||
continue;
|
|
||||||
if (page == -1 && li.hasClass("active")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
page = Integer.parseInt(matcher.group(1).split("-")[8]);
|
|
||||||
} else {
|
|
||||||
page = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String wy = doc.select("ul.stui-page__item li a").last().attr("href");
|
|
||||||
Matcher matcher = regexPage.matcher(wy);
|
|
||||||
if (matcher.find()) {
|
|
||||||
pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
|
|
||||||
} else {
|
|
||||||
pageCount = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (!html.contains("没有找到您想要的结果哦")) {
|
|
||||||
Elements list = doc.select("ul.stui-vodlist li div.stui-vodlist__box");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.selectFirst(".stui-vodlist__thumb").attr("title");
|
|
||||||
String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original");
|
|
||||||
if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) {
|
|
||||||
cover = siteUrl + cover;
|
|
||||||
}
|
|
||||||
String remark = vod.selectFirst("span.pic-text").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", 48);
|
|
||||||
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static String Regex(Pattern pattern, String content) {
|
|
||||||
if (pattern == null) {
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Matcher matcher = pattern.matcher(content);
|
|
||||||
if (matcher.find()) {
|
|
||||||
return matcher.group(1).trim();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频详情信息
|
|
||||||
*
|
|
||||||
* @param ids 视频id
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
// 视频详情url
|
|
||||||
String url = siteUrl + "/kan/" + ids.get(0) + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vodList = new JSONObject();
|
|
||||||
|
|
||||||
// 取基本数据
|
|
||||||
String cover = doc.selectFirst("a.pic img").attr("data-original");
|
|
||||||
if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) {
|
|
||||||
cover = siteUrl + cover;
|
|
||||||
}
|
|
||||||
String title = doc.selectFirst("div.stui-content__detail h1.title").text();
|
|
||||||
String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
|
|
||||||
Elements data = doc.select("p.data");
|
|
||||||
desc = doc.selectFirst("span.detail-content").text().trim();
|
|
||||||
category = Regex(Pattern.compile("类型:(\\S+)"), data.get(0).text());
|
|
||||||
area = Regex(Pattern.compile("地区:(\\S+)"), data.get(0).text());
|
|
||||||
year = Regex(Pattern.compile("年份:(\\S+)"), data.get(0).text());
|
|
||||||
actor = Regex(Pattern.compile("主演:(\\S+)"), data.get(1).text());
|
|
||||||
director = Regex(Pattern.compile("导演:(\\S+)"), data.get(1).text());
|
|
||||||
|
|
||||||
vodList.put("vod_id", ids.get(0));
|
|
||||||
vodList.put("vod_name", title);
|
|
||||||
vodList.put("vod_pic", cover);
|
|
||||||
vodList.put("type_name", category);
|
|
||||||
vodList.put("vod_year", year);
|
|
||||||
vodList.put("vod_area", area);
|
|
||||||
vodList.put("vod_remarks", remark);
|
|
||||||
vodList.put("vod_actor", actor);
|
|
||||||
vodList.put("vod_director", director);
|
|
||||||
vodList.put("vod_content", desc);
|
|
||||||
|
|
||||||
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
|
||||||
@Override
|
|
||||||
public int compare(String o1, String o2) {
|
|
||||||
try {
|
|
||||||
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
|
||||||
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
|
||||||
|
|
||||||
if (sort1 == sort2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return sort1 - sort2 > 0 ? 1 : -1;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 取播放列表数据
|
|
||||||
Elements sources = doc.select("div.stui-vodlist__head");
|
|
||||||
//Elements sourceList = doc.select("div.stui-vodlist__head > ul.stui-content__playlist");
|
|
||||||
|
|
||||||
for (int i = 0; i < sources.size(); i++) {
|
|
||||||
Element source = sources.get(i);
|
|
||||||
String sourceName = source.selectFirst("h3").text().trim();
|
|
||||||
boolean found = false;
|
|
||||||
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
|
||||||
String flag = it.next();
|
|
||||||
if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) {
|
|
||||||
//sourceName = flag;
|
|
||||||
sourceName = playerConfig.getJSONObject(flag).getString("show");
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
String playList = "";
|
|
||||||
Elements playListA = source.select("ul.stui-content__playlist > li > a");
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
|
|
||||||
vodItems.add(vod.text() + "$" + playURL);
|
|
||||||
}
|
|
||||||
if (vodItems.size() > 0)
|
|
||||||
playList = TextUtils.join("#", vodItems);
|
|
||||||
|
|
||||||
if (playList.length() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vod_play.put(sourceName, playList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vod_play.size() > 0) {
|
|
||||||
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
|
||||||
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
|
||||||
vodList.put("vod_play_from", vod_play_from);
|
|
||||||
vodList.put("vod_play_url", vod_play_url);
|
|
||||||
}
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vodList);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取视频播放信息
|
|
||||||
*
|
|
||||||
* @param flag 播放源
|
|
||||||
* @param id 视频id
|
|
||||||
* @param vipFlags 所有可能需要vip解析的源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
|
|
||||||
private final Pattern urlt = Pattern.compile("\"url\": *\"([^\"]*)\",");
|
|
||||||
private final Pattern token = Pattern.compile("\"token\": *\"([^\"]*)\"");
|
|
||||||
private final Pattern vkey = Pattern.compile("\"vkey\": *\"([^\"]*)\",");
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
JSONObject headers = new JSONObject();
|
|
||||||
headers.put("Referer", " https://www.smdyy.cc/");
|
|
||||||
headers.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36");
|
|
||||||
headers.put("Accept", " text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
|
|
||||||
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6");
|
|
||||||
headers.put("Accept-Encoding", " gzip, deflate");
|
|
||||||
String url = siteUrl + "/play/" + id + ".html";
|
|
||||||
Elements allScript = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))).select("script");
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) {
|
|
||||||
JSONObject player = new JSONObject(scContent.substring(scContent.indexOf('{'), scContent.lastIndexOf('}') + 1));
|
|
||||||
if (playerConfig.has(player.getString("from"))) {
|
|
||||||
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
|
|
||||||
//String jxurl = "https://player.tjomet.com/lgyy/?url=" + player.getString("url");
|
|
||||||
String jxurl = pCfg.getString("parse") + player.getString("url");
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(jxurl, getHeaders(jxurl)));
|
|
||||||
Elements script = doc.select("body>script");
|
|
||||||
for (int j = 0; j < script.size(); j++) {
|
|
||||||
String Content = script.get(j).html().trim();
|
|
||||||
Matcher matcher = urlt.matcher(Content);
|
|
||||||
if (!matcher.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String urlt = matcher.group(1);
|
|
||||||
Matcher matcher1 = token.matcher(Content);
|
|
||||||
if (!matcher1.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String token = matcher1.group(1);
|
|
||||||
Matcher matcher2 = vkey.matcher(Content);
|
|
||||||
if (!matcher2.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String vkey = matcher2.group(1);
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
hashMap.put("token", token);
|
|
||||||
hashMap.put("url", urlt);
|
|
||||||
hashMap.put("vkey", vkey);
|
|
||||||
hashMap.put("sign", "smdyycc");
|
|
||||||
OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://player.6080kan.cc/player/xinapi.php", hashMap, new OKCallBack.OKCallBackString() {
|
|
||||||
@Override
|
|
||||||
protected void onFailure(Call call, Exception exc) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResponse(String str) {
|
|
||||||
try {
|
|
||||||
String url = new String(Base64.decode(new JSONObject(str).getString("url").substring(8).getBytes(), 0));
|
|
||||||
result.put("url", url.substring(8, url.length() - 8));
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
result.put("header", headers.toString());
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 搜索
|
|
||||||
*
|
|
||||||
* @param key
|
|
||||||
* @param quick 是否播放页的快捷搜索
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
if (quick)
|
|
||||||
return "";
|
|
||||||
long currentTime = System.currentTimeMillis();
|
|
||||||
String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime;
|
|
||||||
JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (searchResult.getInt("total") > 0) {
|
|
||||||
JSONArray lists = new JSONArray(searchResult.getString("list"));
|
|
||||||
for (int i = 0; i < lists.length(); i++) {
|
|
||||||
JSONObject vod = lists.getJSONObject(i);
|
|
||||||
String id = vod.getString("id");
|
|
||||||
String title = vod.getString("name");
|
|
||||||
String cover = vod.getString("pic");
|
|
||||||
if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) {
|
|
||||||
cover = siteUrl + cover;
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,431 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OKCallBack;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import okhttp3.Call;
|
|
||||||
|
|
||||||
public class XBiubiu extends Spider {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
this.ext = extend;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
String[] fenleis = getRuleVal("fenlei", "").split("#");
|
|
||||||
for (String fenlei : fenleis) {
|
|
||||||
String[] info = fenlei.split("\\$");
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_name", info[0]);
|
|
||||||
jsonObject.put("type_id", info[1]);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
return result.toString();
|
|
||||||
} catch (
|
|
||||||
Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
String ua = getRuleVal("UserW", Misc.UaWinChrome).trim();
|
|
||||||
if (ua.isEmpty())
|
|
||||||
ua = Misc.UaWinChrome;
|
|
||||||
headers.put("User-Agent", ua);
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
if (getRuleVal("shouye").equals("1")) {
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
String[] fenleis = getRuleVal("fenlei", "").split("#");
|
|
||||||
for (String fenlei : fenleis) {
|
|
||||||
String[] info = fenlei.split("\\$");
|
|
||||||
JSONObject data = category(info[1], "1", false, new HashMap<>());
|
|
||||||
if (data != null) {
|
|
||||||
JSONArray vids = data.optJSONArray("list");
|
|
||||||
if (vids != null) {
|
|
||||||
for (int i = 0; i < vids.length() && i < 5; i++) {
|
|
||||||
videos.put(vids.getJSONObject(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (videos.length() >= 30)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private JSONObject category(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = getRuleVal("url") + tid + pg + getRuleVal("houzhui");
|
|
||||||
String html = fetch(webUrl);
|
|
||||||
String parseContent = html;
|
|
||||||
boolean shifouercijiequ = getRuleVal("shifouercijiequ").equals("1");
|
|
||||||
if (shifouercijiequ) {
|
|
||||||
String jiequqian = getRuleVal("jiequqian");
|
|
||||||
String jiequhou = getRuleVal("jiequhou");
|
|
||||||
parseContent = subContent(html, jiequqian, jiequhou).get(0);
|
|
||||||
}
|
|
||||||
String jiequshuzuqian = getRuleVal("jiequshuzuqian");
|
|
||||||
String jiequshuzuhou = getRuleVal("jiequshuzuhou");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
ArrayList<String> jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou);
|
|
||||||
for (int i = 0; i < jiequContents.size(); i++) {
|
|
||||||
//try {
|
|
||||||
String jiequContent = jiequContents.get(i);
|
|
||||||
String title = subContent(jiequContent, getRuleVal("biaotiqian"), getRuleVal("biaotihou")).get(0);
|
|
||||||
String pic = subContent(jiequContent, getRuleVal("tupianqian"), getRuleVal("tupianhou")).get(0);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String link = subContent(jiequContent, getRuleVal("lianjieqian"), getRuleVal("lianjiehou")).get(0);
|
|
||||||
//String remarks = subContent(jiequContent, getRuleVal("gengxinqian"), getRuleVal("gengxinhou")).get(0);
|
|
||||||
//String remarks = subContent(jiequContent, getRuleVal("gengxinqian"), getRuleVal("gengxinhou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", "");
|
|
||||||
String mark = "";
|
|
||||||
if (!getRuleVal("gengxinqian").isEmpty() && !getRuleVal("gengxinhou").isEmpty()) {
|
|
||||||
try {
|
|
||||||
mark = subContent(jiequContent, getRuleVal("gengxinqian"), getRuleVal("gengxinhou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", "");
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", title + "$$$" + pic + "$$$" + link);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
//} catch (Throwable th) {
|
|
||||||
//th.printStackTrace();
|
|
||||||
//break;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("page", pg);
|
|
||||||
result.put("pagecount", Integer.MAX_VALUE);
|
|
||||||
result.put("limit", 90);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result;
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
JSONObject obj = category(tid, pg, filter, extend);
|
|
||||||
return obj != null ? obj.toString() : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String[] idInfo = ids.get(0).split("\\$\\$\\$");
|
|
||||||
String webUrl = getRuleVal("url") + idInfo[2];
|
|
||||||
String html = fetch(webUrl);
|
|
||||||
String parseContent = html;
|
|
||||||
boolean bfshifouercijiequ = getRuleVal("bfshifouercijiequ").equals("1");
|
|
||||||
if (bfshifouercijiequ) {
|
|
||||||
String jiequqian = getRuleVal("bfjiequqian");
|
|
||||||
String jiequhou = getRuleVal("bfjiequhou");
|
|
||||||
parseContent = subContent(html, jiequqian, jiequhou).get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList<String> playList = new ArrayList<>();
|
|
||||||
|
|
||||||
String jiequshuzuqian = getRuleVal("bfjiequshuzuqian");
|
|
||||||
String jiequshuzuhou = getRuleVal("bfjiequshuzuhou");
|
|
||||||
boolean bfyshifouercijiequ = getRuleVal("bfyshifouercijiequ").equals("1");
|
|
||||||
ArrayList<String> jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou);
|
|
||||||
for (int i = 0; i < jiequContents.size(); i++) {
|
|
||||||
try {
|
|
||||||
String jiequContent = jiequContents.get(i);
|
|
||||||
String parseJqContent = bfyshifouercijiequ ? subContent(jiequContent, getRuleVal("bfyjiequqian"), getRuleVal("bfyjiequhou")).get(0) : jiequContent;
|
|
||||||
ArrayList<String> lastParseContents = subContent(parseJqContent, getRuleVal("bfyjiequshuzuqian"), getRuleVal("bfyjiequshuzuhou"));
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
for (int j = 0; j < lastParseContents.size(); j++) {
|
|
||||||
String title = subContent(lastParseContents.get(j), getRuleVal("bfbiaotiqian"), getRuleVal("bfbiaotihou")).get(0);
|
|
||||||
String link = subContent(lastParseContents.get(j), getRuleVal("bflianjieqian"), getRuleVal("bflianjiehou")).get(0);
|
|
||||||
vodItems.add(title + "$" + link);
|
|
||||||
}
|
|
||||||
playList.add(TextUtils.join("#", vodItems));
|
|
||||||
} catch (Throwable th) {
|
|
||||||
th.printStackTrace();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String cover = idInfo[1], title = idInfo[0], area = "";
|
|
||||||
String director = "";
|
|
||||||
String actor = "";
|
|
||||||
String desc = "";
|
|
||||||
String remark = "";
|
|
||||||
String year = "";
|
|
||||||
String category = "";
|
|
||||||
|
|
||||||
if (!getRuleVal("leixinqian").isEmpty() && !getRuleVal("leixinhou").isEmpty()) {
|
|
||||||
try {
|
|
||||||
category = subContent(html, getRuleVal("leixinqian"), getRuleVal("leixinhou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", "");
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!getRuleVal("niandaiqian").isEmpty() && !getRuleVal("niandaihou").isEmpty()) {
|
|
||||||
try {
|
|
||||||
year = subContent(html, getRuleVal("niandaiqian"), getRuleVal("niandaihou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", "");
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!getRuleVal("zhuangtaiqian").isEmpty() && !getRuleVal("zhuangtaihou").isEmpty()) {
|
|
||||||
try {
|
|
||||||
remark = subContent(html, getRuleVal("zhuangtaiqian"), getRuleVal("zhuangtaihou")).get(0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!getRuleVal("zhuyanqian").isEmpty() && !getRuleVal("zhuyanhou").isEmpty()) {
|
|
||||||
try {
|
|
||||||
actor = subContent(html, getRuleVal("zhuyanqian"), getRuleVal("zhuyanhou")).get(0).replaceAll("\\s+", "");
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!getRuleVal("daoyanqian").isEmpty() && !getRuleVal("daoyanhou").isEmpty()) {
|
|
||||||
try {
|
|
||||||
director = subContent(html, getRuleVal("daoyanqian"), getRuleVal("daoyanhou")).get(0).replaceAll("\\s+", "");
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!getRuleVal("juqingqian").isEmpty() && !getRuleVal("juqinghou").isEmpty()) {
|
|
||||||
try {
|
|
||||||
desc = subContent(html, getRuleVal("juqingqian"), getRuleVal("juqinghou")).get(0);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject vod = new JSONObject();
|
|
||||||
vod.put("vod_id", ids.get(0));
|
|
||||||
vod.put("vod_name", title);
|
|
||||||
vod.put("vod_pic", cover);
|
|
||||||
vod.put("type_name", category);
|
|
||||||
vod.put("vod_year", year);
|
|
||||||
vod.put("vod_area", area);
|
|
||||||
vod.put("vod_remarks", remark);
|
|
||||||
vod.put("vod_actor", actor);
|
|
||||||
vod.put("vod_director", director);
|
|
||||||
vod.put("vod_content", desc);
|
|
||||||
|
|
||||||
ArrayList<String> playFrom = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int i = 0; i < playList.size(); i++) {
|
|
||||||
playFrom.add("播放列表" + (i + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
String vod_play_from = TextUtils.join("$$$", playFrom);
|
|
||||||
String vod_play_url = TextUtils.join("$$$", playList);
|
|
||||||
vod.put("vod_play_from", vod_play_from);
|
|
||||||
vod.put("vod_play_url", vod_play_url);
|
|
||||||
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vod);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = getRuleVal("url") + id;
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", webUrl);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
boolean ssmoshiJson = getRuleVal("ssmoshi").equals("0");
|
|
||||||
String webUrlTmp = getRuleVal("url") + getRuleVal("sousuoqian") + key + getRuleVal("sousuohou");
|
|
||||||
String webUrl = webUrlTmp.split(";")[0];
|
|
||||||
String webContent = webUrlTmp.contains(";post") ? fetchPost(webUrl) : fetch(webUrl);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (ssmoshiJson) {
|
|
||||||
JSONObject data = new JSONObject(webContent);
|
|
||||||
JSONArray vodArray = data.getJSONArray("list");
|
|
||||||
for (int j = 0; j < vodArray.length(); j++) {
|
|
||||||
JSONObject vod = vodArray.getJSONObject(j);
|
|
||||||
String name = vod.optString(getRuleVal("jsname")).trim();
|
|
||||||
String id = vod.optString(getRuleVal("jsid")).trim();
|
|
||||||
String pic = vod.optString(getRuleVal("jspic")).trim();
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", name + "$$$" + pic + "$$$" + getRuleVal("sousuohouzhui") + id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
String parseContent = webContent;
|
|
||||||
boolean shifouercijiequ = getRuleVal("sousuoshifouercijiequ").equals("1");
|
|
||||||
if (shifouercijiequ) {
|
|
||||||
String jiequqian = getRuleVal("ssjiequqian");
|
|
||||||
String jiequhou = getRuleVal("ssjiequhou");
|
|
||||||
parseContent = subContent(webContent, jiequqian, jiequhou).get(0);
|
|
||||||
}
|
|
||||||
String jiequshuzuqian = getRuleVal("ssjiequshuzuqian");
|
|
||||||
String jiequshuzuhou = getRuleVal("ssjiequshuzuhou");
|
|
||||||
ArrayList<String> jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou);
|
|
||||||
for (int i = 0; i < jiequContents.size(); i++) {
|
|
||||||
try {
|
|
||||||
String jiequContent = jiequContents.get(i);
|
|
||||||
String title = subContent(jiequContent, getRuleVal("ssbiaotiqian"), getRuleVal("ssbiaotihou")).get(0);
|
|
||||||
String pic = subContent(jiequContent, getRuleVal("sstupianqian"), getRuleVal("sstupianhou")).get(0);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String link = subContent(jiequContent, getRuleVal("sslianjieqian"), getRuleVal("sslianjiehou")).get(0);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", title + "$$$" + pic + "$$$" + link);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
videos.put(v);
|
|
||||||
} catch (Throwable th) {
|
|
||||||
th.printStackTrace();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (
|
|
||||||
Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String ext = null;
|
|
||||||
protected JSONObject rule = null;
|
|
||||||
|
|
||||||
protected void fetchRule() {
|
|
||||||
if (rule == null) {
|
|
||||||
if (ext != null) {
|
|
||||||
try {
|
|
||||||
if (ext.startsWith("http")) {
|
|
||||||
String json = OkHttpUtil.string(ext, null);
|
|
||||||
rule = new JSONObject(json);
|
|
||||||
} else {
|
|
||||||
rule = new JSONObject(ext);
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String fetch(String webUrl) {
|
|
||||||
SpiderDebug.log(webUrl);
|
|
||||||
return OkHttpUtil.string(webUrl, getHeaders(webUrl)).replaceAll("\r|\n", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String fetchPost(String webUrl) {
|
|
||||||
SpiderDebug.log(webUrl);
|
|
||||||
OKCallBack.OKCallBackString callBack = new OKCallBack.OKCallBackString() {
|
|
||||||
@Override
|
|
||||||
protected void onFailure(Call call, Exception e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResponse(String response) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
OkHttpUtil.post(OkHttpUtil.defaultClient(), webUrl, callBack);
|
|
||||||
return callBack.getResult().replaceAll("\r|\n", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getRuleVal(String key, String defaultVal) {
|
|
||||||
String v = rule.optString(key);
|
|
||||||
if (v.isEmpty() || v.equals("空"))
|
|
||||||
return defaultVal;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getRuleVal(String key) {
|
|
||||||
return getRuleVal(key, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
private ArrayList<String> subContent(String content, String startFlag, String endFlag) {
|
|
||||||
ArrayList<String> result = new ArrayList<>();
|
|
||||||
try {
|
|
||||||
Pattern pattern = Pattern.compile(startFlag + "(.*?)" + endFlag);
|
|
||||||
Matcher matcher = pattern.matcher(content);
|
|
||||||
while (matcher.find()) {
|
|
||||||
result.add(matcher.group(1));
|
|
||||||
}
|
|
||||||
} catch (Throwable th) {
|
|
||||||
th.printStackTrace();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,474 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
import com.github.catvod.xpath.XPathRule;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.seimicrawler.xpath.JXDocument;
|
|
||||||
import org.seimicrawler.xpath.JXNode;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class XPath extends Spider {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
this.ext = extend;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
if (rule.getCateManual().size() > 0) {
|
|
||||||
Set<String> keys = rule.getCateManual().keySet();
|
|
||||||
for (String k : keys) {
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_name", k);
|
|
||||||
jsonObject.put("type_id", rule.getCateManual().get(k));
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
String webUrl = rule.getHomeUrl();
|
|
||||||
JXDocument doc = JXDocument.create(fetch(webUrl));
|
|
||||||
if (rule.getCateManual().size() == 0) {
|
|
||||||
List<JXNode> navNodes = doc.selN(rule.getCateNode());
|
|
||||||
for (int i = 0; i < navNodes.size(); i++) {
|
|
||||||
String name = navNodes.get(i).selOne(rule.getCateName()).asString().trim();
|
|
||||||
name = rule.getCateNameR(name);
|
|
||||||
String id = navNodes.get(i).selOne(rule.getCateId()).asString().trim();
|
|
||||||
id = rule.getCateIdR(id);
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getHomeVodNode().isEmpty()) {
|
|
||||||
try {
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
List<JXNode> vodNodes = doc.selN(rule.getHomeVodNode());
|
|
||||||
for (int i = 0; i < vodNodes.size(); i++) {
|
|
||||||
String name = vodNodes.get(i).selOne(rule.getHomeVodName()).asString().trim();
|
|
||||||
name = rule.getHomeVodNameR(name);
|
|
||||||
String id = vodNodes.get(i).selOne(rule.getHomeVodId()).asString().trim();
|
|
||||||
id = rule.getHomeVodIdR(id);
|
|
||||||
String pic = vodNodes.get(i).selOne(rule.getHomeVodImg()).asString().trim();
|
|
||||||
pic = rule.getHomeVodImgR(pic);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String mark = "";
|
|
||||||
if (!rule.getHomeVodMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
mark = vodNodes.get(i).selOne(rule.getHomeVodMark()).asString().trim();
|
|
||||||
mark = rule.getHomeVodMarkR(mark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
if (filter && rule.getFilter() != null) {
|
|
||||||
result.put("filters", rule.getFilter());
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (
|
|
||||||
Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", rule.getUa().isEmpty()
|
|
||||||
? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
|
|
||||||
: rule.getUa());
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
return rule.getCateUrl().replace("{cateId}", tid).replace("{catePg}", pg);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = categoryUrl(tid, pg, filter, extend);
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
JXDocument doc = JXDocument.create(fetch(webUrl));
|
|
||||||
List<JXNode> vodNodes = doc.selN(rule.getCateVodNode());
|
|
||||||
for (int i = 0; i < vodNodes.size(); i++) {
|
|
||||||
String name = vodNodes.get(i).selOne(rule.getCateVodName()).asString().trim();
|
|
||||||
name = rule.getCateVodNameR(name);
|
|
||||||
String id = vodNodes.get(i).selOne(rule.getCateVodId()).asString().trim();
|
|
||||||
id = rule.getCateVodIdR(id);
|
|
||||||
String pic = vodNodes.get(i).selOne(rule.getCateVodImg()).asString().trim();
|
|
||||||
pic = rule.getCateVodImgR(pic);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String mark = "";
|
|
||||||
if (!rule.getCateVodMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
mark = vodNodes.get(i).selOne(rule.getCateVodMark()).asString().trim();
|
|
||||||
mark = rule.getCateVodMarkR(mark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("page", pg);
|
|
||||||
result.put("pagecount", Integer.MAX_VALUE);
|
|
||||||
result.put("limit", 90);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void detailContentExt(String content, JSONObject vod) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = rule.getDetailUrl().replace("{vid}", ids.get(0));
|
|
||||||
String webContent = fetch(webUrl);
|
|
||||||
JXDocument doc = JXDocument.create(webContent);
|
|
||||||
JXNode vodNode = doc.selNOne(rule.getDetailNode());
|
|
||||||
|
|
||||||
String cover = "", title = "", desc = "", category = "", area = "", year = "", remark = "", director = "", actor = "";
|
|
||||||
|
|
||||||
title = vodNode.selOne(rule.getDetailName()).asString().trim();
|
|
||||||
title = rule.getDetailNameR(title);
|
|
||||||
|
|
||||||
cover = vodNode.selOne(rule.getDetailImg()).asString().trim();
|
|
||||||
cover = rule.getDetailImgR(cover);
|
|
||||||
cover = Misc.fixUrl(webUrl, cover);
|
|
||||||
|
|
||||||
if (!rule.getDetailCate().isEmpty()) {
|
|
||||||
try {
|
|
||||||
category = vodNode.selOne(rule.getDetailCate()).asString().trim();
|
|
||||||
category = rule.getDetailCateR(category);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailYear().isEmpty()) {
|
|
||||||
try {
|
|
||||||
year = vodNode.selOne(rule.getDetailYear()).asString().trim();
|
|
||||||
year = rule.getDetailYearR(year);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailArea().isEmpty()) {
|
|
||||||
try {
|
|
||||||
area = vodNode.selOne(rule.getDetailArea()).asString().trim();
|
|
||||||
area = rule.getDetailAreaR(area);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
remark = vodNode.selOne(rule.getDetailMark()).asString().trim();
|
|
||||||
remark = rule.getDetailMarkR(remark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailActor().isEmpty()) {
|
|
||||||
try {
|
|
||||||
actor = vodNode.selOne(rule.getDetailActor()).asString().trim();
|
|
||||||
actor = rule.getDetailActorR(actor);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailDirector().isEmpty()) {
|
|
||||||
try {
|
|
||||||
director = vodNode.selOne(rule.getDetailDirector()).asString().trim();
|
|
||||||
director = rule.getDetailDirectorR(director);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailDesc().isEmpty()) {
|
|
||||||
try {
|
|
||||||
desc = vodNode.selOne(rule.getDetailDesc()).asString().trim();
|
|
||||||
desc = rule.getDetailDescR(desc);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONObject vod = new JSONObject();
|
|
||||||
vod.put("vod_id", ids.get(0));
|
|
||||||
vod.put("vod_name", title);
|
|
||||||
vod.put("vod_pic", cover);
|
|
||||||
vod.put("type_name", category);
|
|
||||||
vod.put("vod_year", year);
|
|
||||||
vod.put("vod_area", area);
|
|
||||||
vod.put("vod_remarks", remark);
|
|
||||||
vod.put("vod_actor", actor);
|
|
||||||
vod.put("vod_director", director);
|
|
||||||
vod.put("vod_content", desc);
|
|
||||||
|
|
||||||
ArrayList<String> playFrom = new ArrayList<>();
|
|
||||||
|
|
||||||
List<JXNode> fromNodes = doc.selN(rule.getDetailFromNode());
|
|
||||||
for (int i = 0; i < fromNodes.size(); i++) {
|
|
||||||
String name = fromNodes.get(i).selOne(rule.getDetailFromName()).asString().trim();
|
|
||||||
name = rule.getDetailFromNameR(name);
|
|
||||||
playFrom.add(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList<String> playList = new ArrayList<>();
|
|
||||||
List<JXNode> urlListNodes = doc.selN(rule.getDetailUrlNode());
|
|
||||||
for (int i = 0; i < urlListNodes.size(); i++) {
|
|
||||||
List<JXNode> urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode());
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
for (int j = 0; j < urlNodes.size(); j++) {
|
|
||||||
String name = urlNodes.get(j).selOne(rule.getDetailUrlName()).asString().trim();
|
|
||||||
name = rule.getDetailUrlNameR(name);
|
|
||||||
String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim();
|
|
||||||
id = rule.getDetailUrlIdR(id);
|
|
||||||
vodItems.add(name + "$" + id);
|
|
||||||
}
|
|
||||||
// 排除播放列表为空的播放源
|
|
||||||
if (vodItems.size() == 0 && playFrom.size() > i) {
|
|
||||||
playFrom.set(i, "");
|
|
||||||
}
|
|
||||||
playList.add(TextUtils.join("#", vodItems));
|
|
||||||
}
|
|
||||||
// 排除播放列表为空的播放源
|
|
||||||
for (int i = playFrom.size() - 1; i >= 0; i--) {
|
|
||||||
if (playFrom.get(i).isEmpty())
|
|
||||||
playFrom.remove(i);
|
|
||||||
}
|
|
||||||
for (int i = playList.size() - 1; i >= 0; i--) {
|
|
||||||
if (playList.get(i).isEmpty())
|
|
||||||
playList.remove(i);
|
|
||||||
}
|
|
||||||
for (int i = playList.size() - 1; i >= 0; i--) {
|
|
||||||
if (i >= playFrom.size())
|
|
||||||
playList.remove(i);
|
|
||||||
}
|
|
||||||
String vod_play_from = TextUtils.join("$$$", playFrom);
|
|
||||||
String vod_play_url = TextUtils.join("$$$", playList);
|
|
||||||
vod.put("vod_play_from", vod_play_from);
|
|
||||||
vod.put("vod_play_url", vod_play_url);
|
|
||||||
|
|
||||||
detailContentExt(webContent, vod);
|
|
||||||
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vod);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id);
|
|
||||||
SpiderDebug.log(webUrl);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
if (!rule.getPlayUa().isEmpty()) {
|
|
||||||
result.put("ua", rule.getPlayUa());
|
|
||||||
}
|
|
||||||
result.put("url", webUrl);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
if (rule.getSearchUrl().isEmpty()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String webUrl = rule.getSearchUrl().replace("{wd}", URLEncoder.encode(key));
|
|
||||||
String webContent = fetch(webUrl);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
// add maccms suggest search api support
|
|
||||||
if (rule.getSearchVodNode().startsWith("json:")) {
|
|
||||||
String[] node = rule.getSearchVodNode().substring(5).split(">");
|
|
||||||
JSONObject data = new JSONObject(webContent);
|
|
||||||
for (int i = 0; i < node.length; i++) {
|
|
||||||
if (i == node.length - 1) {
|
|
||||||
JSONArray vodArray = data.getJSONArray(node[i]);
|
|
||||||
for (int j = 0; j < vodArray.length(); j++) {
|
|
||||||
JSONObject vod = vodArray.getJSONObject(j);
|
|
||||||
String name = vod.optString(rule.getSearchVodName()).trim();
|
|
||||||
name = rule.getSearchVodNameR(name);
|
|
||||||
String id = vod.optString(rule.getSearchVodId()).trim();
|
|
||||||
id = rule.getSearchVodIdR(id);
|
|
||||||
String pic = vod.optString(rule.getSearchVodImg()).trim();
|
|
||||||
pic = rule.getSearchVodImgR(pic);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String mark = vod.optString(rule.getSearchVodMark()).trim();
|
|
||||||
mark = rule.getSearchVodMarkR(mark);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
data = data.getJSONObject(node[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
JXDocument doc = JXDocument.create(webContent);
|
|
||||||
List<JXNode> vodNodes = doc.selN(rule.getSearchVodNode());
|
|
||||||
for (int i = 0; i < vodNodes.size(); i++) {
|
|
||||||
String name = vodNodes.get(i).selOne(rule.getSearchVodName()).asString().trim();
|
|
||||||
name = rule.getSearchVodNameR(name);
|
|
||||||
String id = vodNodes.get(i).selOne(rule.getSearchVodId()).asString().trim();
|
|
||||||
id = rule.getSearchVodIdR(id);
|
|
||||||
String pic = vodNodes.get(i).selOne(rule.getSearchVodImg()).asString().trim();
|
|
||||||
pic = rule.getSearchVodImgR(pic);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String mark = "";
|
|
||||||
if (!rule.getCateVodMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
mark = vodNodes.get(i).selOne(rule.getSearchVodMark()).asString().trim();
|
|
||||||
mark = rule.getSearchVodMarkR(mark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (
|
|
||||||
Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean manualVideoCheck() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv"};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVideoFormat(String url) {
|
|
||||||
url = url.toLowerCase();
|
|
||||||
if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (String format : videoFormatList) {
|
|
||||||
if (url.contains(format)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String ext = null;
|
|
||||||
protected XPathRule rule = null;
|
|
||||||
|
|
||||||
protected void fetchRule() {
|
|
||||||
if (rule == null) {
|
|
||||||
if (ext != null) {
|
|
||||||
if (ext.startsWith("http")) {
|
|
||||||
String json = OkHttpUtil.string(ext, null);
|
|
||||||
rule = XPathRule.fromJson(json);
|
|
||||||
loadRuleExt(json);
|
|
||||||
} else {
|
|
||||||
rule = XPathRule.fromJson(ext);
|
|
||||||
loadRuleExt(ext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void loadRuleExt(String json) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String fetch(String webUrl) {
|
|
||||||
SpiderDebug.log(webUrl);
|
|
||||||
return OkHttpUtil.string(webUrl, getHeaders(webUrl));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class XPathFilter extends XPath {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void loadRuleExt(String json) {
|
|
||||||
super.loadRuleExt(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
String cateUrl = rule.getCateUrl();
|
|
||||||
if (filter && extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value.length() > 0) {
|
|
||||||
cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg);
|
|
||||||
Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl);
|
|
||||||
while (m.find()) {
|
|
||||||
String n = m.group(0).replace("{", "").replace("}", "");
|
|
||||||
cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", "");
|
|
||||||
}
|
|
||||||
return cateUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLDecoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class XPathMac extends XPath {
|
|
||||||
// 尝试分析直连
|
|
||||||
private boolean decodePlayUrl;
|
|
||||||
// 尝试匹配官源标识以调用应用配置中的解析列表
|
|
||||||
private boolean decodeVipFlag;
|
|
||||||
// 播放器配置js
|
|
||||||
private String playerConfigJs = "";
|
|
||||||
// 播放器配置js取值正则
|
|
||||||
private String playerConfigJsRegex = "[\\W|\\S|.]*?MacPlayerConfig.player_list[\\W|\\S|.]*?=([\\W|\\S|.]*?),MacPlayerConfig.downer_list";
|
|
||||||
// 站点里播放源对应的真实官源
|
|
||||||
private HashMap<String, String> show2VipFlag = new HashMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mac cms 直连和官源调用应用内播放列表支持
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param extend
|
|
||||||
*/
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void loadRuleExt(String json) {
|
|
||||||
try {
|
|
||||||
JSONObject jsonObj = new JSONObject(json);
|
|
||||||
decodePlayUrl = jsonObj.optBoolean("dcPlayUrl", false);
|
|
||||||
decodeVipFlag = jsonObj.optBoolean("dcVipFlag", false);
|
|
||||||
JSONObject dcShow2Vip = jsonObj.optJSONObject("dcShow2Vip");
|
|
||||||
if (dcShow2Vip != null) {
|
|
||||||
Iterator<String> keys = dcShow2Vip.keys();
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String name = keys.next();
|
|
||||||
show2VipFlag.put(name.trim(), dcShow2Vip.getString(name).trim());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
playerConfigJs = jsonObj.optString("pCfgJs").trim();
|
|
||||||
playerConfigJsRegex = jsonObj.optString("pCfgJsR", playerConfigJsRegex).trim();
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
String result = super.homeContent(filter);
|
|
||||||
if (result.length() > 0 && playerConfigJs.length() > 0) { // 尝试通过playerConfigJs获取展示和flag匹配关系
|
|
||||||
String webContent = fetch(playerConfigJs);
|
|
||||||
Matcher matcher = Pattern.compile(playerConfigJsRegex).matcher(webContent);
|
|
||||||
if (matcher.find()) {
|
|
||||||
try {
|
|
||||||
JSONObject jsonObject = new JSONObject(matcher.group(1));
|
|
||||||
Iterator<String> keys = jsonObject.keys();
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String key = keys.next();
|
|
||||||
JSONObject keyObj = jsonObject.optJSONObject(key);
|
|
||||||
if (keyObj == null)
|
|
||||||
continue;
|
|
||||||
String show = keyObj.optString("show").trim();
|
|
||||||
if (show.isEmpty())
|
|
||||||
continue;
|
|
||||||
show2VipFlag.put(show, key);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// SpiderDebug.log(webContent);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
String result = super.detailContent(ids);
|
|
||||||
if (decodeVipFlag && result.length() > 0) {
|
|
||||||
try {
|
|
||||||
JSONObject jsonObject = new JSONObject(result);
|
|
||||||
String playFrom[] = jsonObject.optJSONArray("list").getJSONObject(0).optString("vod_play_from").split("\\$\\$\\$");
|
|
||||||
if (playFrom.length > 0) {
|
|
||||||
for (int i = 0; i < playFrom.length; i++) {
|
|
||||||
if (show2VipFlag.containsKey(playFrom[i])) {
|
|
||||||
playFrom[i] = show2VipFlag.get(playFrom[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jsonObject.optJSONArray("list").getJSONObject(0).put("vod_play_from", TextUtils.join("$$$", playFrom));
|
|
||||||
result = jsonObject.toString();
|
|
||||||
}
|
|
||||||
} catch (Throwable th) {
|
|
||||||
SpiderDebug.log(th);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id);
|
|
||||||
String videoUrl = null;
|
|
||||||
// 尝试分析直连
|
|
||||||
if (decodePlayUrl) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(fetch(webUrl));
|
|
||||||
Elements allScript = doc.select("script");
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) {
|
|
||||||
int start = scContent.indexOf('{');
|
|
||||||
int end = scContent.lastIndexOf('}') + 1;
|
|
||||||
String json = scContent.substring(start, end);
|
|
||||||
JSONObject player = new JSONObject(json);
|
|
||||||
String videoUrlTmp = player.getString("url");
|
|
||||||
if (player.has("encrypt")) {
|
|
||||||
int encrypt = player.getInt("encrypt");
|
|
||||||
if (encrypt == 1) {
|
|
||||||
videoUrlTmp = URLDecoder.decode(videoUrlTmp);
|
|
||||||
} else if (encrypt == 2) {
|
|
||||||
videoUrlTmp = new String(Base64.decode(videoUrlTmp, Base64.DEFAULT));
|
|
||||||
videoUrlTmp = URLDecoder.decode(videoUrlTmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
videoUrl = videoUrlTmp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (videoUrl != null) {
|
|
||||||
// 适配2.0.6的调用应用内解析列表的支持, 需要配合直连分析和匹配官源解析一起使用,参考cjt影视和极品直连
|
|
||||||
if (decodeVipFlag && Misc.isVip(videoUrl)) { // 使用jx:1
|
|
||||||
try {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("jx", "1");
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
} else if (decodeVipFlag && vipFlags.contains(flag)) { // 是否使用应用内解析列表解析官源
|
|
||||||
try {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
result.put("header", "");
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 如果是视频直连 直接返回免解
|
|
||||||
else if (isVideoFormat(videoUrl)) {
|
|
||||||
try {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
result.put("header", "");
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 上述都失败了就按默认模式走
|
|
||||||
return super.playerContent(flag, id, vipFlags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class XPathMacFilter extends XPathMac {
|
|
||||||
@Override
|
|
||||||
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
String cateUrl = rule.getCateUrl();
|
|
||||||
if (filter && extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value.length() > 0) {
|
|
||||||
cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg);
|
|
||||||
Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl);
|
|
||||||
while (m.find()) {
|
|
||||||
String n = m.group(0).replace("{", "").replace("}", "");
|
|
||||||
cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", "");
|
|
||||||
}
|
|
||||||
return cateUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.seimicrawler.xpath.JXDocument;
|
|
||||||
import org.seimicrawler.xpath.JXNode;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class XPbd extends XPath {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
String cateUrl = rule.getCateUrl();
|
|
||||||
if (filter && extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value.length() > 0) {
|
|
||||||
cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg);
|
|
||||||
Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl);
|
|
||||||
while (m.find()) {
|
|
||||||
String n = m.group(0).replace("{", "").replace("}", "");
|
|
||||||
cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", "");
|
|
||||||
}
|
|
||||||
return cateUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
String webUrl = rule.getDetailUrl().replace("{vid}", ids.get(0));
|
|
||||||
String webContent = fetch(webUrl);
|
|
||||||
JXDocument doc = JXDocument.create(webContent);
|
|
||||||
JXNode vodNode = doc.selNOne(rule.getDetailNode());
|
|
||||||
JSONObject vodAtom = new JSONObject();
|
|
||||||
|
|
||||||
String cover = "", title = "", desc = "", category = "", area = "", year = "", remark = "", director = "", actor = "";
|
|
||||||
|
|
||||||
title = vodNode.selOne(rule.getDetailName()).asString().trim();
|
|
||||||
title = rule.getDetailNameR(title);
|
|
||||||
|
|
||||||
cover = vodNode.selOne(rule.getDetailImg()).asString().trim();
|
|
||||||
cover = rule.getDetailImgR(cover);
|
|
||||||
cover = Misc.fixUrl(webUrl, cover);
|
|
||||||
|
|
||||||
if (!rule.getDetailCate().isEmpty()) {
|
|
||||||
try {
|
|
||||||
category = vodNode.selOne(rule.getDetailCate()).asString().trim();
|
|
||||||
category = rule.getDetailCateR(category);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailYear().isEmpty()) {
|
|
||||||
try {
|
|
||||||
year = vodNode.selOne(rule.getDetailYear()).asString().trim();
|
|
||||||
year = rule.getDetailYearR(year);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailArea().isEmpty()) {
|
|
||||||
try {
|
|
||||||
area = vodNode.selOne(rule.getDetailArea()).asString().trim();
|
|
||||||
area = rule.getDetailAreaR(area);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
remark = vodNode.selOne(rule.getDetailMark()).asString().trim();
|
|
||||||
remark = rule.getDetailMarkR(remark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailActor().isEmpty()) {
|
|
||||||
try {
|
|
||||||
actor = vodNode.selOne(rule.getDetailActor()).asString().trim();
|
|
||||||
actor = rule.getDetailActorR(actor);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailDirector().isEmpty()) {
|
|
||||||
try {
|
|
||||||
director = vodNode.selOne(rule.getDetailDirector()).asString().trim();
|
|
||||||
director = rule.getDetailDirectorR(director);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailDesc().isEmpty()) {
|
|
||||||
try {
|
|
||||||
desc = vodNode.selOne(rule.getDetailDesc()).asString().trim();
|
|
||||||
desc = rule.getDetailDescR(desc);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vodAtom.put("vod_name", title);
|
|
||||||
vodAtom.put("vod_pic", cover);
|
|
||||||
vodAtom.put("type_name", category);
|
|
||||||
vodAtom.put("vod_year", year);
|
|
||||||
vodAtom.put("vod_area", area);
|
|
||||||
vodAtom.put("vod_remarks", remark);
|
|
||||||
vodAtom.put("vod_actor", actor);
|
|
||||||
vodAtom.put("vod_director", director);
|
|
||||||
vodAtom.put("vod_content", desc);
|
|
||||||
|
|
||||||
List<JXNode> urlListNodes = doc.selN(rule.getDetailUrlNode());
|
|
||||||
for (int i = 0; i < urlListNodes.size(); i++) {
|
|
||||||
List<JXNode> urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode());
|
|
||||||
for (int j = 0; j < urlNodes.size(); j++) {
|
|
||||||
String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim();
|
|
||||||
id = rule.getDetailUrlIdR(id);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray lists = new JSONArray();
|
|
||||||
vodAtom.put("vod_id", id);
|
|
||||||
vodAtom.put("vod_play_from", "磁力测试");
|
|
||||||
vodAtom.put("vod_play_url", "网站没资源$" + id);
|
|
||||||
lists.put(vodAtom);
|
|
||||||
result.put("list", lists);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,471 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class Xiaoh extends Spider {
|
|
||||||
private static final String siteUrl = "https://www.xiaoheimi.net";
|
|
||||||
private static final String siteHost = "www.xiaoheimi.net";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 播放源配置
|
|
||||||
*/
|
|
||||||
private JSONObject playerConfig;
|
|
||||||
/**
|
|
||||||
* 筛选配置
|
|
||||||
*/
|
|
||||||
private JSONObject filterConfig;
|
|
||||||
private Pattern regexCategory = Pattern.compile("/index.php/vod/type/id/(\\d+).html");
|
|
||||||
private Pattern regexVid = Pattern.compile("/index.php/vod/detail/id/(\\d+).html");
|
|
||||||
private Pattern regexPlay = Pattern.compile("/index.php/vod/play/id/(\\d+)/sid/(\\d+)/nid/(\\d+).html");
|
|
||||||
private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+");
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
playerConfig = new JSONObject("{\"gqy2\":{\"sh\":\"高清2\",\"sn\":0,\"pu\":\"\",\"or\":999},\"xbyy\":{\"sh\":\"高清\",\"sn\":0,\"pu\":\"\",\"or\":999},\"ysgc\":{\"sh\":\"高清源\",\"sn\":0,\"pu\":\"\",\"or\":999},\"if101\":{\"sh\":\"小宝影院\",\"sn\":0,\"pu\":\"\",\"or\":999},\"bili\":{\"sh\":\"bili\",\"sn\":0,\"pu\":\"\",\"or\":999},\"dplayer\":{\"sh\":\"DPlayer-H5播放器\",\"sn\":0,\"pu\":\"\",\"or\":999}}");
|
|
||||||
filterConfig = new JSONObject("{\"1\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧片\",\"v\":\"喜剧片\"},{\"n\":\"冒险片\",\"v\":\"冒险片\"},{\"n\":\"剧情片\",\"v\":\"剧情片\"},{\"n\":\"动作片\",\"v\":\"动作片\"},{\"n\":\"动画电影\",\"v\":\"动画电影\"},{\"n\":\"同性片\",\"v\":\"同性片\"},{\"n\":\"奇幻片\",\"v\":\"奇幻片\"},{\"n\":\"恐怖片\",\"v\":\"恐怖片\"},{\"n\":\"悬疑片\",\"v\":\"悬疑片\"},{\"n\":\"惊悚片\",\"v\":\"惊悚片\"},{\"n\":\"歌舞片\",\"v\":\"歌舞片\"},{\"n\":\"灾难片\",\"v\":\"灾难片\"},{\"n\":\"爱情片\",\"v\":\"爱情片\"},{\"n\":\"犯罪片\",\"v\":\"犯罪片\"},{\"n\":\"科幻片\",\"v\":\"科幻片\"},{\"n\":\"经典片\",\"v\":\"经典片\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"},{\"n\":\"战争片\",\"v\":\"战争片\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"言情\",\"v\":\"言情\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"玄幻\",\"v\":\"玄幻\"},{\"n\":\"谍战\",\"v\":\"谍战\"},{\"n\":\"历险\",\"v\":\"历险\"},{\"n\":\"都市\",\"v\":\"都市\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"军旅\",\"v\":\"军旅\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"江湖\",\"v\":\"江湖\"},{\"n\":\"罪案\",\"v\":\"罪案\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"穿越\",\"v\":\"穿越\"},{\"n\":\"宫廷\",\"v\":\"宫廷\"},{\"n\":\"神话\",\"v\":\"神话\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"同性\",\"v\":\"同性\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"格斗\",\"v\":\"格斗\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"竞技\",\"v\":\"竞技\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"魔幻\",\"v\":\"魔幻\"},{\"n\":\"爆笑\",\"v\":\"爆笑\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"恋爱\",\"v\":\"恋爱\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"治愈\",\"v\":\"治愈\"},{\"n\":\"泡面\",\"v\":\"泡面\"},{\"n\":\"穿越\",\"v\":\"穿越\"},{\"n\":\"灵异\",\"v\":\"灵异\"},{\"n\":\"耽美\",\"v\":\"耽美\"},{\"n\":\"动画电影\",\"v\":\"动画电影\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"真人秀\",\"v\":\"真人秀\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"网综\",\"v\":\"网综\"},{\"n\":\"脱口秀\",\"v\":\"脱口秀\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"竞技\",\"v\":\"竞技\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"演唱会\",\"v\":\"演唱会\"},{\"n\":\"晚会\",\"v\":\"晚会\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"21\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"文化\",\"v\":\"文化\"},{\"n\":\"探索\",\"v\":\"探索\"},{\"n\":\"军事\",\"v\":\"军事\"},{\"n\":\"解密\",\"v\":\"解密\"},{\"n\":\"科技\",\"v\":\"科技\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"人物\",\"v\":\"人物\"},{\"n\":\"自然\",\"v\":\"自然\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"20\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 爬虫headers
|
|
||||||
*
|
|
||||||
* @param url
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("method", "GET");
|
|
||||||
headers.put("Host", siteHost);
|
|
||||||
headers.put("Upgrade-Insecure-Requests", "1");
|
|
||||||
headers.put("DNT", "1");
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
|
|
||||||
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类数据 + 首页最近更新视频列表数据
|
|
||||||
*
|
|
||||||
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
|
||||||
// 分类节点
|
|
||||||
Elements elements = doc.select("ul.nav-menu>li>a");
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (Element ele : elements) {
|
|
||||||
String name = ele.text();
|
|
||||||
boolean show = name.equals("电影") ||
|
|
||||||
name.equals("电视剧") ||
|
|
||||||
name.equals("动漫") ||
|
|
||||||
name.equals("综艺") ||
|
|
||||||
name.equals("纪录片") ||
|
|
||||||
name.equals("体育");
|
|
||||||
if (show) {
|
|
||||||
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
|
||||||
if (!mather.find())
|
|
||||||
continue;
|
|
||||||
// 把分类的id和名称取出来加到列表里
|
|
||||||
String id = mather.group(1).trim();
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
try {
|
|
||||||
// 取首页推荐视频列表
|
|
||||||
Element homeList = doc.select("ul.myui-vodlist").get(1);
|
|
||||||
Elements list = homeList.select("div.myui-vodlist__box>a");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.attr("title");
|
|
||||||
String cover = vod.attr("data-original");
|
|
||||||
String remark = vod.selectFirst("span.pic-text").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类信息数据
|
|
||||||
*
|
|
||||||
* @param tid 分类id
|
|
||||||
* @param pg 页数
|
|
||||||
* @param filter 同homeContent方法中的filter
|
|
||||||
* @param extend 筛选参数{k:v, k1:v1}
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/index.php/vod/show/id/";
|
|
||||||
if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
|
|
||||||
url += extend.get("tid");
|
|
||||||
} else {
|
|
||||||
url += tid;
|
|
||||||
}
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
if (value.length() > 0) {
|
|
||||||
url += "/" + key + "/" + URLEncoder.encode(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
url += "/page/" + pg + ".html";
|
|
||||||
String html = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
Document doc = Jsoup.parse(html);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int pageCount = 0;
|
|
||||||
int page = -1;
|
|
||||||
|
|
||||||
// 取页码相关信息
|
|
||||||
Elements pageInfo = doc.select(".myui-page li a");
|
|
||||||
if (pageInfo.size() == 0) {
|
|
||||||
page = Integer.parseInt(pg);
|
|
||||||
pageCount = page;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < pageInfo.size(); i++) {
|
|
||||||
Element a = pageInfo.get(i);
|
|
||||||
String name = a.text();
|
|
||||||
if (page == -1 && a.hasClass("btn-warm")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
page = Integer.parseInt(matcher.group(1).trim());
|
|
||||||
} else {
|
|
||||||
page = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (name.equals("尾页")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
pageCount = Integer.parseInt(matcher.group(1).trim());
|
|
||||||
} else {
|
|
||||||
pageCount = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (!html.contains("没有找到您想要的结果哦")) {
|
|
||||||
// 取当前分类页的视频列表
|
|
||||||
Elements list = doc.select("div.myui-vodlist__box");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.selectFirst(".title").text();
|
|
||||||
String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original");
|
|
||||||
String remark = vod.selectFirst("span.pic-text").text();
|
|
||||||
|
|
||||||
Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", 48);
|
|
||||||
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频详情信息
|
|
||||||
*
|
|
||||||
* @param ids 视频id
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
// 视频详情url
|
|
||||||
String url = siteUrl + "/index.php/vod/detail/id/" + ids.get(0) + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vodList = new JSONObject();
|
|
||||||
|
|
||||||
// 取基本数据
|
|
||||||
String vid = doc.selectFirst("span.mac_hits").attr("data-id");
|
|
||||||
|
|
||||||
String cover = doc.selectFirst("a.myui-vodlist__thumb img").attr("data-original");
|
|
||||||
String title = doc.selectFirst("div.myui-content__detail h1.title").text();
|
|
||||||
String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text();
|
|
||||||
String category = "", area = "", year = "", remark = "", director = "", actor = "";
|
|
||||||
Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted");
|
|
||||||
for (int i = 0; i < span_text_muted.size(); i++) {
|
|
||||||
Element text = span_text_muted.get(i);
|
|
||||||
String info = text.text();
|
|
||||||
if (info.equals("分类:")) {
|
|
||||||
category = text.nextElementSibling().text();
|
|
||||||
} else if (info.equals("年份:")) {
|
|
||||||
year = text.nextElementSibling().text();
|
|
||||||
} else if (info.equals("地区:")) {
|
|
||||||
area = text.nextElementSibling().text();
|
|
||||||
} else if (info.equals("更新:")) {
|
|
||||||
remark = text.nextElementSibling().text();
|
|
||||||
} else if (info.equals("导演:")) {
|
|
||||||
List<String> directors = new ArrayList<>();
|
|
||||||
Elements aa = text.parent().select("a");
|
|
||||||
for (int j = 0; j < aa.size(); j++) {
|
|
||||||
directors.add(aa.get(j).text());
|
|
||||||
}
|
|
||||||
director = TextUtils.join(",", directors);
|
|
||||||
} else if (info.equals("主演:")) {
|
|
||||||
List<String> actors = new ArrayList<>();
|
|
||||||
Elements aa = text.parent().select("a");
|
|
||||||
for (int j = 0; j < aa.size(); j++) {
|
|
||||||
actors.add(aa.get(j).text());
|
|
||||||
}
|
|
||||||
actor = TextUtils.join(",", actors);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vodList.put("vod_id", vid);
|
|
||||||
vodList.put("vod_name", title);
|
|
||||||
vodList.put("vod_pic", cover);
|
|
||||||
vodList.put("type_name", category);
|
|
||||||
vodList.put("vod_year", year);
|
|
||||||
vodList.put("vod_area", area);
|
|
||||||
vodList.put("vod_remarks", remark);
|
|
||||||
vodList.put("vod_actor", actor);
|
|
||||||
vodList.put("vod_director", director);
|
|
||||||
vodList.put("vod_content", desc);
|
|
||||||
|
|
||||||
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
|
||||||
@Override
|
|
||||||
public int compare(String o1, String o2) {
|
|
||||||
try {
|
|
||||||
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
|
||||||
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
|
||||||
|
|
||||||
if (sort1 == sort2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return sort1 - sort2 > 0 ? 1 : -1;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 取播放列表数据
|
|
||||||
Elements sources = doc.select("div.myui-panel__head>ul").get(0).select("li");
|
|
||||||
Elements sourceList = doc.select("div.tab-content>div.tab-pane");
|
|
||||||
|
|
||||||
for (int i = 0; i < sources.size(); i++) {
|
|
||||||
Element source = sources.get(i);
|
|
||||||
String sourceName = source.text();
|
|
||||||
boolean found = false;
|
|
||||||
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
|
||||||
String flag = it.next();
|
|
||||||
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
|
|
||||||
sourceName = flag;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
String playList = "";
|
|
||||||
Elements playListA = sourceList.get(i).select("ul>li>a");
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String playURL = matcher.group(1) + "/sid/" + matcher.group(2) + "/nid/" + matcher.group(3);
|
|
||||||
vodItems.add(vod.text() + "$" + playURL);
|
|
||||||
}
|
|
||||||
if (vodItems.size() > 0)
|
|
||||||
playList = TextUtils.join("#", vodItems);
|
|
||||||
|
|
||||||
if (playList.length() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vod_play.put(sourceName, playList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vod_play.size() > 0) {
|
|
||||||
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
|
||||||
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
|
||||||
vodList.put("vod_play_from", vod_play_from);
|
|
||||||
vodList.put("vod_play_url", vod_play_url);
|
|
||||||
}
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vodList);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取视频播放信息
|
|
||||||
*
|
|
||||||
* @param flag 播放源
|
|
||||||
* @param id 视频id
|
|
||||||
* @param vipFlags 所有可能需要vip解析的源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
// 播放页 url
|
|
||||||
String url = siteUrl + "/index.php/vod/play/id/" + id + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
Elements allScript = doc.select("script");
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) { // 取直链
|
|
||||||
int start = scContent.indexOf('{');
|
|
||||||
int end = scContent.lastIndexOf('}') + 1;
|
|
||||||
String json = scContent.substring(start, end);
|
|
||||||
JSONObject player = new JSONObject(json);
|
|
||||||
if (playerConfig.has(player.getString("from"))) {
|
|
||||||
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
|
|
||||||
String videoUrl = player.getString("url");
|
|
||||||
String playUrl = pCfg.getString("pu");
|
|
||||||
result.put("parse", pCfg.getInt("sn"));
|
|
||||||
result.put("playUrl", playUrl);
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
result.put("header", "");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected static HashMap<String, String> Headers() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
|
|
||||||
headers.put("Referer", siteUrl);
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String url = "https://www.google.com/search?q=site%3A" + siteHost + "+" + URLEncoder.encode(key);
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, Headers()));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
Elements sourceList = doc.select("div.yuRUbf a");
|
|
||||||
for (int i = 0; i < sourceList.size(); i++) {
|
|
||||||
Element sourcess = sourceList.get(i);
|
|
||||||
String sourceName = sourcess.select("h3").text();
|
|
||||||
String list1 = sourcess.attr("href");
|
|
||||||
Matcher matcher = regexVid.matcher(list1);
|
|
||||||
if (sourceName.contains(key) && matcher.find()) {
|
|
||||||
Document ddrklink = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(list1)));
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
String group = matcher.group(1);
|
|
||||||
String cover = ddrklink.selectFirst("a.myui-vodlist__thumb img").attr("data-original");
|
|
||||||
String title = ddrklink.selectFirst("div.myui-content__detail h1.title").text();
|
|
||||||
Elements span_text_muted = ddrklink.select("div.myui-content__detail span.text-muted");
|
|
||||||
for (int j = 0; j < span_text_muted.size(); j++) {
|
|
||||||
Element text = span_text_muted.get(j);
|
|
||||||
String info = text.text();
|
|
||||||
if (info.equals("更新:")) {
|
|
||||||
String remark = text.nextElementSibling().text();
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
v.put("vod_id", group);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class Xxys extends AppYsV2 {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected JSONObject getFinalVideo(String flag, ArrayList<String> parseUrls, String url) throws JSONException {
|
|
||||||
String htmlPlayUrl = "";
|
|
||||||
for (String parseUrl : parseUrls) {
|
|
||||||
if (parseUrl.isEmpty() || parseUrl.equals("null"))
|
|
||||||
continue;
|
|
||||||
String playUrl = parseUrl + url;
|
|
||||||
String content = desc(OkHttpUtil.string(playUrl, null), (byte) 4);
|
|
||||||
try {
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
OkHttpUtil.stringNoRedirect(playUrl, null, hashMap);
|
|
||||||
String d = OkHttpUtil.getRedirectLocation(hashMap);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", d);
|
|
||||||
return result;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
JSONObject tryJson = null;
|
|
||||||
try {
|
|
||||||
tryJson = Misc.jsonParse(url, content);
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
if (tryJson != null && tryJson.has("url") && tryJson.has("header")) {
|
|
||||||
tryJson.put("header", tryJson.getJSONObject("header").toString());
|
|
||||||
return tryJson;
|
|
||||||
}
|
|
||||||
if (content.contains("<html")) {
|
|
||||||
boolean sniffer = false;
|
|
||||||
for (Pattern p : htmlVideoKeyMatch) {
|
|
||||||
if (p.matcher(content).find()) {
|
|
||||||
sniffer = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sniffer) {
|
|
||||||
htmlPlayUrl = parseUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!htmlPlayUrl.isEmpty()) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", htmlPlayUrl);
|
|
||||||
result.put("url", url);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String str) {
|
|
||||||
super.init(context, "http://tvht.lanrentk.cc/api.php/iptv/vod");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
|
|
||||||
public class Zhaozy extends Spider {
|
|
||||||
private static final Pattern aliyun = Pattern.compile("(https://www.aliyundrive.com/s/[^\"]+)");
|
|
||||||
private PushAgent pushAgent;
|
|
||||||
|
|
||||||
public String detailContent(List<String> list) {
|
|
||||||
try {
|
|
||||||
Pattern pattern = aliyun;
|
|
||||||
if (pattern.matcher(list.get(0)).find()) {
|
|
||||||
return pushAgent.detailContent(list);
|
|
||||||
}
|
|
||||||
Matcher matcher = pattern.matcher(OkHttpUtil.string("https://zhaoziyuan.me/" + list.get(0), null));
|
|
||||||
if (!matcher.find()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
list.set(0, matcher.group(1));
|
|
||||||
return pushAgent.detailContent(list);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(Context context, String str) {
|
|
||||||
super.init(context, str);
|
|
||||||
pushAgent = new PushAgent();
|
|
||||||
pushAgent.init(context, str);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String playerContent(String str, String str2, List<String> list) {
|
|
||||||
return pushAgent.playerContent(str, str2, list);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static HashMap<String, String> sHeaders() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
|
|
||||||
headers.put("Accept-encoding", "gzip, deflate, br");
|
|
||||||
headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Pattern regexVid = Pattern.compile("(\\S+)");
|
|
||||||
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String url = "https://zhaoziyuan.me/so?filename=" + URLEncoder.encode(key);
|
|
||||||
Document docs = Jsoup.parse(OkHttpUtil.string(url, null));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
Elements list = docs.select("div.li_con div.news_text");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element doc = list.get(i);
|
|
||||||
String sourceName = doc.select("div.news_text a h3").text();
|
|
||||||
if (sourceName.contains(key)) {
|
|
||||||
String list1 = doc.select("div.news_text a").attr("href");
|
|
||||||
Matcher matcher = regexVid.matcher(list1);
|
|
||||||
if (matcher.find()) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
String group = matcher.group(1);
|
|
||||||
String cover = "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000";
|
|
||||||
String remark = doc.select("div.news_text a p").text();
|
|
||||||
|
|
||||||
v.put("vod_name", sourceName);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
v.put("vod_id", group);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,486 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.nodes.Element;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class Zxzj extends Spider {
|
|
||||||
private static final String siteUrl = "https://zxzj.vip/";
|
|
||||||
/**
|
|
||||||
* 播放源配置
|
|
||||||
*/
|
|
||||||
private JSONObject playerConfig;
|
|
||||||
/**
|
|
||||||
* 筛选配置
|
|
||||||
*/
|
|
||||||
private JSONObject filterConfig;
|
|
||||||
private Pattern regexCategory = Pattern.compile("/list/(\\d+).html");
|
|
||||||
private Pattern regexVid = Pattern.compile("/detail/(\\d+).html");
|
|
||||||
private Pattern regexPlay = Pattern.compile("/video/(\\d+)-(\\d+)-(\\d+).html");
|
|
||||||
private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html");
|
|
||||||
|
|
||||||
protected String ext = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
playerConfig = new JSONObject("{\"dpp\":{\"sh\":\"DP播放\",\"pu\":\"https://jx.zxzj.vip/dplayer.php?url=\",\"sn\":1,\"or\":999}}");
|
|
||||||
filterConfig = new JSONObject("{\"1\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"情色\",\"v\":\"情色\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"法语\",\"v\":\"法语\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"6\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"5\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected static HashMap<String, String> Headers() {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36");
|
|
||||||
headers.put("Referer", siteUrl);
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 爬虫headers
|
|
||||||
*
|
|
||||||
* @param url
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("method", "GET");
|
|
||||||
headers.put("Upgrade-Insecure-Requests", "1");
|
|
||||||
headers.put("DNT", "1");
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
|
|
||||||
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类数据 + 首页最近更新视频列表数据
|
|
||||||
*
|
|
||||||
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
|
||||||
// 分类节点
|
|
||||||
Elements elements = doc.select("ul.stui-header__menu li a");
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
for (Element ele : elements) {
|
|
||||||
String name = ele.text();
|
|
||||||
boolean show = name.equals("电影") ||
|
|
||||||
name.equals("美剧") ||
|
|
||||||
name.equals("韩剧") ||
|
|
||||||
name.equals("日剧") ||
|
|
||||||
name.equals("泰剧") ||
|
|
||||||
name.equals("动漫");
|
|
||||||
if (show) {
|
|
||||||
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
|
||||||
if (!mather.find())
|
|
||||||
continue;
|
|
||||||
// 把分类的id和名称取出来加到列表里
|
|
||||||
String id = mather.group(1).trim();
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
if (filter) {
|
|
||||||
result.put("filters", filterConfig);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
try {
|
|
||||||
// 取首页推荐视频列表
|
|
||||||
Element homeList = doc.select("ul.stui-vodlist").get(0);
|
|
||||||
Elements list = homeList.select("div.stui-vodlist__box");
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.select("a").attr("title");
|
|
||||||
String cover = vod.select("a").attr("data-original");
|
|
||||||
String remark = vod.select("a .pic-text").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取分类信息数据
|
|
||||||
*
|
|
||||||
* @param tid 分类id
|
|
||||||
* @param pg 页数
|
|
||||||
* @param filter 同homeContent方法中的filter
|
|
||||||
* @param extend 筛选参数{k:v, k1:v1}
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
|
|
||||||
urlParams[0] = tid;
|
|
||||||
urlParams[8] = pg;
|
|
||||||
if (extend != null && extend.size() > 0) {
|
|
||||||
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
|
||||||
String key = it.next();
|
|
||||||
String value = extend.get(key);
|
|
||||||
urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 获取分类数据的url
|
|
||||||
String url = siteUrl + "vodshow/" + TextUtils.join("-", urlParams) + ".html";
|
|
||||||
String html = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
Document doc = Jsoup.parse(html);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
int pageCount = 0;
|
|
||||||
int page = -1;
|
|
||||||
|
|
||||||
// 取页码相关信息
|
|
||||||
Elements pageInfo = doc.select("ul.stui-page__item li");
|
|
||||||
if (pageInfo.size() == 0) {
|
|
||||||
page = Integer.parseInt(pg);
|
|
||||||
pageCount = page;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < pageInfo.size(); i++) {
|
|
||||||
Element li = pageInfo.get(i);
|
|
||||||
Element a = li.selectFirst("a");
|
|
||||||
if (a == null)
|
|
||||||
continue;
|
|
||||||
String name = a.text();
|
|
||||||
if (page == -1 && li.hasClass("active")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
//System.out.println("哈哈"+matcher.group(1));
|
|
||||||
page = Integer.parseInt(matcher.group(1).split("-")[8]);
|
|
||||||
} else {
|
|
||||||
page = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (name.equals("尾页")) {
|
|
||||||
Matcher matcher = regexPage.matcher(a.attr("href"));
|
|
||||||
if (matcher.find()) {
|
|
||||||
//System.out.println("尾页" + matcher.group(1));
|
|
||||||
pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
|
|
||||||
} else {
|
|
||||||
pageCount = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (!html.contains("没有找到您想要的结果哦")) {
|
|
||||||
// 取当前分类页的视频列表
|
|
||||||
Elements list = doc.select("div.stui-vodlist__box");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.select("a").attr("title");
|
|
||||||
String cover = vod.select("a").attr("data-original");
|
|
||||||
String remark = vod.select("a .pic-text").text();
|
|
||||||
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("page", page);
|
|
||||||
result.put("pagecount", pageCount);
|
|
||||||
result.put("limit", 48);
|
|
||||||
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
|
|
||||||
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频详情信息
|
|
||||||
*
|
|
||||||
* @param ids 视频id
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
// 视频详情url
|
|
||||||
String url = siteUrl + "/detail/" + ids.get(0) + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vodList = new JSONObject();
|
|
||||||
|
|
||||||
// 取基本数据
|
|
||||||
String cover = doc.select("div.stui-content__thumb a img").attr("data-original");
|
|
||||||
String title = doc.select("div.stui-content__detail h1").text();
|
|
||||||
String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
|
|
||||||
Elements data = doc.select("p.data");
|
|
||||||
Pattern cate = Pattern.compile("类型:(\\S+)");
|
|
||||||
category = doReplaceRegex(cate, data.get(0).text());
|
|
||||||
Pattern areas = Pattern.compile("地区:(\\S+)");
|
|
||||||
area = doReplaceRegex(areas, data.get(0).text());
|
|
||||||
Pattern years = Pattern.compile("年份:(\\S+)");
|
|
||||||
year = doReplaceRegex(years, data.get(0).text());
|
|
||||||
Pattern rms = Pattern.compile("更新:(\\S+)");
|
|
||||||
remark = doReplaceRegex(rms, data.get(3).text());
|
|
||||||
Pattern acs = Pattern.compile("主演:(\\S+)");
|
|
||||||
actor = doReplaceRegex(acs, data.get(1).text());
|
|
||||||
Pattern dis = Pattern.compile("导演:(\\S+)");
|
|
||||||
director = doReplaceRegex(dis, data.get(2).text());
|
|
||||||
|
|
||||||
desc = doc.selectFirst("span.detail-content").text().trim();
|
|
||||||
|
|
||||||
vodList.put("vod_id", ids.get(0));
|
|
||||||
vodList.put("vod_name", title);
|
|
||||||
vodList.put("vod_pic", cover);
|
|
||||||
vodList.put("type_name", category);
|
|
||||||
vodList.put("vod_year", year);
|
|
||||||
vodList.put("vod_area", area);
|
|
||||||
vodList.put("vod_remarks", remark);
|
|
||||||
vodList.put("vod_actor", actor);
|
|
||||||
vodList.put("vod_director", director);
|
|
||||||
vodList.put("vod_content", desc);
|
|
||||||
|
|
||||||
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
|
||||||
@Override
|
|
||||||
public int compare(String o1, String o2) {
|
|
||||||
try {
|
|
||||||
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
|
||||||
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
|
||||||
|
|
||||||
if (sort1 == sort2) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return sort1 - sort2 > 0 ? 1 : -1;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 取播放列表数据
|
|
||||||
Elements sources = doc.select("div.stui-vodlist__head h3");
|
|
||||||
Elements sourceList = doc.select("ul.stui-content__playlist");
|
|
||||||
|
|
||||||
for (int i = 0; i < sources.size(); i++) {
|
|
||||||
Element source = sources.get(i);
|
|
||||||
String sourceName = source.text();
|
|
||||||
boolean found = false;
|
|
||||||
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
|
||||||
String flag = it.next();
|
|
||||||
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
|
|
||||||
sourceName = flag;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
continue;
|
|
||||||
String playList = "";
|
|
||||||
Elements playListA = sourceList.get(i).select("li a");
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (int j = 0; j < playListA.size(); j++) {
|
|
||||||
Element vod = playListA.get(j);
|
|
||||||
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
|
|
||||||
vodItems.add(vod.text() + "$" + playURL);
|
|
||||||
}
|
|
||||||
if (vodItems.size() > 0)
|
|
||||||
playList = TextUtils.join("#", vodItems);
|
|
||||||
|
|
||||||
if (playList.length() == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vod_play.put(sourceName, playList);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vod_play.size() > 0) {
|
|
||||||
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
|
||||||
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
|
||||||
vodList.put("vod_play_from", vod_play_from);
|
|
||||||
vodList.put("vod_play_url", vod_play_url);
|
|
||||||
}
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vodList);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取视频播放信息
|
|
||||||
*
|
|
||||||
* @param flag 播放源
|
|
||||||
* @param id 视频id
|
|
||||||
* @param vipFlags 所有可能需要vip解析的源
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
//定义播放用的headers
|
|
||||||
JSONObject headers = new JSONObject();
|
|
||||||
//headers.put("Host", " cokemv.co");
|
|
||||||
headers.put("origin", " https://zxzj.vip");
|
|
||||||
headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
|
||||||
headers.put("Accept", " */*");
|
|
||||||
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
|
|
||||||
headers.put("Accept-Encoding", " gzip, deflate");
|
|
||||||
|
|
||||||
|
|
||||||
// 播放页 url
|
|
||||||
String url = siteUrl + "/video/" + id + ".html";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
|
|
||||||
Elements allScript = doc.select("script");
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) { // 取直链
|
|
||||||
int start = scContent.indexOf('{');
|
|
||||||
int end = scContent.lastIndexOf('}') + 1;
|
|
||||||
String json = scContent.substring(start, end);
|
|
||||||
JSONObject player = new JSONObject(json);
|
|
||||||
if (playerConfig.has(player.getString("from"))) {
|
|
||||||
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
|
|
||||||
String videoUrl = pCfg.getString("pu") + player.getString("url");
|
|
||||||
Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, getHeaders(videoUrl)));
|
|
||||||
Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')");
|
|
||||||
Elements allScripts = docs.select("body script");
|
|
||||||
for (int j = 0; j < allScripts.size(); j++) {
|
|
||||||
String scContents = allScripts.get(j).html().trim();
|
|
||||||
Matcher matcher = pattern.matcher(scContents);
|
|
||||||
if (matcher.find()) {
|
|
||||||
String players = matcher.group(0);
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", players);
|
|
||||||
result.put("header", headers.toString());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 搜索
|
|
||||||
*
|
|
||||||
* @param key
|
|
||||||
* @param quick 是否播放页的快捷搜索
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String url = siteUrl + "/vodsearch/-------------.html?wd=" + URLEncoder.encode(key) + "&submit=";
|
|
||||||
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
Elements list = doc.select("div.stui-vodlist__box");
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
Element vod = list.get(i);
|
|
||||||
String title = vod.select("a").attr("title");
|
|
||||||
if (title.contains(key)) {
|
|
||||||
String cover = vod.select("a").attr("data-original");
|
|
||||||
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
|
|
||||||
if (!matcher.find())
|
|
||||||
continue;
|
|
||||||
String id = matcher.group(1);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
String remark = vod.select("a span.pic-text").text();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", remark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String doReplaceRegex(Pattern pattern, String src) {
|
|
||||||
if (pattern == null)
|
|
||||||
return src;
|
|
||||||
try {
|
|
||||||
Matcher matcher = pattern.matcher(src);
|
|
||||||
if (matcher.find()) {
|
|
||||||
return matcher.group(1).trim();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
//
|
||||||
|
// Decompiled by Jadx - 632ms
|
||||||
|
//
|
||||||
|
package com.github.catvod.spider.merge;
|
||||||
|
|
||||||
|
import android.util.Base64;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.security.KeyFactory;
|
||||||
|
import java.security.PrivateKey;
|
||||||
|
import java.security.PublicKey;
|
||||||
|
import java.security.spec.PKCS8EncodedKeySpec;
|
||||||
|
import java.security.spec.X509EncodedKeySpec;
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
|
||||||
|
public class RSA {
|
||||||
|
public static final Charset qb = Charset.forName("UTF8");
|
||||||
|
|
||||||
|
public static String l(String str, String str2) {
|
||||||
|
try {
|
||||||
|
byte[] bytes = str.getBytes(qb);
|
||||||
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||||
|
cipher.init(1, n8(str2));
|
||||||
|
int length = bytes.length;
|
||||||
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||||
|
int i = 0;
|
||||||
|
int i2 = 0;
|
||||||
|
while (true) {
|
||||||
|
int i3 = length - i;
|
||||||
|
if (i3 > 0) {
|
||||||
|
byte[] doFinal = i3 > 117 ? cipher.doFinal(bytes, i, 117) : cipher.doFinal(bytes, i, i3);
|
||||||
|
byteArrayOutputStream.write(doFinal, 0, doFinal.length);
|
||||||
|
i2++;
|
||||||
|
i = i2 * 117;
|
||||||
|
} else {
|
||||||
|
byte[] byteArray = byteArrayOutputStream.toByteArray();
|
||||||
|
byteArrayOutputStream.close();
|
||||||
|
return new String(Base64.encode(byteArray, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
ug(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PublicKey n8(String str) {
|
||||||
|
try {
|
||||||
|
return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(str, 0)));
|
||||||
|
} catch (Exception e) {
|
||||||
|
ug(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String qb(String str, String str2) {
|
||||||
|
try {
|
||||||
|
byte[] decode = Base64.decode(str, 0);
|
||||||
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||||
|
cipher.init(2, zC(str2));
|
||||||
|
int length = decode.length;
|
||||||
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||||
|
int i = 0;
|
||||||
|
int i2 = 0;
|
||||||
|
while (true) {
|
||||||
|
int i3 = length - i;
|
||||||
|
if (i3 > 0) {
|
||||||
|
byte[] doFinal = i3 > 128 ? cipher.doFinal(decode, i, 128) : cipher.doFinal(decode, i, i3);
|
||||||
|
byteArrayOutputStream.write(doFinal, 0, doFinal.length);
|
||||||
|
i2++;
|
||||||
|
i = i2 * 128;
|
||||||
|
} else {
|
||||||
|
byte[] byteArray = byteArrayOutputStream.toByteArray();
|
||||||
|
byteArrayOutputStream.close();
|
||||||
|
return new String(byteArray, qb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
ug(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ug(Exception exc) {
|
||||||
|
exc.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PrivateKey zC(String str) {
|
||||||
|
try {
|
||||||
|
return KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(str, 0)));
|
||||||
|
} catch (Exception e) {
|
||||||
|
ug(e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,755 @@
|
|||||||
|
package com.github.catvod.utils;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* #nodoc- Utilities for encoding and decoding the Base64 representation of
|
||||||
|
* binary data. See RFCs <a
|
||||||
|
* href="http://www.ietf.org/rfc/rfc2045.txt">2045</a> and <a
|
||||||
|
* href="http://www.ietf.org/rfc/rfc3548.txt">3548</a>.
|
||||||
|
*/
|
||||||
|
public class Base64Ext {
|
||||||
|
/**
|
||||||
|
* Default values for encoder/decoder flags.
|
||||||
|
*/
|
||||||
|
public static final int DEFAULT = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoder flag bit to omit the padding '=' characters at the end
|
||||||
|
* of the output (if any).
|
||||||
|
*/
|
||||||
|
public static final int NO_PADDING = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoder flag bit to omit all line terminators (i.e., the output
|
||||||
|
* will be on one long line).
|
||||||
|
*/
|
||||||
|
public static final int NO_WRAP = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoder flag bit to indicate lines should be terminated with a
|
||||||
|
* CRLF pair instead of just an LF. Has no effect if {@code
|
||||||
|
* NO_WRAP} is specified as well.
|
||||||
|
*/
|
||||||
|
public static final int CRLF = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encoder/decoder flag bit to indicate using the "URL and
|
||||||
|
* filename safe" variant of Base64 (see RFC 3548 section 4) where
|
||||||
|
* {@code -} and {@code _} are used in place of {@code +} and
|
||||||
|
* {@code /}.
|
||||||
|
*/
|
||||||
|
public static final int URL_SAFE = 8;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to pass to to indicate that it
|
||||||
|
* should not close the output stream it is wrapping when it
|
||||||
|
* itself is closed.
|
||||||
|
*/
|
||||||
|
public static final int NO_CLOSE = 16;
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
// shared code
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
/* package */ static abstract class Coder {
|
||||||
|
public byte[] output;
|
||||||
|
public int op;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode/decode another block of input data. this.output is
|
||||||
|
* provided by the caller, and must be big enough to hold all
|
||||||
|
* the coded data. On exit, this.opwill be set to the length
|
||||||
|
* of the coded data.
|
||||||
|
*
|
||||||
|
* @param finish true if this is the final call to process for
|
||||||
|
* this object. Will finalize the coder state and
|
||||||
|
* include any final bytes in the output.
|
||||||
|
* @return true if the input so far is good; false if some
|
||||||
|
* error has been detected in the input stream..
|
||||||
|
*/
|
||||||
|
public abstract boolean process(byte[] input, int offset, int len, boolean finish);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the maximum number of bytes a call to process()
|
||||||
|
* could produce for the given number of input bytes. This may
|
||||||
|
* be an overestimate.
|
||||||
|
*/
|
||||||
|
public abstract int maxOutputSize(int len);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
// decoding
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode the Base64-encoded data in input and return the data in
|
||||||
|
* a new byte array.
|
||||||
|
* <p>
|
||||||
|
* <p>The padding '=' characters at the end are considered optional, but
|
||||||
|
* if any are present, there must be the correct number of them.
|
||||||
|
*
|
||||||
|
* @param str the input String to decode, which is converted to
|
||||||
|
* bytes using the default charset
|
||||||
|
* @param flags controls certain features of the decoded output.
|
||||||
|
* Pass {@code DEFAULT} to decode standard Base64.
|
||||||
|
* @throws IllegalArgumentException if the input contains
|
||||||
|
* incorrect padding
|
||||||
|
*/
|
||||||
|
public static byte[] decode(String str, int flags) {
|
||||||
|
return decode(str.getBytes(), flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode the Base64-encoded data in input and return the data in
|
||||||
|
* a new byte array.
|
||||||
|
* <p>
|
||||||
|
* <p>The padding '=' characters at the end are considered optional, but
|
||||||
|
* if any are present, there must be the correct number of them.
|
||||||
|
*
|
||||||
|
* @param input the input array to decode
|
||||||
|
* @param flags controls certain features of the decoded output.
|
||||||
|
* Pass {@code DEFAULT} to decode standard Base64.
|
||||||
|
* @throws IllegalArgumentException if the input contains
|
||||||
|
* incorrect padding
|
||||||
|
*/
|
||||||
|
public static byte[] decode(byte[] input, int flags) {
|
||||||
|
return decode(input, 0, input.length, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode the Base64-encoded data in input and return the data in
|
||||||
|
* a new byte array.
|
||||||
|
* <p>
|
||||||
|
* <p>The padding '=' characters at the end are considered optional, but
|
||||||
|
* if any are present, there must be the correct number of them.
|
||||||
|
*
|
||||||
|
* @param input the data to decode
|
||||||
|
* @param offset the position within the input array at which to start
|
||||||
|
* @param len the number of bytes of input to decode
|
||||||
|
* @param flags controls certain features of the decoded output.
|
||||||
|
* Pass {@code DEFAULT} to decode standard Base64.
|
||||||
|
* @throws IllegalArgumentException if the input contains
|
||||||
|
* incorrect padding
|
||||||
|
*/
|
||||||
|
public static byte[] decode(byte[] input, int offset, int len, int flags) {
|
||||||
|
// Allocate space for the most data the input could represent.
|
||||||
|
// (It could contain less if it contains whitespace, etc.)
|
||||||
|
Decoder decoder = new Decoder(flags, new byte[len * 3 / 4]);
|
||||||
|
|
||||||
|
if (!decoder.process(input, offset, len, true)) {
|
||||||
|
throw new IllegalArgumentException("bad base-64");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maybe we got lucky and allocated exactly enough output space.
|
||||||
|
if (decoder.op == decoder.output.length) {
|
||||||
|
return decoder.output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Need to shorten the array, so allocate a new one of the
|
||||||
|
// right size and copy.
|
||||||
|
byte[] temp = new byte[decoder.op];
|
||||||
|
System.arraycopy(decoder.output, 0, temp, 0, decoder.op);
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* package */ static class Decoder extends Coder {
|
||||||
|
/**
|
||||||
|
* Lookup table for turning bytes into their position in the
|
||||||
|
* Base64 alphabet.
|
||||||
|
*/
|
||||||
|
private static final int DECODE[] = {
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
|
||||||
|
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1,
|
||||||
|
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||||
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
|
||||||
|
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||||
|
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode lookup table for the "web safe" variant (RFC 3548
|
||||||
|
* sec. 4) where - and _ replace + and /.
|
||||||
|
*/
|
||||||
|
private static final int DECODE_WEBSAFE[] = {
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1,
|
||||||
|
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1,
|
||||||
|
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||||
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63,
|
||||||
|
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||||
|
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-data values in the DECODE arrays.
|
||||||
|
*/
|
||||||
|
private static final int SKIP = -1;
|
||||||
|
private static final int EQUALS = -2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* States 0-3 are reading through the next input tuple.
|
||||||
|
* State 4 is having read one '=' and expecting exactly
|
||||||
|
* one more.
|
||||||
|
* State 5 is expecting no more data or padding characters
|
||||||
|
* in the input.
|
||||||
|
* State 6 is the error state; an error has been detected
|
||||||
|
* in the input and no future input can "fix" it.
|
||||||
|
*/
|
||||||
|
private int state; // state number (0 to 6)
|
||||||
|
private int value;
|
||||||
|
|
||||||
|
final private int[] alphabet;
|
||||||
|
|
||||||
|
public Decoder(int flags, byte[] output) {
|
||||||
|
this.output = output;
|
||||||
|
|
||||||
|
alphabet = ((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE;
|
||||||
|
state = 0;
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an overestimate for the number of bytes {@code
|
||||||
|
* len} bytes could decode to.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int maxOutputSize(int len) {
|
||||||
|
return len * 3 / 4 + 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode another block of input data.
|
||||||
|
*
|
||||||
|
* @return true if the state machine is still healthy. false if
|
||||||
|
* bad base-64 data has been detected in the input stream.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean process(byte[] input, int offset, int len, boolean finish) {
|
||||||
|
if (this.state == 6) {return false;}
|
||||||
|
|
||||||
|
int p = offset;
|
||||||
|
len += offset;
|
||||||
|
|
||||||
|
// Using local variables makes the decoder about 12%
|
||||||
|
// faster than if we manipulate the member variables in
|
||||||
|
// the loop. (Even alphabet makes a measurable
|
||||||
|
// difference, which is somewhat surprising to me since
|
||||||
|
// the member variable is final.)
|
||||||
|
int state = this.state;
|
||||||
|
int value = this.value;
|
||||||
|
int op = 0;
|
||||||
|
final byte[] output = this.output;
|
||||||
|
final int[] alphabet = this.alphabet;
|
||||||
|
|
||||||
|
while (p < len) {
|
||||||
|
// Try the fast path: we're starting a new tuple and the
|
||||||
|
// next four bytes of the input stream are all data
|
||||||
|
// bytes. This corresponds to going through states
|
||||||
|
// 0-1-2-3-0. We expect to use this method for most of
|
||||||
|
// the data.
|
||||||
|
//
|
||||||
|
// If any of the next four bytes of input are non-data
|
||||||
|
// (whitespace, etc.), value will end up negative. (All
|
||||||
|
// the non-data values in decode are small negative
|
||||||
|
// numbers, so shifting any of them up and or'ing them
|
||||||
|
// together will result in a value with its top bit set.)
|
||||||
|
//
|
||||||
|
// You can remove this whole block and the output should
|
||||||
|
// be the same, just slower.
|
||||||
|
if (state == 0) {
|
||||||
|
while (p + 4 <= len &&
|
||||||
|
(value = ((alphabet[input[p] & 0xff] << 18) |
|
||||||
|
(alphabet[input[p + 1] & 0xff] << 12) |
|
||||||
|
(alphabet[input[p + 2] & 0xff] << 6) |
|
||||||
|
(alphabet[input[p + 3] & 0xff]))) >= 0) {
|
||||||
|
output[op + 2] = (byte) value;
|
||||||
|
output[op + 1] = (byte) (value >> 8);
|
||||||
|
output[op] = (byte) (value >> 16);
|
||||||
|
op += 3;
|
||||||
|
p += 4;
|
||||||
|
}
|
||||||
|
if (p >= len) {break;}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The fast path isn't available -- either we've read a
|
||||||
|
// partial tuple, or the next four input bytes aren't all
|
||||||
|
// data, or whatever. Fall back to the slower state
|
||||||
|
// machine implementation.
|
||||||
|
|
||||||
|
int d = alphabet[input[p++] & 0xff];
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case 0:
|
||||||
|
if (d >= 0) {
|
||||||
|
value = d;
|
||||||
|
++state;
|
||||||
|
} else if (d != SKIP) {
|
||||||
|
this.state = 6;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
if (d >= 0) {
|
||||||
|
value = (value << 6) | d;
|
||||||
|
++state;
|
||||||
|
} else if (d != SKIP) {
|
||||||
|
this.state = 6;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (d >= 0) {
|
||||||
|
value = (value << 6) | d;
|
||||||
|
++state;
|
||||||
|
} else if (d == EQUALS) {
|
||||||
|
// Emit the last (partial) output tuple;
|
||||||
|
// expect exactly one more padding character.
|
||||||
|
output[op++] = (byte) (value >> 4);
|
||||||
|
state = 4;
|
||||||
|
} else if (d != SKIP) {
|
||||||
|
this.state = 6;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
if (d >= 0) {
|
||||||
|
// Emit the output triple and return to state 0.
|
||||||
|
value = (value << 6) | d;
|
||||||
|
output[op + 2] = (byte) value;
|
||||||
|
output[op + 1] = (byte) (value >> 8);
|
||||||
|
output[op] = (byte) (value >> 16);
|
||||||
|
op += 3;
|
||||||
|
state = 0;
|
||||||
|
} else if (d == EQUALS) {
|
||||||
|
// Emit the last (partial) output tuple;
|
||||||
|
// expect no further data or padding characters.
|
||||||
|
output[op + 1] = (byte) (value >> 2);
|
||||||
|
output[op] = (byte) (value >> 10);
|
||||||
|
op += 2;
|
||||||
|
state = 5;
|
||||||
|
} else if (d != SKIP) {
|
||||||
|
this.state = 6;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
if (d == EQUALS) {
|
||||||
|
++state;
|
||||||
|
} else if (d != SKIP) {
|
||||||
|
this.state = 6;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
if (d != SKIP) {
|
||||||
|
this.state = 6;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!finish) {
|
||||||
|
// We're out of input, but a future call could provide
|
||||||
|
// more.
|
||||||
|
this.state = state;
|
||||||
|
this.value = value;
|
||||||
|
this.op = op;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done reading input. Now figure out where we are left in
|
||||||
|
// the state machine and finish up.
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case 0:
|
||||||
|
// Output length is a multiple of three. Fine.
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
// Read one extra input byte, which isn't enough to
|
||||||
|
// make another output byte. Illegal.
|
||||||
|
this.state = 6;
|
||||||
|
return false;
|
||||||
|
case 2:
|
||||||
|
// Read two extra input bytes, enough to emit 1 more
|
||||||
|
// output byte. Fine.
|
||||||
|
output[op++] = (byte) (value >> 4);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
// Read three extra input bytes, enough to emit 2 more
|
||||||
|
// output bytes. Fine.
|
||||||
|
output[op++] = (byte) (value >> 10);
|
||||||
|
output[op++] = (byte) (value >> 2);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
// Read one padding '=' when we expected 2. Illegal.
|
||||||
|
this.state = 6;
|
||||||
|
return false;
|
||||||
|
case 5:
|
||||||
|
// Read all the padding '='s we expected and no more.
|
||||||
|
// Fine.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.state = state;
|
||||||
|
this.op = op;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
// encoding
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-encode the given data and return a newly allocated
|
||||||
|
* String with the result.
|
||||||
|
*
|
||||||
|
* @param input the data to encode
|
||||||
|
* @param flags controls certain features of the encoded output.
|
||||||
|
* Passing {@code DEFAULT} results in output that
|
||||||
|
* adheres to RFC 2045.
|
||||||
|
*/
|
||||||
|
public static String encodeToString(byte[] input, int flags) {
|
||||||
|
try {
|
||||||
|
return new String(encode(input, flags), "US-ASCII");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
// US-ASCII is guaranteed to be available.
|
||||||
|
throw new AssertionError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-encode the given data and return a newly allocated
|
||||||
|
* String with the result.
|
||||||
|
*
|
||||||
|
* @param input the data to encode
|
||||||
|
* @param offset the position within the input array at which to
|
||||||
|
* start
|
||||||
|
* @param len the number of bytes of input to encode
|
||||||
|
* @param flags controls certain features of the encoded output.
|
||||||
|
* Passing {@code DEFAULT} results in output that
|
||||||
|
* adheres to RFC 2045.
|
||||||
|
*/
|
||||||
|
public static String encodeToString(byte[] input, int offset, int len, int flags) {
|
||||||
|
try {
|
||||||
|
return new String(encode(input, offset, len, flags), "US-ASCII");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
// US-ASCII is guaranteed to be available.
|
||||||
|
throw new AssertionError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-encode the given data and return a newly allocated
|
||||||
|
* byte[] with the result.
|
||||||
|
*
|
||||||
|
* @param input the data to encode
|
||||||
|
* @param flags controls certain features of the encoded output.
|
||||||
|
* Passing {@code DEFAULT} results in output that
|
||||||
|
* adheres to RFC 2045.
|
||||||
|
*/
|
||||||
|
public static byte[] encode(byte[] input, int flags) {
|
||||||
|
return encode(input, 0, input.length, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-encode the given data and return a newly allocated
|
||||||
|
* byte[] with the result.
|
||||||
|
*
|
||||||
|
* @param input the data to encode
|
||||||
|
* @param offset the position within the input array at which to
|
||||||
|
* start
|
||||||
|
* @param len the number of bytes of input to encode
|
||||||
|
* @param flags controls certain features of the encoded output.
|
||||||
|
* Passing {@code DEFAULT} results in output that
|
||||||
|
* adheres to RFC 2045.
|
||||||
|
*/
|
||||||
|
public static byte[] encode(byte[] input, int offset, int len, int flags) {
|
||||||
|
Encoder encoder = new Encoder(flags, null);
|
||||||
|
|
||||||
|
// Compute the exact length of the array we will produce.
|
||||||
|
int output_len = len / 3 * 4;
|
||||||
|
|
||||||
|
// Account for the tail of the data and the padding bytes, if any.
|
||||||
|
if (encoder.do_padding) {
|
||||||
|
if (len % 3 > 0) {
|
||||||
|
output_len += 4;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (len % 3) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
output_len += 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
output_len += 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Account for the newlines, if any.
|
||||||
|
if (encoder.do_newline && len > 0) {
|
||||||
|
output_len += (((len - 1) / (3 * Encoder.LINE_GROUPS)) + 1) *
|
||||||
|
(encoder.do_cr ? 2 : 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
encoder.output = new byte[output_len];
|
||||||
|
encoder.process(input, offset, len, true);
|
||||||
|
|
||||||
|
assert encoder.op == output_len;
|
||||||
|
|
||||||
|
return encoder.output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* package */ static class Encoder extends Coder {
|
||||||
|
/**
|
||||||
|
* Emit a new line every this many output tuples. Corresponds to
|
||||||
|
* a 76-character line length (the maximum allowable according to
|
||||||
|
* <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>).
|
||||||
|
*/
|
||||||
|
public static final int LINE_GROUPS = 19;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup table for turning Base64 alphabet positions (6 bits)
|
||||||
|
* into output bytes.
|
||||||
|
*/
|
||||||
|
private static final byte ENCODE[] = {
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
||||||
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
||||||
|
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
||||||
|
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup table for turning Base64 alphabet positions (6 bits)
|
||||||
|
* into output bytes.
|
||||||
|
*/
|
||||||
|
private static final byte ENCODE_WEBSAFE[] = {
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
||||||
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
||||||
|
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
||||||
|
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_',
|
||||||
|
};
|
||||||
|
|
||||||
|
final private byte[] tail;
|
||||||
|
/* package */ int tailLen;
|
||||||
|
private int count;
|
||||||
|
|
||||||
|
final public boolean do_padding;
|
||||||
|
final public boolean do_newline;
|
||||||
|
final public boolean do_cr;
|
||||||
|
final private byte[] alphabet;
|
||||||
|
|
||||||
|
public Encoder(int flags, byte[] output) {
|
||||||
|
this.output = output;
|
||||||
|
|
||||||
|
do_padding = (flags & NO_PADDING) == 0;
|
||||||
|
do_newline = (flags & NO_WRAP) == 0;
|
||||||
|
do_cr = (flags & CRLF) != 0;
|
||||||
|
alphabet = ((flags & URL_SAFE) == 0) ? ENCODE : ENCODE_WEBSAFE;
|
||||||
|
|
||||||
|
tail = new byte[2];
|
||||||
|
tailLen = 0;
|
||||||
|
|
||||||
|
count = do_newline ? LINE_GROUPS : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an overestimate for the number of bytes {@code
|
||||||
|
* len} bytes could encode to.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int maxOutputSize(int len) {
|
||||||
|
return len * 8 / 5 + 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(byte[] input, int offset, int len, boolean finish) {
|
||||||
|
// Using local variables makes the encoder about 9% faster.
|
||||||
|
final byte[] alphabet = this.alphabet;
|
||||||
|
final byte[] output = this.output;
|
||||||
|
int op = 0;
|
||||||
|
int count = this.count;
|
||||||
|
|
||||||
|
int p = offset;
|
||||||
|
len += offset;
|
||||||
|
int v = -1;
|
||||||
|
|
||||||
|
// First we need to concatenate the tail of the previous call
|
||||||
|
// with any input bytes available now and see if we can empty
|
||||||
|
// the tail.
|
||||||
|
|
||||||
|
switch (tailLen) {
|
||||||
|
case 0:
|
||||||
|
// There was no tail.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
if (p + 2 <= len) {
|
||||||
|
// A 1-byte tail with at least 2 bytes of
|
||||||
|
// input available now.
|
||||||
|
v = ((tail[0] & 0xff) << 16) |
|
||||||
|
((input[p++] & 0xff) << 8) |
|
||||||
|
(input[p++] & 0xff);
|
||||||
|
tailLen = 0;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (p + 1 <= len) {
|
||||||
|
// A 2-byte tail with at least 1 byte of input.
|
||||||
|
v = ((tail[0] & 0xff) << 16) |
|
||||||
|
((tail[1] & 0xff) << 8) |
|
||||||
|
(input[p++] & 0xff);
|
||||||
|
tailLen = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v != -1) {
|
||||||
|
output[op++] = alphabet[(v >> 18) & 0x3f];
|
||||||
|
output[op++] = alphabet[(v >> 12) & 0x3f];
|
||||||
|
output[op++] = alphabet[(v >> 6) & 0x3f];
|
||||||
|
output[op++] = alphabet[v & 0x3f];
|
||||||
|
if (--count == 0) {
|
||||||
|
if (do_cr) {
|
||||||
|
output[op++] = '\r';
|
||||||
|
}
|
||||||
|
output[op++] = '\n';
|
||||||
|
count = LINE_GROUPS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this point either there is no tail, or there are fewer
|
||||||
|
// than 3 bytes of input available.
|
||||||
|
|
||||||
|
// The main loop, turning 3 input bytes into 4 output bytes on
|
||||||
|
// each iteration.
|
||||||
|
while (p + 3 <= len) {
|
||||||
|
v = ((input[p] & 0xff) << 16) |
|
||||||
|
((input[p + 1] & 0xff) << 8) |
|
||||||
|
(input[p + 2] & 0xff);
|
||||||
|
output[op] = alphabet[(v >> 18) & 0x3f];
|
||||||
|
output[op + 1] = alphabet[(v >> 12) & 0x3f];
|
||||||
|
output[op + 2] = alphabet[(v >> 6) & 0x3f];
|
||||||
|
output[op + 3] = alphabet[v & 0x3f];
|
||||||
|
p += 3;
|
||||||
|
op += 4;
|
||||||
|
if (--count == 0) {
|
||||||
|
if (do_cr) {
|
||||||
|
output[op++] = '\r';
|
||||||
|
}
|
||||||
|
output[op++] = '\n';
|
||||||
|
count = LINE_GROUPS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (finish) {
|
||||||
|
// Finish up the tail of the input. Note that we need to
|
||||||
|
// consume any bytes in tail before any bytes
|
||||||
|
// remaining in input; there should be at most two bytes
|
||||||
|
// total.
|
||||||
|
|
||||||
|
if (p - tailLen == len - 1) {
|
||||||
|
int t = 0;
|
||||||
|
v = ((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 4;
|
||||||
|
tailLen -= t;
|
||||||
|
output[op++] = alphabet[(v >> 6) & 0x3f];
|
||||||
|
output[op++] = alphabet[v & 0x3f];
|
||||||
|
if (do_padding) {
|
||||||
|
output[op++] = '=';
|
||||||
|
output[op++] = '=';
|
||||||
|
}
|
||||||
|
if (do_newline) {
|
||||||
|
if (do_cr) {
|
||||||
|
output[op++] = '\r';
|
||||||
|
}
|
||||||
|
output[op++] = '\n';
|
||||||
|
}
|
||||||
|
} else if (p - tailLen == len - 2) {
|
||||||
|
int t = 0;
|
||||||
|
v = (((tailLen > 1 ? tail[t++] : input[p++]) & 0xff) << 10) |
|
||||||
|
(((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 2);
|
||||||
|
tailLen -= t;
|
||||||
|
output[op++] = alphabet[(v >> 12) & 0x3f];
|
||||||
|
output[op++] = alphabet[(v >> 6) & 0x3f];
|
||||||
|
output[op++] = alphabet[v & 0x3f];
|
||||||
|
if (do_padding) {
|
||||||
|
output[op++] = '=';
|
||||||
|
}
|
||||||
|
if (do_newline) {
|
||||||
|
if (do_cr) {
|
||||||
|
output[op++] = '\r';
|
||||||
|
}
|
||||||
|
output[op++] = '\n';
|
||||||
|
}
|
||||||
|
} else if (do_newline && op > 0 && count != LINE_GROUPS) {
|
||||||
|
if (do_cr) {
|
||||||
|
output[op++] = '\r';
|
||||||
|
}
|
||||||
|
output[op++] = '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
assert tailLen == 0;
|
||||||
|
assert p == len;
|
||||||
|
} else {
|
||||||
|
// Save the leftovers in tail to be consumed on the next
|
||||||
|
// call to encodeInternal.
|
||||||
|
|
||||||
|
if (p == len - 1) {
|
||||||
|
tail[tailLen++] = input[p];
|
||||||
|
} else if (p == len - 2) {
|
||||||
|
tail[tailLen++] = input[p];
|
||||||
|
tail[tailLen++] = input[p + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.op = op;
|
||||||
|
this.count = count;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Base64Ext() {
|
||||||
|
} // don't instantiate
|
||||||
|
}
|
||||||
@@ -0,0 +1,364 @@
|
|||||||
|
package com.github.catvod.utils;
|
||||||
|
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.security.*;
|
||||||
|
import java.security.interfaces.RSAPrivateKey;
|
||||||
|
import java.security.interfaces.RSAPublicKey;
|
||||||
|
import java.security.spec.PKCS8EncodedKeySpec;
|
||||||
|
import java.security.spec.X509EncodedKeySpec;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实现RSA加密算法
|
||||||
|
*/
|
||||||
|
public final class RSAUtils {
|
||||||
|
/**
|
||||||
|
* 加密算法RSA
|
||||||
|
*/
|
||||||
|
public static final String KEY_ALGORITHM = "RSA";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 签名算法
|
||||||
|
*/
|
||||||
|
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取公钥的key
|
||||||
|
*/
|
||||||
|
private static final String PUBLIC_KEY = "RSAPublicKey";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取私钥的key
|
||||||
|
*/
|
||||||
|
private static final String PRIVATE_KEY = "RSAPrivateKey";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RSA最大加密明文大小
|
||||||
|
*/
|
||||||
|
private static final int MAX_ENCRYPT_BLOCK = 117;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RSA最大解密密文大小
|
||||||
|
*/
|
||||||
|
private static final int MAX_DECRYPT_BLOCK = 128;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BASE64解密
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static byte[] decryptBASE64(String key) throws Exception {
|
||||||
|
return Base64Ext.decode(key.getBytes(), Base64Ext.NO_WRAP);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BASE64加密
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String encryptBASE64(byte[] key) throws Exception {
|
||||||
|
return new String(Base64Ext.encode(key, Base64Ext.NO_WRAP));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 生成密钥对(公钥和私钥)
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static Map<String, Object> genKeyPair() throws Exception {
|
||||||
|
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
|
||||||
|
keyPairGen.initialize(1024);
|
||||||
|
KeyPair keyPair = keyPairGen.generateKeyPair();
|
||||||
|
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
|
||||||
|
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
|
||||||
|
Map<String, Object> keyMap = new HashMap<>();
|
||||||
|
keyMap.put(PUBLIC_KEY, publicKey);
|
||||||
|
keyMap.put(PRIVATE_KEY, privateKey);
|
||||||
|
return keyMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 用私钥对信息生成数字签名
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param data 待加签preSign
|
||||||
|
* @param privateKey 私钥(BASE64编码)
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String sign(byte[] data, String privateKey) throws Exception {
|
||||||
|
byte[] keyBytes = decryptBASE64(privateKey);
|
||||||
|
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
|
||||||
|
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
|
||||||
|
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
|
||||||
|
signature.initSign(privateK);
|
||||||
|
signature.update(data);
|
||||||
|
return encryptBASE64(signature.sign());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 校验数字签名
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param data 待加签preSign
|
||||||
|
* @param publicKey 公钥(BASE64编码)
|
||||||
|
* @param sign 数字签名
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
|
||||||
|
byte[] keyBytes = decryptBASE64(publicKey);
|
||||||
|
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
|
||||||
|
PublicKey publicK = keyFactory.generatePublic(keySpec);
|
||||||
|
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
|
||||||
|
signature.initVerify(publicK);
|
||||||
|
signature.update(data);
|
||||||
|
return signature.verify(decryptBASE64(sign));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <P>
|
||||||
|
* 私钥解密
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param encryptedData 已加密数据
|
||||||
|
* @param privateKey 私钥(BASE64编码)
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception {
|
||||||
|
byte[] keyBytes = decryptBASE64(privateKey);
|
||||||
|
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
|
||||||
|
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
|
||||||
|
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, privateK);
|
||||||
|
int inputLen = encryptedData.length;
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
int offSet = 0;
|
||||||
|
byte[] cache;
|
||||||
|
int i = 0;
|
||||||
|
// 对数据分段解密
|
||||||
|
while (inputLen - offSet > 0) {
|
||||||
|
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
|
||||||
|
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
|
||||||
|
} else {
|
||||||
|
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
|
||||||
|
}
|
||||||
|
out.write(cache, 0, cache.length);
|
||||||
|
i++;
|
||||||
|
offSet = i * MAX_DECRYPT_BLOCK;
|
||||||
|
}
|
||||||
|
byte[] decryptedData = out.toByteArray();
|
||||||
|
out.close();
|
||||||
|
return decryptedData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** */
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 公钥解密
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param encryptedData 已加密数据
|
||||||
|
* @param publicKey 公钥(BASE64编码)
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey) throws Exception {
|
||||||
|
byte[] keyBytes = decryptBASE64(publicKey);
|
||||||
|
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
|
||||||
|
Key publicK = keyFactory.generatePublic(x509KeySpec);
|
||||||
|
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, publicK);
|
||||||
|
int inputLen = encryptedData.length;
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
int offSet = 0;
|
||||||
|
byte[] cache;
|
||||||
|
int i = 0;
|
||||||
|
// 对数据分段解密
|
||||||
|
while (inputLen - offSet > 0) {
|
||||||
|
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
|
||||||
|
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
|
||||||
|
} else {
|
||||||
|
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
|
||||||
|
}
|
||||||
|
out.write(cache, 0, cache.length);
|
||||||
|
i++;
|
||||||
|
offSet = i * MAX_DECRYPT_BLOCK;
|
||||||
|
}
|
||||||
|
byte[] decryptedData = out.toByteArray();
|
||||||
|
out.close();
|
||||||
|
return decryptedData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** */
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 公钥加密
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param data 源数据
|
||||||
|
* @param publicKey 公钥(BASE64编码)
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
|
||||||
|
byte[] keyBytes = decryptBASE64(publicKey);
|
||||||
|
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
|
||||||
|
Key publicK = keyFactory.generatePublic(x509KeySpec);
|
||||||
|
// 对数据加密
|
||||||
|
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, publicK);
|
||||||
|
int inputLen = data.length;
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
int offSet = 0;
|
||||||
|
byte[] cache;
|
||||||
|
int i = 0;
|
||||||
|
// 对数据分段加密
|
||||||
|
while (inputLen - offSet > 0) {
|
||||||
|
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
|
||||||
|
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
|
||||||
|
} else {
|
||||||
|
cache = cipher.doFinal(data, offSet, inputLen - offSet);
|
||||||
|
}
|
||||||
|
out.write(cache, 0, cache.length);
|
||||||
|
i++;
|
||||||
|
offSet = i * MAX_ENCRYPT_BLOCK;
|
||||||
|
}
|
||||||
|
byte[] encryptedData = out.toByteArray();
|
||||||
|
out.close();
|
||||||
|
return encryptedData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 私钥加密
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param data 源数据
|
||||||
|
* @param privateKey 私钥(BASE64编码)
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static byte[] encryptByPrivateKey(byte[] data, String privateKey) throws Exception {
|
||||||
|
byte[] keyBytes = decryptBASE64(privateKey);
|
||||||
|
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
|
||||||
|
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
|
||||||
|
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, privateK);
|
||||||
|
int inputLen = data.length;
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
int offSet = 0;
|
||||||
|
byte[] cache;
|
||||||
|
int i = 0;
|
||||||
|
// 对数据分段加密
|
||||||
|
while (inputLen - offSet > 0) {
|
||||||
|
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
|
||||||
|
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
|
||||||
|
} else {
|
||||||
|
cache = cipher.doFinal(data, offSet, inputLen - offSet);
|
||||||
|
}
|
||||||
|
out.write(cache, 0, cache.length);
|
||||||
|
i++;
|
||||||
|
offSet = i * MAX_ENCRYPT_BLOCK;
|
||||||
|
}
|
||||||
|
byte[] encryptedData = out.toByteArray();
|
||||||
|
out.close();
|
||||||
|
return encryptedData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 获取私钥
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param keyMap 密钥对
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
|
||||||
|
Key key = (Key) keyMap.get(PRIVATE_KEY);
|
||||||
|
return encryptBASE64(key.getEncoded());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 获取公钥
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param keyMap 密钥对
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
|
||||||
|
Key key = (Key) keyMap.get(PUBLIC_KEY);
|
||||||
|
return encryptBASE64(key.getEncoded());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* java端私钥加密
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
* @param PRIVATEKEY
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String encryptedDataWithPriKey(String data, String PRIVATEKEY) throws Exception {
|
||||||
|
return encryptBASE64(encryptByPrivateKey(data.getBytes(), PRIVATEKEY));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* java端私钥解密
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String decryptDataWithPubKey(String data, String PUBLICKEY) throws Exception {
|
||||||
|
byte[] rs = decryptBASE64(data);
|
||||||
|
return new String(decryptByPublicKey(rs, PUBLICKEY), "UTF-8");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* java端公钥加密
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String encryptedDataWithPubKey(String data, String PUBLICKEY) throws Exception {
|
||||||
|
data = encryptBASE64(encryptByPublicKey(data.getBytes(), PUBLICKEY));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* java端私钥解密
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static String decryptDataWithPriKey(String data, String PRIVATEKEY) throws Exception {
|
||||||
|
byte[] rs = decryptBASE64(data);
|
||||||
|
return new String(decryptByPrivateKey(rs, PRIVATEKEY), "UTF-8");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -89,6 +89,10 @@ public class XPathRule {
|
|||||||
* 分类页地址
|
* 分类页地址
|
||||||
*/
|
*/
|
||||||
private String cateUrl;
|
private String cateUrl;
|
||||||
|
/**
|
||||||
|
* 分类页地址2
|
||||||
|
*/
|
||||||
|
private String cateUrl2;
|
||||||
/**
|
/**
|
||||||
* 分类叶视频节点 xpath
|
* 分类叶视频节点 xpath
|
||||||
*/
|
*/
|
||||||
@@ -352,6 +356,7 @@ public class XPathRule {
|
|||||||
rule.homeVodMark = jsonObj.optString("homeVodMark").trim();
|
rule.homeVodMark = jsonObj.optString("homeVodMark").trim();
|
||||||
rule.homeVodMarkR = getPattern(jsonObj, "homeVodMarkR");
|
rule.homeVodMarkR = getPattern(jsonObj, "homeVodMarkR");
|
||||||
rule.cateUrl = jsonObj.optString("cateUrl").trim();
|
rule.cateUrl = jsonObj.optString("cateUrl").trim();
|
||||||
|
rule.cateUrl2 = jsonObj.optString("cateUrl2").trim();
|
||||||
rule.cateVodNode = jsonObj.optString("cateVodNode").trim();
|
rule.cateVodNode = jsonObj.optString("cateVodNode").trim();
|
||||||
rule.cateVodName = jsonObj.optString("cateVodName").trim();
|
rule.cateVodName = jsonObj.optString("cateVodName").trim();
|
||||||
rule.cateVodNameR = getPattern(jsonObj, "cateVodNameR");
|
rule.cateVodNameR = getPattern(jsonObj, "cateVodNameR");
|
||||||
@@ -485,6 +490,10 @@ public class XPathRule {
|
|||||||
return cateUrl;
|
return cateUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCateUrl2() {
|
||||||
|
return cateUrl2;
|
||||||
|
}
|
||||||
|
|
||||||
public String getCateVodNode() {
|
public String getCateVodNode() {
|
||||||
return cateVodNode;
|
return cateVodNode;
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
d63fe3db21b48e04884c2d5303907bd1
|
eb64596dd182ed2a025c8f071196d3b3
|
||||||
|
|||||||
@@ -0,0 +1,187 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.utils.okhttp.OKCallBack;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import okhttp3.Call;
|
||||||
|
|
||||||
|
public class Alist extends Spider {
|
||||||
|
private String ext;
|
||||||
|
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> hashMap) {
|
||||||
|
try {
|
||||||
|
String url = this.ext + "/api/public/path";
|
||||||
|
JSONObject params = new JSONObject();
|
||||||
|
params.put("path", tid);
|
||||||
|
|
||||||
|
JSONArray jSONArray2 = new JSONArray();
|
||||||
|
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, params.toString(), new OKCallBack.OKCallBackString() {
|
||||||
|
@Override
|
||||||
|
protected void onFailure(Call call, Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResponse(String response) {
|
||||||
|
try {
|
||||||
|
JSONObject retval = new JSONObject(response);
|
||||||
|
JSONArray list = retval.getJSONObject("data").getJSONArray("files");
|
||||||
|
for (int i =0; i < list.length(); ++i){
|
||||||
|
JSONObject o = list.getJSONObject(i);
|
||||||
|
String pic = o.getString("thumbnail");
|
||||||
|
if(pic.isEmpty()){
|
||||||
|
pic = "http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png";
|
||||||
|
}
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
jSONObject2.put("vod_id", tid + (tid.charAt(tid.length()-1) == '/' ? "" : "/") + o.getString("name"));
|
||||||
|
jSONObject2.put("vod_name", o.getString("name"));
|
||||||
|
jSONObject2.put("vod_pic", pic);
|
||||||
|
jSONObject2.put("vod_tag",o.getInt("type")==1 ? "folder" : "file" );
|
||||||
|
jSONObject2.put("vod_remarks", o.getInt("type")==1 ? "文件夹" : "文件");
|
||||||
|
jSONArray2.put(jSONObject2);
|
||||||
|
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
JSONObject jSONObject3 = new JSONObject();
|
||||||
|
jSONObject3.put("page", 1);
|
||||||
|
jSONObject3.put("pagecount", 1);
|
||||||
|
jSONObject3.put("limit", jSONArray2.length());
|
||||||
|
jSONObject3.put("total", jSONArray2.length());
|
||||||
|
jSONObject3.put("list", jSONArray2);
|
||||||
|
return jSONObject3.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String filename = ids.get(0);
|
||||||
|
String url = this.ext + "/api/public/path";
|
||||||
|
JSONObject params = new JSONObject();
|
||||||
|
params.put("path", filename);
|
||||||
|
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONArray list = new JSONArray();
|
||||||
|
|
||||||
|
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, params.toString(), new OKCallBack.OKCallBackString() {
|
||||||
|
@Override
|
||||||
|
protected void onFailure(Call call, Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResponse(String response) {
|
||||||
|
try {
|
||||||
|
JSONObject retval = new JSONObject(response);
|
||||||
|
JSONArray files = retval.getJSONObject("data").getJSONArray("files");
|
||||||
|
for (int i =0; i < files.length(); ++i){
|
||||||
|
JSONObject o = files.getJSONObject(i);
|
||||||
|
String url = o.getString("url");
|
||||||
|
if(url.indexOf("//") ==0){
|
||||||
|
url = "http:"+url;
|
||||||
|
}
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
jSONObject2.put("vod_id", filename + "/" + o.getString("name"));
|
||||||
|
jSONObject2.put("vod_name", o.getString("name"));
|
||||||
|
jSONObject2.put("vod_pic", o.getString("thumbnail"));
|
||||||
|
jSONObject2.put("vod_tag",o.getInt("type")==1 ? "folder" : "file" );
|
||||||
|
jSONObject2.put("vod_play_from", "播放");
|
||||||
|
jSONObject2.put("vod_play_url", o.getString("name")+"$"+url);
|
||||||
|
list.put(jSONObject2);
|
||||||
|
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
result.put("list", list);
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
String fileTime(long time, String fmt) {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTimeInMillis(time);
|
||||||
|
Date date = calendar.getTime();
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat(fmt);
|
||||||
|
return sdf.format(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String homeContent(boolean z) {
|
||||||
|
try {
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
JSONObject newCls = new JSONObject();
|
||||||
|
newCls.put("type_id", "/");
|
||||||
|
newCls.put("type_name", "Alist");
|
||||||
|
newCls.put("type_flag", "1"); // 1 列表形式的文件夹 2 缩略图 0 或者不存在 表示正常
|
||||||
|
classes.put(newCls);
|
||||||
|
|
||||||
|
JSONArray jSONArray3 = new JSONArray();
|
||||||
|
|
||||||
|
JSONObject jSONObject4 = new JSONObject();
|
||||||
|
jSONObject4.put("class", classes);
|
||||||
|
if(z) {
|
||||||
|
jSONObject4.put("filters", new JSONObject("{}"));
|
||||||
|
}
|
||||||
|
return jSONObject4.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(Context context, String ext){
|
||||||
|
Alist.super.init(context);
|
||||||
|
this.ext = ext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String playerContent(String str, String str2, List<String> list) {
|
||||||
|
try{
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
result.put("url", str2);
|
||||||
|
return result.toString();
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String searchContent(String str, boolean z) {
|
||||||
|
try {
|
||||||
|
return "";
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,604 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
import com.github.catvod.utils.Misc;
|
||||||
|
import com.github.catvod.utils.gZip;
|
||||||
|
import com.github.catvod.utils.okhttp.OKCallBack;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
|
import okhttp3.Call;
|
||||||
|
import okhttp3.Response;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class Bdys01 extends Spider {
|
||||||
|
private static final String siteUrl = "https://www.bdys01.com";
|
||||||
|
private static final String siteHost = "www.bdys01.com";
|
||||||
|
private String cookie="";
|
||||||
|
private String referer="";
|
||||||
|
private String rspurl="";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 筛选配置
|
||||||
|
*/
|
||||||
|
private JSONObject filterConfig;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(Context context) {
|
||||||
|
super.init(context);
|
||||||
|
try {
|
||||||
|
filterConfig = new JSONObject("{\"0\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}],\"1\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}],\"a\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}]}");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 爬虫headers
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected HashMap<String, String> getHeaders(String url,String ref) {
|
||||||
|
HashMap<String, String> headers = new HashMap<>();
|
||||||
|
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
||||||
|
if(!ref.equals("google")){
|
||||||
|
headers.put("Authority", "www.bdys01.com");
|
||||||
|
if(ref.length()>0){
|
||||||
|
if(ref.equals("origin")){
|
||||||
|
headers.put("Origin", "https://www.bdys01.com");
|
||||||
|
} else {
|
||||||
|
headers.put("Referer", ref);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(cookie.length()>0){
|
||||||
|
headers.put("Cookie", cookie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HashMap<String, String> getHeaders2(String url) {
|
||||||
|
HashMap<String, String> headers = new HashMap<>();
|
||||||
|
String ss = url.replace("https://","").split("/")[0];
|
||||||
|
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
||||||
|
headers.put("Authority", ss);
|
||||||
|
headers.put("Origin", "www.bdys01.com");
|
||||||
|
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void getCookie(){
|
||||||
|
cookie="";
|
||||||
|
String cookieurl="https://www.bdys01.com/zzzzz";
|
||||||
|
Map<String, List<String>> cookies = new HashMap<>();
|
||||||
|
OkHttpUtil.string(cookieurl,getHeaders(cookieurl,""),cookies);
|
||||||
|
for( Map.Entry<String, List<String>> entry : cookies.entrySet() ){
|
||||||
|
if(entry.getKey().equals("set-cookie")){
|
||||||
|
cookie = "Messi YYDS Forever 8K ;" + TextUtils.join(";",entry.getValue());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分类数据 + 首页最近更新视频列表数据
|
||||||
|
*
|
||||||
|
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
getCookie();
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl,referer)));
|
||||||
|
referer=siteUrl+"/";
|
||||||
|
// 分类节点
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
String catestr ="{\"全部\": \"a\",\"电影\": \"0\",\"电视剧\": \"1\"}";
|
||||||
|
JSONObject catedef = new JSONObject(catestr);
|
||||||
|
Iterator it = catedef.keys();
|
||||||
|
while(it.hasNext()){
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
String key =(String) it.next();
|
||||||
|
jsonObject.put("type_name", key);
|
||||||
|
jsonObject.put("type_id", catedef.getString(key));
|
||||||
|
classes.put(jsonObject);
|
||||||
|
}
|
||||||
|
result.put("class", classes);
|
||||||
|
if (filter) {
|
||||||
|
result.put("filters", filterConfig);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// 取首页推荐视频列表
|
||||||
|
Element homeList = doc.select("div.row.row-cards").get(0);
|
||||||
|
Elements list = homeList.select("div.col-4.rows-md-7");
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
Element vod = list.get(i);
|
||||||
|
String title = vod.selectFirst("h3.card-title").text();
|
||||||
|
String cover = vod.selectFirst("img.w-100" ).attr("data-src");
|
||||||
|
String remark = vod.selectFirst("p.text-muted").text();
|
||||||
|
String id =vod.selectFirst("a.d-block.cover").attr("href");
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", remark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
result.put("list", videos);
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分类信息数据
|
||||||
|
*
|
||||||
|
* @param tid 分类id
|
||||||
|
* @param pg 页数
|
||||||
|
* @param filter 同homeContent方法中的filter
|
||||||
|
* @param extend 筛选参数{k:v, k1:v1}
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/s/" ;
|
||||||
|
if (extend != null && extend.size() > 0 ) {
|
||||||
|
String urlformat= "";
|
||||||
|
if(tid.equals("a")){
|
||||||
|
urlformat= url +"{s}/"+ pg +"?&area={area}&year={year}&order={order}";
|
||||||
|
}else {
|
||||||
|
urlformat= url +"{s}/"+ pg +"?&type="+tid+"&area={area}&year={year}&order={order}";
|
||||||
|
}
|
||||||
|
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
||||||
|
String key = it.next();
|
||||||
|
String value = extend.get(key);
|
||||||
|
if (value.length() > 0) {
|
||||||
|
urlformat=urlformat.replace("{"+key+"}",URLEncoder.encode(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i=0 ;i<4;i++) {
|
||||||
|
if (urlformat.contains("{s}")) {
|
||||||
|
urlformat = urlformat.replace("{s}", "all");
|
||||||
|
} else if (urlformat.contains("{area}")) {
|
||||||
|
urlformat = urlformat.replace("&area={area}", "");
|
||||||
|
} else if (urlformat.contains("{year}")) {
|
||||||
|
urlformat = urlformat.replace("&year={year}", "");
|
||||||
|
} else if (urlformat.contains("{order}")) {
|
||||||
|
urlformat = urlformat.replace("{order}", "0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
url = urlformat;
|
||||||
|
} else {
|
||||||
|
if(tid.equals("a")){
|
||||||
|
url += "all/" + pg + "?&order=0";
|
||||||
|
}else {
|
||||||
|
url += "all/" + pg + "?&type=" + tid + "&order=0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
referer=siteUrl+"/";
|
||||||
|
String html = OkHttpUtil.string(url, getHeaders(url,referer));
|
||||||
|
referer = url;
|
||||||
|
Document doc = Jsoup.parse(html);
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
if (!html.contains("没有找到您想要的结果哦")) {
|
||||||
|
// 取当前分类页的视频列表
|
||||||
|
Elements list = doc.select("div.col-lg-8");
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
Element vod = list.get(i);
|
||||||
|
String title = vod.selectFirst("h3.mb-0").text();
|
||||||
|
String cover = vod.selectFirst("img.w-100").attr("src");
|
||||||
|
String remark = vod.selectFirst("p.mb-0").text();
|
||||||
|
String idtt = vod.selectFirst("a.d-block").attr("href");
|
||||||
|
String id ="";
|
||||||
|
if(idtt.contains("JSESSIONID")) {
|
||||||
|
int end = idtt.indexOf(";");
|
||||||
|
id = idtt.substring(0,end);
|
||||||
|
}else{
|
||||||
|
id =idtt;
|
||||||
|
}
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", remark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int page =Integer.parseInt(pg);
|
||||||
|
result.put("page", page);
|
||||||
|
result.put("pagecount", videos.length()== 24 ? page + 1 : page);
|
||||||
|
result.put("limit", 24);
|
||||||
|
result.put("total",Integer.MAX_VALUE );
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 视频详情信息
|
||||||
|
*
|
||||||
|
* @param ids 视频id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + ids.get(0);
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url,referer)));
|
||||||
|
referer=url;
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONObject vodList = new JSONObject();
|
||||||
|
String cover = doc.selectFirst("div.col-md-auto img").attr("src");
|
||||||
|
String title = doc.selectFirst("h1.d-none.d-md-block").text();
|
||||||
|
String desc = doc.select("div.card.collapse > div.card-body").text();
|
||||||
|
String year = doc.select("span.badge.bg-purple-lt").text().replace("更新时间:","").split("-")[0];
|
||||||
|
String category = "", area = "", remark = "", director = "", actor = "";
|
||||||
|
Element details = doc.select("div.col.mb-2").get(0);
|
||||||
|
Elements allp = details.select("p");
|
||||||
|
for (int i = 0; i < allp.size(); i++) {
|
||||||
|
Element text = allp.get(i);
|
||||||
|
String info = text.selectFirst("strong").text();
|
||||||
|
if (info.equals("类型:")) {
|
||||||
|
List<String> categorys = new ArrayList<>();
|
||||||
|
Elements aa = text.select("a");
|
||||||
|
for (int j = 0; j < aa.size(); j++) {
|
||||||
|
categorys.add(aa.get(j).text());
|
||||||
|
}
|
||||||
|
category ="类型:"+TextUtils.join(",", categorys);
|
||||||
|
} else if (info.contains("地区")) {
|
||||||
|
int start= text.text().indexOf("[")+1;
|
||||||
|
int end = text.text().indexOf("]");
|
||||||
|
area = text.text().substring(start,end);
|
||||||
|
} else if (info.contains("豆瓣")) {
|
||||||
|
remark = "豆瓣:"+text.text();
|
||||||
|
} else if (info.contains("导演:")) {
|
||||||
|
director = text.selectFirst("a").text();
|
||||||
|
} else if (info.contains("主演:")) {
|
||||||
|
List<String> actors = new ArrayList<>();
|
||||||
|
Elements aa = text.select("a");
|
||||||
|
for (int j = 0; j < aa.size(); j++) {
|
||||||
|
actors.add(aa.get(j).text());
|
||||||
|
}
|
||||||
|
actor =TextUtils.join(",", actors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String vid = ids.get(0);
|
||||||
|
vodList.put("vod_id", vid);
|
||||||
|
vodList.put("vod_name", title);
|
||||||
|
vodList.put("vod_pic", cover);
|
||||||
|
vodList.put("type_name", category);
|
||||||
|
vodList.put("vod_year", year);
|
||||||
|
vodList.put("vod_area", area);
|
||||||
|
vodList.put("vod_remarks", remark);
|
||||||
|
vodList.put("vod_actor", actor);
|
||||||
|
vodList.put("vod_director", director);
|
||||||
|
vodList.put("vod_content", desc);
|
||||||
|
Map<String, String> vod_play = new TreeMap<>();
|
||||||
|
// 取播放列表数据
|
||||||
|
Elements playListA = doc.select("a.btn.btn-square");
|
||||||
|
String sourceName = "播放列表";
|
||||||
|
String playList = "";
|
||||||
|
List<String> vodItems = new ArrayList<>();
|
||||||
|
for (int j = 0; j < playListA.size(); j++) {
|
||||||
|
Element vod = playListA.get(j);
|
||||||
|
String idtt = vod.attr("href");
|
||||||
|
String playURL ="";
|
||||||
|
if(idtt.contains("JSESSIONID")) {
|
||||||
|
int end = idtt.indexOf(";");
|
||||||
|
playURL = idtt.substring(0,end);
|
||||||
|
}else{
|
||||||
|
playURL =idtt;
|
||||||
|
}
|
||||||
|
vodItems.add(vod.text() + "$" + playURL);
|
||||||
|
}
|
||||||
|
if (vodItems.size() > 0)
|
||||||
|
playList = TextUtils.join("#", vodItems);
|
||||||
|
vod_play.put(sourceName, playList);
|
||||||
|
if (vod_play.size() > 0) {
|
||||||
|
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
||||||
|
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
||||||
|
vodList.put("vod_play_from", vod_play_from);
|
||||||
|
vodList.put("vod_play_url", vod_play_url);
|
||||||
|
}
|
||||||
|
JSONArray list = new JSONArray();
|
||||||
|
list.put(vodList);
|
||||||
|
result.put("list", list);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取视频播放信息
|
||||||
|
*
|
||||||
|
* @param flag 播放源
|
||||||
|
* @param id 视频id
|
||||||
|
* @param vipFlags 所有可能需要vip解析的源
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@TargetApi(Build.VERSION_CODES.KITKAT)
|
||||||
|
@Override
|
||||||
|
public String playerContent(String flag, String id, List<String> vipFlags) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + id ;
|
||||||
|
String htmlplay = OkHttpUtil.string(url, getHeaders(url,referer));
|
||||||
|
Document doc = Jsoup.parse(htmlplay);
|
||||||
|
Elements allScript = doc.select("script");
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
String pid="";
|
||||||
|
for (int i = 0; i < allScript.size(); i++) {
|
||||||
|
String scContent = allScript.get(i).toString();
|
||||||
|
if (scContent.contains("var pid =")) {
|
||||||
|
int start = scContent.indexOf("var pid =");
|
||||||
|
int end = scContent.lastIndexOf("var time") + 1;
|
||||||
|
String pidtmp = scContent.substring(start, end);
|
||||||
|
start = pidtmp.indexOf("=")+2;
|
||||||
|
end = pidtmp.lastIndexOf(";") ;
|
||||||
|
pid = pidtmp.substring(start, end);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
long t = System.currentTimeMillis();
|
||||||
|
String key = Misc.MD5(pid+"-"+t, StandardCharsets.UTF_8).substring(0,16);
|
||||||
|
String sg = encrypt(pid+"-"+t,key);
|
||||||
|
String geturl = siteUrl+"/lines?t="+t+"&sg="+sg+"&pid="+pid;
|
||||||
|
String urlsrc = OkHttpUtil.string(geturl, getHeaders(geturl,""));
|
||||||
|
JSONObject urlsrcobj = new JSONObject(urlsrc);
|
||||||
|
JSONObject urldb = urlsrcobj.getJSONObject("data");
|
||||||
|
List <String> urldblist = new ArrayList<>();
|
||||||
|
if(!urldb.isNull("url3")){
|
||||||
|
String url3 = urldb.optString("url3");
|
||||||
|
urldblist.add(url3);
|
||||||
|
}
|
||||||
|
if(!urldb.isNull("m3u8")){
|
||||||
|
String m3u8 = urldb.optString("m3u8").replace("www.bde4.cc","www.bdys01.com");
|
||||||
|
urldblist.add(m3u8);
|
||||||
|
}
|
||||||
|
if(!urldb.isNull("m3u8_2")){
|
||||||
|
String m3u8_2 =urldb.optString("m3u8_2");
|
||||||
|
String[] m2=m3u8_2.split(",");
|
||||||
|
for(int i=0; i< m2.length ;i++){
|
||||||
|
urldblist.add(m2[i].replace("www.bde4.cc","www.bdys01.com"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(urldblist.isEmpty()){
|
||||||
|
rspurl="";
|
||||||
|
t = System.currentTimeMillis();
|
||||||
|
key = Misc.MD5(pid+"-"+t, StandardCharsets.UTF_8).substring(0,16);
|
||||||
|
sg = encrypt(pid+"-"+t,key);
|
||||||
|
geturl = siteUrl+"/god/"+pid;
|
||||||
|
HashMap<String, String> hashMap = new HashMap();
|
||||||
|
hashMap.put("t", Long.toString(t));
|
||||||
|
hashMap.put("sg", sg);
|
||||||
|
hashMap.put("verifyCode", "666");
|
||||||
|
OkHttpUtil.post(OkHttpUtil.defaultClient(), geturl, hashMap,getHeaders(geturl,"origin") ,new OKCallBack.OKCallBackString() {
|
||||||
|
@Override
|
||||||
|
protected void onFailure(Call call, Exception exc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResponse(String str) {
|
||||||
|
try {
|
||||||
|
JSONObject rspobj = new JSONObject(str);
|
||||||
|
if(rspobj.isNull("url")){
|
||||||
|
rspurl="";
|
||||||
|
}else {
|
||||||
|
rspurl = rspobj.getString("url");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(rspurl.isEmpty()){
|
||||||
|
t = System.currentTimeMillis();
|
||||||
|
key = Misc.MD5(pid+"-"+t, StandardCharsets.UTF_8).substring(0,16);
|
||||||
|
sg = encrypt(pid+"-"+t,key);
|
||||||
|
geturl = siteUrl+"/god/"+pid+"?type=1";
|
||||||
|
HashMap<String, String> hashMap2 = new HashMap();
|
||||||
|
hashMap2.put("t", Long.toString(t));
|
||||||
|
hashMap2.put("sg", sg);
|
||||||
|
hashMap2.put("verifyCode", "888");
|
||||||
|
OkHttpUtil.post(OkHttpUtil.defaultClient(), geturl, hashMap2,getHeaders(geturl,"origin") ,new OKCallBack.OKCallBackString() {
|
||||||
|
@Override
|
||||||
|
protected void onFailure(Call call, Exception exc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResponse(String str) {
|
||||||
|
try {
|
||||||
|
rspurl = new JSONObject(str).getString("url");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
String realurl ="";
|
||||||
|
if(rspurl.contains("rkey")){
|
||||||
|
t = System.currentTimeMillis();
|
||||||
|
realurl =rspurl.replace("?rkey",t+".mp4?ver=6010&rkey");
|
||||||
|
}else if (rspurl.contains("ixigua")) {
|
||||||
|
realurl = rspurl;
|
||||||
|
}else{
|
||||||
|
t = System.currentTimeMillis();
|
||||||
|
realurl = rspurl.replace("http:","https:") +"/"+t+".mp4";
|
||||||
|
}
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
result.put("url", realurl);
|
||||||
|
result.put("header", "");
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
int index =new Random().nextInt(urldblist.size());
|
||||||
|
String videourl = urldblist.get(index);
|
||||||
|
if(videourl.contains("mp4")){
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
result.put("url", videourl);
|
||||||
|
result.put("header", "");
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
Map<String, List<String>> respHeaders = new HashMap<>();
|
||||||
|
OkHttpUtil.stringNoRedirect(videourl, getHeaders(videourl,""), respHeaders);
|
||||||
|
String redirect = OkHttpUtil.getRedirectLocation(respHeaders);
|
||||||
|
String realm3u8="";
|
||||||
|
OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
|
||||||
|
@Override
|
||||||
|
protected void onFailure(Call call, Exception e) {
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void onResponse(Response response) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
OkHttpUtil.get(OkHttpUtil.defaultClient(), redirect, null, getHeaders2(redirect), callBack);
|
||||||
|
if (callBack.getResult().code() == 200) {
|
||||||
|
InputStream picsrc = callBack.getResult().body().byteStream();
|
||||||
|
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||||
|
int nRead;
|
||||||
|
byte[] data = new byte[4];
|
||||||
|
while ((nRead = picsrc.read(data, 0, data.length)) != -1) {
|
||||||
|
buffer.write(data, 0, nRead);
|
||||||
|
}
|
||||||
|
buffer.flush();
|
||||||
|
byte[] targetArray = buffer.toByteArray();
|
||||||
|
picsrc.close();
|
||||||
|
byte[] dep = Arrays.copyOfRange(targetArray,3354,targetArray.length);
|
||||||
|
String pp = gZip.KS(dep);
|
||||||
|
String[] m3u8ori = pp.split("\n");
|
||||||
|
for(int i=0;i<m3u8ori.length;i++){
|
||||||
|
String mt= m3u8ori[i];
|
||||||
|
if(mt.contains(".ts")){
|
||||||
|
mt="https://vod.bdys.me/"+mt;
|
||||||
|
m3u8ori[i]=mt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
realm3u8= TextUtils.join("\n",m3u8ori);
|
||||||
|
}
|
||||||
|
String realm3u8b64=Base64.encodeToString(realm3u8.getBytes(), 2);
|
||||||
|
result.put("url", "data:application/vnd.apple.mpegurl;base64,"+realm3u8b64);
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
result.put("header", new JSONObject(getHeaders2("https://vod.bdys.me/")).toString());
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
try {
|
||||||
|
String url = "https://www.google.com/search?q=site%3A" + siteHost + "+" + URLEncoder.encode(key);
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(url,getHeaders(url,"google")));
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
Elements sourceList = doc.select("div.yuRUbf a");
|
||||||
|
if(sourceList.size()>0){
|
||||||
|
for (int i = 0; i < 1; i++) {
|
||||||
|
Element sourcess = sourceList.get(i);
|
||||||
|
String sourceName = sourcess.select("h3.LC20lb.MBeuO.DKV0Md").text();
|
||||||
|
String list1 = sourcess.attr("href");
|
||||||
|
if(list1.contains("/s/")||list1.contains("play")||list1.contains("performer")||list1.contains("search")||list1.contains("jsessionid")){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (sourceName.contains(key)) {
|
||||||
|
Document ddrklink = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(list1,referer)));
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
String cover = ddrklink.selectFirst("div.col-md-auto img").attr("src");
|
||||||
|
String title = ddrklink.selectFirst("h2.d-sm-block.d-md-none").text();
|
||||||
|
String id =list1.replace("https://www.bdys01.com","");
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_remarks", "");
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String encrypt(String src, String KEY) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
|
||||||
|
SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES");
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
|
||||||
|
return bytesToHexStr(cipher.doFinal(src.getBytes())).toUpperCase();
|
||||||
|
} catch (Exception exception) {
|
||||||
|
SpiderDebug.log(exception);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String bytesToHexStr(byte[] bytes) {
|
||||||
|
StringBuilder hexStr = new StringBuilder();
|
||||||
|
for (byte b : bytes) {
|
||||||
|
String hex = Integer.toHexString(b & 0xFF);
|
||||||
|
if (hex.length() == 1) {
|
||||||
|
hex = '0' + hex;
|
||||||
|
}
|
||||||
|
hexStr.append(hex);
|
||||||
|
}
|
||||||
|
return hexStr.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,386 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Base64;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
import com.github.catvod.utils.CBC;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
/* loaded from: classes.dElements */
|
||||||
|
public class Bttwoo extends Spider {
|
||||||
|
private final String O = "{}";
|
||||||
|
private final Pattern G = Pattern.compile("https://www.bttwoo.com/(\\S+)");
|
||||||
|
private final Pattern n = Pattern.compile("https://www.bttwoo.com/movie/(\\d+).html");
|
||||||
|
private final Pattern Ur = Pattern.compile("https://www.bttwoo.com/v_play/(\\S+).html");
|
||||||
|
private final Pattern eA = Pattern.compile("https://www.bttwoo.com/\\S+/page/(\\d+)");
|
||||||
|
private final Pattern o = Pattern.compile("=\"(.*?)\";var");
|
||||||
|
private final Pattern F = Pattern.compile("parse\\(\"(.*?)\"\\);var iv");
|
||||||
|
private final Pattern Cp = Pattern.compile("iv=md5\\.enc\\.Utf8\\.parse\\((.*?)\\);var decrypted");
|
||||||
|
private final Pattern JC = Pattern.compile("url: \"(.*?)\"");
|
||||||
|
|
||||||
|
protected HashMap<String, String> header(String str) {
|
||||||
|
HashMap<String, String> hashMap = new HashMap<>();
|
||||||
|
hashMap.put("method", "GET");
|
||||||
|
if (!TextUtils.isEmpty(str)) {
|
||||||
|
hashMap.put("Referer", str);
|
||||||
|
}
|
||||||
|
hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
||||||
|
return hashMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String categoryContent(String str, String str2, boolean z, HashMap<String, String> hashMap) {
|
||||||
|
int i;
|
||||||
|
try {
|
||||||
|
String str3 = "https://www.bttwoo.com/" + str + "/page/" + str2;
|
||||||
|
String h = OkHttpUtil.string(str3, header(str3));
|
||||||
|
Document ue = Jsoup.parse(h);
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
Matcher matcher = this.eA.matcher(ue.select("div.pagenavi_txt > a.extend").attr("href"));
|
||||||
|
int i2 = 1;
|
||||||
|
int parseInt = matcher.find() ? Integer.parseInt(matcher.group(1).trim()) : 1;
|
||||||
|
|
||||||
|
Elements B1 = ue.select("div.pagenavi_txt > a ");
|
||||||
|
int i3 = 0;
|
||||||
|
if (B1.size() > 0) {
|
||||||
|
i = Integer.parseInt(str2);
|
||||||
|
for (int i4 = 0; i4 < B1.size(); i4++) {
|
||||||
|
Element O = B1.get(i4).selectFirst("a");
|
||||||
|
if (O != null) {
|
||||||
|
O.text().trim();
|
||||||
|
if (O.hasClass("current")) {
|
||||||
|
Matcher matcher2 = this.eA.matcher(O.attr("href"));
|
||||||
|
if (matcher2.find()) {
|
||||||
|
i = Integer.parseInt(matcher2.group(1).trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
i = 1;
|
||||||
|
// i = Integer.parseInt(str2);
|
||||||
|
}
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
if (!h.contains("没有找到您想要的结果哦")) {
|
||||||
|
Elements B12 = ue.select("div.bt_img > ul > li");
|
||||||
|
while (i3 < B12.size()) {
|
||||||
|
Element hq = B12.get(i3);
|
||||||
|
String pE = hq.selectFirst("h3.dytit > a").text();
|
||||||
|
String Pd = hq.selectFirst("a > img ").attr("data-original");
|
||||||
|
Element O2 = hq.selectFirst("div.jidi > span");
|
||||||
|
String pE2 = O2 != null ? O2.text() : "";
|
||||||
|
Matcher matcher3 = this.n.matcher(hq.selectFirst("h3.dytit > a").attr("href"));
|
||||||
|
if (matcher3.find()) {
|
||||||
|
String group = matcher3.group(i2);
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
jSONObject2.put("vod_id", group);
|
||||||
|
jSONObject2.put("vod_name", pE);
|
||||||
|
jSONObject2.put("vod_pic", Pd);
|
||||||
|
jSONObject2.put("vod_remarks", pE2);
|
||||||
|
jSONArray.put(jSONObject2);
|
||||||
|
}
|
||||||
|
i3++;
|
||||||
|
i2 = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("page: "+i);
|
||||||
|
jSONObject.put("page", i);
|
||||||
|
jSONObject.put("pagecount", parseInt);
|
||||||
|
jSONObject.put("limit", 25);
|
||||||
|
jSONObject.put("total", parseInt <= 1 ? jSONArray.length() : parseInt * 25);
|
||||||
|
jSONObject.put("list", jSONArray);
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String detailContent(List<String> list) {
|
||||||
|
String str ="";
|
||||||
|
Exception e;
|
||||||
|
Document ue = null;
|
||||||
|
JSONObject jSONObject = null;
|
||||||
|
String Pd = "";
|
||||||
|
String pE = "";
|
||||||
|
String pE2 ="";
|
||||||
|
Elements B1 = null;
|
||||||
|
String str2 =" ";
|
||||||
|
String str3 = "";
|
||||||
|
String str4 = "";
|
||||||
|
String str5 = "";
|
||||||
|
String str6 = "";
|
||||||
|
String str7 = "";
|
||||||
|
int i = 0;
|
||||||
|
Element hq = null;
|
||||||
|
String str8;
|
||||||
|
String str9 = "$$$";
|
||||||
|
String str10 = "";
|
||||||
|
try {
|
||||||
|
String str11 = "https://www.bttwoo.com/movie/" + list.get(0) + ".html";
|
||||||
|
ue = Jsoup.parse(OkHttpUtil.string(str11, header(str11)));
|
||||||
|
jSONObject = new JSONObject();
|
||||||
|
Pd = ue.selectFirst("div.dyimg > img").attr("src");
|
||||||
|
pE = ue.selectFirst("div.moviedteail_tt > h1").text();
|
||||||
|
pE2 = Jsoup.parse(ue.selectFirst("meta[name=description]").attr("content")).text();
|
||||||
|
B1 = ue.select("ul.moviedteail_list > li");
|
||||||
|
str2 = str10;
|
||||||
|
str3 = str2;
|
||||||
|
str4 = str3;
|
||||||
|
str5 = str4;
|
||||||
|
str6 = str5;
|
||||||
|
str7 = str6;
|
||||||
|
// i = 0;
|
||||||
|
} catch (Exception e2) {
|
||||||
|
e = e2;
|
||||||
|
str = str10;
|
||||||
|
return "1111";
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
str = str10;
|
||||||
|
if (i >= B1.size()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Element hq2 = B1.get(i);
|
||||||
|
Elements exVar = B1;
|
||||||
|
String pE3 = hq2.text();
|
||||||
|
JSONObject jSONObject3 = jSONObject;
|
||||||
|
if (pE3.contains("类型:")) {
|
||||||
|
str2 = hq2.text();
|
||||||
|
} else if (pE3.contains("年份:")) {
|
||||||
|
str3 = hq2.text();
|
||||||
|
} else if (pE3.contains("地区:")) {
|
||||||
|
str4 = hq2.text();
|
||||||
|
} else if (pE3.contains("上映:")) {
|
||||||
|
str5 = hq2.text();
|
||||||
|
} else {
|
||||||
|
str8 = str9;
|
||||||
|
if (pE3.contains("导演:")) {
|
||||||
|
ArrayList arrayList = new ArrayList();
|
||||||
|
Elements B12 = hq2.select("a");
|
||||||
|
for (int i2 = 0; i2 < B12.size(); i2++) {
|
||||||
|
arrayList.add(B12.get(i2).text());
|
||||||
|
}
|
||||||
|
str7 = TextUtils.join(",", arrayList);
|
||||||
|
} else if (pE3.contains("主演:")) {
|
||||||
|
ArrayList arrayList2 = new ArrayList();
|
||||||
|
Elements B13 = hq2.select("a");
|
||||||
|
for (int i3 = 0; i3 < B13.size(); i3++) {
|
||||||
|
arrayList2.add(B13.get(i3).text());
|
||||||
|
}
|
||||||
|
str6 = TextUtils.join(",", arrayList2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
str8 = str9;
|
||||||
|
i++;
|
||||||
|
str10 = str;
|
||||||
|
B1 = exVar;
|
||||||
|
jSONObject = jSONObject3;
|
||||||
|
str9 = str8;
|
||||||
|
} catch (Exception e3) {
|
||||||
|
e = e3;
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String str12 = str9;
|
||||||
|
JSONObject jSONObject4 = jSONObject;
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
try{
|
||||||
|
jSONObject2.put("vod_id", list.get(0));
|
||||||
|
jSONObject2.put("vod_name", pE);
|
||||||
|
jSONObject2.put("vod_pic", Pd);
|
||||||
|
jSONObject2.put("type_name", str2);
|
||||||
|
jSONObject2.put("vod_year", str3);
|
||||||
|
jSONObject2.put("vod_area", str4);
|
||||||
|
jSONObject2.put("vod_remarks", str5);
|
||||||
|
jSONObject2.put("vod_actor", str6);
|
||||||
|
jSONObject2.put("vod_director", str7);
|
||||||
|
jSONObject2.put("vod_content", pE2);
|
||||||
|
TreeMap treeMap = new TreeMap();
|
||||||
|
Elements B14 = ue.select("div.mi_paly_box > div > div.ypxingq_t");
|
||||||
|
Elements B15 = ue.select("div.paly_list_btn");
|
||||||
|
|
||||||
|
for (int i4 = 0; i4 < B14.size(); i4++) {
|
||||||
|
String pE4 = B14.get(i4).text();
|
||||||
|
Elements B16 = B15.get(i4).select("a");
|
||||||
|
ArrayList arrayList3 = new ArrayList();
|
||||||
|
for (int i5 = 0; i5 < B16.size(); i5++) {
|
||||||
|
String name = B16.get(i5).text();
|
||||||
|
Matcher matcher = this.Ur.matcher(B16.get(i5).attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
arrayList3.add(name + "$" + matcher.group(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String join = arrayList3.size() > 0 ? TextUtils.join("#", arrayList3) : str;
|
||||||
|
if (join.length() != 0) {
|
||||||
|
treeMap.put(pE4, join);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (treeMap.size() > 0) {
|
||||||
|
String join2 = TextUtils.join(str12, treeMap.keySet());
|
||||||
|
String join3 = TextUtils.join(str12, treeMap.values());
|
||||||
|
jSONObject2.put("vod_play_from", join2);
|
||||||
|
jSONObject2.put("vod_play_url", join3);
|
||||||
|
}
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
jSONArray.put(jSONObject2);
|
||||||
|
jSONObject4.put("list", jSONArray);
|
||||||
|
|
||||||
|
}catch (Exception e4){
|
||||||
|
SpiderDebug.log(e4);
|
||||||
|
}
|
||||||
|
|
||||||
|
return jSONObject4.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String homeContent(boolean z) {
|
||||||
|
int i;
|
||||||
|
try {
|
||||||
|
Document ue = Jsoup.parse(OkHttpUtil.string("https://www.bttwoo.com/", header("https://www.bttwoo.com")));
|
||||||
|
Elements B1 = ue.select("ul.navlist > li > a");
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
Iterator<Element> it = B1.iterator();
|
||||||
|
while (true) {
|
||||||
|
i = 0;
|
||||||
|
if (!it.hasNext()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Element next = it.next();
|
||||||
|
String pE = next.text();
|
||||||
|
if (pE.equals("最新电影")) {
|
||||||
|
pE = "最新";
|
||||||
|
}
|
||||||
|
if (pE.equals("热门下载")) {
|
||||||
|
pE = "热门放映";
|
||||||
|
}
|
||||||
|
if (pE.equals("最新") || pE.equals("本月热门") || pE.equals("热门放映") || pE.equals("国产剧") || pE.equals("日韩剧") || pE.equals("美剧")) {
|
||||||
|
i = 1;
|
||||||
|
}
|
||||||
|
if (i != 0) {
|
||||||
|
Matcher matcher = this.G.matcher(next.attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
String trim = matcher.group(1).trim();
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
jSONObject.put("type_id", trim);
|
||||||
|
jSONObject.put("type_name", pE);
|
||||||
|
jSONArray.put(jSONObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
if (z) {
|
||||||
|
jSONObject2.put("filters", new JSONObject("{}"));
|
||||||
|
}
|
||||||
|
jSONObject2.put("class", jSONArray);
|
||||||
|
try {
|
||||||
|
Elements B12 = ue.select("div.leibox > ul > li ");
|
||||||
|
JSONArray jSONArray2 = new JSONArray();
|
||||||
|
while (i < B12.size()) {
|
||||||
|
Element hq = B12.get(i);
|
||||||
|
String pE2 = hq.selectFirst("h3.dytit > a").text();
|
||||||
|
String Pd = hq.selectFirst("a > img").attr("data-original");
|
||||||
|
Element O = hq.selectFirst("div.jidi > span ");
|
||||||
|
String pE3 = O != null ? O.text() : "";
|
||||||
|
Matcher matcher2 = this.n.matcher(hq.selectFirst("h3.dytit > a").attr("href"));
|
||||||
|
if (matcher2.find()) {
|
||||||
|
String group = matcher2.group(1);
|
||||||
|
JSONObject jSONObject3 = new JSONObject();
|
||||||
|
jSONObject3.put("vod_id", group);
|
||||||
|
jSONObject3.put("vod_name", pE2);
|
||||||
|
jSONObject3.put("vod_pic", Pd);
|
||||||
|
jSONObject3.put("vod_remarks", pE3);
|
||||||
|
jSONArray2.put(jSONObject3);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
jSONObject2.put("list", jSONArray2);
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return jSONObject2.toString();
|
||||||
|
} catch (Exception e2) {
|
||||||
|
SpiderDebug.log(e2);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String playerContent(String str, String str2, List<String> list) {
|
||||||
|
try {
|
||||||
|
String str3 = "https://www.bttwoo.com/v_play/" + str2 + ".html";
|
||||||
|
Document ue = Jsoup.parse(OkHttpUtil.string(str3, header(str3)));
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
Matcher matcher = this.o.matcher(ue.toString());
|
||||||
|
Matcher matcher2 = this.F.matcher(ue.toString());
|
||||||
|
Matcher matcher3 = this.Cp.matcher(ue.toString());
|
||||||
|
if (matcher.find() && matcher2.find() && matcher3.find()) {
|
||||||
|
// Matcher matcher4 = this.JC.matcher(AES.decryptToString(Base64.decode(matcher.group(1), 0), matcher2.group(1).getBytes(), matcher3.group(1).getBytes(),AES.AES_CBC_PKCS7Padding));
|
||||||
|
Matcher matcher4 = this.JC.matcher(CBC.DECRYPT(Base64.decode(matcher.group(1), 0), matcher2.group(1).getBytes(), matcher3.group(1).getBytes()));
|
||||||
|
if (matcher4.find()) {
|
||||||
|
String group = matcher4.group(1);
|
||||||
|
HashMap hashMap = new HashMap();
|
||||||
|
hashMap.put("User-Agent", " Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36");
|
||||||
|
jSONObject.put("url", group);
|
||||||
|
jSONObject.put("header", new JSONObject(hashMap).toString());
|
||||||
|
jSONObject.put("parse", "0");
|
||||||
|
jSONObject.put("palyUrl", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String searchContent(String str, boolean z) {
|
||||||
|
if (z) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
String str2 = "https://www.bttwoo.com/xssearch?q=" + URLEncoder.encode(str) + "&f=_all&p=1";
|
||||||
|
Document ue = Jsoup.parse(OkHttpUtil.string(str2, header(str2)));
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
Elements B1 = ue.select("div.mi_ne_kd > ul > li");
|
||||||
|
for (int i = 0; i < B1.size(); i++) {
|
||||||
|
Element hq = B1.get(i);
|
||||||
|
String trim = hq.selectFirst("img").attr("alt").trim();
|
||||||
|
String Pd = hq.selectFirst("img ").attr("data-original");
|
||||||
|
Element O = hq.selectFirst("div.jidi > span");
|
||||||
|
String pE = O != null ? O.text() : "";
|
||||||
|
Matcher matcher = this.n.matcher(hq.selectFirst("a").attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
String group = matcher.group(1);
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
jSONObject2.put("vod_id", group);
|
||||||
|
jSONObject2.put("vod_name", trim);
|
||||||
|
jSONObject2.put("vod_pic", Pd);
|
||||||
|
jSONObject2.put("vod_remarks", pE);
|
||||||
|
jSONArray.put(jSONObject2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jSONObject.put("list", jSONArray);
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,479 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
import com.github.catvod.utils.AES;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static com.github.catvod.utils.AES.AES_CBC_PKCS7Padding;
|
||||||
|
import static com.github.catvod.utils.AES.decryptToString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 双十电影
|
||||||
|
* <p>
|
||||||
|
* Author: 忍一忍我很大
|
||||||
|
*/
|
||||||
|
public class Dy1010 extends Spider {
|
||||||
|
private static final String siteUrl = "http://www.1010dy1.com";
|
||||||
|
private static final String siteHost = "www.1010dy1.com";
|
||||||
|
/**
|
||||||
|
* 播放源配置
|
||||||
|
*/
|
||||||
|
private JSONObject playerConfig;
|
||||||
|
/**
|
||||||
|
* 筛选配置
|
||||||
|
*/
|
||||||
|
private JSONObject filterConfig;
|
||||||
|
|
||||||
|
private Pattern regexCategory = Pattern.compile("/type/(\\w+)/");
|
||||||
|
private Pattern regexVid = Pattern.compile("/detail/(\\w+)/");
|
||||||
|
private Pattern regexPlay = Pattern.compile("/play/(\\w+)-(\\d+)-(\\d+)/");
|
||||||
|
private Pattern regexPage = Pattern.compile("/show/\\d+/page/(\\d+)/");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(Context context) {
|
||||||
|
super.init(context);
|
||||||
|
try {
|
||||||
|
playerConfig = new JSONObject("{\"xg_app_player\":{\"show\":\"app全局解析\",\"or\":999,\"ps\":\"1\",\"parse\":\"\"},\"duoduozy\":{\"show\":\"多多云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"renrenmi\":{\"show\":\"快速云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"xigua\":{\"show\":\"西瓜云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"mgtv\":{\"show\":\"芒果云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"qq\":{\"show\":\"腾讯云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"youku\":{\"show\":\"优酷云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"qiyi\":{\"show\":\"爱奇艺\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"pptv\":{\"show\":\"PPTV\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"letv\":{\"show\":\"乐视云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"sohu\":{\"show\":\"搜狐云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"bilibili\":{\"show\":\"哔哩云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"dbm3u8\":{\"show\":\"百度云\",\"des\":\"在线播放\",\"ps\":\"0\",\"parse\":\"\"},\"tkm3u8\":{\"show\":\"天空云\",\"des\":\"天空播放器\",\"ps\":\"0\",\"parse\":\"\"},\"dplayer\":{\"show\":\"DPlayer-H5播放器\",\"des\":\"dplayer.js.org\",\"ps\":\"0\",\"parse\":\"\"},\"videojs\":{\"show\":\"videojs-H5播放器\",\"des\":\"videojs.com\",\"ps\":\"0\",\"parse\":\"\"},\"iva\":{\"show\":\"iva-H5播放器\",\"des\":\"videojj.com\",\"ps\":\"0\",\"parse\":\"\"},\"iframe\":{\"show\":\"iframe外链数据\",\"des\":\"iframe外链数据\",\"ps\":\"0\",\"parse\":\"\"},\"link\":{\"show\":\"外链数据\",\"des\":\"外部网站播放链接\",\"ps\":\"0\",\"parse\":\"\"},\"swf\":{\"show\":\"Flash文件\",\"des\":\"swf\",\"ps\":\"0\",\"parse\":\"\"},\"flv\":{\"show\":\"Flv文件\",\"des\":\"flv\",\"ps\":\"0\",\"parse\":\"\"},\"bdxm3u8\":{\"show\":\"北斗云\",\"des\":\"在线播放\",\"ps\":\"0\",\"parse\":\"\"},\"lym3u8\":{\"show\":\"老鸭资源\",\"des\":\"在线播放\",\"ps\":\"0\",\"parse\":\"\"},\"aliplayer\":{\"show\":\"阿里云播放器\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"hnm3u8\":{\"show\":\"红牛云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"kbm3u8\":{\"show\":\"快播云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"wjm3u8\":{\"show\":\"无尽备用\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"}}");
|
||||||
|
filterConfig = new JSONObject("{\"1\":[{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"灾难\",\"v\":\"灾难\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"冒险\",\"v\":\"冒险\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2000\",\"v\":\"2000\"},{\"n\":\"1997\",\"v\":\"1997\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"海外\",\"v\":\"海外\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"网剧\",\"v\":\"网剧\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"1997\",\"v\":\"1997\"},{\"n\":\"1980\",\"v\":\"1980\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
|
||||||
|
} catch (JSONException e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 爬虫headers
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected HashMap<String, String> getHeaders(String url) {
|
||||||
|
HashMap<String, String> headers = new HashMap<>();
|
||||||
|
headers.put("Referer", "http://www.1010dy1.com/");
|
||||||
|
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.169.400 QQBrowser/11.0.5130.400");
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分类数据 + 首页最近更新视频列表数据
|
||||||
|
*
|
||||||
|
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
|
||||||
|
// 分类节点
|
||||||
|
Elements elements = doc.select("ul.stui-header__menu > li > a");
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
for (Element ele : elements) {
|
||||||
|
String name = ele.text();
|
||||||
|
Matcher mather = regexCategory.matcher(ele.attr("href"));
|
||||||
|
if (!mather.find())
|
||||||
|
continue;
|
||||||
|
String id = mather.group(1).trim();
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
jsonObject.put("type_id", id);
|
||||||
|
jsonObject.put("type_name", name);
|
||||||
|
classes.put(jsonObject);
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
if (filter) {
|
||||||
|
result.put("filters", filterConfig);
|
||||||
|
}
|
||||||
|
result.put("class", classes);
|
||||||
|
try {
|
||||||
|
// 取首页推荐视频列表
|
||||||
|
Elements list = doc.select("div.stui-pannel_bd:nth-child(1) ul.stui-vodlist li div.stui-vodlist__box");
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
Element vod = list.get(i);
|
||||||
|
Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href"));
|
||||||
|
if (!matcher.find())
|
||||||
|
continue;
|
||||||
|
String title = vod.selectFirst(".stui-vodlist__thumb").attr("title");
|
||||||
|
String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original");
|
||||||
|
String remark = vod.selectFirst("span.pic-text").text();
|
||||||
|
String id = matcher.group(1);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", remark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
result.put("list", videos);
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分类信息数据
|
||||||
|
*
|
||||||
|
* @param tid 分类id
|
||||||
|
* @param pg 页数
|
||||||
|
* @param filter 同homeContent方法中的filter
|
||||||
|
* @param extend 筛选参数{k:v, k1:v1}
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/show/";
|
||||||
|
if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
|
||||||
|
url += extend.get("tid");
|
||||||
|
} else {
|
||||||
|
url += tid;
|
||||||
|
}
|
||||||
|
if (extend != null && extend.size() > 0) {
|
||||||
|
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
|
||||||
|
String key = it.next();
|
||||||
|
String value = extend.get(key);
|
||||||
|
if (value.length() > 0) {
|
||||||
|
url += "/" + key + "/" + URLEncoder.encode(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
url += "/page/" + pg + "/";
|
||||||
|
// 获取分类数据的url
|
||||||
|
//String url = siteUrl + "/show/" + tid + "/page/" + pg + "/";
|
||||||
|
String html = OkHttpUtil.string(url, getHeaders(url));
|
||||||
|
Document doc = Jsoup.parse(html);
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
int pageCount = 0;
|
||||||
|
int page = -1;
|
||||||
|
// 取页码相关信息
|
||||||
|
Elements pageInfo = doc.select(".stui-page li");
|
||||||
|
if (pageInfo.size() == 0) {
|
||||||
|
page = Integer.parseInt(pg);
|
||||||
|
pageCount = page;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < pageInfo.size(); i++) {
|
||||||
|
Element li = pageInfo.get(i);
|
||||||
|
Element a = li.selectFirst("a");
|
||||||
|
if (a == null)
|
||||||
|
continue;
|
||||||
|
String name = a.text();
|
||||||
|
if (page == -1 && li.hasClass("active")) {
|
||||||
|
Matcher matcher = regexPage.matcher(a.attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
page = Integer.parseInt(matcher.group(1));
|
||||||
|
} else {
|
||||||
|
page = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (name.equals("尾页")) {
|
||||||
|
Matcher matcher = regexPage.matcher(a.attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
pageCount = Integer.parseInt(matcher.group(1));
|
||||||
|
} else {
|
||||||
|
pageCount = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
if (!html.contains("没有找到您想要的结果哦")) {
|
||||||
|
Elements list = doc.select("ul.stui-vodlist li div.stui-vodlist__box");
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
Element vod = list.get(i);
|
||||||
|
String title = vod.selectFirst(".title").text();
|
||||||
|
String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original");
|
||||||
|
String remark = vod.selectFirst("span.pic-text").text();
|
||||||
|
Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href"));
|
||||||
|
if (!matcher.find())
|
||||||
|
continue;
|
||||||
|
String id = matcher.group(1);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", remark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.put("page", page);
|
||||||
|
result.put("pagecount", pageCount);
|
||||||
|
result.put("limit", 30);
|
||||||
|
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 30);
|
||||||
|
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 视频详情信息
|
||||||
|
*
|
||||||
|
* @param ids 视频id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
// 视频详情url
|
||||||
|
String url = siteUrl + "/detail/" + ids.get(0) + "/";
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONObject vodList = new JSONObject();
|
||||||
|
|
||||||
|
// 取基本数据
|
||||||
|
String cover = doc.selectFirst("a.stui-vodlist__thumb img").attr("data-original");
|
||||||
|
String title = doc.selectFirst("a.stui-vodlist__thumb").attr("title");
|
||||||
|
String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text();
|
||||||
|
String category = "", area = "", year = "", remark = "", director = "", actor = "";
|
||||||
|
Elements span_text_muted = doc.select("div.stui-content__detail span.text-muted");
|
||||||
|
for (int i = 0; i < span_text_muted.size(); i++) {
|
||||||
|
Element text = span_text_muted.get(i);
|
||||||
|
String info = text.text();
|
||||||
|
if (info.equals("类型:")) {
|
||||||
|
category = text.nextElementSibling().text();
|
||||||
|
} else if (info.equals("年份:")) {
|
||||||
|
year = text.nextElementSibling().text();
|
||||||
|
} else if (info.equals("地区:")) {
|
||||||
|
area = text.nextElementSibling().text();
|
||||||
|
} else if (info.equals("更新:")) {
|
||||||
|
remark = text.nextSibling().outerHtml().trim();
|
||||||
|
} else if (info.equals("导演:")) {
|
||||||
|
List<String> directors = new ArrayList<>();
|
||||||
|
Elements aa = text.parent().select("a");
|
||||||
|
for (int j = 0; j < aa.size(); j++) {
|
||||||
|
directors.add(aa.get(j).text());
|
||||||
|
}
|
||||||
|
director = TextUtils.join(",", directors);
|
||||||
|
} else if (info.equals("主演:")) {
|
||||||
|
List<String> actors = new ArrayList<>();
|
||||||
|
Elements aa = text.parent().select("a");
|
||||||
|
for (int j = 0; j < aa.size(); j++) {
|
||||||
|
actors.add(aa.get(j).text());
|
||||||
|
}
|
||||||
|
actor = TextUtils.join(",", actors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vodList.put("vod_id", ids.get(0));
|
||||||
|
vodList.put("vod_name", title);
|
||||||
|
vodList.put("vod_pic", cover);
|
||||||
|
vodList.put("type_name", category);
|
||||||
|
vodList.put("vod_year", year);
|
||||||
|
vodList.put("vod_area", area);
|
||||||
|
vodList.put("vod_remarks", remark);
|
||||||
|
vodList.put("vod_actor", actor);
|
||||||
|
vodList.put("vod_director", director);
|
||||||
|
vodList.put("vod_content", desc);
|
||||||
|
|
||||||
|
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
|
||||||
|
@Override
|
||||||
|
public int compare(String o1, String o2) {
|
||||||
|
try {
|
||||||
|
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
|
||||||
|
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
|
||||||
|
|
||||||
|
if (sort1 == sort2) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return sort1 - sort2 > 0 ? 1 : -1;
|
||||||
|
} catch (JSONException e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Elements sources = doc.select("div.playlist");
|
||||||
|
|
||||||
|
for (int i = 0; i < sources.size(); i++) {
|
||||||
|
Element source = sources.get(i);
|
||||||
|
String sourceName = source.selectFirst("h3.title").text().trim();
|
||||||
|
String tabHref = source.attr("href");
|
||||||
|
boolean found = false;
|
||||||
|
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
||||||
|
String flag = it.next();
|
||||||
|
if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) {
|
||||||
|
sourceName = playerConfig.getJSONObject(flag).getString("show");
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
continue;
|
||||||
|
String playList = "";
|
||||||
|
Elements playListA = source.select("ul.stui-content__playlist > li > a");
|
||||||
|
List<String> vodItems = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int j = 0; j < playListA.size(); j++) {
|
||||||
|
Element vod = playListA.get(j);
|
||||||
|
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
||||||
|
if (!matcher.find())
|
||||||
|
continue;
|
||||||
|
String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
|
||||||
|
vodItems.add(vod.text() + "$" + playURL);
|
||||||
|
}
|
||||||
|
if (vodItems.size() > 0)
|
||||||
|
playList = TextUtils.join("#", vodItems);
|
||||||
|
|
||||||
|
if (playList.length() == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
vod_play.put(sourceName, playList);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vod_play.size() > 0) {
|
||||||
|
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
||||||
|
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
||||||
|
vodList.put("vod_play_from", vod_play_from);
|
||||||
|
vodList.put("vod_play_url", vod_play_url);
|
||||||
|
}
|
||||||
|
JSONArray list = new JSONArray();
|
||||||
|
list.put(vodList);
|
||||||
|
result.put("list", list);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Pattern regexUrl = Pattern.compile("(?<=urls = \").+?(?=\";)");
|
||||||
|
/**
|
||||||
|
* 获取视频播放信息
|
||||||
|
*
|
||||||
|
* @param flag 播放源
|
||||||
|
* @param id 视频id
|
||||||
|
* @param vipFlags 所有可能需要vip解析的源
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String playerContent(String flag, String id, List<String> vipFlags) {
|
||||||
|
try {
|
||||||
|
JSONObject headers = new JSONObject();
|
||||||
|
headers.put("Origin", " https://dp.1010dy.cc");
|
||||||
|
//headers.put("Referer", " http://www.1010dy1.com/");
|
||||||
|
//headers.put("Icy-MetaData", "1");
|
||||||
|
//headers.put("scheme", " https");
|
||||||
|
headers.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36");
|
||||||
|
headers.put("Accept", " */*");
|
||||||
|
//headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6");
|
||||||
|
//headers.put("Accept-Encoding", " gzip, deflate");
|
||||||
|
headers.put("Connection", " close");
|
||||||
|
// 播放页 url
|
||||||
|
String url = siteUrl + "/play/" + id + "/";
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
|
||||||
|
Elements allScript = doc.select("script");
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
for (int i = 0; i < allScript.size(); i++) {
|
||||||
|
String scContent = allScript.get(i).html().trim();
|
||||||
|
if (scContent.startsWith("var player_")) {
|
||||||
|
int start = scContent.indexOf('{');
|
||||||
|
int end = scContent.lastIndexOf('}') + 1;
|
||||||
|
String json = scContent.substring(start, end);
|
||||||
|
JSONObject player = new JSONObject(json);
|
||||||
|
if (playerConfig.has(player.getString("from"))) {
|
||||||
|
HashMap<String, String> hashMap = new HashMap<>();
|
||||||
|
hashMap.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36");
|
||||||
|
hashMap.put("Referer", url);
|
||||||
|
String jxurl = "https://dp.1010dy.cc/?url=" + player.getString("url")+"&next="+player.getString("link_next")+"&id="+player.getString("id")+"&nid="+player.getString("nid")+"&from="+player.getString("from");
|
||||||
|
String doc1 = OkHttpUtil.string(jxurl, hashMap);
|
||||||
|
Matcher matcher = regexUrl.matcher(doc1);
|
||||||
|
if (!matcher.find()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String data = matcher.group(0);
|
||||||
|
byte[] decode = Base64.decode(data, Base64.DEFAULT);
|
||||||
|
String iv = "c487ebl2e38a0faO";
|
||||||
|
String key = "Of84ff0clf252cba";
|
||||||
|
String directUrl = decryptToString(decode, key.getBytes(), iv.getBytes(),AES_CBC_PKCS7Padding);
|
||||||
|
if (player.getString("from").equals("duoduozy")) {
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
result.put("url", directUrl);
|
||||||
|
result.put("header", headers.toString());
|
||||||
|
} else {
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
result.put("url", directUrl);
|
||||||
|
result.put("header", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 搜索
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* @param quick 是否播放页的快捷搜索
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
try {
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime;
|
||||||
|
JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
if (searchResult.getInt("total") > 0) {
|
||||||
|
JSONArray lists = new JSONArray(searchResult.getString("list"));
|
||||||
|
for (int i = 0; i < lists.length(); i++) {
|
||||||
|
JSONObject vod = lists.getJSONObject(i);
|
||||||
|
String id = vod.getString("id");
|
||||||
|
String title = vod.getString("name");
|
||||||
|
String cover = vod.getString("pic");
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", "");
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,296 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
|
import android.content.Context;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
import com.github.catvod.utils.CBC;
|
||||||
|
import com.github.catvod.utils.okhttp.OKCallBack;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import okhttp3.Call;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
|
||||||
|
public class Jianying extends Spider {
|
||||||
|
public static String token;
|
||||||
|
|
||||||
|
|
||||||
|
public void init(Context context, String str) {
|
||||||
|
super.init(context, str);
|
||||||
|
token = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
private HashMap<String, String> getHeaders(String url) {
|
||||||
|
HashMap<String, String> headers = new HashMap<>();
|
||||||
|
headers.put("accept", "application/json, text/plain, */*");
|
||||||
|
headers.put("accept-encoding", "gzip, deflate, br");
|
||||||
|
headers.put("connection", "keep-alive");
|
||||||
|
headers.put("Authorization", token);
|
||||||
|
headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
String url = "https://admin.syrme.top/v1/api/video/index";
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jSONObject.toString(), getHeaders(url), new OKCallBack.OKCallBackString() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Call call, Exception exc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResponse(String str) {
|
||||||
|
try {
|
||||||
|
JSONArray list = new JSONObject(str).getJSONArray("data");
|
||||||
|
for (int i = 0; i < list.length(); i++) {
|
||||||
|
JSONObject vObj = list.getJSONObject(i);
|
||||||
|
String name = vObj.getString("title");
|
||||||
|
if (!name.equals("轮播")) {
|
||||||
|
String id = vObj.getString("title");
|
||||||
|
JSONObject newCls = new JSONObject();
|
||||||
|
newCls.put("type_id", id);
|
||||||
|
newCls.put("type_name", name);
|
||||||
|
classes.put(newCls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (JSONException unused) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("class", classes);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String homeVideoContent() {
|
||||||
|
try {
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
String url = "https://admin.syrme.top/v1/api/video/index";
|
||||||
|
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jSONObject.toString(), getHeaders(url), new OKCallBack.OKCallBackString() {
|
||||||
|
@Override
|
||||||
|
public void onFailure(Call call, Exception exc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResponse(String str) {
|
||||||
|
try {
|
||||||
|
JSONArray jsonArray = new JSONObject(str).getJSONArray("data");
|
||||||
|
JSONArray list = jsonArray.getJSONObject(1).getJSONArray("video_list");
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject vObj = list.getJSONObject(i);
|
||||||
|
String id = vObj.getString("ID");
|
||||||
|
String title = vObj.getString("title");
|
||||||
|
String cover = vObj.getString("image");
|
||||||
|
String mark = vObj.getString("score");
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", mark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
} catch (JSONException unused) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
||||||
|
try {
|
||||||
|
int parseInt = Integer.parseInt(pg);
|
||||||
|
if (parseInt == 0) {
|
||||||
|
parseInt = 1;
|
||||||
|
}
|
||||||
|
String url = "https://admin.syrme.top/v1/api/video/search?q=" + tid + "&page=" + pg + "&size=" + 24;
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
JSONArray list = new JSONArray();
|
||||||
|
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jSONObject.toString(), getHeaders(url), new OKCallBack.OKCallBackString() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Call call, Exception exc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResponse(String str4) {
|
||||||
|
try {
|
||||||
|
JSONArray data = new JSONObject(str4).getJSONArray("data");
|
||||||
|
for (int i = 0; i < data.length(); i++) {
|
||||||
|
JSONObject vObj = data.getJSONObject(i);
|
||||||
|
JSONObject vodAtom = new JSONObject();
|
||||||
|
vodAtom.put("vod_id", vObj.getString("ID"));
|
||||||
|
vodAtom.put("vod_name", vObj.getString("title"));
|
||||||
|
vodAtom.put("vod_pic", vObj.optString("image"));
|
||||||
|
String mark = vObj.optString("score");
|
||||||
|
if (mark.equals("null")) {
|
||||||
|
mark = "";
|
||||||
|
}
|
||||||
|
vodAtom.put("vod_remarks", mark);
|
||||||
|
list.put(vodAtom);
|
||||||
|
}
|
||||||
|
} catch (JSONException unused) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("page", parseInt);
|
||||||
|
if (list.length() == 24) {
|
||||||
|
parseInt++;
|
||||||
|
}
|
||||||
|
result.put("pagecount", parseInt);
|
||||||
|
result.put("limit", 24);
|
||||||
|
result.put("total", Integer.MAX_VALUE);
|
||||||
|
result.put("list", list);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
String url = "https://admin.syrme.top/v1/api/video/id?id=" + ids.get(0);
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
JSONObject vodAtom = new JSONObject();
|
||||||
|
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jSONObject.toString(), getHeaders(url), new OKCallBack.OKCallBackString() {
|
||||||
|
@Override
|
||||||
|
public void onFailure(Call call, Exception exc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResponse(String str) {
|
||||||
|
try {
|
||||||
|
JSONObject vObj = new JSONObject(str).getJSONObject("data");
|
||||||
|
vodAtom.put("vod_id", vObj.getString("ID"));
|
||||||
|
vodAtom.put("vod_name", vObj.getString("title"));
|
||||||
|
vodAtom.put("vod_pic", vObj.getString("image"));
|
||||||
|
vodAtom.put("type_name", vObj.getString("video_type"));
|
||||||
|
vodAtom.put("vod_year", vObj.getString("year"));
|
||||||
|
vodAtom.put("vod_area", vObj.getString("video_tags"));
|
||||||
|
String optString = vObj.optString("score");
|
||||||
|
String des = "";
|
||||||
|
if (optString.equals("null")) {
|
||||||
|
optString = des;
|
||||||
|
}
|
||||||
|
vodAtom.put("vod_remarks", optString);
|
||||||
|
vodAtom.put("vod_actor", vObj.getString("authors"));
|
||||||
|
vodAtom.put("vod_director", vObj.getString("director"));
|
||||||
|
String optString2 = vObj.optString("content");
|
||||||
|
if (!optString2.equals("null")) {
|
||||||
|
des = optString2;
|
||||||
|
}
|
||||||
|
vodAtom.put("vod_content", des);
|
||||||
|
vodAtom.put("vod_play_from", "简影");
|
||||||
|
vodAtom.put("vod_play_url", vObj.optString("url_content").replace("\n", "#"));
|
||||||
|
} catch (JSONException unused) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONArray list = new JSONArray();
|
||||||
|
list.put(vodAtom);
|
||||||
|
result.put("list", list);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(26)
|
||||||
|
public String playerContent(String flag, String id, List<String> vipFlags) {
|
||||||
|
try {
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
String time = LocalDateTime.now(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")).replace("-", "丨");
|
||||||
|
String key = "ba0-1024-11eb-ad";
|
||||||
|
String enData = CBC.hexs(time, key, key);
|
||||||
|
String basic = "";
|
||||||
|
int i = 0;
|
||||||
|
while (i < enData.length()) {
|
||||||
|
int i2 = i + 8;
|
||||||
|
basic = basic + enData.substring(i, i2) + "-";
|
||||||
|
i = i2;
|
||||||
|
}
|
||||||
|
String sid = basic.substring(0, basic.length() - 1);
|
||||||
|
JSONObject headers = new JSONObject();
|
||||||
|
headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
||||||
|
headers.put("Accept", " */*");
|
||||||
|
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
|
||||||
|
headers.put("Accept-Encoding", " gzip, deflate");
|
||||||
|
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("url", id + "?sid=" + sid);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
result.put("header", headers.toString());
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String searchContent(String str, boolean quick) {
|
||||||
|
if (quick) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
try {
|
||||||
|
String url = "https://admin.syrme.top/v1/api/video/search?q=" + str + "&page=1&size=24";
|
||||||
|
OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, new JSONObject().toString(), getHeaders(url), new OKCallBack.OKCallBackString() {
|
||||||
|
@Override
|
||||||
|
public void onFailure(Call call, Exception exc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResponse(String str3) {
|
||||||
|
try {
|
||||||
|
JSONArray jsonArray = new JSONObject(str3).getJSONArray("data");
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject vObj = jsonArray.getJSONObject(i);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", vObj.getString("ID"));
|
||||||
|
v.put("vod_name", vObj.getString("title"));
|
||||||
|
v.put("vod_pic", vObj.optString("image"));
|
||||||
|
String mark = vObj.optString("score");
|
||||||
|
if (mark.equals("null")) {
|
||||||
|
mark = "";
|
||||||
|
}
|
||||||
|
v.put("vod_remarks", mark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
} catch (JSONException unused) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Exception unused) {
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,326 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
public class Nianying extends Spider {
|
||||||
|
|
||||||
|
private static String host = "http://cms111.nbhut.com/api.php/Chengcheng/vod";
|
||||||
|
|
||||||
|
public HashMap<String, String> headers() {
|
||||||
|
HashMap<String, String> hashMap = new HashMap<>();
|
||||||
|
hashMap.put("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 11; M2105K81AC Build/RKQ1.200826.002)");
|
||||||
|
return hashMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(Context context) {
|
||||||
|
super.init(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(Context context, String extend) {
|
||||||
|
super.init(context, extend);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
|
||||||
|
linkedHashMap.put("movie", "电影");
|
||||||
|
linkedHashMap.put("tvplay", "剧集");
|
||||||
|
linkedHashMap.put("comic", "动漫");
|
||||||
|
linkedHashMap.put("tvshow", "综艺");
|
||||||
|
for (String str : linkedHashMap.keySet()) {
|
||||||
|
JSONObject item = new JSONObject();
|
||||||
|
item.put("type_id", str);
|
||||||
|
item.put("type_name", linkedHashMap.get(str));
|
||||||
|
classes.put(item);
|
||||||
|
}
|
||||||
|
result.put("class", classes);
|
||||||
|
|
||||||
|
if (filter) {
|
||||||
|
JSONObject filterBox = new JSONObject();
|
||||||
|
result.put("filters", filterBox);
|
||||||
|
String json = OkHttpUtil.string(host + "/?ac=flitter", headers());
|
||||||
|
JSONObject sourceData = new JSONObject(decrypt(json));
|
||||||
|
for (String tid : linkedHashMap.keySet()) {
|
||||||
|
JSONArray filterArr = new JSONArray();
|
||||||
|
filterBox.put(tid, filterArr);
|
||||||
|
JSONArray typeJSON = sourceData.optJSONArray(tid);
|
||||||
|
for (int j = 0; j < typeJSON.length(); j++) {
|
||||||
|
JSONObject item = typeJSON.optJSONObject(j);
|
||||||
|
String itemName = item.optString("name");
|
||||||
|
String itemField = item.optString("field");
|
||||||
|
JSONArray itemValues = item.optJSONArray("values");
|
||||||
|
JSONObject jOne = new JSONObject();
|
||||||
|
jOne.put("key", itemField);
|
||||||
|
jOne.put("name", itemName);
|
||||||
|
filterArr.put(jOne);
|
||||||
|
JSONArray values = new JSONArray();
|
||||||
|
jOne.put("value", values);
|
||||||
|
|
||||||
|
JSONObject all = new JSONObject();
|
||||||
|
all.put("n", "全部");
|
||||||
|
all.put("v", "");
|
||||||
|
values.put(all);
|
||||||
|
for (int k = 0; k < itemValues.length(); k++) {
|
||||||
|
String k1 = itemValues.optString(k);
|
||||||
|
JSONObject kvo = new JSONObject();
|
||||||
|
kvo.put("n", k1);
|
||||||
|
kvo.put("v", k1);
|
||||||
|
values.put(kvo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String decrypt(String data) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeVideoContent() {
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
try {
|
||||||
|
String url = host + "/?ac=list&class=tvplay&page=1";
|
||||||
|
String encodeData = OkHttpUtil.string(url, headers());
|
||||||
|
JSONObject json = new JSONObject(decrypt(encodeData));
|
||||||
|
JSONArray data = json.optJSONArray("data");
|
||||||
|
JSONArray list = new JSONArray();
|
||||||
|
for (int i = 0; i < data.length(); i++) {
|
||||||
|
JSONObject item = data.getJSONObject(i);
|
||||||
|
JSONObject vod = new JSONObject();
|
||||||
|
String nextlink = item.getString("nextlink");
|
||||||
|
String vod_id = nextlink.substring(nextlink.indexOf("ids=") + 4);
|
||||||
|
vod.put("vod_id", vod_id);
|
||||||
|
vod.put("vod_name", item.getString("title"));
|
||||||
|
vod.put("vod_pic", item.getString("pic"));
|
||||||
|
vod.put("vod_remarks", item.getString("state"));
|
||||||
|
list.put(vod);
|
||||||
|
}
|
||||||
|
result.put("list", list);
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
try {
|
||||||
|
String url = host + "/";
|
||||||
|
Map<String, String> params = new HashMap<>();
|
||||||
|
if (extend != null) {
|
||||||
|
params.putAll(extend);
|
||||||
|
}
|
||||||
|
params.put("class", tid);
|
||||||
|
params.put("page", pg);
|
||||||
|
params.put("ac", "list");
|
||||||
|
|
||||||
|
List<String> ps = new LinkedList<>();
|
||||||
|
for (Map.Entry<String, String> entry : params.entrySet()) {
|
||||||
|
ps.add(entry.getKey() + "=" + entry.getValue());
|
||||||
|
}
|
||||||
|
url = url + "?" + TextUtils.join("&", ps);
|
||||||
|
String encodeData = OkHttpUtil.string(url, headers());
|
||||||
|
JSONObject json = new JSONObject(decrypt(encodeData));
|
||||||
|
JSONArray list = json.optJSONArray("data");
|
||||||
|
JSONArray vods = new JSONArray();
|
||||||
|
for (int i = 0; i < list.length(); i++) {
|
||||||
|
JSONObject item = list.getJSONObject(i);
|
||||||
|
JSONObject vod = new JSONObject();
|
||||||
|
String nextlink = item.getString("nextlink");
|
||||||
|
String vod_id = nextlink.substring(nextlink.indexOf("ids=") + 4);
|
||||||
|
vod.put("vod_id", vod_id);
|
||||||
|
vod.put("vod_name", item.getString("title"));
|
||||||
|
vod.put("vod_pic", item.getString("pic"));
|
||||||
|
vod.put("vod_remarks", item.getString("state"));
|
||||||
|
vods.put(vod);
|
||||||
|
}
|
||||||
|
int parseInt = Integer.parseInt(pg);
|
||||||
|
result.put("page", parseInt);
|
||||||
|
if (vods.length() == 20) {
|
||||||
|
parseInt++;
|
||||||
|
}
|
||||||
|
result.put("pagecount", parseInt);
|
||||||
|
result.put("limit", 20);
|
||||||
|
result.put("total", Integer.MAX_VALUE);
|
||||||
|
result.put("list", vods);
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
try {
|
||||||
|
String url = host + "/?ac=detail&ids=" + ids.get(0);
|
||||||
|
String encodeData = OkHttpUtil.string(url, headers());
|
||||||
|
JSONObject vodInfo = new JSONObject(decrypt(encodeData));
|
||||||
|
JSONObject vod = new JSONObject();
|
||||||
|
vod.put("vod_id", vodInfo.getString("id"));
|
||||||
|
vod.put("vod_name", vodInfo.getString("title"));
|
||||||
|
vod.put("vod_pic", vodInfo.getString("img_url"));
|
||||||
|
vod.put("vod_year", vodInfo.optString("pubtime"));
|
||||||
|
vod.put("vod_remarks", vodInfo.optString("season_num"));
|
||||||
|
vod.put("vod_content", vodInfo.optString("intro").trim());
|
||||||
|
|
||||||
|
JSONArray type = vodInfo.optJSONArray("type");
|
||||||
|
if (type != null && type.length() > 0) {
|
||||||
|
vod.put("type_name", type.toString().replace("[\"", "").replace("\"]", ""));
|
||||||
|
}
|
||||||
|
JSONArray area = vodInfo.optJSONArray("area");
|
||||||
|
if (area != null && area.length() > 0) {
|
||||||
|
vod.put("vod_area", area.toString().replace("[\"", "").replace("\"]", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONArray actor = vodInfo.optJSONArray("actor");
|
||||||
|
if (actor != null && actor.length() > 0) {
|
||||||
|
vod.put("vod_actor", actor.toString().replace("[\"", "").replace("\"]", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONArray director = vodInfo.optJSONArray("director");
|
||||||
|
if (director != null && director.length() > 0) {
|
||||||
|
vod.put("vod_director", director.toString().replace("[\"", "").replace("\"]", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject videolist = vodInfo.getJSONObject("videolist");
|
||||||
|
Iterator<String> keys = videolist.keys();
|
||||||
|
Map<String, String> map = new TreeMap<>((o1, o2) -> {
|
||||||
|
if (o1.contains("m3u8")) {
|
||||||
|
if (o2.contains("lzm3u8")) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (o1.contains("ddzy")) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
});
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String source = keys.next();
|
||||||
|
JSONArray urls = videolist.optJSONArray(source);
|
||||||
|
List<String> sourceValues = new ArrayList<>();
|
||||||
|
for (int i = 0; i < urls.length(); i++) {
|
||||||
|
JSONObject item = urls.getJSONObject(i);
|
||||||
|
String title = item.optString("title");
|
||||||
|
String urlv = item.optString("url");
|
||||||
|
if (urlv.contains("url=")) {
|
||||||
|
urlv = urlv.replace("http://ry.nbhut.com/4.7.php?url=", "");
|
||||||
|
}
|
||||||
|
sourceValues.add(title + "$" + urlv);
|
||||||
|
}
|
||||||
|
|
||||||
|
map.put(source, TextUtils.join("#", sourceValues));
|
||||||
|
}
|
||||||
|
|
||||||
|
String join = TextUtils.join("$$$", map.keySet());
|
||||||
|
String join2 = TextUtils.join("$$$", map.values());
|
||||||
|
vod.put("vod_play_from", join);
|
||||||
|
vod.put("vod_play_url", join2);
|
||||||
|
JSONArray vods = new JSONArray();
|
||||||
|
vods.put(vod);
|
||||||
|
result.put("list", vods);
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param flag
|
||||||
|
* @param id
|
||||||
|
* @param vipFlags
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String playerContent(String flag, String id, List<String> vipFlags) {
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
try {
|
||||||
|
result.put("parse", "0");
|
||||||
|
if (Misc.isVideoFormat(id)) {
|
||||||
|
result.put("url", id);
|
||||||
|
} else if (Misc.isVip(id)) {
|
||||||
|
result.put("url", id);
|
||||||
|
result.put("parse", "1");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
try {
|
||||||
|
String url = host + "/?ac=list&wd=" + key + "&page=1";
|
||||||
|
String encodeData = OkHttpUtil.string(url, headers());
|
||||||
|
JSONObject json = new JSONObject(decrypt(encodeData));
|
||||||
|
JSONArray list = json.optJSONArray("data");
|
||||||
|
JSONArray vods = new JSONArray();
|
||||||
|
for (int i = 0; i < list.length(); i++) {
|
||||||
|
JSONObject item = list.getJSONObject(i);
|
||||||
|
JSONObject vod = new JSONObject();
|
||||||
|
String nextlink = item.getString("nextlink");
|
||||||
|
String vod_id = nextlink.substring(nextlink.indexOf("ids=") + 4);
|
||||||
|
vod.put("vod_id", vod_id);
|
||||||
|
vod.put("vod_name", item.getString("title"));
|
||||||
|
vod.put("vod_pic", item.getString("pic"));
|
||||||
|
vod.put("vod_remarks", item.getString("state"));
|
||||||
|
vods.put(vod);
|
||||||
|
}
|
||||||
|
result.put("list", vods);
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isVideoFormat(String url) {
|
||||||
|
return super.isVideoFormat(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean manualVideoCheck() {
|
||||||
|
return super.manualVideoCheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,410 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import com.github.catvod.utils.Misc;
|
||||||
|
import com.github.catvod.utils.okhttp.OKCallBack;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import okhttp3.Call;
|
||||||
|
|
||||||
|
|
||||||
|
public class Tkys extends Spider {
|
||||||
|
|
||||||
|
private static final String siteUrl = new String("https://www.tkys.tv");
|
||||||
|
private static final String siteHost = new String("www.tkys.tv");
|
||||||
|
|
||||||
|
protected JSONObject playerConfig;
|
||||||
|
protected JSONObject filterConfig;
|
||||||
|
|
||||||
|
protected Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html");
|
||||||
|
protected Pattern regexVoddetail = Pattern.compile("/voddetail/(\\d+).html");
|
||||||
|
protected Pattern regexPlay = Pattern.compile("/vodplay/(\\S+).html");
|
||||||
|
protected Pattern regexPage = Pattern.compile("/vodshow/\\d+--------(\\d+)---.html");
|
||||||
|
protected Pattern regexBtToken = Pattern.compile("token = \"(.*?)\"");
|
||||||
|
protected Pattern regexEnurl = Pattern.compile("getVideoInfo\\(\"(.*?)\"");
|
||||||
|
|
||||||
|
|
||||||
|
private final String filterString = "";
|
||||||
|
private final String playerString = "{\"mgtv\":{\"show\":\"芒果-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://play.tkys.tv/?url=\"},\"qiyi\":{\"show\":\"奇艺-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"qq\":{\"show\":\"QQ-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"sohu\":{\"show\":\"搜狐-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://play.tkys.tv/?url=\"},\"xx\":{\"show\":\"蓝光C\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"youku\":{\"show\":\"优酷-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"bilibili\":{\"show\":\"BL-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"dbm3u8\":{\"show\":\"备用1(请勿相信片中广告!!)\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"wjm3u8\":{\"show\":\"备用2(请勿相信片中广告!!)\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"kbm3u8\":{\"show\":\"备用3(有广告,误信)\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"tkqp\":{\"show\":\"app专用\",\"des\":\"天空自切\",\"ps\":\"1\",\"parse\":\"https://jxqd.tkys.tv/dnmdsb2.php?url=\"},\"wuduzy\":{\"show\":\"蓝光B(维护中)\",\"des\":\"五毒\",\"ps\":\"1\",\"parse\":\"https://jx.yyy4080.com/351755?url=\"},\"miaoparty\":{\"show\":\"蓝光MZ\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jxqd.tkys.tv/dnmdsb2.php?url=\"},\"wuduby\":{\"show\":\"蓝光备用\",\"des\":\"五毒备用\",\"ps\":\"0\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8.php?url=\"},\"iframe\":{\"show\":\"iframe外链数据\",\"des\":\"iframe外链数据\",\"ps\":\"0\",\"parse\":\"\"},\"link\":{\"show\":\"外链数据\",\"des\":\"外部网站播放链接\",\"ps\":\"0\",\"parse\":\"\"}}";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(Context context) {
|
||||||
|
super.init(context);
|
||||||
|
try {
|
||||||
|
playerConfig = new JSONObject(playerString);
|
||||||
|
filterConfig = new JSONObject(filterString);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 爬虫headers
|
||||||
|
*
|
||||||
|
* @param refererUrl
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected HashMap<String, String> getHeaders(String refererUrl) {
|
||||||
|
HashMap<String, String> headers = new HashMap<>();
|
||||||
|
headers.put("method", "GET");
|
||||||
|
if (!TextUtils.isEmpty(refererUrl)) {
|
||||||
|
headers.put("Referer", refererUrl);
|
||||||
|
}
|
||||||
|
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
|
||||||
|
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分类数据 + 首页最近更新视频列表数据
|
||||||
|
*
|
||||||
|
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + '/';
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl)));
|
||||||
|
Elements elements = doc.select("ul.nav-menu>li>a[href*='vodtype']");
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
for (Element ele : elements) {
|
||||||
|
String name = ele.text();
|
||||||
|
String href = ele.attr("href");
|
||||||
|
Matcher mather = regexCategory.matcher(href);
|
||||||
|
if (!mather.find())
|
||||||
|
continue;
|
||||||
|
// 把分类的id和名称取出来加到列表里
|
||||||
|
String id = mather.group(1).trim();
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
jsonObject.put("type_id", id);
|
||||||
|
jsonObject.put("type_name", name);
|
||||||
|
classes.put(jsonObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
if (filter) {
|
||||||
|
result.put("filters", filterConfig);
|
||||||
|
}
|
||||||
|
result.put("class", classes);
|
||||||
|
try {
|
||||||
|
// 取首页推荐视频列表
|
||||||
|
Elements list = doc.select("ul.myui-vodlist > li > div.myui-vodlist__box > a");
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
Element vod = list.get(i);
|
||||||
|
String title = vod.attr("title");
|
||||||
|
String cover = vod.attr("data-original");
|
||||||
|
String remark = "";
|
||||||
|
Element remarkEle = vod.selectFirst("span.pic-text");
|
||||||
|
if (remarkEle != null) {
|
||||||
|
remark = remarkEle.text();
|
||||||
|
}
|
||||||
|
Matcher matcher = regexVoddetail.matcher(vod.attr("href"));
|
||||||
|
if (!matcher.find())
|
||||||
|
continue;
|
||||||
|
String id = matcher.group(1);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", remark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
result.put("list", videos);
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取分类信息数据
|
||||||
|
*
|
||||||
|
* @param tid 分类id
|
||||||
|
* @param pg 页数
|
||||||
|
* @param filter 同homeContent方法中的filter
|
||||||
|
* @param extend 筛选参数{k:v, k1:v1}
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
||||||
|
try {
|
||||||
|
int page = 1;
|
||||||
|
TreeMap<String, String> ext = new TreeMap<>();
|
||||||
|
if (!TextUtils.isEmpty(pg) && Integer.parseInt(pg.trim()) > 1) {
|
||||||
|
page = Integer.parseInt(pg.trim());
|
||||||
|
ext.put("page", page + "");
|
||||||
|
}
|
||||||
|
if (extend != null && extend.size() > 0) {
|
||||||
|
ext.putAll(extend);
|
||||||
|
}
|
||||||
|
ext.put("id", tid);
|
||||||
|
List<String> kv = new ArrayList<>();
|
||||||
|
for (Map.Entry<String, String> entry : ext.entrySet()) {
|
||||||
|
if ("".equals(entry.getValue())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
kv.add(entry.getKey() + "/" + entry.getValue());
|
||||||
|
}
|
||||||
|
String params = TextUtils.join("/", kv);
|
||||||
|
|
||||||
|
String url = siteUrl + "/vodshow/" + params + ".html";
|
||||||
|
|
||||||
|
String html = OkHttpUtil.string(url, getHeaders(siteUrl));
|
||||||
|
Document doc = Jsoup.parse(html);
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
int pageCount = 1;
|
||||||
|
|
||||||
|
// 取页码相关信息
|
||||||
|
Elements pageInfo = doc.select("ul.myui-page li.visible-xs > a");
|
||||||
|
if (pageInfo.size() > 0) {
|
||||||
|
String text = pageInfo.text();
|
||||||
|
pageCount = Integer.parseInt(text.split("/")[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
// 取当前分类页的视频列表
|
||||||
|
Elements list = doc.select("ul.myui-vodlist > li > div > a");
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
Element vod = list.get(i);
|
||||||
|
String title = vod.attr("title");
|
||||||
|
String cover = vod.attr("data-original");
|
||||||
|
String remark = "";
|
||||||
|
Element remarkEle = vod.selectFirst("span.pic-text");
|
||||||
|
if (remarkEle != null) {
|
||||||
|
remark = remarkEle.text();
|
||||||
|
}
|
||||||
|
|
||||||
|
Matcher matcher = regexVoddetail.matcher(vod.attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
String vodId = matcher.group(1);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", vodId);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", remark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.put("page", page);
|
||||||
|
result.put("pagecount", pageCount);
|
||||||
|
result.put("limit", 48);
|
||||||
|
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
|
||||||
|
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 视频详情信息
|
||||||
|
*
|
||||||
|
* @param ids 视频id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
// 视频详情url
|
||||||
|
String url = siteUrl + "/voddetail/" + ids.get(0) + ".html";
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl)));
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONObject vodList = new JSONObject();
|
||||||
|
|
||||||
|
// 取基本数据
|
||||||
|
String cover = doc.selectFirst("div.myui-content__thumb > a > img").attr("data-original");
|
||||||
|
String title = doc.selectFirst("div.myui-content__detail > h1").text();
|
||||||
|
String desc = doc.selectFirst("#desc span.data").text();
|
||||||
|
|
||||||
|
vodList.put("vod_id", ids.get(0));
|
||||||
|
vodList.put("vod_name", title);
|
||||||
|
vodList.put("vod_pic", cover);
|
||||||
|
vodList.put("vod_content", desc);
|
||||||
|
|
||||||
|
Map<String, String> vod_play = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
// 取播放列表数据
|
||||||
|
Elements sources = doc.select("a[href*='playlist']");
|
||||||
|
Elements sourceList = doc.select("div[id*='playlist']");
|
||||||
|
|
||||||
|
for (int i = 0; i < sources.size(); i++) {
|
||||||
|
Element source = sources.get(i);
|
||||||
|
String sourceName = source.text();
|
||||||
|
boolean found = false;
|
||||||
|
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
|
||||||
|
String flag = it.next();
|
||||||
|
if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) {
|
||||||
|
// sourceName = flag;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
String playList = "";
|
||||||
|
Elements playListA = sourceList.get(i).select("a");
|
||||||
|
List<String> vodItems = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int j = 0; j < playListA.size(); j++) {
|
||||||
|
Element vod = playListA.get(j);
|
||||||
|
Matcher matcher = regexPlay.matcher(vod.attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
String playURL = matcher.group(1);
|
||||||
|
String playUrlName = vod.text();
|
||||||
|
vodItems.add(playUrlName + "$" + playURL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vodItems.size() > 0) {
|
||||||
|
playList = TextUtils.join("#", vodItems);
|
||||||
|
vod_play.put(sourceName, playList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vod_play.size() > 0) {
|
||||||
|
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
|
||||||
|
String vod_play_url = TextUtils.join("$$$", vod_play.values());
|
||||||
|
vodList.put("vod_play_from", vod_play_from);
|
||||||
|
vodList.put("vod_play_url", vod_play_url);
|
||||||
|
}
|
||||||
|
JSONArray list = new JSONArray();
|
||||||
|
list.put(vodList);
|
||||||
|
result.put("list", list);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取视频播放信息
|
||||||
|
*
|
||||||
|
* @param flag 播放源
|
||||||
|
* @param id 视频id
|
||||||
|
* @param vipFlags 所有可能需要vip解析的源
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String playerContent(String flag, String id, List<String> vipFlags) {
|
||||||
|
try {
|
||||||
|
// 播放页 url
|
||||||
|
String url = siteUrl + "/vodplay/" + id + ".html";
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl)));
|
||||||
|
Elements allScript = doc.select("script");
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
Map<String, String> playHeader = new HashMap<>();
|
||||||
|
playHeader.put("User-Agent", " Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36");
|
||||||
|
result.put("header", new JSONObject(playHeader).toString());
|
||||||
|
result.put("parse", "0");
|
||||||
|
result.put("playUrl", "");
|
||||||
|
for (int i = 0; i < allScript.size(); i++) {
|
||||||
|
String scContent = allScript.get(i).html().trim();
|
||||||
|
if (scContent.startsWith("var player_")) { // 取直链
|
||||||
|
int start = scContent.indexOf('{');
|
||||||
|
int end = scContent.lastIndexOf('}') + 1;
|
||||||
|
String json = scContent.substring(start, end);
|
||||||
|
JSONObject player = new JSONObject(json);
|
||||||
|
String videoUrl = player.optString("url");
|
||||||
|
String from = player.optString("from");
|
||||||
|
if (from.equals("")) {
|
||||||
|
from = "tkqp";
|
||||||
|
}
|
||||||
|
if (Misc.isVideoFormat(videoUrl)) {
|
||||||
|
result.put("url", videoUrl);
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject playJxConfig = playerConfig.optJSONObject(from);
|
||||||
|
String parseUrl = playJxConfig.optString("parse");
|
||||||
|
|
||||||
|
Map<String, String> paramsMap = new HashMap<>();
|
||||||
|
paramsMap.put("url", videoUrl);
|
||||||
|
String parseHtml = OkHttpUtil.string(parseUrl + videoUrl, getHeaders(siteUrl));
|
||||||
|
|
||||||
|
Matcher tokenMatcher = regexBtToken.matcher(parseHtml);
|
||||||
|
Matcher enurlMatcher = regexEnurl.matcher(parseHtml);
|
||||||
|
|
||||||
|
if (tokenMatcher.find() && enurlMatcher.find()) {
|
||||||
|
String token = tokenMatcher.group(1);
|
||||||
|
String enurl = enurlMatcher.group(1);
|
||||||
|
byte[] decode = Base64.decode(enurl, Base64.DEFAULT);
|
||||||
|
String realurl = AES.decryptOfAesCbcPkcs7(decode, "7692AA70EEF92B42".getBytes(), token.getBytes());
|
||||||
|
result.put("url", realurl);
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
try {
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime;
|
||||||
|
JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(siteUrl)));
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
if (searchResult.getInt("total") > 0) {
|
||||||
|
JSONArray lists = new JSONArray(searchResult.getString("list"));
|
||||||
|
for (int i = 0; i < lists.length(); i++) {
|
||||||
|
JSONObject vod = lists.getJSONObject(i);
|
||||||
|
String id = vod.getString("id");
|
||||||
|
String title = vod.getString("name");
|
||||||
|
String cover = vod.getString("pic");
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", cover);
|
||||||
|
v.put("vod_remarks", "");
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
|
||||||
|
public class Yisou extends Spider {
|
||||||
|
private static final Pattern aliyun = Pattern.compile("(https://www.aliyundrive.com/s/[^\"]+)");
|
||||||
|
private PushAgent yisou;
|
||||||
|
|
||||||
|
|
||||||
|
public String detailContent(List<String> list) {
|
||||||
|
try {
|
||||||
|
return yisou.detailContent(list);
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void init(Context context, String str) {
|
||||||
|
super.init(context, str);
|
||||||
|
yisou = new PushAgent();
|
||||||
|
yisou.init(context,str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String playerContent(String str, String str2, List<String> list) {
|
||||||
|
return yisou.playerContent(str, str2, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pattern regexVid = Pattern.compile("(\\S+)");
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
try {
|
||||||
|
if (quick)
|
||||||
|
return "";
|
||||||
|
String url = "https://yiso.fun/info?searchKey=" + URLEncoder.encode(key)+"&from=ali";
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(url, null));
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
// Elements list = doc.select("ul.newsList>li>div.li_con");
|
||||||
|
Elements list = doc.select("div.col-md-8>div.row-cards");
|
||||||
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
Element vod = list.get(i);
|
||||||
|
String title = "";
|
||||||
|
Elements titlelist = vod.select("h3.card-title>a>span");
|
||||||
|
for(int k = 0; k < titlelist.size(); k++){
|
||||||
|
title+=titlelist.get(k).text()
|
||||||
|
}
|
||||||
|
String cover = "";
|
||||||
|
String remark = vod.selectFirst("div.align-items-center>p.text-muted").text();
|
||||||
|
Matcher matcher = regexVid.matcher(vod.select("h3.card-title>a").attr("href"));
|
||||||
|
if (!matcher.find())
|
||||||
|
continue;
|
||||||
|
String id = matcher.group(1);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
//v.put("vod_id", vod.select("h3.card-title>a").attr("href"));
|
||||||
|
v.put("vod_id", id);
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000");
|
||||||
|
v.put("vod_remarks", remark);
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,227 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.spider.merge.Ms;
|
||||||
|
import com.github.catvod.spider.merge.W;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
/* loaded from: classes.dex */
|
||||||
|
public class KanSJ extends Spider {
|
||||||
|
private static short[] $ = {648, 660, 660, 656, 730, 719, 719, 651, 641, 654, 660, 662, 718, 666, 659, 665, 666, 643, 665, 718, 643, 654, 2987, 2991, 2977, 2944, 2987, 2983, 3030, 2977, 2981, 2997, 2967, 2977, 2997, 2991, 2948, 3029, 2978, 2999, 2979, 2980, 2983, 2999, 2995, 2983, 2983, 3026, 2977, 2984, 2983, 2978, 2981, 2980, 2959, 2999, 2989, 2980, 2945, 2999, 2978, 2967, 2948, 2999, 3028, 2983, 2985, 3031, 2979, 2958, 2975, 2951, 2966, 3024, 2976, 2955, 2986, 2964, 2957, 2967, 2956, 2958, 2965, 2967, 2966, 2975, 2967, 2985, 2986, 3017, 2987, 3039, 2996, 2962, 2975, 2962, 2996, 2961, 2967, 2996, 2967, 2960, 3017, 3007, 2972, 2947, 2967, 3028, 3031, 2955, 2994, 2953, 2976, 2963, 2988, 3029, 2975, 2979, 3039, 2997, 2991, 2951, 2984, 3031, 2958, 3007, 2958, 2967, 3025, 3004, 2997, 3007, 2952, 2993, 2958, 2958, 2960, 2956, 2961, 2980, 3006, 3006, 2992, 2990, 2953, 3025, 2945, 2997, 2996, 3017, 2983, 2980, 2987, 2981, 2957, 2996, 2997, 2996, 2987, 2986, 2979, 2984, 2984, 2946, 2965, 3027, 2972, 3007, 2983, 3038, 2966, 2992, 2974, 2974, 2998, 2987, 2986, 2993, 2995, 3006, 2965, 2946, 2975, 2953, 2957, 3004, 2954, 2965, 2991, 2996, 2976, 3028, 3006, 2985, 2974, 2972, 3038, 2985, 2954, 3024, 2972, 2961, 2967, 2995, 2996, 2957, 2966, 3039, 2994, 2958, 2988, 2980, 2978, 2963, 3026, 2975, 2955, 3039, 3031, 3004, 3006, 2958, 3026, 2976, 2945, 2954, 2967, 2999, 2997, 3028, 2981, 2961, 2991, 2978, 2983, 2999, 2983, 2980, 2388, 2384, 2384, 2394, 2429, 2430, 2384, 2395, 2392, 2397, 2392, 2391, 2395, 2430, 2418, 2408, 2417, 2418, 2416, 2398, 2336, 2414, 2345, 2395, 2392, 2376, 2396, 2399, 2392, 2392, 2378, 2394, 2392, 2420, 2392, 2414, 2430, 2430, 2387, 2426, 2392, 2430, 2396, 2392, 2392, 2422, 2398, 2395, 2392, 2390, 2409, 2413, 2397, 2368, 2392, 2350, 2380, 2378, 2385, 2387, 2408, 2423, 2422, 2382, 2368, 2412, 2412, 2378, 2408, 2390, 2398, 2400, 2408, 2423, 2386, 2422, 2349, 2415, 2337, 2403, 2344, 2398, 2346, 2386, 2344, 2385, 2394, 2409, 2398, 2408, 2358, 2336, 2419, 2391, 2351, 2411, 2427, 2382, 2371, 2390, 2430, 2382, 2349, 2423, 2431, 2384, 2381, 2344, 2384, 2417, 2422, 2346, 2382, 2399, 2416, 2398, 2411, 2413, 2421, 2387, 2416, 2429, 2424, 2398, 2398, 2354, 2377, 2392, 2399, 2429, 2429, 2380, 2428, 2419, 2412, 2395, 2387, 2385, 2337, 2392, 2396, 2414, 2386, 2379, 2399, 2387, 2396, 2414, 2410, 2376, 2345, 2344, 2347, 2403, 2423, 2391, 2430, 2397, 2400, 2421, 2369, 2385, 2396, 2337, 2414, 2413, 2371, 2379, 2428, 2401, 2346, 2386, 2416, 2379, 2420, 2382, 2414, 2417, 2396, 2369, 2371, 2426, 2350, 2385, 2377, 2414, 2351, 2369, 2411, 2377, 2394, 2409, 2379, 2398, 2378, 2423, 2344, 2390, 2396, 2418, 2396, 2390, 2350, 2419, 2386, 2427, 2346, 2383, 2421, 2428, 2385, 2430, 2382, 2394, 2382, 2409, 2395, 2389, 2368, 2389, 2392, 2430, 2388, 2395, 2392, 2392, 2396, 2394, 2430, 2368, 2395, 2383, 2412, 2412, 2385, 2422, 2399, 2418, 2418, 2351, 2368, 2376, 2381, 2390, 2391, 2400, 2428, 2431, 2346, 2377, 2428, 2381, 2351, 2422, 2385, 2348, 2392, 2409, 2417, 2371, 2398, 2431, 2401, 2394, 2344, 2409, 2344, 2376, 2376, 2417, 2429, 2346, 2424, 2415, 2388, 2337, 2427, 2344, 2427, 2385, 2401, 2418, 2430, 2395, 2385, 2337, 2398, 2416, 2349, 2431, 2350, 2395, 2413, 2424, 2385, 2394, 2371, 2416, 2427, 2399, 2368, 2428, 2371, 2429, 2409, 2387, 2431, 2384, 2429, 2346, 2377, 2399, 2383, 2408, 2416, 2384, 2389, 2379, 2347, 2411, 2428, 2427, 2387, 2348, 2409, 2411, 2387, 2409, 2399, 2400, 2431, 2385, 2421, 2346, 2379, 2383, 2408, 2380, 2371, 2336, 2392, 2403, 2377, 2412, 2420, 2385, 2379, 2379, 2397, 2348, 2387, 2384, 2394, 2351, 2368, 2392, 2350, 2415, 2395, 2394, 2430, 2348, 2350, 2347, 2349, 2381, 2337, 2383, 2428, 2430, 2336, 2394, 2401, 2381, 2429, 2385, 2403, 2400, 2427, 2368, 2389, 2394, 2414, 2369, 2424, 2397, 2368, 2399, 2381, 2421, 2382, 2345, 2358, 2351, 2423, 2423, 2417, 2344, 2430, 2377, 2422, 2376, 2387, 2395, 2392, 2377, 2408, 2427, 2408, 2348, 2430, 2418, 2369, 2394, 2417, 2354, 2422, 2358, 2397, 2411, 2409, 2381, 2350, 2418, 2408, 2416, 2424, 2347, 2426, 2381, 2412, 2423, 2349, 2348, 2369, 2388, 2394, 2420, 2368, 2381, 2416, 2386, 2378, 2417, 2419, 2420, 2388, 2412, 2419, 2384, 2383, 2377, 2394, 2354, 2358, 2390, 2349, 2346, 2424, 2396, 2411, 2379, 2409, 2412, 2389, 2427, 2428, 2416, 2415, 2401, 2384, 2351, 2395, 2336, 2369, 2408, 2392, 2337, 2349, 2344, 2420, 2378, 2377, 2427, 2337, 2412, 2381, 2380, 2409, 2427, 2410, 2394, 2376, 2376, 2397, 2415, 2428, 2396, 2394, 2401, 2421, 2386, 2431, 2409, 2408, 2345, 2344, 2408, 2358, 2358, 2401, 2392, 2369, 2427, 2346, 2421, 2389, 2354, 2428, 2354, 2377, 2350, 2397, 2369, 2344, 2337, 2382, 2337, 2428, 2418, 2354, 2421, 2389, 2413, 2369, 2422, 2380, 2397, 2417, 2400, 2386, 2396, 2395, 2347, 2426, 2351, 2403, 2385, 2390, 2336, 2430, 2351, 2392, 2358, 2351, 2431, 2385, 2430, 2401, 2347, 2397, 2387, 2385, 2344, 2354, 2415, 2423, 2368, 2420, 2419, 2385, 2416, 2416, 2385, 2347, 2376, 2410, 2422, 2377, 2401, 2392, 2418, 2396, 2392, 2420, 2391, 2424, 2379, 2400, 2345, 2389, 2348, 2421, 2371, 2381, 2390, 2409, 2378, 2388, 2395, 2350, 2348, 2351, 2397, 2416, 2414, 2386, 2431, 2430, 2421, 2391, 2336, 2392, 2394, 2398, 2421, 2430, 2428, 2382, 2391, 2349, 2347, 2385, 2384, 2391, 2430, 2389, 2414, 2423, 2420, 2416, 2337, 2397, 2428, 2358, 2412, 2383, 2348, 2403, 2384, 2354, 2424, 2386, 2378, 2427, 2381, 2421, 2411, 2388, 2399, 2398, 2399, 2350, 2336, 2426, 2336, 2409, 2390, 2416, 2371, 2380, 2431, 2348, 2383, 2369, 2347, 2412, 2345, 2354, 2414, 2387, 2392, 2395, 2418, 2351, 2398, 2429, 2424, 2427, 2378, 2423, 2380, 2427, 2381, 2411, 2378, 2390, 2337, 2414, 2415, 2345, 2344, 2394, 2379, 2422, 2415, 2349, 2418, 2381, 2377, 2387, 2368, 2392, 2427, 2379, 2401, 2399, 2348, 2418, 2349, 2384, 2428, 2379, 2395, 2368, 2384, 2401, 2422, 2419, 2418, 2347, 2427, 2423, 2398, 2389, 2378, 2396, 2368, 2382, 2411, 2350, 2388, 2389, 2354, 2416, 2426, 2411, 2347, 2426, 2348, 2382, 2391, 2337, 2371, 2376, 2382, 2418, 2428, 2388, 2403, 2426, 2417, 2395, 2346, 2378, 2388, 2384, 2376, 2387, 2392, 2397, 2398,
|
||||||
|
2403, 2383, 2351, 2379, 2385, 2415, 2401, 2358, 2351, 2397, 2394, 2403, 2389, 2415, 2378, 2411, 2413, 2385, 2380, 2423, 2400, 2431, 2386, 2400, 2394, 2417, 2344, 2336, 2413, 2394, 2348, 2417, 2401, 2400, 2383, 2400, 2412, 2369, 2388, 2392, 2421, 2386, 2429, 2376, 2384, 2403, 2379, 2378, 2416, 2381, 2384, 2390, 2416, 2379, 2368, 2358, 2348, 2385, 2414, 2415, 2383, 2416, 2337, 2371, 2394, 2383, 2415, 2368, 2420, 2385, 2376, 2350, 2423, 2345, 2369, 2398, 2368, 2399, 2429, 2387, 2346, 2410, 2350, 2376, 2340, 2340, 2346, 2350, 2336, 2305, 2346, 2342, 2391, 2336, 2340, 2356, 2326, 2336, 2356, 2350, 2309, 2388, 2339, 2358, 2338, 2341, 2342, 2358, 2354, 2342, 2342, 2387, 2336, 2345, 2342, 2339, 2340, 2341, 2318, 2358, 2348, 2341, 2304, 2358, 2340, 2325, 2318, 2315, 2323, 2342, 2312, 2348, 2390, 2345, 2319, 2305, 2348, 2385, 2355, 2327, 2317, 2318, 2327, 2388, 2322, 2358, 2304, 2399, 2384, 2341, 2399, 2336, 2313, 2305, 2380, 2314, 2376, 2348, 2305, 2384, 2352, 2333, 2380, 2312, 2359, 2324, 2305, 2355, 2305, 2316, 2327, 2340, 2327, 2327, 2325, 2306, 2358, 2385, 2317, 2390, 2319, 2339, 2307, 2359, 2309, 2342, 2309, 2319, 2399, 2384, 2380, 2318, 2322, 2324, 2333, 2340, 2307, 2304, 2356, 2326, 2309, 2314, 2376, 2335, 2325, 2399, 2387, 2359, 2337, 2350, 2308, 2352, 2323, 2337, 2386, 2313, 2313, 2307, 2356, 2388, 2325, 2335, 2347, 2326, 2312, 2398, 2338, 2346, 2304, 2339, 2325, 2340, 2380, 2334, 2355, 2307, 2306, 2353, 2336, 2340, 2385, 2317, 2316, 2322, 2399, 2315, 2325, 2398, 2337, 2304, 2355, 2359, 2357, 2305, 2380, 2347, 2305, 2346, 2357, 2385, 2386, 2347, 2306, 2324, 2367, 2315, 2317, 2389, 2307, 2319, 2314, 2350, 2398, 2359, 2339, 2376, 2335, 2337, 2312, 2323, 2358, 2338, 2376, 2366, 2327, 2324, 2340, 2346, 2306, 2312, 2321, 2353, 2390, 2333, 2333, 2320, 2350, 2339, 2342, 2358, 2342, 2341, 7332, 7328, 7328, 7338, 7309, 7326, 7328, 7339, 7336, 7341, 7336, 7335, 7339, 7310, 7298, 7320, 7297, 7298, 7296, 7342, 7376, 7326, 7385, 7339, 7336, 7352, 7340, 7343, 7336, 7336, 7354, 7338, 7336, 7300, 7340, 7326, 7310, 7310, 7331, 7309, 7336, 7310, 7340, 7336, 7336, 7302, 7342, 7339, 7336, 7330, 7324, 7330, 7358, 7385, 7338, 7310, 7323, 7356, 7387, 7343, 7377, 7323, 7321, 7334, 7300, 7334, 7330, 7303, 7308, 7388, 7338, 7341, 7315, 7322, 7329, 7326, 7304, 7309, 7366, 7391, 7307, 7377, 7321, 7366, 7325, 7307, 7353, 7391, 7310, 7362, 7313, 7376, 7335, 7362, 7354, 7298, 7330, 7300, 7300, 7325, 7388, 7341, 7320, 7353, 7358, 7340, 7335, 7385, 7376, 7322, 7339, 7324, 7329, 7315, 7327, 7391, 7330, 7391, 7315, 7332, 7331, 7387, 7339, 7330, 7321, 7324, 7307, 7366, 7342, 7327, 7315, 7310, 7377, 7356, 7297, 7313, 7304, 7385, 7345, 7300, 7308, 7309, 7384, 7333, 7308, 7327, 7340, 7324, 7320, 7299, 7385, 7352, 7312, 7336, 7334, 7322, 7333, 7390, 7331, 7335, 7384, 7388, 7356, 7344, 7333, 7320, 7334, 7354, 7390, 7312, 7358, 7327, 7385, 7358, 7339, 7332, 7376, 7343, 7366, 7389, 7325, 7377, 7313, 7329, 7323, 7298, 7325, 7391, 7313, 7308, 7358, 7353, 7347, 7387, 7342, 7344, 7299, 7385, 7377, 7353, 7366, 7340, 7358, 7296, 7384, 7336, 7357, 7376, 7296, 7300, 7326, 7328, 7313, 7391, 7296, 7376, 7345, 7345, 7353, 7353, 7336, 7310, 7332, 7339, 7336, 7336, 7340, 7338, 7310, 7344, 7339, 7389, 7343, 7322, 7327, 7390, 7358, 7302, 7341, 7389, 7303, 7330, 7359, 7302, 7324, 7340, 7384, 7311, 7303, 7384, 7339, 7321, 7326, 7384, 7312, 7299, 7308, 7334, 7332, 7301, 7389, 7311, 7356, 7355, 7343, 7302, 7307, 7300, 7340, 7330, 7333, 7391, 7301, 7340, 7390, 7298, 7312, 7308, 7299, 7329, 7352, 7324, 7384, 7307, 7377, 7304, 7389, 7310, 7312, 7387, 7301, 7357, 7329, 7306, 7357, 7352, 7336, 7341, 7325, 7341, 7331, 7356, 7298, 7333, 7320, 7341, 7309, 7311, 7315, 7389, 7311, 7309, 7332, 7333, 7312, 7389, 7299, 7332, 7301, 7366, 7338, 7327, 7387, 7343, 7331, 7385, 7330, 7386, 7315, 7330, 7345, 7352, 7330, 7359, 7297, 7332, 7321, 7357, 7306, 7303, 7309, 7333, 7333, 7299, 7298, 7309, 7355, 7327, 7344, 7312, 7323, 7309, 7300, 7312, 7335, 7355, 7307, 7358, 7386, 7347, 7310, 7297, 7332, 7326, 7306, 7326, 7335, 7323, 7300, 7298, 7344, 7326, 7352, 7335, 7356, 7315, 7390, 7312, 7386, 7338, 7327, 7311, 7385, 7362, 7321, 7335, 7329, 7297, 7340, 7306, 7298, 7390, 7353, 7347, 7339, 7306, 7386, 7301, 7377, 7324, 7326, 7352, 7331, 7339, 7336, 7335, 7302, 7352, 7386, 7296, 7321, 7376, 7327, 7304, 7377, 7302, 7353, 7298, 7313, 7342, 7391, 7377, 7296, 7354, 7303, 7359, 7315, 7341, 7336, 7354, 7303, 7320, 7334, 7342, 7341, 7309, 7310, 7341, 7341, 7376, 7307, 7328, 7312, 7327, 7304, 7385, 7354, 7390, 7333, 7385, 7326, 7296, 7313, 7385, 7306, 7297, 7306, 7312, 7385, 7385, 7338, 7298, 7300, 7302, 7355, 7390, 7322, 7323, 7296, 7327, 7353, 7355, 7313, 7297, 7332, 7377, 7313, 7339, 7320, 7391, 7296, 7353, 7308, 7358, 7332, 7300, 7302, 7345, 7353, 7313, 7356, 7338, 7352, 7352, 7341, 7331, 7344, 7347, 7328, 7354, 7331, 7376, 7389, 7390, 7385, 7334, 7359, 7323, 7343, 7359, 7302, 7387, 7389, 7324, 7325, 7299, 7362, 7385, 7299, 7324, 7390, 7307, 7311, 7336, 7307, 7343, 7341, 7320, 7307, 7387, 7324, 7343, 7313, 7312, 7332, 7391, 7311, 7345, 7330, 7300, 7358, 7308, 7308, 7335, 7341, 7333, 7331, 7328, 7327, 7354, 7352, 7386, 7308, 7311, 7301, 7391, 7354, 7331, 7328, 7344, 7331, 7310, 7387, 7297, 7362, 7321, 7345, 7353, 7386, 7387, 7354, 7309, 7330, 7331, 7341, 7335, 7297, 7336, 7339, 7357, 7336, 7298, 7339, 7309, 7339, 7311, 7306, 7352, 7329, 7385, 7358, 7322, 7298, 7390, 7301, 7329, 7321, 7323, 7359, 7322, 7310, 7344, 7307, 7347, 7299, 7342, 7331, 7355, 7325, 7339, 7345, 7330, 7384, 7331, 7330, 7307, 7385, 7387, 7366, 7307, 7390, 7366, 7356, 7335, 7310, 7362, 7339, 7310, 7359, 7357, 7342, 7386, 7358, 7356, 7338, 7309, 7384, 7324, 7347, 7352, 7301, 7388, 7345, 7331, 7376, 7344, 7336, 7389, 7343, 7331, 7334, 7327, 7303, 7312, 7325, 7385, 7315, 7389, 7336, 7310, 7355, 7297, 7359, 7331, 7297, 7321, 7332, 7301, 7336, 7298, 7340, 7336, 7303, 7298, 7315, 7388, 7302, 7313, 7345, 7376, 7388, 7324, 7384, 7309, 7362, 7300, 7339, 7335, 7296, 7385, 7300, 7315, 7300, 7308, 7334, 7343, 7352, 7329,
|
||||||
|
7355, 7357, 7309, 7302, 7321, 7324, 7315, 7334, 7320, 7333, 7341, 7297, 7385, 7322, 7366, 7312, 7355, 7327, 7313, 7329, 7388, 7384, 7324, 7386, 7345, 7344, 7296, 7390, 7376, 7330, 7326, 7308, 7356, 7390, 7341, 7341, 7302, 7355, 7313, 7307, 7353, 7306, 7340, 7347, 7343, 7342, 7313, 7330, 7328, 7321, 7300, 7341, 7354, 7385, 7331, 7312, 7301, 7384, 7296, 7326, 7331, 7339, 7336, 7328, 7334, 7341, 7296, 7391, 7354, 7387, 7353, 7359, 7296, 7302, 7302, 7358, 7304, 7312, 7326, 7376, 7362, 7301, 7353, 7376, 7321, 7327, 7320, 7334, 7333, 7336, 7340, 7326, 7328, 7366, 7315, 7334, 7386, 7388, 7296, 7356, 7312, 7330, 7320, 7334, 7377, 7323, 7296, 7315, 7311, 7386, 7343, 7343, 7329, 7321, 7376, 7344, 7321, 7315, 7335, 7315, 7324, 7310, 7313, 7345, 7312, 7301, 7306, 7333, 7386, 7385, 7310, 7388, 7354, 7315, 7377, 7308, 7359, 7356, 7328, 7320, 7311, 7299, 7304, 7355, 7320, 7306, 7354, 7338, 7310, 7380, 7912, 2474, 2444, 2458, 2445, 2514, 2494, 2456, 2458, 2449, 2443, 1998, 2027, 2022, 2044, 2019, 2017, 1957, 1976, 1956, 1979, 1956, 1978, 1962, 1954, 1990, 2019, 2020, 2047, 2034, 1969, 1962, 2015, 1969, 1962, 1995, 2020, 2030, 2040, 2021, 2019, 2030, 1962, 1979, 1978, 1969, 1962, 2010, 1992, 1999, 1991, 1978, 1978, 1962, 1992, 2047, 2019, 2022, 2030, 1957, 2011, 1985, 2011, 1979, 1956, 1979, 1971, 1978, 1971, 1979, 1970, 1956, 1978, 1978, 1979, 1955, 7368, 7377, 7386, 7393, 7372, 7387, 7379, 7391, 7372, 7381, 7373, 3653, 3676, 3671, 3692, 3651, 3674, 3664, 426, 431, 427, 431, 434, 2808, 2785, 2794, 2769, 2784, 2799, 2787, 2795, 1500, 1485, 1483, 1481, 1461, 1452, 1447, 1436, 1450, 1447, 4758, 4743, 4737, 4739, 4741, 4745, 4755, 4744, 4754, 110, 117, 110, 123, 118, 1261, 1256, 1266, 1269, 5796, 5803, 5798, 5812, 5812, 13384, 13396, 13392, 13379, 13679, 13666, 13675, 13694, 7533, 7550, 7529, 7533, 14304, 14334, 14335, 14327, 14335, 14251, 14250, 14267, 14254, 14246, 14243, 14305, 14271, 14247, 14271, 14304, 14254, 14271, 14271, 14304, 14265, 14246, 14251, 14250, 14240, 14320, 14313, 14267, 14246, 14251, 14322, 3727, 3786, 3781, 3784, 3802, 3802, 3732, 13109, 13170, 13153, 13174, 13170, 13102, 1531, 1444, 1464, 1468, 1455, 1504, 921, 975, 984, 898, -1690, -1665, -1676, -1713, -1696, -1668, -1679, -1687, -1713, -1691, -1694, -1668, -4962, -4985, -4980, -4937, -4968, -4988, -4983, -4975, -4937, -4978, -4966, -4985, -4987, -16281, -16258, -16267, -16306, -16270, -16258, -16257, -16283, -16268, -16257, -16283, -4343, -4336, -4325, -4320, -4325, -4330, -4339, -4326, -4324, -4341, -4336, -4339, -15761, -15754, -15747, -15802, -15752, -15750, -15763, -15754, -15765, -3997, -3974, -3983, -4022, -3993, -3984, -3976, -3980, -3993, -3970, -3994, -2459, -2436, -2441, -2484, -2446, -2463, -2442, -2446, -3375, -3384, -3389, -3336, -3362, -3390, -3386, -3371, -7980, -7987, -7994, -7939, -7982, -7989, -7999, -6424, -6415, -6406, -6463, -6416, -6401, -6413, -6405, -5794, -5817, -5812, -5769, -5823, -5812, -7819, -7824, -7830, -7827, -5561, -5543, -5544, -5552, -5544, -5604, -5602, -5562, -5608, -5632, -5608, -5561, -5608, -5606, -5625, -5602, -5631, -5620, -5619, -5561, -5602, -5625, -5620, -5561, -5545, -5623, -5621, -5547, -5620, -5619, -5604, -5623, -5631, -5628, -5554, -5631, -5620, -5605, -5547, -6431, -6420, -6427, -6416, -6454, -6405, -6412, -6408, -6416, -14907, -14884, -14889, -14868, -14896, -14881, -14894, -14912, -14912, -6217, -6204, -6498, 32013, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32103, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 2147, 8743, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32100, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 2147, -2928, 12081, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32101, 32102, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 6323, -5441, 12081, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32100, 32111, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 5745, 728, 12081, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32101, 32101, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 4985, 11942, 12081, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32101, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 938, -212, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32098, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 12286, 4733, 32116, 32043, 32011, 29529, 29526, 29531, 29513, 29513, 26445, 26388, 26375, 26388, 26380, 26477, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26434, 26447, 26438, 26451, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 6989, 12477, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 12970, 13649, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 12970, 13649, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 5383, 2035, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 5383, 2035, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1894, 1824, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1894, 1824, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13726, 10346, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13726, 10346, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 7911, 14669, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 7911, 14669, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13649, 2035, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13649, 2035, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1326, 10687, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1326, 10687, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -5040, 13340, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -5040, 13340, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 5529, 6236, 26388, 26394, 26388, 26432,
|
||||||
|
26388, 26380, 26388, 5529, 6236, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13726, 4621, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13726, 4621, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15985, 14669, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15985, 14669, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3152, 10390, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3152, 10390, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13988, -3745, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13988, -3745, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 156, 1326, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 156, 1326, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1894, 1824, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1894, 1824, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1946, 4775, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1946, 4775, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2044, 1964, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2044, 1964, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6649, 13902, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6649, 13902, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3996, 275, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -3996, 275, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 689, -6836, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 689, -6836, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14488, 4611, 14407, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14488, 4611, 14407, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13522, -4109, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13522, -4109, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13488, 13508, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13488, 13508, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -5914, 13726, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -5914, 13726, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13994, 103, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13994, 103, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13833, 7635, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13833, 7635, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26455, 26436, 26451, 26455, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 12294, 13324, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14003, 12294, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14003, 12294, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 15889, -3728, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15889, -3728, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, -337, 2329, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -337, 2329, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 13510, 2376, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13510, 2376, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6328, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6328, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3043, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3043, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -6713, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -6713, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 723, 26, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 723, 26, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3873, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -3873, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14465, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14465, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3014, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3014, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13382, 14736, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13382, 14736, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1593, 15889, 13599, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1593, 15889, 13599, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -4535, 5339, 5487, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -4535, 5339, 5487, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13718, 1481, 15889, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13718, 1481, 15889, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26447, 26451, 26455, 26436, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 14658, 10699, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26394, 26388, 26432, 26388, 26380,
|
||||||
|
26388, 26372, 26374, 26375, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26443, 26475, 26443, 26475, 26394, 26388, 26372, 26388, 26380, 26477, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26434, 26447, 26438, 26451, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 6989, 12477, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13522, -4109, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13522, -4109, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1326, 10687, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1326, 10687, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3996, 275, 14144, 14329, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -3996, 275, 14144, 14329, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 12970, 13649, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 12970, 13649, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15488, 14747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15488, 14747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 5529, 6236, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 5529, 6236, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13726, 10346, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13726, 10346, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15985, 14669, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15985, 14669, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13649, 2035, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13649, 2035, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13488, 13508, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13488, 13508, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6649, 13902, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6649, 13902, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10583, 103, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 10583, 103, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2035, 345, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2035, 345, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 12912, 1326, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 12912, 1326, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6247, 13649, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6247, 13649, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26455, 26436, 26451, 26455, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 12294, 13324, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14003, 12294, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14003, 12294, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 15889, -3728, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15889, -3728, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 13510, 2376, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 10523, 12747, 13510, 2376, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, -337, 2329, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 10523, 12747, -337, 2329, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3873, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -3873, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 723, 26, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 723, 26, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6328, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6328, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3014, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3014, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -6713, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -6713, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 646, 13718, 12375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 646, 13718, 12375, 26388, 26443, 26394, 26445, 26388, 26456, 26388,
|
||||||
|
26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26447, 26451, 26455, 26436, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 14658, 10699, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26443, 26475, 26443, 26475, 26394, 26388, 26370, 26388, 26380, 26477, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26434, 26447, 26438, 26451, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 6989, 12477, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2035, 1577, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2035, 1577, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 7911, 14669, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 7911, 14669, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6107, -4234, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6107, -4234, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1182, 4912, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1182, 4912, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 808, 7207, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 808, 7207, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13988, -3745, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13988, -3745, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -7381, -6977, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -7381, -6977, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3863, 12763, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3863, 12763, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13726, 10346, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13726, 10346, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 12, 1326, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 12, 1326, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -5914, 13726, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -5914, 13726, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1326, 10687, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1326, 10687, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15143, 14658, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15143, 14658, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15143, 15941, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15143, 15941, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 7688, 10284, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 7688, 10284, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13481, 13613, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13481,
|
||||||
|
13613, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10628, 15462, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 10628, 15462, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 4604, 332, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 4604, 332, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13703, 14561, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13703, 14561, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26455, 26436, 26451, 26455, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 12294, 13324, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14003, 12294, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 723, 26, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 723, 26, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3089, 6328, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3089, 6328, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26447, 26451, 26455, 26436, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 14658, 10699, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26443, 26475, 26394, 26388, 26373, 26388, 26380, 26477, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26434, 26447, 26438, 26451, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 6989, 12477, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -2241, 7926, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -2241, 7926, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2035, 1577, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2035, 1577, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -4983, -5314, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -4983, -5314, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 923, 1427, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 923, 1427, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 755, 2318, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 755, 2318, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3899, 10598, 26388, 26394, 26388, 26432, 26388, 26380, 26388,
|
||||||
|
-3899, 10598, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6328, -23, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6328, -23, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6556, 15528, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6556, 15528, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 452, -6836, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 452, -6836, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 4649, 2573, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 4649, 2573, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2318, 1337, 10660, 13726, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2318, 1337, 10660, 13726, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -5612, 6649, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -5612, 6649, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2932, -6278, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2932, -6278, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26455, 26436, 26451, 26455, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 12294, 13324, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14003, 12294, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14003, 12294, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2329, 13510, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2329, 13510, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 723, -3873, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 723, -3873, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3089, 6328, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3089, 6328, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26447, 26451, 26455, 26436, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 14658, 10699, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26443, 26475, 26443, 26475, 26443, 26475, 26443, 32682, 32677, 32672, 32696, 32681, 32702, 32703, -20332, -20339, -20346, -20291, -20336, -20345, -20337, -20349, -20336, -20343, -20335, -18297, -18274, -18283, -18258, -18303, -18280, -18286, -17123, -17148, -17137, -17100, -17147, -17142, -17146, -17138, -17081, -17058, -17067, -17042, -17064, -17067, -23479, -23476, -23466, -23471, -21468, -21446, -21445, -21453, -21445, -21377, -21379, -21467, -21381, -21405, -21381, -21468, -21381, -21383, -21404, -21379, -21406, -21393, -21394, -21468, -21379, -21404, -21393, -21468, -21452, -21398, -21400, -21450, -21395, -21406, -21401, -21377, -21394, -21383, 17424, 17420, 17420, 17416, 17419, 17474, 17495, 17495, 17439, 17425, 17420, 17437, 17433, 17494, 17435, 17431, 17429, 17495, 17417, 17425, 17433, 17431, 17426, 17425, 17495, 17426, 17433, 17418, 17495, 17418, 17433, 17423, 17495, 17434, 17418, 17433, 17430, 17435, 17424, 17495, 17429, 17433, 17425, 17430, 17495, 17427, 17419, 17426, 17494, 17420, 17408, 17420, 28358, 28356, 28376, 28362, 29761, 29776, 29763, 29762, 29780, 24884, 24883, 24877, 7291, 7266, 7273, 7250, 7295, 7272, 7264, 7276, 7295, 7270, 7294, 8669, 8644, 8655, 8692, 8667, 8642, 8648, 9490, 9483, 9472, 9531, 9482, 9477, 9481, 9473, 14750, 14727, 14732, 14775, 14721, 14732, 6377, 6380, 6390, 6385, 12849, 12847, 12846, 12838, 12846, 12906, 12904, 12848, 12910, 12918, 12910, 12849, 12910, 12908, 12913, 12904, 12919, 12922, 12923, 12849, 12904, 12913, 12922, 12849, 12833, 12927, 12925, 12835, 12922, 12923, 12906, 12927, 12919, 12914, 12856, 12905, 12922, 12835, 9754, 9804, 9819, 9729, 9741};
|
||||||
|
private String T9 = "http://kantv.zsyzcy.cn";
|
||||||
|
private String I = "";
|
||||||
|
private String PL = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDqbQ2AO1Ehyap6FmLrkqjhsqpyqOL/M9RtytRwqRqv/Yzeq21mToFuJ3yE9SIaN1hYhq7ZSYnWhhvjwBXXVHo7gSR/ABMCkRSRMLENNds5zYA8pVxxPMLWUXsdyokZlsIRF2XOxz8Ol6zwqURkp9ThJBDu4ym91ZXh4FglqQS2CwIDAQAB";
|
||||||
|
private String sO = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOptDYA7USHJqnoWYuuSqOGyqnKo4v8z1G3K1HCpGq/9jN6rbWZOgW4nfIT1Iho3WFiGrtlJidaGG+PAFddUejuBJH8AEwKRFJEwsQ012znNgDylXHE8wtZRex3KiRmWwhEXZc7HPw6XrPCpRGSn1OEkEO7jKb3VleHgWCWpBLYLAgMBAAECgYBVuuHoFkk6YQTONyef3PeT6oH5AphZGfxC1p1QQhd3avM8b1bHxkgBH8Gi4f7BtaHCZibFYeZdpJfId3PFVqiILR2rebJ5prJpFyfHl3RVqUZ9AzPumHRRD5JIC6YA7vBCg5724T8Veg9CxTdHzybYLCwXaDYFTlW0/6nnh1gPoQJBAPqbq5gkXCh+o/DrpT7kqia2cTun45XMCmYTiKShjmMujIVPC+/O43aErRpuLbeivxI6B9XqA841mSPb8uTUpbsCQQDveECxlKfpq01q//xAXb3lL+e+P7DX18W8ek+lLtXoUDhyKEB2c6zHO9g6A/6fHgx2DJH1+vnYmjHiiH2QsoPxAkEAmNaRy0L5lZTOpSMB756DiwKfglN9ACGlgeWN42HINgLwnmi8De/uV5zI+aKSbTlrMFGF79c9pOiZUf5VX2u0+wJABk6GdabSnUbTrSO8wv01CRov4kTPJYAbRxF5k4IeRBYIxojk2bnGLSEYWr7ML+icr2c5WN8ZQWkeMzchB3SMIQJADGzV6RHvx/6DCzLvSrtHUnyfKyCh19tC5hxyVyuXMAlKdQIzRSiTIOiRY/5HwvVi8ZCVvYmHQ7n0XGYFdJ3s7Q==";
|
||||||
|
private String x = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCriltAoK1NhfK6Tpjip3uQg87B8Gnf+m/Kf7Wz+oPsfTfkpCppreQ6j1hDdPbAbh87+iuszCdgSqbm/xr84PFIcWtF5nndS3rxLqo9EMgDrC+yTdeVGC6jku8lr9FgTPRf+LfMR65LesXlj2dhmI9PD/xFotQE/YpsCMeovV1zzwIDAQAB";
|
||||||
|
private String L = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKuKW0CgrU2F8rpOmOKne5CDzsHwad/6b8p/tbP6g+x9N+SkKmmt5DqPWEN09sBuHzv6K6zMJ2BKpub/Gvzg8Uhxa0Xmed1LevEuqj0QyAOsL7JN15UYLqOS7yWv0WBM9F/4t8xHrkt6xeWPZ2GYj08P/EWi1AT9imwIx6i9XXPPAgMBAAECgYB4Fsv7WoD4nKVouE1fn1Bpw1yjeOMl4fURFobmEKL6lE7kyejHQu1b8a4gy2lTHcTQADtDJUkLqDdfz4fdMLy4jMl/Cv2FJ0K3zKXQKVhMpTcndLLjkdRvYyrdmyNRbW3ZghMwcwNrmkYwQNUz7y3Cvf0+pNHhEck7PZBc3l8uwQJBANoQ3ip9va8oPkxG68iSnVzDASnqOGDdgDD9bIyva0S7L0wix0chcy00CkmoR7srivPRxhM8xBq6iPeWMmoXPxUCQQDJYZISJ9470OVrFVo24utj+0ju7bfAbFDqb2uFxyM6fXKmWeeNDLJIvSQ3efl6SJIYJg2h+pXP32SdKJDNhABTAkBdBfcQH0Wsk7lHprVsgYbZjGJRtBXK1JKb02/b7/UNg+BgVTG3WUCd1uZQl5XJ9YA4FJOvnyt0z4AgRhVJhpMlAkEAnkz5oxX95u1d+mBNi0mzmeOFQHRTdopuzOqLDh0s/yRvxH51u3XYi79KweU7DDoRxbPcEZFGxKIpmDS0Jyl1iwJBAIODi6S2PViooWayw9+lP9pvqOLAEwI/zO35iUyKqO8rizf3FFHp9YpzNzugxXylcL30g5Sz8eVUIqfjaRqcSCg=";
|
||||||
|
private String VX = "1";
|
||||||
|
private String o2 = null;
|
||||||
|
|
||||||
|
private static String $(int i, int i2, int i3) {
|
||||||
|
char[] cArr = new char[i2 - i];
|
||||||
|
for (int i4 = 0; i4 < i2 - i; i4++) {
|
||||||
|
cArr[i4] = (char) ($[i + i4] ^ i3);
|
||||||
|
}
|
||||||
|
return new String(cArr);
|
||||||
|
}
|
||||||
|
|
||||||
|
private HashMap<String, String> T9(String str) {
|
||||||
|
HashMap<String, String> hashMap = new HashMap<>();
|
||||||
|
hashMap.put("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 10; PBEM00 Build/QKQ1.190918.001)");
|
||||||
|
return hashMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String categoryContent(String str, String str2, boolean z, HashMap<String, String> hashMap) {
|
||||||
|
String $2 = "vod_remarks";
|
||||||
|
String $3 = "vod_pic";
|
||||||
|
String $4 = "limit";
|
||||||
|
String $5 = "vod_name";
|
||||||
|
String $6 = "page";
|
||||||
|
String $7 = "vod_id";
|
||||||
|
String $8 = "pagecount";
|
||||||
|
String $9 = "total";
|
||||||
|
String $10 = "list";
|
||||||
|
String $11 = "class";
|
||||||
|
String $12 = "year";
|
||||||
|
String $13 = "type";
|
||||||
|
String $14 = "area";
|
||||||
|
try {
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
String str3 = this.T9 + "/1080detail.php/app/video?&tid=" + str;
|
||||||
|
HashMap<String, String> hashMap2 = hashMap == null ? new HashMap<>() : hashMap;
|
||||||
|
if (!hashMap2.containsKey($14)) {
|
||||||
|
hashMap2.put($14, "");
|
||||||
|
}
|
||||||
|
if (!hashMap2.containsKey($13)) {
|
||||||
|
hashMap2.put($13, "");
|
||||||
|
}
|
||||||
|
if (!hashMap2.containsKey($12)) {
|
||||||
|
hashMap2.put($12, "");
|
||||||
|
}
|
||||||
|
if (!hashMap2.containsKey($11)) {
|
||||||
|
hashMap2.put($11, "");
|
||||||
|
}
|
||||||
|
String str4 = (((str3 + "&class=" + hashMap2.get($13)) + "&area=" + hashMap2.get($14)) + "&year=" + hashMap2.get($12)) + "&pg=" + str2;
|
||||||
|
JSONObject jSONObject2 = new JSONObject(W.AJ(str4, T9(str4)));
|
||||||
|
JSONArray jSONArray = jSONObject2.getJSONArray($10);
|
||||||
|
JSONArray jSONArray2 = new JSONArray();
|
||||||
|
for (int i = 0; i < jSONArray.length(); i++) {
|
||||||
|
JSONObject jSONObject3 = jSONArray.getJSONObject(i);
|
||||||
|
JSONObject jSONObject4 = new JSONObject();
|
||||||
|
jSONObject4.put($7, jSONObject3.getString($7));
|
||||||
|
jSONObject4.put($5, jSONObject3.getString($5));
|
||||||
|
jSONObject4.put($3, jSONObject3.getString($3));
|
||||||
|
jSONObject4.put($2, jSONObject3.getString($2));
|
||||||
|
jSONArray2.put(jSONObject4);
|
||||||
|
}
|
||||||
|
int i2 = jSONObject2.getInt($9);
|
||||||
|
int i3 = jSONObject2.getInt($8);
|
||||||
|
jSONObject.put($6, jSONObject2.getInt($6));
|
||||||
|
jSONObject.put($8, i3);
|
||||||
|
jSONObject.put($4, jSONObject2.getInt($4));
|
||||||
|
jSONObject.put($9, i2);
|
||||||
|
jSONObject.put($10, jSONArray2);
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Throwable unused) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String detailContent(List<String> list) {
|
||||||
|
String $2 = "vod_play_url";
|
||||||
|
String $3 = "vod_play_from";
|
||||||
|
String $4 = "vod_content";
|
||||||
|
String $5 = "vod_director";
|
||||||
|
String $6 = "vod_actor";
|
||||||
|
String $7 = "vod_remarks";
|
||||||
|
String $8 = "vod_area";
|
||||||
|
String $9 = "vod_year";
|
||||||
|
String $10 = "vod_pic";
|
||||||
|
String $11 = "vod_name";
|
||||||
|
String $12 = "vod_id";
|
||||||
|
String $13 = "list";
|
||||||
|
try {
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
String str = this.T9 + "/1080tv.php/provide/vod/?ac=detail&ids=" + list.get(0);
|
||||||
|
JSONObject jSONObject3 = new JSONObject(W.AJ(str, T9(str))).getJSONArray($13).getJSONObject(0);
|
||||||
|
jSONObject.put($12, jSONObject3.getString($12));
|
||||||
|
jSONObject.put($11, jSONObject3.getString($11));
|
||||||
|
jSONObject.put($10, jSONObject3.getString($10));
|
||||||
|
jSONObject.put("type_name", jSONObject3.getString("vod_class"));
|
||||||
|
jSONObject.put($9, jSONObject3.getString($9));
|
||||||
|
jSONObject.put($8, jSONObject3.getString($8));
|
||||||
|
jSONObject.put($7, jSONObject3.getString($7));
|
||||||
|
jSONObject.put($6, jSONObject3.getString($6));
|
||||||
|
jSONObject.put($5, jSONObject3.getString($5));
|
||||||
|
jSONObject.put($4, jSONObject3.getString($4));
|
||||||
|
jSONObject.put($3, jSONObject3.getString($3));
|
||||||
|
jSONObject.put($2, Ms.T9(jSONObject3.getString($2).replace("\/", "/"), this.L));
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
jSONArray.put(jSONObject);
|
||||||
|
jSONObject2.put($13, jSONArray);
|
||||||
|
return jSONObject2.toString();
|
||||||
|
} catch (Throwable unused) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String homeContent(boolean z) {
|
||||||
|
try {
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
jSONObject.put("class", new JSONArray("[{"type_id":"1","type_name":"电影"},{"type_id":"2","type_name":"电视剧"},{"type_id":"30","type_name":"日韩剧"},{"type_id":"29","type_name":"欧美剧"},{"type_id":"33","type_name":"港台剧"},{"type_id":"3","type_name":"综艺"},{"type_id":"4","type_name":"动漫"}]"));
|
||||||
|
if (z) {
|
||||||
|
jSONObject.put("filters", new JSONObject("{"1":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"动画","v":"动画"},{"n":"奇幻","v":"奇幻"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"经典","v":"经典"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"微电影","v":"微电影"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"中国大陆","v":"大陆"},{"n":"中国香港","v":"香港"},{"n":"中国台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"意大利","v":"意大利"},{"n":"西班牙","v":"西班牙"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"2":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"古装","v":"古装"},{"n":"战争","v":"战争"},{"n":"青春偶像","v":"青春偶像"},{"n":"喜剧","v":"喜剧"},{"n":"家庭","v":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"历史","v":"历史"},{"n":"经典","v":"经典"},{"n":"乡村","v":"乡村"},{"n":"情景","v":"情景"},{"n":"商战","v":"商战"},{"n":"网剧","v":"网剧"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"中国大陆","v":"大陆"},{"n":"中国台湾","v":"中国台湾"},{"n":"中国香港","v":"中国香港"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"4":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"情感","v":"情感"},{"n":"科幻","v":"科幻"},{"n":"热血","v":"热血"},{"n":"推理","v":"推理"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"萝莉","v":"萝莉"},{"n":"校园","v":"校园"},{"n":"动作","v":"动作"},{"n":"机战","v":"机战"},{"n":"运动","v":"运动"},{"n":"战争","v":"战争"},{"n":"少年","v":"少年"},{"n":"少女","v":"少女"},{"n":"社会","v":"社会"},{"n":"原创","v":"原创"},{"n":"亲子","v":"亲子"},{"n":"益智","v":"益智"},{"n":"励志","v":"励志"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国","v":"内地"},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}],"3":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"选秀","v":"选秀"},{"n":"情感","v":"情感"},{"n":"访谈","v":"访谈"},{"n":"播报","v":"播报"},{"n":"旅游","v":"旅游"},{"n":"音乐","v":"音乐"},{"n":"美食","v":"美食"},{"n":"纪实","v":"纪实"},{"n":"曲艺","v":"曲艺"},{"n":"生活","v":"生活"},{"n":"游戏互动","v":"游戏互动"},{"n":"财经","v":"财经"},{"n":"求职","v":"求职"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}]}]}"));
|
||||||
|
}
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Throwable unused) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String homeVideoContent() {
|
||||||
|
String $2 = "vod_remarks";
|
||||||
|
String $3 = "vod_pic";
|
||||||
|
String $4 = "vod_name";
|
||||||
|
String $5 = "vod_id";
|
||||||
|
String $6 = "list";
|
||||||
|
try {
|
||||||
|
String str = this.T9 + "/1080tv.php/provide/vod/?ac=filter";
|
||||||
|
JSONObject jSONObject = new JSONObject(W.AJ(str, T9(str)));
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
JSONArray jSONArray2 = jSONObject.getJSONArray($6);
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
for (int i = 0; i < jSONArray2.length(); i++) {
|
||||||
|
JSONObject jSONObject3 = jSONArray2.getJSONObject(i);
|
||||||
|
jSONObject2.put($5, jSONObject3.getString($5));
|
||||||
|
jSONObject2.put($4, jSONObject3.getString($4));
|
||||||
|
jSONObject2.put($3, jSONObject3.getString($3));
|
||||||
|
jSONObject2.put($2, jSONObject3.getString($2));
|
||||||
|
jSONArray.put(jSONObject2);
|
||||||
|
}
|
||||||
|
JSONObject jSONObject4 = new JSONObject();
|
||||||
|
jSONObject4.put($6, jSONArray);
|
||||||
|
return jSONObject4.toString();
|
||||||
|
} catch (Throwable unused) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(Context context) {
|
||||||
|
KanSJ.super.init(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String playerContent(String str, String str2, List<String> list) {
|
||||||
|
try {
|
||||||
|
JSONObject jSONObject = new JSONObject(W.AJ("https://gitea.com/qiaoji/jar/raw/branch/main/ksj.txt", null));
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
String str3 = jSONObject.getString("tvjx") + str2;
|
||||||
|
String T9 = Ms.T9(W.AJ(str3, T9(str3)), this.sO);
|
||||||
|
jSONObject2.put("parse", 0);
|
||||||
|
jSONObject2.put("url", T9);
|
||||||
|
return jSONObject2.toString();
|
||||||
|
} catch (Throwable unused) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String searchContent(String str, boolean z) {
|
||||||
|
String $2 = "vod_remarks";
|
||||||
|
String $3 = "vod_pic";
|
||||||
|
String $4 = "vod_name";
|
||||||
|
String $5 = "vod_id";
|
||||||
|
String $6 = "list";
|
||||||
|
try {
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
String str2 = this.T9 + "/1080tv.php/provide/vod/?ac=detail&wd=" + URLEncoder.encode(str) + "&pg=1";
|
||||||
|
String AJ = W.AJ(str2, T9(str2));
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
JSONArray jSONArray2 = new JSONObject(AJ).getJSONArray($6);
|
||||||
|
for (int i = 0; i < jSONArray2.length(); i++) {
|
||||||
|
JSONObject jSONObject2 = jSONArray2.getJSONObject(i);
|
||||||
|
JSONObject jSONObject3 = new JSONObject();
|
||||||
|
jSONObject3.put($5, jSONObject2.getString($5));
|
||||||
|
jSONObject3.put($4, jSONObject2.getString($4));
|
||||||
|
jSONObject3.put($3, jSONObject2.getString($3));
|
||||||
|
jSONObject3.put($2, jSONObject2.getString($2));
|
||||||
|
jSONArray.put(jSONObject3);
|
||||||
|
}
|
||||||
|
jSONObject.put($6, jSONArray);
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Throwable unused) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
java文件加入后报错,但Java文件应该没问题。很大可能是Java文件里的调用的问题。很可能是调用的文件没有或者没有添加相关的代码。
|
||||||
Reference in New Issue
Block a user