1 | |
---|
2 | import re |
---|
3 | import sys |
---|
4 | from lib.net import Net |
---|
5 | |
---|
6 | import re, urllib, json |
---|
7 | from lib import helpers |
---|
8 | import lib.common as common |
---|
9 | |
---|
10 | class WaawResolver(object): |
---|
11 | name = "waaw" |
---|
12 | domains = ["waaw.tv", "hqq.watch", "netu.tv", "hqq.tv"] |
---|
13 | pattern = "(?://|\.)((?:waaw|netu|hqq)\.(?:tv|watch))/(?:watch_video\.php\?v|.+?vid)=([a-zA-Z0-9]+)" |
---|
14 | |
---|
15 | def __init__(self): |
---|
16 | # self.net = Net() |
---|
17 | # self.net = Net(cookie_file='/mnt/network/cookies', http_debug = True) |
---|
18 | self.net = Net(cookie_file='/mnt/network/cookies', http_debug = False) |
---|
19 | |
---|
20 | url = str(sys.argv[1]) |
---|
21 | host = self.get_host_and_id(url)[0] |
---|
22 | media_id = self.get_host_and_id(url)[1] |
---|
23 | |
---|
24 | return self.get_media_url(host, media_id) |
---|
25 | |
---|
26 | def get_host_and_id(self, url): |
---|
27 | r = re.search(self.pattern, url, re.I) |
---|
28 | if r: |
---|
29 | return r.groups() |
---|
30 | else: |
---|
31 | return False |
---|
32 | |
---|
33 | def get_media_url1(self, host, media_id): |
---|
34 | web_url = self.get_url(host, media_id) |
---|
35 | link = self.net.http_GET(web_url).content |
---|
36 | if 'FILE WAS DELETED' in link: |
---|
37 | print 'File deleted.' |
---|
38 | else: |
---|
39 | video_link = str(re.compile('file[: ]*"(.+?)"').findall(link)[0]) |
---|
40 | |
---|
41 | if len(video_link) > 0: |
---|
42 | print video_link |
---|
43 | else: |
---|
44 | print 'No playable video found.' |
---|
45 | |
---|
46 | def get_media_url(self, host, media_id): |
---|
47 | web_url = self.get_url(host, media_id) |
---|
48 | headers = {'User-Agent': common.FF_USER_AGENT, 'Referer': 'https://waaw.tv/watch_video.php?v=%s&post=1' % media_id} |
---|
49 | html = self.net.http_GET(web_url, headers=headers).content |
---|
50 | ret = self.net.save_cookies('/mnt/network/cookies') |
---|
51 | |
---|
52 | if html: |
---|
53 | try: |
---|
54 | wise = re.search('(eval\s*\(function.*?)</script>', html, re.DOTALL | re.I).groups()[0] |
---|
55 | data_unwise = self.jswise(wise).replace("\\", "") |
---|
56 | try: at = re.search('var at\s*=\s*"([^"]+)"', data_unwise, re.I).groups()[0] |
---|
57 | except: at = "" |
---|
58 | try: http_referer = re.search('var http_referer\s*=\s*"([^"]+)"', data_unwise, re.I).groups()[0] |
---|
59 | except: http_referer = "" |
---|
60 | |
---|
61 | player_url = "http://hqq.watch/sec/player/embed_player.php?iss=&vid=%s&at=%s&autoplayed=yes&referer=on&http_referer=%s&pass=&embed_from=&need_captcha=0&hash_from=" % (media_id, at, http_referer) |
---|
62 | headers.update({'Referer': web_url}) |
---|
63 | data_player = self.net.http_GET(player_url, headers=headers).content |
---|
64 | data_unescape = re.findall('document.write\(unescape\("([^"]+)"', data_player) |
---|
65 | |
---|
66 | data = "" |
---|
67 | for d in data_unescape: |
---|
68 | data += urllib.unquote(d) |
---|
69 | |
---|
70 | |
---|
71 | data_unwise_player = "" |
---|
72 | wise = "" |
---|
73 | wise = re.search('(eval\s*\(function.*?)</script>', data_player, re.DOTALL | re.I) |
---|
74 | if wise: |
---|
75 | data_unwise_player = self.jswise(wise.group(1)).replace("\\", "") |
---|
76 | |
---|
77 | try: vars_data = re.search('/player/get_md5.php",\s*\{(.*?)\}', data, re.DOTALL | re.I).groups()[0] |
---|
78 | except: vars_data = "" |
---|
79 | matches = re.findall('\s*([^:]+):\s*([^,]*)[,"]', vars_data) |
---|
80 | params = {} |
---|
81 | for key, value in matches: |
---|
82 | if key == "adb": |
---|
83 | params[key] = "0/" |
---|
84 | elif '"' in value: |
---|
85 | params[key] = value.replace('"', '') |
---|
86 | else: |
---|
87 | try: value_var = re.search('var\s*%s\s*=\s*"([^"]+)"' % value, data, re.I).groups()[0] |
---|
88 | except: value_var = "" |
---|
89 | if not value_var and data_unwise_player: |
---|
90 | try: value_var = re.search('var\s*%s\s*=\s*"([^"]+)"' % value, data_unwise_player, re.I).groups()[0] |
---|
91 | except: value_var = "" |
---|
92 | params[key] = value_var |
---|
93 | |
---|
94 | params = urllib.urlencode(params) |
---|
95 | headers.update({'X-Requested-With': 'XMLHttpRequest', 'Referer': player_url}) |
---|
96 | data= "" |
---|
97 | data = self.net.http_GET("http://hqq.watch/player/get_md5.php?" + params, headers=headers).content |
---|
98 | url_data = json.loads(data) |
---|
99 | media_url = self.tb(url_data["html5_file"].replace("#", "")) |
---|
100 | del headers["Referer"] |
---|
101 | # del headers["X-Requested-With"] |
---|
102 | # if media_url: return media_url + helpers.append_headers(headers) |
---|
103 | |
---|
104 | if media_url: print media_url + helpers.append_headers(headers) |
---|
105 | # headers = {'User-Agent': common.FF_USER_AGENT} |
---|
106 | # if media_url: print media_url + helpers.append_headers(headers) |
---|
107 | |
---|
108 | |
---|
109 | |
---|
110 | except Exception as e: |
---|
111 | # raise ResolverError(e) |
---|
112 | print "errormsg=Video not found 2" |
---|
113 | # raise ResolverError('Video not found') |
---|
114 | # print "errormsg=Video not found" |
---|
115 | |
---|
116 | def tb(self, b_m3u8_2): |
---|
117 | j = 0 |
---|
118 | s2 = "" |
---|
119 | while j < len(b_m3u8_2): |
---|
120 | s2 += "\\u0" + b_m3u8_2[j:(j + 3)] |
---|
121 | j += 3 |
---|
122 | |
---|
123 | return s2.decode('unicode-escape').encode('ASCII', 'ignore') |
---|
124 | |
---|
125 | ## loop2unobfuscated |
---|
126 | def jswise(self, wise): |
---|
127 | while True: |
---|
128 | wise = re.search("var\s.+?\('([^']+)','([^']+)','([^']+)','([^']+)'\)", wise, re.DOTALL) |
---|
129 | if not wise: break |
---|
130 | ret = wise = self.js_wise(wise.groups()) |
---|
131 | |
---|
132 | return ret |
---|
133 | |
---|
134 | ## js2python |
---|
135 | def js_wise(self, wise): |
---|
136 | w, i, s, e = wise |
---|
137 | |
---|
138 | v0 = 0; |
---|
139 | v1 = 0; |
---|
140 | v2 = 0 |
---|
141 | v3 = []; |
---|
142 | v4 = [] |
---|
143 | |
---|
144 | while True: |
---|
145 | if v0 < 5: |
---|
146 | v4.append(w[v0]) |
---|
147 | elif v0 < len(w): |
---|
148 | v3.append(w[v0]) |
---|
149 | v0 += 1 |
---|
150 | if v1 < 5: |
---|
151 | v4.append(i[v1]) |
---|
152 | elif v1 < len(i): |
---|
153 | v3.append(i[v1]) |
---|
154 | v1 += 1 |
---|
155 | if v2 < 5: |
---|
156 | v4.append(s[v2]) |
---|
157 | elif v2 < len(s): |
---|
158 | v3.append(s[v2]) |
---|
159 | v2 += 1 |
---|
160 | if len(w) + len(i) + len(s) + len(e) == len(v3) + len(v4) + len(e): break |
---|
161 | |
---|
162 | v5 = "".join(v3); |
---|
163 | v6 = "".join(v4) |
---|
164 | v1 = 0 |
---|
165 | v7 = [] |
---|
166 | |
---|
167 | for v0 in range(0, len(v3), 2): |
---|
168 | v8 = -1 |
---|
169 | if ord(v6[v1]) % 2: v8 = 1 |
---|
170 | v7.append(chr(int(v5[v0:v0 + 2], 36) - v8)) |
---|
171 | v1 += 1 |
---|
172 | if v1 >= len(v4): v1 = 0 |
---|
173 | |
---|
174 | return "".join(v7) |
---|
175 | |
---|
176 | def get_url2(self, host, media_id): |
---|
177 | return 'http://vodlocker.com/embed-%s-640x400.html' % media_id |
---|
178 | |
---|
179 | def get_url(self, host, media_id): |
---|
180 | # return self._default_get_url(host, media_id, template='http://hqq.watch/player/embed_player.php?vid={media_id}&autoplay=no') |
---|
181 | return 'http://hqq.watch/player/embed_player.php?vid=%s&autoplay=no' % media_id |
---|
182 | |
---|
183 | sys.stdout = WaawResolver() |
---|