Created
June 21, 2018 11:22
-
-
Save jackhuntcn/c017b658d0e1c728e1cd5ced6f9fd0f6 to your computer and use it in GitHub Desktop.
a script for check product history price, using PyV8.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#coding: utf-8 | |
import sys | |
if sys.getdefaultencoding() != 'utf-8': | |
reload(sys) | |
sys.setdefaultencoding('utf-8') | |
import json | |
import re | |
from urllib import quote | |
from datetime import datetime | |
from dateutil.relativedelta import relativedelta | |
import requests | |
from pyv8 import PyV8 | |
header = { | |
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36', | |
'referer': 'http://tool.manmanbuy.com/historyLowest.aspx' | |
} | |
f1 = ''' | |
var hexcase = 0; | |
var b64pad = ""; | |
var chrsz = 8; | |
function hex_md5(s) { | |
return binl2hex(core_md5(str2binl(s), s.length * chrsz)) | |
} | |
function b64_md5(s) { | |
return binl2b64(core_md5(str2binl(s), s.length * chrsz)) | |
} | |
function str_md5(s) { | |
return binl2str(core_md5(str2binl(s), s.length * chrsz)) | |
} | |
function hex_hmac_md5(key, data) { | |
return binl2hex(core_hmac_md5(key, data)) | |
} | |
function b64_hmac_md5(key, data) { | |
return binl2b64(core_hmac_md5(key, data)) | |
} | |
function str_hmac_md5(key, data) { | |
return binl2str(core_hmac_md5(key, data)) | |
} | |
function core_md5(x, len) { | |
x[len >> 5] |= 0x80 << ((len) % 32); | |
x[(((len + 64) >>> 9) << 4) + 14] = len; | |
var a = 1732584193; | |
var b = -271733879; | |
var c = -1732584194; | |
var d = 271733878; | |
for (var i = 0; i < x.length; i += 16) { | |
var olda = a; | |
var oldb = b; | |
var oldc = c; | |
var oldd = d; | |
a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); | |
d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); | |
c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); | |
b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); | |
a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); | |
d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); | |
c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); | |
b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); | |
a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); | |
d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); | |
c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); | |
b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); | |
a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); | |
d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); | |
c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); | |
b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); | |
a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); | |
d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); | |
c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); | |
b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); | |
a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); | |
d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); | |
c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); | |
b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); | |
a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); | |
d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); | |
c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); | |
b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); | |
a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); | |
d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); | |
c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); | |
b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); | |
a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); | |
d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); | |
c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); | |
b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); | |
a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); | |
d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); | |
c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); | |
b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); | |
a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); | |
d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); | |
c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); | |
b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); | |
a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); | |
d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); | |
c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); | |
b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); | |
a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); | |
d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); | |
c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); | |
b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); | |
a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); | |
d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); | |
c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); | |
b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); | |
a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); | |
d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); | |
c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); | |
b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); | |
a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); | |
d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); | |
c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); | |
b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); | |
a = safe_add(a, olda); | |
b = safe_add(b, oldb); | |
c = safe_add(c, oldc); | |
d = safe_add(d, oldd) | |
} | |
return Array(a, b, c, d) | |
} | |
function md5_cmn(q, a, b, x, s, t) { | |
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b) | |
} | |
function md5_ff(a, b, c, d, x, s, t) { | |
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t) | |
} | |
function md5_gg(a, b, c, d, x, s, t) { | |
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t) | |
} | |
function md5_hh(a, b, c, d, x, s, t) { | |
return md5_cmn(b ^ c ^ d, a, b, x, s, t) | |
} | |
function md5_ii(a, b, c, d, x, s, t) { | |
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t) | |
} | |
function core_hmac_md5(key, data) { | |
var bkey = str2binl(key); | |
if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); | |
var ipad = Array(16), | |
opad = Array(16); | |
for (var i = 0; i < 16; i++) { | |
ipad[i] = bkey[i] ^ 0x36363636; | |
opad[i] = bkey[i] ^ 0x5C5C5C5C | |
} | |
var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); | |
return core_md5(opad.concat(hash), 512 + 128) | |
} | |
function safe_add(x, y) { | |
var lsw = (x & 0xFFFF) + (y & 0xFFFF); | |
var msw = (x >> 16) + (y >> 16) + (lsw >> 16); | |
return (msw << 16) | (lsw & 0xFFFF) | |
} | |
function bit_rol(num, cnt) { | |
return (num << cnt) | (num >>> (32 - cnt)) | |
} | |
function str2binl(str) { | |
var bin = Array(); | |
var mask = (1 << chrsz) - 1; | |
for (var i = 0; i < str.length * chrsz; i += chrsz) bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32); | |
return bin | |
} | |
function binl2str(bin) { | |
var str = ""; | |
var mask = (1 << chrsz) - 1; | |
for (var i = 0; i < bin.length * 32; i += chrsz) str += String.fromCharCode((bin[i >> 5] >>> (i % 32)) & mask); | |
return str | |
} | |
function binl2hex(binarray) { | |
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; | |
var str = ""; | |
for (var i = 0; i < binarray.length * 4; i++) { | |
str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF) | |
} | |
return str | |
} | |
function binl2b64(binarray) { | |
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | |
var str = ""; | |
for (var i = 0; i < binarray.length * 4; i += 3) { | |
var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16) | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8) | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF); | |
for (var j = 0; j < 4; j++) { | |
if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; | |
else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F) | |
} | |
} | |
return str | |
} | |
''' | |
f2 = ''' | |
var d = { | |
zero: ["0", "00", "000", "0000", "00000", "000000", "0000000", "00000000"], | |
chars: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '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'], | |
strReverse: function (a) { | |
var b, c = []; | |
for (b = 0, l = a.length; b < l; b++) c[c.length] = a.charAt(b); | |
return c.reverse().join("") | |
}, | |
encrypt: function (a, b, e) { | |
var a1 = d.shuzi(a); | |
var a2 = d.zimu(a); | |
a = a2 + a1; | |
var f, g = []; | |
for (f = 0, l = a.length; f < l; f++) g[g.length] = d.to(a.charCodeAt(f), b); | |
return d.rnd(e ? d.strReverse(g.join("")) : g.join(""), 4) | |
}, | |
to: function (a, c) { | |
var e = "" + d.round(a + 88, c).toString(16), | |
f = c - e.length; | |
return f > 0 ? d.zero[f - 1] + e : e | |
}, | |
round: function (a, b) { | |
var c = 1 << 4 * b; | |
return 0 > a ? a % c + c : a % c | |
}, | |
shuzi: function (a) { | |
return a.replace(/[^0-9]+/ig, "") | |
}, | |
zimu: function (a) { | |
return a.toLowerCase().replace(/https/g, "http").replace(/[^a-zA-Z]+/ig, "") | |
}, | |
rnd: function (a, b) { | |
return d.rd(b) + hex_md5(a) + d.rd(Math.ceil(Math.random() * 10)) | |
}, | |
rd: function (a) { | |
var res = ""; | |
for (var i = 0; i < a; i++) { | |
res += d.chars[Math.ceil(Math.random() * 35)] | |
} | |
return res | |
} | |
} | |
''' | |
def get_token(item_url): | |
token = None | |
with PyV8.JSContext() as ctxt: | |
ctxt.eval(f1) | |
ctxt.eval(f2) | |
token = ctxt.eval('''d.encrypt('%s', 2, true)''' % item_url) | |
return token | |
def do_req(item_url, token): | |
item_url_quoted = quote(item_url, safe='') | |
xhr_url = 'http://tool.manmanbuy.com/history.aspx?DA=1&action=gethistory&url=%s&bjid=&spbh=&cxid=&zkid=&w=951&token=%s' \ | |
% (item_url_quoted, token) | |
resp = requests.get(xhr_url, timeout=10) | |
resp.encoding = 'GBK' | |
data = json.loads(resp.text) | |
return data | |
def send_berrychat(text): | |
headers = {'content-type': 'application/json'} | |
incoming_url = 'YOUR_BERRYCHAT_INCOMING_WEBHOOK_URL' | |
payload = {"text": text} | |
resp = requests.post(incoming_url, data=json.dumps(payload), headers=headers) | |
return resp.status_code | |
if __name__ == "__main__": | |
product_url = str(sys.argv[1]) | |
token = get_token(product_url) | |
if token: | |
data = do_req(product_url, token) | |
date_price = data['datePrice'] | |
product_name = data['spName'] | |
price_list = re.findall(r'Date\.UTC\((\d+,\d+,\d+)\),(\d+)', date_price) | |
lastday, current = price_list[-2:] | |
last_price = float(lastday[1]) | |
current_price = float(current[1]) | |
if last_price > current_price: | |
send_berrychat("亲, 你关注的 [%s] (链接: %s) 降价了, 当前价格: %s 元, 比上次价格少了 %.2f 元,快去买买买吧!" \ | |
% (product_name, product_url, current_price, last_price - current_price)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment