├── .gitattributes ├── .gitignore ├── 2023_06 ├── demo10_meituan │ ├── meituan.js │ └── meituan.py ├── demo11_tianaw │ └── tianaw.js ├── demo12_qizhidao │ └── crawler_qizhidao.py ├── demo13_aqi │ └── aqi.js ├── demo1_whggzy │ └── whggzy.py ├── demo2_qiming │ ├── qiming.js │ └── qiming.py ├── demo3_mohurd │ ├── mohurd.js │ └── mohurd.py ├── demo4_endata │ ├── endata.js │ └── endata.py ├── demo5_1688 │ ├── h.js │ └── sign_1688.py ├── demo6_cinfo │ ├── cinfo.py │ └── ent.js ├── demo7_qimai │ ├── qimai.js │ └── qimai.py ├── demo8_oklink │ ├── oklink.js │ └── oklink.py └── demo9_qunaer │ ├── qunaer.js │ └── qunaer.py ├── 2023_07 ├── spider_minmetals │ ├── minmetals.js │ └── minmetals.py ├── spider_qq_music │ ├── loader.js │ ├── module.js │ └── qq_music.py ├── spider_spolicy │ ├── spolicy.js │ └── spolicy.py └── spider_xueqiu │ ├── xueqiu.html │ ├── xueqiu.js │ └── xueqiu.py ├── 2023_08 ├── spider_boss │ └── boss_zp_token.js ├── spider_qichacha │ ├── qichacha.py │ └── qichacha_.js ├── spider_tianyancha │ └── tianyancha.py ├── spider_uyanip │ └── uyanip_register.py └── spider_yuekeyun │ └── yuekeyun.js ├── 2023_09 ├── geetest_slide │ ├── GTrace.py │ ├── geetest.py │ └── generate_w.js ├── jsl │ ├── jsl.js │ └── jsl.py ├── rpc │ ├── ws_client.js │ └── ws_server.py ├── rs4_fangdichan │ ├── d.FxJzG50F.dfe1675.js │ ├── fangdichan.py │ └── rs4.js ├── tonghuashun │ ├── tonghuashun.js │ └── tonghuashun.py └── trendinsight │ ├── juliang.js │ └── juliang.py ├── 2023_10 ├── wx_betterwood │ ├── betterwood.js │ └── betterwood.py └── yidun │ ├── GTrace.py │ ├── YidunAST1.js │ ├── core.js │ ├── proxy_.js │ ├── trace.py │ └── yidun.py ├── 2023_11 └── zkh │ └── encrypt_new.js ├── 2024-4 └── urbtix_rs6_dp.py ├── 2024_02 └── tls_demo │ ├── tls_demo.go │ └── tls_demo.py ├── LICENSE ├── README.md ├── package-lock.json ├── package.json └── requirements.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=python 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .DS_Store -------------------------------------------------------------------------------- /2023_06/demo10_meituan/meituan.js: -------------------------------------------------------------------------------- 1 | // 加密的方法,reload是加密,reqUrlAndParams是要加密的字符串 2 | var token = window.Rohr_Opt.reload(reqUrlAndParams); 3 | 4 | var iI = function (jc) { 5 | // 把值转为json字符串 6 | // 字典是无序的,所以前面的排序是不需要的步骤 7 | jc = cD.deflate(JSON.stringify(jc)); 8 | // 看返回结果判断是什么压缩,1、如果是数组则是二进制压缩,2、ascii码映射 9 | // 这里返回结果是数组 10 | jc = iD(jc); 11 | return jc 12 | }; 13 | 14 | var iJ = function (je) { 15 | var jd = []; 16 | var ck = Object.keys(je).sort(); 17 | ck.forEach(function (jf, bx) { 18 | if (jf !== _$_543c[136] && jf !== _$_543c[137]) { 19 | jd.push(jf + _$_543c[122] + je[jf]) 20 | } 21 | }); 22 | jd = jd.join(_$_543c[121]); 23 | // jd=被排序过的请求参数 24 | return iI(jd) 25 | }; 26 | 27 | // jv=reqUrlAndParams 不带_token的请求参数 28 | function reload(jv) { 29 | var jw; 30 | var jx = {}; 31 | 32 | // 生成jx:把字符串的参数转换为字典形式 33 | if (typeof jv === _$_543c[91]) { 34 | jx = iO.parse(jv.split(_$_543c[146])[1]) 35 | } else { 36 | if (typeof jv === _$_543c[2]) { 37 | jx = jv 38 | } 39 | } 40 | 41 | 42 | ;iP.sign = iJ(jx); 43 | iP.cts = new Date().getTime(); 44 | jw = iI(iP); 45 | if (Rohr_Opt.LogVal && typeof (window) !== _$_543c[0]) { 46 | window[Rohr_Opt.LogVal] = encodeURIComponent(jw) 47 | } 48 | ; 49 | 50 | return jw 51 | } -------------------------------------------------------------------------------- /2023_06/demo10_meituan/meituan.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import json 3 | import time 4 | import zlib 5 | 6 | import requests 7 | 8 | 9 | def decode_sign(token_str): 10 | token_str = token_str.replace(" ", "") 11 | 12 | # base编码 13 | # token_str = f"\"{str(token_str)}\"" 14 | # token_str = str(token_str) 15 | # token_str = f"'{token_str}'" 16 | 17 | print(f"str:::{token_str}") 18 | 19 | encode1 = str(token_str).encode() 20 | # 参数 压缩成 特殊的编码 21 | compress = zlib.compress(encode1) 22 | b_encode = base64.b64encode(compress) 23 | # 转变 str 24 | e_sign = str(b_encode, encoding="utf-8") 25 | return e_sign 26 | 27 | 28 | def get_token_data(data, not_last=True): 29 | token_encode = base64.b64decode(data.encode()) 30 | # 二进制解压decompress 31 | token_str = zlib.decompress(token_encode).decode("utf-8") 32 | print("1111") 33 | print(token_str) 34 | # ip 35 | # token_str = token_str.replace("'", "\"") 36 | # if not_last: 37 | # # sign = json.loads(token_str)["sign"] 38 | # sign = json.loads(token_str) 39 | # print(sign) 40 | # get_token_data(sign, False) 41 | 42 | 43 | # 生成sign 44 | params = { 45 | 'cityName': '广州', 46 | 'cateId': 0, 47 | 'areaId': 0, 48 | 'sort': '', 49 | 'dinnerCountAttrId': '', 50 | 'page': 1, 51 | 'userId': '234746173', 52 | 'uuid': 'cab1469b7bd84ca09ea5.1686484028.1.0.0', 53 | 'platform': 1, 54 | 'partner': 126, 55 | 'originUrl': 'https://gz.meituan.com/meishi/', 56 | 'riskLevel': 1, 57 | 'optimusCode': 10 58 | } 59 | params_str = "\"" 60 | # 对key进行排序 61 | keys = [i for i in params.keys()] 62 | keys.sort() 63 | # 拼接 64 | for key in keys: 65 | params_str += f"{key}={params.get(key)}&" 66 | params_str = params_str[:-1] 67 | params_str += "\"" 68 | # 加密 69 | sign = decode_sign(params_str) 70 | 71 | # 生成_token 72 | iP = { 73 | 'rId': 100900, 74 | 'ver': "1.0.6", 75 | # 'ts': 1686369166338, 76 | # 'cts': 1686369167064, 77 | "ts":1686485181487, 78 | "cts":1686485200311, 79 | 'brVD': [ 80 | 1920, 81 | 150 82 | ], 83 | 'brR': [ 84 | [ 85 | 1920, 86 | 1080 87 | ], 88 | [ 89 | 1920, 90 | 981 91 | ], 92 | 30, 93 | 30 94 | ], 95 | 'bI': [ 96 | 'https://gz.meituan.com/meishi/', 97 | '' 98 | ], 99 | 'mT': [], 100 | 'kT': [], 101 | 'aT': [], 102 | 'tT': [], 103 | 'aM': '', 104 | 'sign': sign 105 | } 106 | 107 | ip_json = '{"rId":100900,"ver":"1.0.6","ts":1686485181487,"cts":1686485200311,"brVD":[1920,150],"brR":[[1920,1080],[1920,981],30,30],"bI":["https://gz.meituan.com/meishi/",""],"mT":[],"kT":[],"aT":[],"tT":[],"aM":"","sign":"eJwljU1uwyAQhe+SBUsMDsFOJRZVVpWq7nKAsZk6oxiwYKjUHCbXqLrqaXKPUnX1Pj29nx1khBfvlJiB8R+IP98goHt8/zy+7sJTjJhPqUZ+Zs4tI9LGFGo5JY9OK5EyLRTPeXUX5q08dd1ykwGJK0Q5p9A1LhfqxAZLKzTJ3Cad7q3YVuD3lEOzM5XrK37g2rikzE7Ugn9//d4MxuphL2ol72aYtLHHaZj8aGZQR4SD1Ha0ZjSqH6WWSqrdL1yKSlc="}' 108 | my_json = json.dumps(iP).replace(" ", '') 109 | print(ip_json==my_json) 110 | print() 111 | params["_token"] = decode_sign(json.dumps(iP)) 112 | # url = "https://gz.meituan.com/meishi/api/poi/getPoiList?" 113 | # headers = { 114 | # "Cookie": 'uuid=a63a78dd2c6d4b8fa71d.1686314553.1.0.0; _lxsdk_cuid=188a02e1500c8-0a5a1464137002-1c525634-1fa400-188a02e1500c8; WEBDFPID=3y14z78z14v45v97y8569vuxz2y2w126811z97v8z4097958u7w48713-2001674556041-1686314555132WEUGSSM75613c134b6a252faa6802015be905513214; mtcdn=K; qruuid=fbee9f74-162b-483c-b1aa-8ec768c236b0; token2=AgGZIbi2lzfVJExG-UP_COPrJScWpUpvQqXc4_qvhfg1aPNdM4gKib0f1AgFDvfWKoFK-pwqZk69IAAAAADjGAAA4cp65WW_BGhwA2TCJypD8sq-G4SjXc_mYF_PRR5i8WVkumJgHOOqNiq7TvWNRYms; oops=AgGZIbi2lzfVJExG-UP_COPrJScWpUpvQqXc4_qvhfg1aPNdM4gKib0f1AgFDvfWKoFK-pwqZk69IAAAAADjGAAA4cp65WW_BGhwA2TCJypD8sq-G4SjXc_mYF_PRR5i8WVkumJgHOOqNiq7TvWNRYms; lt=AgGZIbi2lzfVJExG-UP_COPrJScWpUpvQqXc4_qvhfg1aPNdM4gKib0f1AgFDvfWKoFK-pwqZk69IAAAAADjGAAA4cp65WW_BGhwA2TCJypD8sq-G4SjXc_mYF_PRR5i8WVkumJgHOOqNiq7TvWNRYms; u=234746173; n=move_on_; unc=move_on_; _lxsdk=188a02e1500c8-0a5a1464137002-1c525634-1fa400-188a02e1500c8; ci=20; rvct=20%2C70; client-id=f4264e44-01fa-424b-9fd9-a07897d53362; __mta=150369929.1686314725417.1686314725417.1686324299749.2; firstTime=1686324301881; _lx_utm=utm_source%3Dgoogle%26utm_medium%3Dorganic; _lxsdk_s=188a0a34c8b-d8a-4f7-334%7C%7C12', 115 | # "Referer": "https://gz.meituan.com/meishi/", 116 | # "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" 117 | # } 118 | # data = requests.get(url, headers=headers, params=params).text 119 | # # print(data) 120 | # 121 | # print(params["_token"]) 122 | -------------------------------------------------------------------------------- /2023_06/demo11_tianaw/tianaw.js: -------------------------------------------------------------------------------- 1 | const aes = require("crypto-js") 2 | var privateKey = "ciKAJTYXcaiHdCrN" 3 | 4 | /** 5 | * 加密 6 | * @param l 要加密的文本 7 | * @returns {*} 8 | */ 9 | newEncrypt = function (l) { 10 | var n = aes.enc.Utf8.parse(privateKey) 11 | , t = aes.enc.Utf8.parse(privateKey) 12 | , e = aes.enc.Utf8.parse(l) 13 | , a = aes.AES.encrypt(e, n, { 14 | iv: t, 15 | mode: aes.mode.CBC, 16 | padding: aes.pad.Pkcs7 17 | }); 18 | return aes.enc.Base64.stringify(a.ciphertext) 19 | } 20 | 21 | 22 | /** 23 | * 解密 24 | * @param l 25 | * @returns {*} 26 | */ 27 | newDecoto = function (l) { 28 | var n = aes.enc.Base64.parse(l) 29 | , t = aes.enc.Utf8.parse(privateKey) 30 | , e = aes.enc.Utf8.parse(privateKey) 31 | , a = aes.lib.CipherParams.create({ 32 | ciphertext: n 33 | }); 34 | return aes.AES.decrypt(a, t, { 35 | iv: e, 36 | mode: aes.mode.CBC, 37 | padding: aes.pad.Pkcs7 38 | }).toString(aes.enc.Utf8) 39 | } 40 | 41 | var f = { 42 | "body": { 43 | "loginMethod": "1", 44 | "name": "15014324839", 45 | "password": "12312312312" 46 | }, 47 | "head": { 48 | "userCode": null, 49 | "channelCode": "101", 50 | // "transTime": (new Date()).getTime(), 51 | "transTime": 1688549765646, 52 | "transToken": "", 53 | "customerId": null, 54 | "transSerialNumber": "" 55 | } 56 | } 57 | 58 | // json_key参数加密 59 | const json_key = newEncrypt(JSON.stringify(f)) 60 | console.log(json_key) 61 | 62 | 63 | // 解析结果 64 | function getResult(data) { 65 | // var data = '8UQlJBq0xiGEcNeOz8oGgaTX/aNh8S1TAn6oIGlPz1/eEwl1q26a2NyMSNcubZHPyBmBBRYCpAHd+QBIoBuvBMPcnHjnvsMOXwv6In77aIU6PHbS4gIF5p1Dm/UkAy3bSqoYTaTmLuQx3V+tBbxLUzVXbRA0AdYfdbdKfHXFo4GqwUuaC4yjdFic4iTu4GfE2piFzmWriTJrqtJqLfNF3DWLJ77uFZb4+Jnjutx5xvrQmEYF23PUTkkPfQZB+hV6qNihIZJrCSzLyyc8PaIef6+e81UHPpBvS9dH1BvyUMcewd8RtskToqvejBzPtCYF' 66 | var n = data.replace(/[\r\n]/g, "") 67 | var t = newDecoto(n) 68 | console.log(t) 69 | return t 70 | } 71 | var data = '8UQlJBq0xiGEcNeOz8oGgaTX/aNh8S1TAn6oIGlPz1/eEwl1q26a2NyMSNcubZHPyBmBBRYCpAHd+QBIoBuvBMPcnHjnvsMOXwv6In77aIU6PHbS4gIF5p1Dm/UkAy3bSqoYTaTmLuQx3V+tBbxLUzVXbRA0AdYfdbdKfHXFo4GqwUuaC4yjdFic4iTu4GfE2piFzmWriTJrqtJqLfNF3DWLJ77uFZb4+Jnjutx5xvrQmEYF23PUTkkPfQZB+hV6qNihIZJrCSzLyyc8PaIef6+e81UHPpBvS9dH1BvyUMcewd8RtskToqvejBzPtCYF' 72 | var data = 'tzLSXRbOKZrz9hWpvdbkY0iosxc+nYHzMOF2QSkGbe5pppOo+AfHxWkspVsMTuAkjyz+6n1CAGQ7cP3QPTRYu04GrxLIP0PmkIuyqcEdp1vOfmEJ7bT/BxwWVR5dWHeIsEPOlN/Nk7PPAyWvLpxU11pxYBGGPlUeeqk0U7y9xR7hykqIcHb98XYf3vMTriZXZzhxKrWeSw+tyo6vA7NizxjcGbyUzF47wQNgRWVchaeXPvBXajvstc+1q+/2DH6CD6CAdCRSM3GBb89S6jHSFOF0xa8EsCh7L3dbsAzc8HvOH28L529D+oRwVI3PPALT' 73 | var data = 'tzLSXRbOKZrz9hWpvdbkY0iosxc+nYHzMOF2QSkGbe5pppOo+AfHxWkspVsMTuAkjyz+6n1CAGQ7cP3QPTRYu04GrxLIP0PmkIuyqcEdp1vOfmEJ7bT/BxwWVR5dWHeIsEPOlN/Nk7PPAyWvLpxU11pxYBGGPlUeeqk0U7y9xR7hykqIcHb98XYf3vMTriZXZzhxKrWeSw+tyo6vA7NizxjcGbyUzF47wQNgRWVchaeXPvBXajvstc+1q+/2DH6CD6CAdCRSM3GBb89S6jHSFOF0xa8EsCh7L3dbsAzc8HvOH28L529D+oRwVI3PPALT' 74 | var data = 'tzLSXRbOKZrz9hWpvdbkY0iosxc+nYHzMOF2QSkGbe5pppOo+AfHxWkspVsMTuAkjyz+6n1CAGQ7\\ncP3QPTRYu04GrxLIP0PmkIuyqcEdp1vOfmEJ7bT/BxwWVR5dWHeIsEPOlN/Nk7PPAyWvLpxU11px\\nYBGGPlUeeqk0U7y9xR7hykqIcHb98XYf3vMTriZXZzhxKrWeSw+tyo6vA7NizxjcGbyUzF47wQNg\\nRWVchaeXPvBXajvstc+1q+/2DH6CD6CAdCRSM3GBb89S6jHSFOF0xa8EsCh7L3dbsAzc8HvOH28L\\n529D+oRwVI3PPALT' 75 | getResult(data) 76 | -------------------------------------------------------------------------------- /2023_06/demo12_qizhidao/crawler_qizhidao.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | import requests 4 | from Crypto.Cipher import AES 5 | from Crypto.Util.Padding import unpad 6 | import base64 7 | from pkcs7 import PKCS7Encoder 8 | 9 | 10 | def AES_decrypt(data, hasUse:int): 11 | """ 12 | 解密方法 13 | :param data: 数据,接口中的data1参数 14 | :param hasUse: hasUse参数,用来获取加密key 15 | :return: 解密后的字典数据 16 | """ 17 | key_list = [b"xc46VoB49X3PGYAg", b"KE3pb84wxqLTZEG3", b"18Lw0OEaBBUwHYNT", b"jxxWWIzvkqEQcZrd", b"40w42rjLEXxYhxRn", 18 | b"K6hkD03WNW8N1fPM", b"I8V3IwIhrwNbWxqz", b"3JNNbxAP4zi5oSGA", b"7pUuESQl8aRTFFKK", b"KB4GAHN6M5soB3WV"] 19 | # 解码 20 | html = base64.b64decode(data) 21 | # mode为ECB的AES加密 22 | aes = AES.new(key_list[hasUse-1], AES.MODE_ECB) 23 | # 解密 24 | info = aes.decrypt(html) 25 | # 填充 26 | decrypt = unpad(info, AES.block_size).decode() 27 | return json.loads(decrypt) 28 | 29 | 30 | # 通过curlconvert(https://curlconverter.com/)生成请求代码 31 | cookies = { 32 | 'wz_uuid': 'X%2Fa4b7e834699f617fc2428d3d3e509928', 33 | 'sensorsdata2015jssdkchannel': '%7B%22prop%22%3A%7B%22_sa_channel_landing_url%22%3A%22%22%7D%7D', 34 | 'Hm_lvt_9ea3e7293b7c088e0d2c88874b63e7dd': '1689777143', 35 | 'token': 'eyJhbGciOiJIUzUxMiJ9.ZXlKNmFYQWlPaUpFUlVZaUxDSmhiR2NpT2lKa2FYSWlMQ0psYm1NaU9pSkJNVEk0UTBKRExVaFRNalUySW4wLi50dGs5YlNkZ1lCS0tGWjVWaFhvMWZnLlQyMWhXTjZkX29pSnZZcWpfOThrRENVZkFldkVTckEyNHZYd2ZNYmxjTE5NeC03emRKcjVuUW0wajRzX0F1VS10SlAtUFZOWUZ6Qm9lZ29pTWFTXzRmeE52VGlFSUtFOERFMWRnQWpyblB6WldfQ0pBcXdEcFpRQnlpa1RLZmtJamVvVllYLUlSUlVWY1QxNEhhcmhHQktfU3hvSW9jQmZtWjV4aVc4SVNpUWxHeFNyMjhfbU81YXEzS3M5V05DYTVZWlJHUnpqSlRNSlJHa2tMNDFxdVEuNlEwWDhDaTVLV19kdGllQ1oyUWVfdw.nfmeio4xKklqFvmQMfHMrQFBNI1BqgP-MUfDn-eVJ2Kp5xe2Ku6PymUYwg_8TUP7yg9GtMee0TUa5sQlvvHZqQ', 36 | 'accessToken': 'eyJhbGciOiJIUzUxMiJ9.ZXlKNmFYQWlPaUpFUlVZaUxDSmhiR2NpT2lKa2FYSWlMQ0psYm1NaU9pSkJNVEk0UTBKRExVaFRNalUySW4wLi50dGs5YlNkZ1lCS0tGWjVWaFhvMWZnLlQyMWhXTjZkX29pSnZZcWpfOThrRENVZkFldkVTckEyNHZYd2ZNYmxjTE5NeC03emRKcjVuUW0wajRzX0F1VS10SlAtUFZOWUZ6Qm9lZ29pTWFTXzRmeE52VGlFSUtFOERFMWRnQWpyblB6WldfQ0pBcXdEcFpRQnlpa1RLZmtJamVvVllYLUlSUlVWY1QxNEhhcmhHQktfU3hvSW9jQmZtWjV4aVc4SVNpUWxHeFNyMjhfbU81YXEzS3M5V05DYTVZWlJHUnpqSlRNSlJHa2tMNDFxdVEuNlEwWDhDaTVLV19kdGllQ1oyUWVfdw.nfmeio4xKklqFvmQMfHMrQFBNI1BqgP-MUfDn-eVJ2Kp5xe2Ku6PymUYwg_8TUP7yg9GtMee0TUa5sQlvvHZqQ', 37 | 'creditNo': '%22%22', 38 | 'param_sign': 'rqd3lt', 39 | 'SSO_SESSION_ID': 'YzI3YWJjOWEtYTgyNC00MDVlLTk4ZGItNGJkNDM1NTg1YWUz', 40 | 'acw_tc': '784e2ca816900794228843102e20ad4a6f8c79118e26d4a2b126f5024b728c', 41 | 'patentDetailTechnicalSupportShowTime': 'show', 42 | 'Hm_lpvt_9ea3e7293b7c088e0d2c88874b63e7dd': '1690080902', 43 | 'sensorsdata2015jssdkcross': '%7B%22distinct_id%22%3A%2204dc736832124b66841aa70b1d9d1d65%22%2C%22first_id%22%3A%221896e90f5a7d41-020705f8463bb2c-1b525634-2073600-1896e90f5a8cb8%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfbG9naW5faWQiOiIwNGRjNzM2ODMyMTI0YjY2ODQxYWE3MGIxZDlkMWQ2NSIsIiRpZGVudGl0eV9jb29raWVfaWQiOiIxODk2ZTkwZjVhN2Q0MS0wMjA3MDVmODQ2M2JiMmMtMWI1MjU2MzQtMjA3MzYwMC0xODk2ZTkwZjVhOGNiOCJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%2204dc736832124b66841aa70b1d9d1d65%22%7D%2C%22%24device_id%22%3A%221896e90f5a7d41-020705f8463bb2c-1b525634-2073600-1896e90f5a8cb8%22%7D', 44 | 'x-web-ip': '113.77.243.101, 120.78.44.166, 100.121.108.213', 45 | } 46 | 47 | headers = { 48 | 'authority': 'app.qizhidao.com', 49 | 'accept': 'application/json, text/plain, */*', 50 | 'accept-language': 'zh-CN,zh;q=0.9', 51 | 'accesstoken': 'eyJhbGciOiJIUzUxMiJ9.ZXlKNmFYQWlPaUpFUlVZaUxDSmhiR2NpT2lKa2FYSWlMQ0psYm1NaU9pSkJNVEk0UTBKRExVaFRNalUySW4wLi50dGs5YlNkZ1lCS0tGWjVWaFhvMWZnLlQyMWhXTjZkX29pSnZZcWpfOThrRENVZkFldkVTckEyNHZYd2ZNYmxjTE5NeC03emRKcjVuUW0wajRzX0F1VS10SlAtUFZOWUZ6Qm9lZ29pTWFTXzRmeE52VGlFSUtFOERFMWRnQWpyblB6WldfQ0pBcXdEcFpRQnlpa1RLZmtJamVvVllYLUlSUlVWY1QxNEhhcmhHQktfU3hvSW9jQmZtWjV4aVc4SVNpUWxHeFNyMjhfbU81YXEzS3M5V05DYTVZWlJHUnpqSlRNSlJHa2tMNDFxdVEuNlEwWDhDaTVLV19kdGllQ1oyUWVfdw.nfmeio4xKklqFvmQMfHMrQFBNI1BqgP-MUfDn-eVJ2Kp5xe2Ku6PymUYwg_8TUP7yg9GtMee0TUa5sQlvvHZqQ', 52 | 'content-type': 'application/json', 53 | # 'cookie': 'wz_uuid=X%2Fa4b7e834699f617fc2428d3d3e509928; sensorsdata2015jssdkchannel=%7B%22prop%22%3A%7B%22_sa_channel_landing_url%22%3A%22%22%7D%7D; Hm_lvt_9ea3e7293b7c088e0d2c88874b63e7dd=1689777143; token=eyJhbGciOiJIUzUxMiJ9.ZXlKNmFYQWlPaUpFUlVZaUxDSmhiR2NpT2lKa2FYSWlMQ0psYm1NaU9pSkJNVEk0UTBKRExVaFRNalUySW4wLi50dGs5YlNkZ1lCS0tGWjVWaFhvMWZnLlQyMWhXTjZkX29pSnZZcWpfOThrRENVZkFldkVTckEyNHZYd2ZNYmxjTE5NeC03emRKcjVuUW0wajRzX0F1VS10SlAtUFZOWUZ6Qm9lZ29pTWFTXzRmeE52VGlFSUtFOERFMWRnQWpyblB6WldfQ0pBcXdEcFpRQnlpa1RLZmtJamVvVllYLUlSUlVWY1QxNEhhcmhHQktfU3hvSW9jQmZtWjV4aVc4SVNpUWxHeFNyMjhfbU81YXEzS3M5V05DYTVZWlJHUnpqSlRNSlJHa2tMNDFxdVEuNlEwWDhDaTVLV19kdGllQ1oyUWVfdw.nfmeio4xKklqFvmQMfHMrQFBNI1BqgP-MUfDn-eVJ2Kp5xe2Ku6PymUYwg_8TUP7yg9GtMee0TUa5sQlvvHZqQ; accessToken=eyJhbGciOiJIUzUxMiJ9.ZXlKNmFYQWlPaUpFUlVZaUxDSmhiR2NpT2lKa2FYSWlMQ0psYm1NaU9pSkJNVEk0UTBKRExVaFRNalUySW4wLi50dGs5YlNkZ1lCS0tGWjVWaFhvMWZnLlQyMWhXTjZkX29pSnZZcWpfOThrRENVZkFldkVTckEyNHZYd2ZNYmxjTE5NeC03emRKcjVuUW0wajRzX0F1VS10SlAtUFZOWUZ6Qm9lZ29pTWFTXzRmeE52VGlFSUtFOERFMWRnQWpyblB6WldfQ0pBcXdEcFpRQnlpa1RLZmtJamVvVllYLUlSUlVWY1QxNEhhcmhHQktfU3hvSW9jQmZtWjV4aVc4SVNpUWxHeFNyMjhfbU81YXEzS3M5V05DYTVZWlJHUnpqSlRNSlJHa2tMNDFxdVEuNlEwWDhDaTVLV19kdGllQ1oyUWVfdw.nfmeio4xKklqFvmQMfHMrQFBNI1BqgP-MUfDn-eVJ2Kp5xe2Ku6PymUYwg_8TUP7yg9GtMee0TUa5sQlvvHZqQ; creditNo=%22%22; param_sign=rqd3lt; SSO_SESSION_ID=YzI3YWJjOWEtYTgyNC00MDVlLTk4ZGItNGJkNDM1NTg1YWUz; acw_tc=784e2ca816900794228843102e20ad4a6f8c79118e26d4a2b126f5024b728c; patentDetailTechnicalSupportShowTime=show; Hm_lpvt_9ea3e7293b7c088e0d2c88874b63e7dd=1690080902; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2204dc736832124b66841aa70b1d9d1d65%22%2C%22first_id%22%3A%221896e90f5a7d41-020705f8463bb2c-1b525634-2073600-1896e90f5a8cb8%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfbG9naW5faWQiOiIwNGRjNzM2ODMyMTI0YjY2ODQxYWE3MGIxZDlkMWQ2NSIsIiRpZGVudGl0eV9jb29raWVfaWQiOiIxODk2ZTkwZjVhN2Q0MS0wMjA3MDVmODQ2M2JiMmMtMWI1MjU2MzQtMjA3MzYwMC0xODk2ZTkwZjVhOGNiOCJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%2204dc736832124b66841aa70b1d9d1d65%22%7D%2C%22%24device_id%22%3A%221896e90f5a7d41-020705f8463bb2c-1b525634-2073600-1896e90f5a8cb8%22%7D; x-web-ip=113.77.243.101, 120.78.44.166, 100.121.108.213', 54 | 'device-id': 'BagomEiCgy9JAwmXvGbEkcLZXnAe4wCOn5gsmssX9ifgzPdJKTXQQbYBXQtEHh3wDMJCHS5DeqbJeTcvNdWZDQA==', 55 | 'eagleeye-pappname': 'fyw9n1jhpf@545ab88155a2a87', 56 | 'eagleeye-sessionid': '9klIwkvkeO9umRjeacsvna2j1pR6', 57 | 'eagleeye-traceid': '20f1728d16900809365551035a2a87', 58 | 'h5version': 'v1.0.0', 59 | 'origin': 'https://patents.qizhidao.com', 60 | 'referer': 'https://patents.qizhidao.com/', 61 | 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', 62 | 'sec-ch-ua-mobile': '?0', 63 | 'sec-ch-ua-platform': '"macOS"', 64 | 'sec-fetch-dest': 'empty', 65 | 'sec-fetch-mode': 'cors', 66 | 'sec-fetch-site': 'same-site', 67 | 'sensordeviceid': '1896e90f5a7d41-020705f8463bb2c-1b525634-2073600-1896e90f5a8cb8', 68 | 'sensorsdistinctid': '04dc736832124b66841aa70b1d9d1d65', 69 | 'signature': '4e0277e900072ceb7f4ea5b7086f2401.etQF71', 70 | 'token': 'eyJhbGciOiJIUzUxMiJ9.ZXlKNmFYQWlPaUpFUlVZaUxDSmhiR2NpT2lKa2FYSWlMQ0psYm1NaU9pSkJNVEk0UTBKRExVaFRNalUySW4wLi50dGs5YlNkZ1lCS0tGWjVWaFhvMWZnLlQyMWhXTjZkX29pSnZZcWpfOThrRENVZkFldkVTckEyNHZYd2ZNYmxjTE5NeC03emRKcjVuUW0wajRzX0F1VS10SlAtUFZOWUZ6Qm9lZ29pTWFTXzRmeE52VGlFSUtFOERFMWRnQWpyblB6WldfQ0pBcXdEcFpRQnlpa1RLZmtJamVvVllYLUlSUlVWY1QxNEhhcmhHQktfU3hvSW9jQmZtWjV4aVc4SVNpUWxHeFNyMjhfbU81YXEzS3M5V05DYTVZWlJHUnpqSlRNSlJHa2tMNDFxdVEuNlEwWDhDaTVLV19kdGllQ1oyUWVfdw.nfmeio4xKklqFvmQMfHMrQFBNI1BqgP-MUfDn-eVJ2Kp5xe2Ku6PymUYwg_8TUP7yg9GtMee0TUa5sQlvvHZqQ', 71 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 72 | 'user-agent-web': 'X/a4b7e834699f617fc2428d3d3e509928', 73 | } 74 | 75 | json_data = { 76 | 'text_ver': 'N', 77 | 'subWordSwitch': None, 78 | 'sortColumns': [ 79 | { 80 | 'columnName': '_score', 81 | 'shortName': '_score', 82 | 'sortType': 0, 83 | }, 84 | ], 85 | 'listColumns': [ 86 | { 87 | 'name': '标题', 88 | 'shortName': 'TI', 89 | 'columnName': 'patent_name', 90 | }, 91 | { 92 | 'name': '公开(公告)号', 93 | 'shortName': 'PN', 94 | 'columnName': 'out_num', 95 | }, 96 | { 97 | 'name': '摘要', 98 | 'shortName': 'ABS', 99 | 'columnName': 'patent_brief', 100 | }, 101 | { 102 | 'name': '摘要附图', 103 | 'shortName': 'IMAGE', 104 | 'columnName': 'patent_img', 105 | }, 106 | { 107 | 'name': '当前权利人', 108 | 'shortName': 'ASP', 109 | 'columnName': 'patent_person', 110 | }, 111 | { 112 | 'name': '发明(设计)人', 113 | 'shortName': 'IN', 114 | 'columnName': 'designer', 115 | }, 116 | { 117 | 'name': '申请日', 118 | 'shortName': 'AD', 119 | 'columnName': 'app_date', 120 | }, 121 | { 122 | 'name': '公开(公告)日', 123 | 'shortName': 'PD', 124 | 'columnName': 'out_date', 125 | }, 126 | { 127 | 'name': '申请号', 128 | 'shortName': 'AN', 129 | 'columnName': 'app_num_standard', 130 | }, 131 | ], 132 | 'columnType': 1, 133 | 'orderColumn': '_score', 134 | 'orderType': '_score', 135 | 'simpleVersion': True, 136 | 'current': 1, 137 | 'pageSize': 20, 138 | 'statement': '华为', 139 | 'filter': '', 140 | 'pageCount': 21073, 141 | 'checkResult': True, 142 | } 143 | 144 | response = requests.post( 145 | 'https://app.qizhidao.com/qzd-bff-patent/patent/simple-version/search', 146 | cookies=cookies, 147 | headers=headers, 148 | json=json_data, 149 | ).json() 150 | 151 | 152 | data = AES_decrypt(response["data1"], response["hasUse"]) 153 | 154 | print(data) 155 | 156 | -------------------------------------------------------------------------------- /2023_06/demo1_whggzy/whggzy.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | url = "http://www.whggzy.com/front/search/category" 4 | 5 | headers = { 6 | # 这两个参数是必须的 7 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36", 8 | "Referer": "http://www.whggzy.com/PurchaseAdvisory/index.html", 9 | 10 | # 通过xhr断点找到接口的headers包含一下几个 11 | 'Accept': "*/*", 12 | 'Content-Type': "application/json", 13 | 'X-Requested-With': "XMLHttpRequest", 14 | 15 | 16 | } 17 | 18 | # 通过查看参数发现data传的是字符串,所以这个通过字符串的方式发送data,而不是字典 19 | data = '''{ 20 | "categoryCode": "MostImportant", 21 | "pageNo": 1, 22 | "pageSize": 15 23 | }''' 24 | 25 | print(requests.post(url, headers=headers, data=data).text) 26 | -------------------------------------------------------------------------------- /2023_06/demo2_qiming/qiming.py: -------------------------------------------------------------------------------- 1 | """python调用js""" 2 | import json 3 | 4 | import execjs 5 | import requests 6 | 7 | url = 'https://vipapi.qimingpian.cn/DataList/productListVip' 8 | 9 | headers = { 10 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" 11 | } 12 | 13 | data = { 14 | "time_interval": "", 15 | "tag": "", 16 | "tag_type": "", 17 | "province": "", 18 | "lunci": "", 19 | "page": 1, 20 | "num": 20, 21 | "unionid": "" 22 | } 23 | 24 | # 打开js文件 25 | with open("./demo2_qiming.js", "r") as f: 26 | jscode = f.read() 27 | 28 | # 调用api接口拿到加密数据 29 | resp = requests.get(url, headers=headers, data=data).json() 30 | 31 | # 调用js文件 32 | ctx = execjs.compile(jscode).call('s', resp["encrypt_data"]) 33 | 34 | print(ctx) 35 | print(f"type:{type(ctx)}") -------------------------------------------------------------------------------- /2023_06/demo3_mohurd/mohurd.js: -------------------------------------------------------------------------------- 1 | const CryptoJS = require('crypto-js') 2 | // jsdom hash md5 逆向算法 3 | 4 | function m(t) { 5 | // d.a是CryptoJS 6 | var f = CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn") 7 | var h = CryptoJS.enc.Utf8.parse("0123456789ABCDEF") 8 | var e = CryptoJS.enc.Hex.parse(t), 9 | 10 | n = CryptoJS.enc.Base64.stringify(e), 11 | a = CryptoJS.AES.decrypt(n, f, { 12 | iv: h, 13 | mode: CryptoJS.mode.CBC, 14 | padding: CryptoJS.pad.Pkcs7 15 | }), 16 | r = a.toString(CryptoJS.enc.Utf8); 17 | return r.toString() 18 | } 19 | 20 | var data = '95780ba0943730051dccb5fe3918f9fe1b6f2130681f99d5620c5497aa480f13f32e8cc4b2f871a9a59a1d0117ce9456ce6b66396085eaa2822aa2ffc121eac1885d297bbd68dcda88cd8b0b29e282f9fd6b8392d52b817608665d8a565119f3346fb19449490842b923ec5781524595bc078b2c15e47473f15860e2ed45c9dbab5a750581a26fcb22b99228eb09b541e83ac3724f373a7512ac3827fa40354d1e9af350488194daf6b0317870a9a65dee320e0d4cb84708b25e383c02095c17f20d09fb39ab6e1a150c85818ecc2a31c384412859eff0026319094965cffffbc42c9495ee35f03b2440b8baac751927c38b616dc2042a64223fa6a72f1dc685fcbb38fd7cc47f1efbc9f5bd2c7490e58fbd36cf5a3b4be852fac87c6e682bb7d554b9990431e2d550d914754c6ac899fef97980084a6ba4bfda771be81ea11fd1542b6ffafe1439be2c94f74f6a83bfce6d2bc2e9dc1d86b84eeb85c2b8dda8846d65232148f9d88ac4a675d2049c1ac6efae1e4a5f4a106f0e627fb89199d9491303a792672832269e9a5cc208be00fbf1baf342262ebdbef5eaf3a50a52eeae2811f2813697018bf103df428dc0d496af435d2384b2198000add245d87233c3955695a6daa1bb4bc5a8657b2c9dfbf9f4067097df759f5724a5cb3a747a58509e2f22da6cbcdd29ba95dc555cd40cba6d0a2eced0b15ece067bc949dce784b2ceb06a61e9f7dc8943445da701c15fc7053f2c21ea1fc877e02280d22f913983c6f1dead091312c37aa90a5967b71b4c34dab24468bde5f747d8f44f8fd4b0fa493ff49b92441a7e1e8c256a6a18573baa1bf16f5093e36a7c9e282a3156dba776ea6a94794c9a034ae4f5e77761e49569d194d10703302476e7fd8e25ab4669f0c7a6c7d0e2680847d77ea5a585f7f60e7fcebb1ae791b8216bb25b644f5094157bd62c6aebf0a7faf173b2fde0da6f9ebb0dcab8a129c11b9f972445aee5297d38e0cc72d0b4d9c84c7e6b0ecf592d37998d04df8c52d5776c2741863b5fefd69302f176909b6bc065c4b81fc959a348368d250a03a86145f81950937ca83e3a765e6afd71d00c68faeca8d4d76f5ad762fc7d17fd05894857841bec355bb1d7f75db95c8e30dea58536ac6288fd3429ca9ab48d1eddb48631734ce2a574d79b93952fa2c9e9665c6337b35ea2309344cd22fe1b92dbd02051917d6c5edf1f2259c5f8a0cb3fbd00391c298f0461ba16a2300337d0b60b224bc6b796cedeb427cd07d97f17460d490bc3b112d2b8403026ff5ff5a70dde82cf210f22c3c206ca3bfe34cc137bedad0f1ae712d7168226a42fd22f9e17dede40654157e4c4756bd10292c7d0e2eefba36634309aeb24d3725802243e2003a68dac0a3b539eed0dca51f6f0d57a5c58a117fc56910d0e7319b05e0fc4a5137952e2f958636b584973da7dd61b63101e2d0cffe2b249c562b72b64fb6ca67ed0246bf0f9185fe22c87dc6d3c8374239dd4e70cdbc5ccacbd359dea203c021ac7d54998b2f1571d7f787a3ce1c4fda45037bd33be1ff9da883a556e2ef81ad2047d35a5065e73402e0e02231bcb3724445df198ad53112db4690091a98edea0fd194480b4193c2e9bb1cee1fb37654fce593cc88c59537003dd297be5d88834ec00595a4dda9fe44e14193482f1d212cf33ec58be3edfbecf7c7908bbf4c4b9beee5d0ef148e1bbdae9daea30beadcc6f5639a6f4eb57719fda5bc0e8766a52da34f17f2aa1a4b608fb6e53938d8e74d3b53aaeee663e1053e8444d44fb7a782d3b087155c9341559ada772299b988e859039435751592c25532090c0cc1a4445ba93ab3a1c9e8cd198251ed3ed76cc5091b83ead3cf1e11ceeeb0461e923c394a0a9f37220b9a5ed8e5f01b360eb6661a6456cde6a4497186567d4324d469277be217c03b84048ad272a3ea49b943f4c7c70487d060cd24cd9ea61032207c2a13c1384e0b5159d70d78d5e224401b5142ca2548ff2a13d1029a3b54dd68c7ac03d2c004c645ea586cdebf96267fffac4079305e37ab11e3af6bdff0e296ee4b5efdd00b48f44a91eb8475ddd6668a0b7548a7640229aeb650f76e02005b782a0a082175f256654aa8e0f3e3675726c9697978fd4ac35b6b64107e373cf80a9881152e62b2c1841292dbc40c41a7a36c8d353f2add2731415dcd81be8b3cdbfe26dec973a4e6edf2382992409db93aea8f354fbea21a21c54747ac540e752b5b13fee5f5d30277de7178eb998e31656b266c4de884a878251d6108ef36bfe8ec1020cbd469debe57478fb3af6d369a6e12499ba5ee436cef3f3089aa1710a0ddf84809875b5fb0cf1ee1aedbb25e0df0617f1ec2b6bea1671d2adf79a7d6789b019218bcc7219cb9a53f47dcffccd129a48cebb2433fa9d7e547a651a09c2bf4637639d2c08aee3d7e10d2b2474e1a4ecc22e932cddfd6c4caa781af8eed3a8ff0a261ae116e134b76b7e5d084ba242b0a109b424e4e74d0a0018290b491a97e571977e09d79047ddd510dd7102548a14b04938cac79c15a7e03a4ed64f69168b93a5ad5608a3edf433363f07fa601383566b537230df6a46c073ec472e7be790a92af7db67d1334cd1098fa339cfe858e759f918c6bed01402cce8aa43512ce1a9208531edfe16ae743aaf5357587372e248a68d7d33698764d05234a19d84c1566e4e96d13457f8d273609ced3662356687a65ee59868325334883ea21552dacb8b8bbafe68b98ba402b6ddbdfa0040f0dc5fafa02b9ebb7216ab7443b3bd4580a207c3a6beca773d061ea384908a23d739adbbc690a7dd5ec67d59bc9025a6ba708d8d7c63785acc455e1fe6e6a3acf46f9786c12100db59c71f32b5648804cdb40cca356cd5bf8503f12e30eb575a440fa115539d53ee5f6e8269260cdc2e825b408726dd74953a11914a17e263f8355fb0df890f605856f65837d87b70262e6ad03e21f947d154a9f99cd1b904eb72065dc03b449233597b2072ab1b6ea3d408017b9a21eba679633fb88381346a6193ae9a0bab1c16bb8e8a53d75b3c1746b504ed0c45be0694d115ae012109ada0dad961ad107e3c2568fe5baa57e18267399421056f1c1e63feef5e50ec3a89d9507212f3eea0140e8cb52499356d033e07452deebdb7d8ed03106c22b294dc6fa50ca8114855a238418d6a914a633d5835085ac004f35c41e65fcae25d155b338eabfc98e01483d4e00fdcb0caae3e8f544dcedc90bd1393a426aafbe6d98d4a016cbb9097c01f3153d05659f382366f36f025283fac809fc7322898964aeac267bd323981d59afad32568e40ff006cdadeeb18e6ba7a9fb9956f878f10e6fc028e005bfb50feb3accdc6c14e5f7237f996a8cb2599a42bd0ccff426f6dcf087d3a97d0120e4383e62d81eea5d73b7b43e41d5251d329f228168f12437f67cbf420bf2d2b71dd67b8523cfdbd219d1c7251d148e42aa1ecd42e8693516047b0abb47d3ffaf83945c9f6a17a248d7aceb42e2af242701d8d239ac0f6c2035768474f0e7801a9584191e40042d6b410b3b9d40cd436396f1c1b68eaf6b21e3e6494984d640a54563ced6fd020c8ccbae41e9eddd68a3f174e7495db3bdd4a2f8b7f38aa9631aa4bde9567b4526d851b071b95e7af042cbecd6b4d78fc89958c93bac5b68d30761628dfe10a908600b98b65e8b7a5b3067cd1aaa57d3d3f8942e08ef5891aae7012d2f5fe30bb8153d615814ef6e35ce4f1de79848e1b623b399bbbc07ba6ec56e1d5fd9ba184d3ac31d74b5645ba29088575d06915586ea7c789d942f04641af94a873aba213e4de646c466011c26af27b10406a852bd2cb9a3f4bc818f2555dd6187ba9249dea59985b50d0902dd9f3dedc45c1a8056d4feaaf94878bd8c6b1aeefb7baec6018c843559a54cdfcf0571c92cedc137682002bb29188eb0b3f37849c2d0cfc63e26f3dccd38ca23070a6b43f651780dcbe82453bfe22d2af70225c9cde8bb6070bb4934aa45f9eabf2443336b9160eae8c4f4ecf34a5483fe354996f2ea03d5003d8005f99c721f6b3df1c662345b1717df8ecd650d1cb1be67ef03c85c96d0b8f9b98b31a48c81a11bd95832652985f27eea0ff0d1d4a2d4b9b80c301d2f5f5aceedebde590a2fbcd0c3aea6f092b6b14b2bf638f36b7a84c8bff4aa5c968679d47bc5ff5851a8aede8b408e38c15f0dd828ba41bdeece59f228e69e65bf3765be1d8b2674b602c108b2e01c37986994d261b03fd22a418d24092f75df8ff1add8538bce478b24e74d1d8d1a00371579144ed729b5b148149373de8edc5d421f286fef1e1718c37f2aadbdbaddd058e8f9ff7f14e9bd37cc7cfc78a70cadc71330f9aeae2cbfd73c5dc4931eb060032a955ddcd74fd88bb948db78e2bba24f0fa79106684654ee65e287335bc07069bb7da8602cb0cf195451c4bdc25ba40838a37239b42c4c0422e2eff334fbe65603f7b2698528b5d2dac3ace7366e42af15b5e9420273ad342110f873fe8b8fb503d7e1dff071d86f8c41372afa05398ef0378479367ef55634aeadcd115512ec13f69d8f703b7ea5189679c78d76da8bde66a272c21ef12b8f3d262d6f00b0fd9ec2d49e50f0564bbfee942007e6f3d57dff860af818f8d84a416902f9be306a6a16fd4004f3410ca591ea9e039b6652d60c71ea4f018c54f91f0f0580e4f92aef97776d76173f10dd4f7a00f7545dd2a564a31ecb44267cfe5c0f05d929813f6f49d64e104a631b6f48813c3e363a2d045688a158564b4c7909a53a40736e80e641fcbb7140eafb42113f8a8fccb304ca4b8c0c5d4c085beb70e9b86ea4365ec674be41b94be15a95205615380df50ea99f7b3be063af4b338dbede597c7a4b620d8cc7a92bcd302ec0193fded07ddac7b9b6286578defaef9bfb78ac1f5b0f3f3a7b04c8bc90e74b110f54ca0ec99cf18fa2c4ab32b258e5ad50c8ebedef6bc4065375ec985dd253de043d44b11702462d3b52fd933e0dc2c4a5c85b64eb71585f8c8b884ac35e25ce29b5faa8a56143db1e9582d6c0041ee95eb1b309ca1b25338dad55a2ad6cd724f357adaf50a04fe34d2ac868b25783bcb26ed6b9b349b0649261063e3cbd0bc7164280f690f73b41e5c60d54459714e7fc24c529568afeb53c5fc1556f95283db3cd00d1d655212a7859186f657672305bdda28e40d15f11b7ae4d038ab63214f93a0bb40d0badebe492566ed6c9a0ea86652f924437185bc09ac3b86b1953e1e3c15de68bf32977cc479063bb8d436a9a1c60d8e012a44aebfb14c9c42e9eabc13a5eeeb329d007701ff19316e02c795627e7c391821a1f2e1254594a49c7727d683187095403ef7ff4a24f773492fc454cd1c583f1abd409ed82f2d4106a97bd35645684c486fb2f6800940f24708d4c5a7f17b2fdc75d9259a32efb3e62494b8fdec9dd48905810b2bd67fe30a6dc89cafb5a1e72c64a325d4f0f27898b9bd3a88d95661c7dda699562fd7a7a1de5d325d7e4de19274250add5bd9a92ffdb62709e2b3ab667bec4891fdfb1849ca1fe6030464842d9a798a55fa40d0b8c9854d8416e6bd45d474f5beac902f462f7d29873ce8688859555a7a5e7a58a42f0b777e5354785db94fc09b862f86236ed42f2dc40e6d534c9a2c3983595137177d1427c2cf18e4cf9a77ad25b5b6f26ad08562e96fa3a37f9874f875caed57d786b931f369d54c72b5c833133599e6abdc4206f049962d236f10ee05c96ed77371d92df69fa35dbb6fa1751c4df970317430c0d680f434d5fe365bd4eeaf4165037c3976463cae7bc6d7ad587779b6f0251e5eb56e5fee645fae414a7203aa62eaee13b2e9801716769c55e394b3f4cbb6e82544e4969c487e8b02b17fd429d67aa80e24a75ad8d9756202cc8e74380a4acfc875193eba7f6e4a3672411bd6636cb2296fcc4908caf444a8e9768f81382d01b2087461e69b45cd1e3aae3b70f834f786b9af2c32664243fa5ef5c7ed53e76c3c503af61a9fedd2dfbb3fa97598779b9df3066f394e55359e4540da927a2765f48bd2e4d4a2ce3913d88606ac3fbcbfd07dede3a9b0deb9fbfa143cd97c42a5665741f4e9e7768493eff721cdfe8fe91cca7def6dadca5eeefac8c57cd52289ec0b9f0487d8b842e786e93351b77' 21 | console.log(m(data)); -------------------------------------------------------------------------------- /2023_06/demo3_mohurd/mohurd.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | 4 | """加密""" 5 | 6 | query = f"pg=2&pgsz=15&total=0" 7 | url = f"https://jzsc.mohurd.gov.cn/APi/webApi/dataservice/query/comp/list?{query}" 8 | 9 | headers = { 10 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" 11 | 12 | } 13 | # 获取到原始数据 14 | ori_data = requests.get(url, headers=headers).text 15 | 16 | # 打开js文件 17 | with open("mohurd.js", "r") as f: 18 | jscode = f.read() 19 | 20 | ctx = execjs.compile(jscode).call('m', ori_data) 21 | 22 | print(ctx) 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /2023_06/demo4_endata/endata.py: -------------------------------------------------------------------------------- 1 | """js混淆""" 2 | import execjs 3 | import requests 4 | 5 | url = "https://www.endata.com.cn/API/GetData.ashx" 6 | headers = { 7 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" 8 | 9 | } 10 | data = { 11 | "year": 2023, 12 | "MethodName": "BoxOffice_GetYearInfoData" 13 | } 14 | ori_data = requests.post(url, headers=headers, data=data).text 15 | 16 | with open("endata.js", 'r') as f: 17 | js_code = f.read() 18 | 19 | result = execjs.compile(js_code).call("webInstace.shell", ori_data) 20 | 21 | print(result) 22 | 23 | # (webInstace.shell(data)); 24 | -------------------------------------------------------------------------------- /2023_06/demo5_1688/h.js: -------------------------------------------------------------------------------- 1 | function h(a) { 2 | function b(a, b) { 3 | return a << b | a >>> 32 - b 4 | } 5 | 6 | function c(a, b) { 7 | var c, d, e, f, g; 8 | return e = 2147483648 & a, 9 | f = 2147483648 & b, 10 | c = 1073741824 & a, 11 | d = 1073741824 & b, 12 | g = (1073741823 & a) + (1073741823 & b), 13 | c & d ? 2147483648 ^ g ^ e ^ f : c | d ? 1073741824 & g ? 3221225472 ^ g ^ e ^ f : 1073741824 ^ g ^ e ^ f : g ^ e ^ f 14 | } 15 | 16 | function d(a, b, c) { 17 | return a & b | ~a & c 18 | } 19 | 20 | function e(a, b, c) { 21 | return a & c | b & ~c 22 | } 23 | 24 | function f(a, b, c) { 25 | return a ^ b ^ c 26 | } 27 | 28 | function g(a, b, c) { 29 | return b ^ (a | ~c) 30 | } 31 | 32 | function h(a, e, f, g, h, i, j) { 33 | return a = c(a, c(c(d(e, f, g), h), j)), 34 | c(b(a, i), e) 35 | } 36 | 37 | function i(a, d, f, g, h, i, j) { 38 | return a = c(a, c(c(e(d, f, g), h), j)), 39 | c(b(a, i), d) 40 | } 41 | 42 | function j(a, d, e, g, h, i, j) { 43 | return a = c(a, c(c(f(d, e, g), h), j)), 44 | c(b(a, i), d) 45 | } 46 | 47 | function k(a, d, e, f, h, i, j) { 48 | return a = c(a, c(c(g(d, e, f), h), j)), 49 | c(b(a, i), d) 50 | } 51 | 52 | function l(a) { 53 | for (var b, c = a.length, d = c + 8, e = (d - d % 64) / 64, f = 16 * (e + 1), g = new Array(f - 1), h = 0, i = 0; c > i;) 54 | b = (i - i % 4) / 4, 55 | h = i % 4 * 8, 56 | g[b] = g[b] | a.charCodeAt(i) << h, 57 | i++; 58 | return b = (i - i % 4) / 4, 59 | h = i % 4 * 8, 60 | g[b] = g[b] | 128 << h, 61 | g[f - 2] = c << 3, 62 | g[f - 1] = c >>> 29, 63 | g 64 | } 65 | 66 | function m(a) { 67 | var b, c, d = "", e = ""; 68 | for (c = 0; 3 >= c; c++) 69 | b = a >>> 8 * c & 255, 70 | e = "0" + b.toString(16), 71 | d += e.substr(e.length - 2, 2); 72 | return d 73 | } 74 | 75 | function n(a) { 76 | a = a.replace(/\r\n/g, "\n"); 77 | for (var b = "", c = 0; c < a.length; c++) { 78 | var d = a.charCodeAt(c); 79 | 128 > d ? b += String.fromCharCode(d) : d > 127 && 2048 > d ? (b += String.fromCharCode(d >> 6 | 192), 80 | b += String.fromCharCode(63 & d | 128)) : (b += String.fromCharCode(d >> 12 | 224), 81 | b += String.fromCharCode(d >> 6 & 63 | 128), 82 | b += String.fromCharCode(63 & d | 128)) 83 | } 84 | return b 85 | } 86 | 87 | var o, p, q, r, s, t, u, v, w, x = [], y = 7, z = 12, A = 17, B = 22, C = 5, D = 9, E = 14, F = 20, G = 4, H = 11, 88 | I = 16, J = 23, K = 6, L = 10, M = 15, N = 21; 89 | for (a = n(a), 90 | x = l(a), 91 | t = 1732584193, 92 | u = 4023233417, 93 | v = 2562383102, 94 | w = 271733878, 95 | o = 0; o < x.length; o += 16) 96 | p = t, 97 | q = u, 98 | r = v, 99 | s = w, 100 | t = h(t, u, v, w, x[o + 0], y, 3614090360), 101 | w = h(w, t, u, v, x[o + 1], z, 3905402710), 102 | v = h(v, w, t, u, x[o + 2], A, 606105819), 103 | u = h(u, v, w, t, x[o + 3], B, 3250441966), 104 | t = h(t, u, v, w, x[o + 4], y, 4118548399), 105 | w = h(w, t, u, v, x[o + 5], z, 1200080426), 106 | v = h(v, w, t, u, x[o + 6], A, 2821735955), 107 | u = h(u, v, w, t, x[o + 7], B, 4249261313), 108 | t = h(t, u, v, w, x[o + 8], y, 1770035416), 109 | w = h(w, t, u, v, x[o + 9], z, 2336552879), 110 | v = h(v, w, t, u, x[o + 10], A, 4294925233), 111 | u = h(u, v, w, t, x[o + 11], B, 2304563134), 112 | t = h(t, u, v, w, x[o + 12], y, 1804603682), 113 | w = h(w, t, u, v, x[o + 13], z, 4254626195), 114 | v = h(v, w, t, u, x[o + 14], A, 2792965006), 115 | u = h(u, v, w, t, x[o + 15], B, 1236535329), 116 | t = i(t, u, v, w, x[o + 1], C, 4129170786), 117 | w = i(w, t, u, v, x[o + 6], D, 3225465664), 118 | v = i(v, w, t, u, x[o + 11], E, 643717713), 119 | u = i(u, v, w, t, x[o + 0], F, 3921069994), 120 | t = i(t, u, v, w, x[o + 5], C, 3593408605), 121 | w = i(w, t, u, v, x[o + 10], D, 38016083), 122 | v = i(v, w, t, u, x[o + 15], E, 3634488961), 123 | u = i(u, v, w, t, x[o + 4], F, 3889429448), 124 | t = i(t, u, v, w, x[o + 9], C, 568446438), 125 | w = i(w, t, u, v, x[o + 14], D, 3275163606), 126 | v = i(v, w, t, u, x[o + 3], E, 4107603335), 127 | u = i(u, v, w, t, x[o + 8], F, 1163531501), 128 | t = i(t, u, v, w, x[o + 13], C, 2850285829), 129 | w = i(w, t, u, v, x[o + 2], D, 4243563512), 130 | v = i(v, w, t, u, x[o + 7], E, 1735328473), 131 | u = i(u, v, w, t, x[o + 12], F, 2368359562), 132 | t = j(t, u, v, w, x[o + 5], G, 4294588738), 133 | w = j(w, t, u, v, x[o + 8], H, 2272392833), 134 | v = j(v, w, t, u, x[o + 11], I, 1839030562), 135 | u = j(u, v, w, t, x[o + 14], J, 4259657740), 136 | t = j(t, u, v, w, x[o + 1], G, 2763975236), 137 | w = j(w, t, u, v, x[o + 4], H, 1272893353), 138 | v = j(v, w, t, u, x[o + 7], I, 4139469664), 139 | u = j(u, v, w, t, x[o + 10], J, 3200236656), 140 | t = j(t, u, v, w, x[o + 13], G, 681279174), 141 | w = j(w, t, u, v, x[o + 0], H, 3936430074), 142 | v = j(v, w, t, u, x[o + 3], I, 3572445317), 143 | u = j(u, v, w, t, x[o + 6], J, 76029189), 144 | t = j(t, u, v, w, x[o + 9], G, 3654602809), 145 | w = j(w, t, u, v, x[o + 12], H, 3873151461), 146 | v = j(v, w, t, u, x[o + 15], I, 530742520), 147 | u = j(u, v, w, t, x[o + 2], J, 3299628645), 148 | t = k(t, u, v, w, x[o + 0], K, 4096336452), 149 | w = k(w, t, u, v, x[o + 7], L, 1126891415), 150 | v = k(v, w, t, u, x[o + 14], M, 2878612391), 151 | u = k(u, v, w, t, x[o + 5], N, 4237533241), 152 | t = k(t, u, v, w, x[o + 12], K, 1700485571), 153 | w = k(w, t, u, v, x[o + 3], L, 2399980690), 154 | v = k(v, w, t, u, x[o + 10], M, 4293915773), 155 | u = k(u, v, w, t, x[o + 1], N, 2240044497), 156 | t = k(t, u, v, w, x[o + 8], K, 1873313359), 157 | w = k(w, t, u, v, x[o + 15], L, 4264355552), 158 | v = k(v, w, t, u, x[o + 6], M, 2734768916), 159 | u = k(u, v, w, t, x[o + 13], N, 1309151649), 160 | t = k(t, u, v, w, x[o + 4], K, 4149444226), 161 | w = k(w, t, u, v, x[o + 11], L, 3174756917), 162 | v = k(v, w, t, u, x[o + 2], M, 718787259), 163 | u = k(u, v, w, t, x[o + 9], N, 3951481745), 164 | t = c(t, p), 165 | u = c(u, q), 166 | v = c(v, r), 167 | w = c(w, s); 168 | var O = m(t) + m(u) + m(v) + m(w); 169 | return O.toLowerCase() 170 | } -------------------------------------------------------------------------------- /2023_06/demo5_1688/sign_1688.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | import requests 4 | import execjs 5 | 6 | # 请求的参数 7 | data = '{"cid":"FactoryRankServiceWidget:FactoryRankServiceWidget","methodName":"execute","params":"{\\"extParam\\":{\\"methodName\\":\\"readRelatedRankEntries\\",\\"cateId\\":\\"10166\\",\\"size\\":\\"15\\"}}"}' 8 | 9 | # sign = token & 时间戳 & g & 请求参数 10 | token = "2a3e896698e27affa623d6ecd90aca5e" 11 | i = int(time.time() * 1000) 12 | g = "12574478" 13 | # 拼接出字符串 14 | j = f"{token}&{i}&{g}&{str(data)}" 15 | 16 | # 使用js文件生成sign 17 | with open("h.js", "r", encoding="utf-8") as f: 18 | js_code = f.read() 19 | sign = execjs.compile(js_code).call("h", j) 20 | 21 | # 设置header和params 22 | headers = { 23 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36", 24 | "Referer": "https://sale.1688.com/", 25 | # 这里需要传入cookie,不然会提示token为空 26 | "Cookie":"ali_apache_id=11.186.201.43.1663984139311.308083.7; lid=%E6%93%A6%E8%82%A9%E8%80%8C%E8%BF%87_i; ali_apache_track=c_mid=b2b-304522062300831|c_lid=%E6%93%A6%E8%82%A9%E8%80%8C%E8%BF%87_i|c_ms=1; alicnweb=touch_tb_at%3D1663984141571%7Clastlogonid%3D%25E6%2593%25A6%25E8%2582%25A9%25E8%2580%258C%25E8%25BF%2587_i; cookie2=18fcec77ee17f5a0befe325b42e559c1; sgcookie=E100uLL9nh0QfcW2lMNwr8FDApO7CvIHlwKtUR5G1KocviAC7UKDzEtWXrEdn4ZjMfFwtpoNgTt6A35P4OSwhcR14WifvxsQwS5zPQiEvjCf%2Bkg%3D; t=98a2c5ef884a77ed116b8c40aa337b55; _tb_token_=335e17e513ee3; __cn_logon__=false; ali_ab=183.36.181.166.1685669557509.1; cna=KRiDHKOhigkCAbcGKOLNw97C; xlly_s=1; _csrf_token=1685669653018; _m_h5_tk=2a3e896698e27affa623d6ecd90aca5e_1685700926011; _m_h5_tk_enc=4d2c59116a4b16b003d4aad6ad370526; isg=BJWVwjqdXa0wCHlRwV1TjfrjpJdPkkmkrNr9nhc6KIxabrVg3-LQdKJvOHJY7mFc; l=fBjX5pF7NwyQJ--ZBOfZnurza77TMIRAguPzaNbMi9fPOD1H5b6OW1a6_rYMCnGVFssJR3R4Lnf6BeYBcgI-nxvtjsx8SjkmnmOk-Wf..; tfstk=cvMcBjMSwz_BElvtPqwXhmGAssAdaF6a-AkSUh0tI4EECtH30smFa6WP334DRE51.", 27 | } 28 | # 这里的data、时间戳要和sign里的data一样 29 | params = {"jsv": "2.6.1", "appKey": "12574478", "t": str(i), "sign": sign, "v": "1.0", "type": "jsonp", "isSec": 0, 30 | "timeout": 20000, "api": "mtop.taobao.widgetService.getJsonComponent", "dataType": "jsonp", 31 | "jsonpIncPrefix": "mboxfc", "callback": "mtopjsonpmboxfc3", "data": data} 32 | 33 | url = "https://h5api.m.1688.com/h5/mtop.taobao.widgetservice.getjsoncomponent/1.0/" 34 | print(requests.get(url, headers=headers, params=params).text) 35 | -------------------------------------------------------------------------------- /2023_06/demo6_cinfo/cinfo.py: -------------------------------------------------------------------------------- 1 | # 导入所需的库 2 | import execjs 3 | 4 | # 定义JavaScript代码 5 | with open("ent.js") as f: 6 | js_code = f.read() 7 | # 这里将上述代码粘贴进来 8 | 9 | # 创建一个JavaScript执行环境 10 | ctx = execjs.compile(js_code) 11 | 12 | # 调用getResCode方法 13 | res_code = ctx.call('getResCode') 14 | 15 | # 打印结果 16 | print(res_code) 17 | -------------------------------------------------------------------------------- /2023_06/demo6_cinfo/ent.js: -------------------------------------------------------------------------------- 1 | const CryptoJS = require('crypto-js'); 2 | 3 | (function anonymous() { 4 | (function(_0x1aadd4, _0x23b77f) { 5 | var _0x1b74fa = _0x1aadd4(); 6 | function _0x38fe0a(_0x2ff8e7, _0x5066a8) { 7 | return _0x1d8f(_0x2ff8e7 - -0x13d, _0x5066a8); 8 | } 9 | while (!![]) { 10 | try { 11 | var _0x74665 = parseInt(_0x38fe0a(0x53, 0x44)) / 0x1 * (parseInt(_0x38fe0a(0x47, 0x39)) / 0x2) + -parseInt(_0x38fe0a(0x3d, 0x4e)) / 0x3 * (parseInt(_0x38fe0a(0x3a, 0x2d)) / 0x4) + -parseInt(_0x38fe0a(0x48, 0x44)) / 0x5 * (-parseInt(_0x38fe0a(0x40, 0x40)) / 0x6) + -parseInt(_0x38fe0a(0x4f, 0x5a)) / 0x7 + -parseInt(_0x38fe0a(0x55, 0x43)) / 0x8 * (parseInt(_0x38fe0a(0x3e, 0x4d)) / 0x9) + -parseInt(_0x38fe0a(0x36, 0x2d)) / 0xa + parseInt(_0x38fe0a(0x37, 0x34)) / 0xb * (parseInt(_0x38fe0a(0x43, 0x34)) / 0xc); 12 | if (_0x74665 === _0x23b77f) 13 | break; 14 | else 15 | _0x1b74fa['push'](_0x1b74fa['shift']()); 16 | } catch (_0x210384) { 17 | _0x1b74fa['push'](_0x1b74fa['shift']()); 18 | } 19 | } 20 | }(_0x4221, 0xed879)); 21 | var _0x5743e7 = (function() { 22 | var _0x2fd7a9 = !![]; 23 | return function(_0x37c5c7, _0x214f94) { 24 | function _0x5235cb(_0x378586, _0x26926d) { 25 | return _0x1d8f(_0x378586 - 0x22, _0x26926d); 26 | } 27 | if (_0x5235cb(0x19a, 0x1a7) === _0x5235cb(0x1b5, 0x1b2)) { 28 | if (_0x130f44) { 29 | var _0x5ed0ec = _0x5a1805[_0x5235cb(0x1a8, 0x1b3)](_0x1b9ebb, arguments); 30 | return _0x2e0318 = null, 31 | _0x5ed0ec; 32 | } 33 | } else { 34 | var _0x365f84 = _0x2fd7a9 ? function() { 35 | function _0x1bfac6(_0x322a4d, _0x361eb2) { 36 | return _0x5235cb(_0x322a4d - 0x17a, _0x361eb2); 37 | } 38 | if (_0x214f94) { 39 | var _0x2dfd3a = _0x214f94[_0x1bfac6(0x322, 0x329)](_0x37c5c7, arguments); 40 | return _0x214f94 = null, 41 | _0x2dfd3a; 42 | } 43 | } 44 | : function() {} 45 | ; 46 | return _0x2fd7a9 = ![], 47 | _0x365f84; 48 | } 49 | } 50 | ; 51 | }()); 52 | function _0x5f5228(_0x1b1b46, _0x2d0f9b) { 53 | return _0x1d8f(_0x2d0f9b - -0x3e2, _0x1b1b46); 54 | } 55 | function _0x1d8f(_0x202e67, _0x44a605) { 56 | var _0x481179 = _0x4221(); 57 | return _0x1d8f = function(_0xd7474e, _0x5743e7) { 58 | _0xd7474e = _0xd7474e - 0x173; 59 | var _0x4221a6 = _0x481179[_0xd7474e]; 60 | return _0x4221a6; 61 | } 62 | , 63 | _0x1d8f(_0x202e67, _0x44a605); 64 | } 65 | var _0xd7474e = _0x5743e7(this, function() { 66 | function _0x214126(_0x4b34b5, _0x42bb7e) { 67 | return _0x1d8f(_0x42bb7e - 0x1e5, _0x4b34b5); 68 | } 69 | return _0xd7474e[_0x214126(0x375, 0x366)]()[_0x214126(0x386, 0x37a)](_0x214126(0x37e, 0x36d) + '+$')[_0x214126(0x360, 0x366)]()['constructo' + 'r'](_0xd7474e)[_0x214126(0x382, 0x37a)]('(((.+)+)+)' + '+$'); 70 | }); 71 | function _0x4221() { 72 | var _0x548d0d = ['(((.+)+)+)', 'tempenc', 'indexcode', 'enc', '2273544JIfRMw', 'mode', 'encrypt', '1234567887', '178426RiJhFM', 'Pkcs7', '328656zAegOF', 'QZmsl', 'parse', 'search', 'stringify', 'Utf8', '5338700AEiWPt', '2049916WKpGRn', 'getTime', 'floor', '4gtpMBs', 'LcEdH', 'AES', '1610850kzMWuJ', '369CHAaNq', 'Base64', '42XlTfGL', 'getItem', 'pad', '144nELjqo', 'toString', 'bind', 'ciphertext', '12jIcaPc', '532905BSVQmt', 'apply', '654321']; 73 | _0x4221 = function() { 74 | return _0x548d0d; 75 | } 76 | ; 77 | return _0x4221(); 78 | } 79 | _0xd7474e(), 80 | self[_0x5f5228(-0x247, -0x258)] = { 81 | 'getResCode': function() { 82 | var _0x27ee95 = CryptoJS[_0x49fcfc(-0x112, -0x122)][_0x49fcfc(-0xfd, -0xfc)](CryptoJS[_0x49fcfc(-0x100, -0xf0)][_0x49fcfc(-0xf4, -0xf8)][_0x49fcfc(-0xf7, -0xec)](Math[_0x49fcfc(-0x115, -0x104)](new Date()[_0x49fcfc(-0x116, -0x108)]() / 0x3e8)), CryptoJS[_0x49fcfc(-0x100, -0x112)][_0x49fcfc(-0xf4, -0xfc)]['parse'](localStorage[_0x49fcfc(-0x10d, -0x11d)](_0x49fcfc(-0x102, -0xf5)) || _0x49fcfc(-0xfc, -0xf8) + _0x49fcfc(-0x104, -0x110)), { 83 | 'iv': CryptoJS['enc'][_0x49fcfc(-0xf4, -0xeb)][_0x49fcfc(-0xf7, -0x106)](_0x49fcfc(-0xfc, -0x103) + _0x49fcfc(-0x104, -0x116)), 84 | 'mode': CryptoJS[_0x49fcfc(-0xfe, -0xf2)]['CBC'], 85 | 'padding': CryptoJS[_0x49fcfc(-0x10c, -0x11e)][_0x49fcfc(-0xfa, -0x100)] 86 | }); 87 | function _0x49fcfc(_0xa5e7e9, _0x527e7b) { 88 | return _0x5f5228(_0x527e7b, _0xa5e7e9 - 0x157); 89 | } 90 | return CryptoJS[_0x49fcfc(-0x100, -0xfb)][_0x49fcfc(-0x10f, -0xff)][_0x49fcfc(-0xf5, -0xe5)](_0x27ee95[_0x49fcfc(-0x108, -0xfd)]); 91 | } 92 | ['bind']()[_0x5f5228(-0x253, -0x260)]() 93 | }; 94 | } 95 | ) 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /2023_06/demo7_qimai/qimai.js: -------------------------------------------------------------------------------- 1 | function v(t) { 2 | // 找到这里使用的方法 3 | // t = z[V1](t)[T](/%([0-9A-F]{2})/g, function(n, t) { 4 | t = encodeURIComponent(t).replace(/%([0-9A-F]{2})/g, function (n, t) { 5 | // 这里的Y1是个固定字符 6 | // return o(Y1 + t) 7 | return o("0x" + t) 8 | }); 9 | try { 10 | // boat方法 11 | // return z[Q1](t) 12 | return btoa(t) 13 | } catch (n) { 14 | // 找到这个方法 15 | // return z[W1][K1](t)[U1](Z1) 16 | return Buffer.from(t).toString("base64") 17 | } 18 | } 19 | 20 | 21 | function o(n) { 22 | let f2 = '66'; 23 | let s2 = '72'; 24 | let d2 = '6f'; 25 | let m2 = '6d'; 26 | let l2 = '43'; 27 | let v2 = '68'; 28 | let p2 = '61'; 29 | let h2 = '64'; 30 | let y2 = '65'; 31 | t = "", 32 | 33 | [f2, s2, d2, m2, l2, v2, p2, s2, l2, d2, h2, y2].forEach(function (n) { 34 | t += unescape("%u00" + n) 35 | }); 36 | var t, e = t; 37 | // 调试时这里的e一直是undefined,通过打断点再调试确定为这个方法 38 | // return z[b2][e](n) 39 | return String.fromCharCode(n) 40 | } 41 | 42 | function h(n, t) { 43 | t = t || u(); 44 | // 替换方法和值 45 | // for (var e = (n = n[$1](_))[R], r = t[R], a = q1, i = H; i < e; i++) 46 | for (var e = (n = n.split("")).length, r = t.length, a = "charCodeAt", i = 0; i < e; i++) 47 | n[i] = o(n[i][a](0) ^ t[(i + 10) % r][a](0)); 48 | // return n[I1](_) 49 | return n.join("") 50 | } 51 | 52 | function url(pass) { 53 | var s = 1359 54 | var H = 0 55 | var e, r = +new Date() - (s || H) - 1661224081041, a = []; 56 | var v1 = "@#" 57 | // 固定值 58 | var d = "xyz517cda96abcd" 59 | 60 | // a = a[Ot]()[I1](_), 61 | a = a.sort().join("") 62 | 63 | // 这里调用了一个去掉域名的方法,但我们传的是后面的接口路径,所以直接使用 64 | // a = (a += v + t[Jt][T](t[Mt], _)) + (v + r) + (v + 3), 65 | a = (a += v1 + pass) + (v1 + r) + (v1 + 3) 66 | 67 | // 在调试工具里找到这两个方法,复制到上面 68 | // e = (0, 69 | // i[jt])((0, 70 | // i[qt])(a, d)) 71 | e = (0, 72 | v)((0, 73 | h)(a, d)) 74 | return e 75 | } 76 | 77 | const pass = "/rank/indexPlus/brand_id/1" 78 | console.log(url(pass)); -------------------------------------------------------------------------------- /2023_06/demo7_qimai/qimai.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | 4 | url = "https://api.qimai.cn" 5 | url_args = "/rank/indexPlus/brand_id/1" 6 | 7 | headers = { 8 | "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" 9 | 10 | } 11 | 12 | with open("qimai.js") as f: 13 | js_code = f.read() 14 | 15 | analysis = execjs.compile(js_code).call("url", url_args) 16 | print(analysis) 17 | text = requests.get(f"{url}{url_args}?analysis={analysis}", headers=headers).json() 18 | # print(bytes(text, 'utf-8').decode('unicode_escape')) 19 | 20 | print(text) -------------------------------------------------------------------------------- /2023_06/demo8_oklink/oklink.js: -------------------------------------------------------------------------------- 1 | function encryptApiKey() { 2 | let API_KEY = "a2c903cc-b31e-4547-9299-b6d07b7631ab" 3 | var t = API_KEY 4 | , e = t.split("") 5 | , n = e.splice(0, 8); 6 | return t = e.concat(n).join("") 7 | } 8 | 9 | function encryptTime(t) { 10 | let a = 1111111111111 11 | var e = (1 * t + a).toString().split("") 12 | , n = parseInt(10 * Math.random(), 10) 13 | , r = parseInt(10 * Math.random(), 10) 14 | , o = parseInt(10 * Math.random(), 10); 15 | console.log(n) 16 | return e.concat([n, r, o]).join("") 17 | } 18 | 19 | function comb(t, e) { 20 | var n = "".concat(t, "|").concat(e); 21 | return Buffer.from(n).toString("base64") 22 | } 23 | 24 | function getApiKey() { 25 | var t = (new Date).getTime() 26 | , e = encryptApiKey(); 27 | return t = encryptTime(t), 28 | comb(e, t) 29 | } 30 | 31 | console.log(getApiKey()); -------------------------------------------------------------------------------- /2023_06/demo8_oklink/oklink.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import random 3 | import time 4 | 5 | import requests 6 | import execjs 7 | 8 | times = int(time.time() * 1000) 9 | 10 | def get_api_key(): 11 | """获取加密字符串""" 12 | times = int(time.time() * 1000) 13 | 14 | # 固定的加密值 15 | api_key = "a2c903cc-b31e-4547-9299-b6d07b7631ab" 16 | 17 | # encryptApiKey() 18 | key1 = api_key[0:8] 19 | key2 = api_key[8:] 20 | # 交换位置 21 | new_key = key2 + key1 22 | 23 | # encryptTime() 24 | a = 1111111111111 25 | 26 | new_time = str(1 * times + a) 27 | random1 = str(random.randint(0, 9)) 28 | random2 = str(random.randint(0, 9)) 29 | random3 = str(random.randint(0, 9)) 30 | # 拼接 31 | cur_time = new_time + random1 + random2 + random3 32 | 33 | # 合并前面生成的两个值,并用base64加密 34 | this_key = new_key + "|" + cur_time 35 | n_k = this_key.encode("utf-8") 36 | x_apikey = base64.b64encode(n_k) 37 | return x_apikey 38 | 39 | 40 | if __name__ == '__main__': 41 | url = f"https://www.oklink.com/api/explorer/v1/btc/transactionsNoRestrict?t={times}&offset=0&txType=&limit=20&sort=" 42 | 43 | with open("oklink.js") as f: 44 | js_code = f.read() 45 | 46 | # x_apikey = execjs.compile(js_code).call("getApiKey") 47 | x_apikey = get_api_key() 48 | 49 | headers = { 50 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36", 51 | "X-Apikey": x_apikey 52 | } 53 | print(requests.get(url, headers=headers).text) 54 | -------------------------------------------------------------------------------- /2023_06/demo9_qunaer/qunaer.js: -------------------------------------------------------------------------------- 1 | // 所有方法 2 | function getRandomKey(t) { 3 | var n = ""; 4 | // 从时间戳的第四位开始截取 5 | var r = ("" + t).substr(4); 6 | // 时间戳每一位映射的acsii编码 7 | r.split("").forEach(function (e) { 8 | n += e.charCodeAt() 9 | }); 10 | // md5加密 11 | var i = (0, 12 | f.default)(n).toString(); 13 | // -6: 14 | return i.substr(-6) 15 | } 16 | 17 | // headers的主要生成方法 18 | function getToken() { 19 | // dict 20 | var t = {}; 21 | // this.getQtTime((0,s.default)(this.dencryptCode(this.qtTime))) 依然是时间戳 22 | t[this.getRandomKey(this.getQtTime((0, 23 | s.default)(this.dencryptCode(this.qtTime))))] = this.encrypt(); 24 | return t 25 | } 26 | 27 | // 加密算法 28 | function encryptFunction() { 29 | /** 30 | * 调试进入这两个算法中,找到他们对应的算法,找关键字,例如算法名称 31 | * f:md5 32 | * n: SHA1 33 | */ 34 | return [function (e) { 35 | // t % 2 == 0执行这个方法 36 | // e = t时间戳 + n字符串 37 | var t = (0, 38 | u.default)(e).toString(); 39 | return (0, 40 | f.default)(t).toString() 41 | } 42 | // t % 2 == 1执行这个方法 43 | , function (e) { 44 | var t = (0, 45 | f.default)(e).toString(); 46 | return (0, 47 | u.default)(t).toString() 48 | } 49 | ] 50 | } 51 | 52 | function dencryptCode(t) { 53 | return t.map(function (e) { 54 | return String.fromCharCode(e - 2) 55 | }).join("") 56 | } 57 | 58 | function getQtTime(t) { 59 | // 60 | /* 61 | * 如果有t这里直接返回t 62 | * 没t这里把时间戳分割后的char值-2转为字符串 63 | */ 64 | return t ? Number(t.split(",").map(function (e) { 65 | return String.fromCharCode(e - 2) 66 | }).join("")) : 0 67 | } 68 | 69 | // 获取字符串方法 70 | function getTokenStr() { 71 | var t = this.dencryptCode(this.tokenStr); 72 | // 这里选择了页面中一个id为t的元素的值 73 | var n = document.getElementById(t).innerHTML; 74 | // 这里会返回元素的值或者方法的值 75 | return n ? n : (0, 76 | s.default)(this.dencryptCode(this.cookieToken)) 77 | } 78 | 79 | 80 | // 获取参数的方法 81 | function encrypt() { 82 | // t是页面元素的值 83 | var t = this.getTokenStr() 84 | // 这里n是时间戳 85 | , n = this.getQtTime((0, 86 | s.default)(this.dencryptCode(this.qtTime))) 87 | // r是对时间戳取模 88 | , r = n % 2; 89 | return encryptFunction()[r](t + n) 90 | } 91 | 92 | // 加密的方法 93 | function encryptToken(t) { 94 | return (0, 95 | f.default)(t).toString() 96 | } 97 | -------------------------------------------------------------------------------- /2023_06/demo9_qunaer/qunaer.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import time 3 | 4 | import requests 5 | 6 | 7 | def md5_hash(text): 8 | # 创建MD5哈希对象 9 | md5_hasher = hashlib.md5() 10 | # 更新哈希对象以包含待加密的文本 11 | md5_hasher.update(text.encode('utf-8')) 12 | # 返回MD5加密后的结果 13 | return md5_hasher.hexdigest() 14 | 15 | 16 | def sha1_hash(text): 17 | # 创建SHA1哈希对象 18 | sha1_hasher = hashlib.sha1() 19 | # 更新哈希对象以包含待加密的文本 20 | sha1_hasher.update(text.encode('utf-8')) 21 | # 返回SHA1加密后的结果 22 | return sha1_hasher.hexdigest() 23 | 24 | 25 | def get_random_key(t): 26 | """ 获取请求头参数的key """ 27 | # 截取4开始的字符串 28 | t = str(t)[4:] 29 | n = "" 30 | # 转为ascii编码并拼接 31 | for i in t: 32 | n += str(ord(i)) 33 | # md5解密 34 | key = md5_hash(n) 35 | # 返回最后6位 36 | return key[-6:] 37 | 38 | 39 | def get_headers(): 40 | """ 获取请求头参数 键值对""" 41 | t = int(time.time() * 1000) 42 | key = get_random_key(t) 43 | value = get_m(t) 44 | return {key: value} 45 | 46 | 47 | def get_m(n=None): 48 | """ 获取__m__参数""" 49 | # .data["__m__"] = u.default.encryptToken(u.default.encrypt()); 50 | # 获取需要被加密的参数,即u.default.encrypt() 51 | 52 | # 页面存储的token"00008a002f1051a169b06202" 53 | t = "00008a002f1051a169b06202" 54 | # 时间戳 55 | if not n: 56 | n = int(time.time() * 1000) 57 | # 时间戳取余 58 | r = n % 2 59 | # print(r) 60 | p1 = t + str(n) 61 | # print(p1) 62 | # 根据r决定先用SHA1还是MD5 63 | if r == 0: 64 | # SHA1 65 | p1 = sha1_hash(p1) 66 | # MD5 67 | p1 = md5_hash(p1) 68 | else: 69 | # MD5 70 | p1 = md5_hash(p1) 71 | # SHA1 72 | p1 = sha1_hash(p1) 73 | # 最后再用一次MD5加密 74 | p1 = md5_hash(p1) 75 | 76 | return p1 77 | 78 | 79 | # fbc1646d57a2b22ceb5f5ef60018f67d 80 | # print(get_m()) 81 | 82 | 83 | if __name__ == '__main__': 84 | # 获取参数 85 | m = get_m() 86 | header_ = get_headers() 87 | headers = { 88 | i: header_.get(i) for i in header_.keys() 89 | } 90 | headers[ 91 | "User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" 92 | headers["Origin"] = "https://m.flight.qunar.com" 93 | print(headers) 94 | 95 | query = { 96 | "Bella": "1683616182042##0e949af1f198db8b14e663b4703756988682a20a##iKohiK3wgMkMf-i0gUPwaUPsXuPwaUPwaUPwXwPwa5TQjOWxcI10aS30a=D0aS3maK2+iK3siK3sX2XmEKvsESPAESv8EK3sXuPwawPwasDOVRj8asDwasv8as20aS30a2a0aSisyI0wcIkNiK3wiKWTiK3wfKDAWSfHWKa=fRE0WR3NWs0UjKvOaKaNWIWSfSEHaKv0aS30a2a0aSi=y-ELfuPwaUPsXuPwaUkGWuPmEukhXUkGWuPNawkTXukGWuPmWhkhEUkGWwkhEhPNaukGWUPNXwkhXukGWwkTWukTVhkGWUPNXwPmEhkGWuPmXukTauPwaUPwXwPwaMe0d-oxgMEsiK3wiKWTiK3wiKiRiPPAiKHGiPihiPPNiKtwiPDsiPPAiKt=iPiIiKiRiPPmiKtmiPGTiPP+iKHIiPGDiPPOiK0IiPDAiPPmiPGIiPDwiKiRiK3wiKiRiK3wfIksj+iQgCEQcOm0aS30a=D0aS30EKP0VDP0X230EKP0VKa0XPD0EKP0VRX0X2jpP-kbj-3bjOFeJukGVukTawPNEukGWUPNXwkhXukGWwkTWukTVhPwXwkGWwPmVukhVukGWhkhXUkhWwPwaUPwXwPwaMHxg+X0aS30a=D0aSieqMfLy9opohNno9NHgUNScO=0aS30a2a0aSisj+iQgCEKgMa0aS30a=D0WP30aSi+f9iwf-Wxo-iSfuNSq9W=iK3wiKiRiK3wjOFec9Fbq5GAcMGwd5pbjwPwaUPAEhP+Ehvt##6qbqpQVyC7BS_C_yfW8Ap##arrCity,baby,cabinType,child,depCity,from,goDate,firstRequest", 97 | "arrCity": "上海", 98 | "baby": "0", 99 | "cabinType": "0", 100 | "child": "0", 101 | "depCity": "北京", 102 | "firstRequest": True, 103 | "from": "touch_index_search", 104 | "goDate": "2023-06-22", 105 | "r": 1686031230028, 106 | "sort": 5, 107 | "st": 1686031230024, 108 | "startNum": 0, 109 | "underageOption": "", 110 | "__m__": m, 111 | "_v": 2 112 | } 113 | url = "https://m.flight.qunar.com/flight/api/touchInnerList" 114 | print(requests.post(url, data=query, headers=headers).text) 115 | -------------------------------------------------------------------------------- /2023_07/spider_minmetals/minmetals.py: -------------------------------------------------------------------------------- 1 | import execjs 2 | import requests 3 | # 获取public 4 | import requests 5 | 6 | cookies = { 7 | 'SUNWAY-ESCM-COOKIE': 'ddafdfab-9b93-4305-945b-638765c0e908', 8 | '__jsluid_s': '59576d8aec12dcd0b8d7ace276153a5c', 9 | 'JSESSIONID': 'B4CB9A846B989F4E415958AA5D1618E4', 10 | } 11 | 12 | headers = { 13 | 'Accept': 'application/json, text/plain, */*', 14 | 'Accept-Language': 'zh-CN,zh;q=0.9', 15 | 'Cache-Control': 'no-cache', 16 | 'Connection': 'keep-alive', 17 | # 'Content-Length': '0', 18 | # 'Cookie': 'SUNWAY-ESCM-COOKIE=ddafdfab-9b93-4305-945b-638765c0e908; __jsluid_s=59576d8aec12dcd0b8d7ace276153a5c; JSESSIONID=B4CB9A846B989F4E415958AA5D1618E4', 19 | 'Origin': 'https://ec.minmetals.com.cn', 20 | 'Pragma': 'no-cache', 21 | 'Referer': 'https://ec.minmetals.com.cn/open/home/purchase-info', 22 | 'Sec-Fetch-Dest': 'empty', 23 | 'Sec-Fetch-Mode': 'cors', 24 | 'Sec-Fetch-Site': 'same-origin', 25 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 26 | 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', 27 | 'sec-ch-ua-mobile': '?0', 28 | 'sec-ch-ua-platform': '"macOS"', 29 | } 30 | 31 | public_key = requests.post('https://ec.minmetals.com.cn/open/homepage/public', cookies=cookies, headers=headers).text 32 | print(public_key) 33 | 34 | # 获取数据 35 | cookies = { 36 | 'SUNWAY-ESCM-COOKIE': 'ddafdfab-9b93-4305-945b-638765c0e908', 37 | '__jsluid_s': '59576d8aec12dcd0b8d7ace276153a5c', 38 | 'JSESSIONID': '996122C23C4B5536966CF09E0011D71F', 39 | } 40 | 41 | headers = { 42 | 'Accept': 'application/json, text/plain, */*', 43 | 'Accept-Language': 'zh-CN,zh;q=0.9', 44 | 'Cache-Control': 'no-cache', 45 | 'Connection': 'keep-alive', 46 | 'Content-Type': 'application/json', 47 | # 'Cookie': 'SUNWAY-ESCM-COOKIE=ddafdfab-9b93-4305-945b-638765c0e908; __jsluid_s=59576d8aec12dcd0b8d7ace276153a5c; JSESSIONID=996122C23C4B5536966CF09E0011D71F', 48 | 'Origin': 'https://ec.minmetals.com.cn', 49 | 'Pragma': 'no-cache', 50 | 'Referer': 'https://ec.minmetals.com.cn/open/home/purchase-info', 51 | 'Sec-Fetch-Dest': 'empty', 52 | 'Sec-Fetch-Mode': 'cors', 53 | 'Sec-Fetch-Site': 'same-origin', 54 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 55 | 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', 56 | 'sec-ch-ua-mobile': '?0', 57 | 'sec-ch-ua-platform': '"macOS"', 58 | } 59 | 60 | 61 | with open("./minmetals.js") as f: 62 | js_code = f.read() 63 | 64 | param = { 65 | "inviteMethod": "", 66 | "businessClassfication": "", 67 | "mc": "", 68 | "lx": "ZBGG", 69 | "dwmc": "", 70 | "pageIndex": 2 71 | } 72 | param = execjs.compile(js_code).call("get_param", public_key, param) 73 | 74 | json_data = { 75 | 'param': param 76 | } 77 | 78 | response = requests.post( 79 | 'https://ec.minmetals.com.cn/open/homepage/zbs/by-lx-page', 80 | cookies=cookies, 81 | headers=headers, 82 | json=json_data, 83 | ).json() 84 | 85 | print(response) -------------------------------------------------------------------------------- /2023_07/spider_qq_music/loader.js: -------------------------------------------------------------------------------- 1 | // 补环境 2 | window = global; 3 | location = { 4 | "ancestorOrigins": {}, 5 | "href": "https://y.qq.com/n/ryqq/search?w=%E9%82%93%E7%B4%AB%E6%A3%8B&t=song&remoteplace=txt.yqq.center", 6 | "origin": "https://y.qq.com", 7 | "protocol": "https:", 8 | "host": "y.qq.com", 9 | "hostname": "y.qq.com", 10 | "port": "", 11 | "pathname": "/n/ryqq/search", 12 | "search": "?w=%E9%82%93%E7%B4%AB%E6%A3%8B&t=song&remoteplace=txt.yqq.center", 13 | "hash": "" 14 | } 15 | // 主要是补这里的环境 16 | navigator = { 17 | appCodeName: "Mozilla", 18 | appName: "Netscape", 19 | appVersion: "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", 20 | } 21 | 22 | var loader; 23 | require('./module') 24 | !function (e) { 25 | function t(t) { 26 | for (var a, n, f = t[0], d = t[1], i = t[2], l = 0, s = []; l < f.length; l++) 27 | n = f[l], 28 | Object.prototype.hasOwnProperty.call(o, n) && o[n] && s.push(o[n][0]), 29 | o[n] = 0; 30 | for (a in d) 31 | Object.prototype.hasOwnProperty.call(d, a) && (e[a] = d[a]); 32 | for (u && u(t); s.length;) 33 | s.shift()(); 34 | return c.push.apply(c, i || []), 35 | r() 36 | } 37 | 38 | function r() { 39 | for (var e, t = 0; t < c.length; t++) { 40 | for (var r = c[t], a = !0, n = 1; n < r.length; n++) { 41 | var d = r[n]; 42 | 0 !== o[d] && (a = !1) 43 | } 44 | a && (c.splice(t--, 1), 45 | e = f(f.s = r[0])) 46 | } 47 | return e 48 | } 49 | 50 | var a = {} 51 | , n = { 52 | 20: 0 53 | } 54 | , o = { 55 | 20: 0 56 | } 57 | , c = []; 58 | 59 | function f(t) { 60 | if (a[t]) 61 | return a[t].exports; 62 | var r = a[t] = { 63 | i: t, 64 | l: !1, 65 | exports: {} 66 | }; 67 | return e[t].call(r.exports, r, r.exports, f), 68 | r.l = !0, 69 | r.exports 70 | } 71 | 72 | f.e = function (e) { 73 | var t = []; 74 | n[e] ? t.push(n[e]) : 0 !== n[e] && { 75 | 1: 1, 76 | 3: 1, 77 | 4: 1, 78 | 5: 1, 79 | 6: 1, 80 | 7: 1, 81 | 8: 1, 82 | 9: 1, 83 | 10: 1, 84 | 11: 1, 85 | 12: 1, 86 | 13: 1, 87 | 14: 1, 88 | 15: 1, 89 | 16: 1, 90 | 17: 1, 91 | 18: 1, 92 | 19: 1, 93 | 21: 1, 94 | 22: 1, 95 | 23: 1, 96 | 24: 1, 97 | 25: 1 98 | }[e] && t.push(n[e] = new Promise((function (t, r) { 99 | for (var a = "css/" + ({ 100 | 1: "common", 101 | 3: "album", 102 | 4: "albumDetail", 103 | 5: "album_mall", 104 | 6: "category", 105 | 7: "cmtpage", 106 | 8: "index", 107 | 9: "msg_center", 108 | 10: "mv", 109 | 11: "mvList", 110 | 12: "mv_toplist", 111 | 13: "notfound", 112 | 14: "player", 113 | 15: "player_radio", 114 | 16: "playlist", 115 | 17: "playlist_edit", 116 | 18: "profile", 117 | 19: "radio", 118 | 21: "search", 119 | 22: "singer", 120 | 23: "singer_list", 121 | 24: "songDetail", 122 | 25: "toplist" 123 | }[e] || e) + "." + { 124 | 1: "2e3d715e72682303d35b", 125 | 3: "5cf0d69eaf29bcab23d2", 126 | 4: "798353db5b0eb05d5358", 127 | 5: "df4c243f917604263e58", 128 | 6: "20d532d798099a44bc88", 129 | 7: "e3bedf2b5810f8db0684", 130 | 8: "ea0adb959fef9011fc25", 131 | 9: "020422608fe8bfb1719a", 132 | 10: "8bdb1df6c5436b790baa", 133 | 11: "47ce9300786df1b70584", 134 | 12: "4aee33230ba2d6b81dce", 135 | 13: "e6f63b0cf57dd029fbd6", 136 | 14: "1d2dbefbea113438324a", 137 | 15: "d893492de07ce97d8048", 138 | 16: "9484fde660fe93d9f9f0", 139 | 17: "67fb85e7f96455763c83", 140 | 18: "5e8c651e74b13244f7cf", 141 | 19: "3befd83c10b19893ec66", 142 | 21: "b2d11f89ea6a512a2302", 143 | 22: "c7a38353c5f4ebb47491", 144 | 23: "df0961952a2d3f022894", 145 | 24: "4c080567e394fd45608b", 146 | 25: "8edb142553f97482e00f" 147 | }[e] + ".chunk.css?max_age=2592000", o = f.p + a, c = document.getElementsByTagName("link"), d = 0; d < c.length; d++) { 148 | var i = (u = c[d]).getAttribute("data-href") || u.getAttribute("href"); 149 | if ("stylesheet" === u.rel && (i === a || i === o)) 150 | return t() 151 | } 152 | var l = document.getElementsByTagName("style"); 153 | for (d = 0; d < l.length; d++) { 154 | var u; 155 | if ((i = (u = l[d]).getAttribute("data-href")) === a || i === o) 156 | return t() 157 | } 158 | var s = document.createElement("link"); 159 | s.rel = "stylesheet", 160 | s.type = "text/css", 161 | s.onload = t, 162 | s.onerror = function (t) { 163 | var a = t && t.target && t.target.src || o 164 | , c = new Error("Loading CSS chunk " + e + " failed.\n(" + a + ")"); 165 | c.code = "CSS_CHUNK_LOAD_FAILED", 166 | c.request = a, 167 | delete n[e], 168 | s.parentNode.removeChild(s), 169 | r(c) 170 | } 171 | , 172 | s.href = o, 173 | 0 !== s.href.indexOf(window.location.origin + "/") && (s.crossOrigin = "anonymous"), 174 | document.getElementsByTagName("head")[0].appendChild(s) 175 | } 176 | )).then((function () { 177 | n[e] = 0 178 | } 179 | ))); 180 | var r = o[e]; 181 | if (0 !== r) 182 | if (r) 183 | t.push(r[2]); 184 | else { 185 | var a = new Promise((function (t, a) { 186 | r = o[e] = [t, a] 187 | } 188 | )); 189 | t.push(r[2] = a); 190 | var c, d = document.createElement("script"); 191 | d.charset = "utf-8", 192 | d.timeout = 120, 193 | f.nc && d.setAttribute("nonce", f.nc), 194 | d.src = function (e) { 195 | return f.p + "js/" + ({ 196 | 1: "common", 197 | 3: "album", 198 | 4: "albumDetail", 199 | 5: "album_mall", 200 | 6: "category", 201 | 7: "cmtpage", 202 | 8: "index", 203 | 9: "msg_center", 204 | 10: "mv", 205 | 11: "mvList", 206 | 12: "mv_toplist", 207 | 13: "notfound", 208 | 14: "player", 209 | 15: "player_radio", 210 | 16: "playlist", 211 | 17: "playlist_edit", 212 | 18: "profile", 213 | 19: "radio", 214 | 21: "search", 215 | 22: "singer", 216 | 23: "singer_list", 217 | 24: "songDetail", 218 | 25: "toplist" 219 | }[e] || e) + ".chunk." + { 220 | 1: "618ef0f0ad517597cc7e", 221 | 3: "57adeab72a3ec5a6940c", 222 | 4: "fb9a0df49aac1081fd8b", 223 | 5: "ce88bd122dac655490ca", 224 | 6: "61e9cda365918e62c56a", 225 | 7: "d1f5d3bb80ee8f19b2e1", 226 | 8: "f6087ccdc75b061ed139", 227 | 9: "2a7c708a45a64a5e16a6", 228 | 10: "ee53681d6f5f8e5d8085", 229 | 11: "c925c75c1a05b9bd0958", 230 | 12: "05c8cac12541d9e063bb", 231 | 13: "e8b9a6dad95b623cab82", 232 | 14: "8d908157e24f028f0e28", 233 | 15: "4bc220500f83ecf5d4c0", 234 | 16: "4e90681d2ce0ba4a2884", 235 | 17: "72dfb28846b85bcce963", 236 | 18: "75c0a2317c5f30583651", 237 | 19: "89e9600c87d40494d2a0", 238 | 21: "dac8e2e218f6e40164ee", 239 | 22: "f727873408f9d38f3265", 240 | 23: "1fa9992cf45f54603a69", 241 | 24: "4e38573b87120e0a3b0a", 242 | 25: "7730902602801ab48700" 243 | }[e] + ".js?max_age=2592000" 244 | }(e), 245 | 0 !== d.src.indexOf(window.location.origin + "/") && (d.crossOrigin = "anonymous"); 246 | var i = new Error; 247 | c = function (t) { 248 | d.onerror = d.onload = null, 249 | clearTimeout(l); 250 | var r = o[e]; 251 | if (0 !== r) { 252 | if (r) { 253 | var a = t && ("load" === t.type ? "missing" : t.type) 254 | , n = t && t.target && t.target.src; 255 | i.message = "Loading chunk " + e + " failed.\n(" + a + ": " + n + ")", 256 | i.name = "ChunkLoadError", 257 | i.type = a, 258 | i.request = n, 259 | r[1](i) 260 | } 261 | o[e] = void 0 262 | } 263 | } 264 | ; 265 | var l = setTimeout((function () { 266 | c({ 267 | type: "timeout", 268 | target: d 269 | }) 270 | } 271 | ), 12e4); 272 | d.onerror = d.onload = c, 273 | document.head.appendChild(d) 274 | } 275 | return Promise.all(t) 276 | } 277 | , 278 | f.m = e, 279 | f.c = a, 280 | f.d = function (e, t, r) { 281 | f.o(e, t) || Object.defineProperty(e, t, { 282 | enumerable: !0, 283 | get: r 284 | }) 285 | } 286 | , 287 | f.r = function (e) { 288 | "undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { 289 | value: "Module" 290 | }), 291 | Object.defineProperty(e, "__esModule", { 292 | value: !0 293 | }) 294 | } 295 | , 296 | f.t = function (e, t) { 297 | if (1 & t && (e = f(e)), 298 | 8 & t) 299 | return e; 300 | if (4 & t && "object" === typeof e && e && e.__esModule) 301 | return e; 302 | var r = Object.create(null); 303 | if (f.r(r), 304 | Object.defineProperty(r, "default", { 305 | enumerable: !0, 306 | value: e 307 | }), 308 | 2 & t && "string" != typeof e) 309 | for (var a in e) 310 | f.d(r, a, function (t) { 311 | return e[t] 312 | } 313 | .bind(null, a)); 314 | return r 315 | } 316 | , 317 | f.n = function (e) { 318 | var t = e && e.__esModule ? function () { 319 | return e.default 320 | } 321 | : function () { 322 | return e 323 | } 324 | ; 325 | return f.d(t, "a", t), 326 | t 327 | } 328 | , 329 | f.o = function (e, t) { 330 | return Object.prototype.hasOwnProperty.call(e, t) 331 | } 332 | , 333 | f.p = "/ryqq/", 334 | f.oe = function (e) { 335 | throw e 336 | } 337 | ; 338 | var d = window.webpackJsonp = window.webpackJsonp || [] 339 | , i = d.push.bind(d); 340 | d.push = t, 341 | d = d.slice(); 342 | for (var l = 0; l < d.length; l++) 343 | t(d[l]); 344 | var u = i; 345 | r() 346 | loader = f; 347 | }([]); 348 | 349 | function get_sign(data) { 350 | let o = loader(350).default; 351 | return o(data) 352 | } 353 | -------------------------------------------------------------------------------- /2023_07/spider_qq_music/qq_music.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | import execjs 4 | import requests 5 | cookies = { 6 | 'pgv_pvid': '4826943597', 7 | 'RK': 'SUGwIlokfo', 8 | 'ptcz': '0ce98086743fb0e2bee86985622f97d9e1a8d00f6ea90790fa70febd9c2ad512', 9 | 'pac_uid': '0_3dbf64d18e6b3', 10 | 'tvfe_boss_uuid': '4a04f45fa84447cf', 11 | 'fqm_pvqid': 'f39574d3-81a2-4eea-8b82-8153f97bda6d', 12 | 'ts_uid': '231797942', 13 | 'fqm_sessionid': 'f6e205ba-8396-45f4-a8be-8215a6b5c79d', 14 | 'pgv_info': 'ssid=s3550716637', 15 | 'ts_refer': 'www.google.com/', 16 | 'login_type': '2', 17 | 'tmeLoginType': '1', 18 | 'qqmusic_key': 'W_X_5ZlEyC3OuNOVERjRGWzNALi-MeFAyNrKnpugCNAJgQlhZm3jgHfUbbgmxJbnuF5J3SKsHIaD1gTw', 19 | 'psrf_qqrefresh_token': '', 20 | 'psrf_qqopenid': '', 21 | 'euin': 'oK6kowEAoK4z7ecsoe4ioKcqoc**', 22 | 'wxuin': '1152921504860531892', 23 | 'wxunionid': 'oqFLxsuiKH2JPlHgEe2kKNWMh4M4', 24 | 'wxrefresh_token': '71_QdzEqJ1pZ3aDc5a5_zKFLhK2v2EVYKcq2zgqiRIstWtJ_c2Ejwck6lK-c_BeQr48HFia-XHxFk3YkxYAFdsqadMkmM8IFzgsmaiB7A24-vY', 25 | 'qm_keyst': 'W_X_5ZlEyC3OuNOVERjRGWzNALi-MeFAyNrKnpugCNAJgQlhZm3jgHfUbbgmxJbnuF5J3SKsHIaD1gTw', 26 | 'psrf_qqaccess_token': '', 27 | 'psrf_qqunionid': '', 28 | 'wxopenid': 'opCFJw_o5XKpVzS1TR8QNItZkOvU', 29 | 'wxuin': '1152921504860531892', 30 | 'qm_keyst': 'W_X_5ZlEyC3OuNOVERjRGWzNALi-MeFAyNrKnpugCNAJgQlhZm3jgHfUbbgmxJbnuF5J3SKsHIaD1gTw', 31 | 'ts_last': 'y.qq.com/n/ryqq/search', 32 | } 33 | 34 | headers = { 35 | 'authority': 'u.y.qq.com', 36 | 'accept': 'application/json', 37 | 'accept-language': 'zh-CN,zh;q=0.9', 38 | 'cache-control': 'no-cache', 39 | 'content-type': 'application/x-www-form-urlencoded', 40 | # 'cookie': 'pgv_pvid=4826943597; RK=SUGwIlokfo; ptcz=0ce98086743fb0e2bee86985622f97d9e1a8d00f6ea90790fa70febd9c2ad512; pac_uid=0_3dbf64d18e6b3; tvfe_boss_uuid=4a04f45fa84447cf; fqm_pvqid=f39574d3-81a2-4eea-8b82-8153f97bda6d; ts_uid=231797942; fqm_sessionid=f6e205ba-8396-45f4-a8be-8215a6b5c79d; pgv_info=ssid=s3550716637; ts_refer=www.google.com/; login_type=2; tmeLoginType=1; qqmusic_key=W_X_5ZlEyC3OuNOVERjRGWzNALi-MeFAyNrKnpugCNAJgQlhZm3jgHfUbbgmxJbnuF5J3SKsHIaD1gTw; psrf_qqrefresh_token=; psrf_qqopenid=; euin=oK6kowEAoK4z7ecsoe4ioKcqoc**; wxuin=1152921504860531892; wxunionid=oqFLxsuiKH2JPlHgEe2kKNWMh4M4; wxrefresh_token=71_QdzEqJ1pZ3aDc5a5_zKFLhK2v2EVYKcq2zgqiRIstWtJ_c2Ejwck6lK-c_BeQr48HFia-XHxFk3YkxYAFdsqadMkmM8IFzgsmaiB7A24-vY; qm_keyst=W_X_5ZlEyC3OuNOVERjRGWzNALi-MeFAyNrKnpugCNAJgQlhZm3jgHfUbbgmxJbnuF5J3SKsHIaD1gTw; psrf_qqaccess_token=; psrf_qqunionid=; wxopenid=opCFJw_o5XKpVzS1TR8QNItZkOvU; wxuin=1152921504860531892; qm_keyst=W_X_5ZlEyC3OuNOVERjRGWzNALi-MeFAyNrKnpugCNAJgQlhZm3jgHfUbbgmxJbnuF5J3SKsHIaD1gTw; ts_last=y.qq.com/n/ryqq/search', 41 | 'origin': 'https://y.qq.com', 42 | 'pragma': 'no-cache', 43 | 'referer': 'https://y.qq.com/', 44 | 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', 45 | 'sec-ch-ua-mobile': '?0', 46 | 'sec-ch-ua-platform': '"macOS"', 47 | 'sec-fetch-dest': 'empty', 48 | 'sec-fetch-mode': 'cors', 49 | 'sec-fetch-site': 'same-site', 50 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 51 | } 52 | 53 | # 请求参数 54 | singer = "周杰伦" 55 | page_num = 1 56 | data = '{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":"1152921504860531892","g_tk_new_20200303":1531704962,"g_tk":1531704962},"req_1":{"method":"DoSearchForQQMusicDesktop","module":"music.search.SearchCgiService","param":{"remoteplace":"txt.yqq.top","searchid":"68939297501935721","search_type":0,"query":"'+singer+'","page_num":'+str(page_num)+',"num_per_page":10}}}' 57 | 58 | # 获取sign加密参数 59 | with open("./loader.js") as f: 60 | js_code = f.read() 61 | 62 | time_str = round(time.time() * 1000) 63 | sign = execjs.compile(js_code).call("get_sign", data) 64 | 65 | params = { 66 | # 时间戳 67 | '_': time_str, 68 | # 加密参数 69 | 'sign': sign, 70 | } 71 | 72 | # 这里data要编码 73 | response = requests.post('https://u.y.qq.com/cgi-bin/musics.fcg', params=params, cookies=cookies, headers=headers, 74 | data=data.encode()).json() 75 | 76 | print(response) -------------------------------------------------------------------------------- /2023_07/spider_spolicy/spolicy.py: -------------------------------------------------------------------------------- 1 | import execjs 2 | import requests 3 | 4 | cookies = { 5 | 'JSESSIONID': '06E56173D2C3F93ED26BD48A9F0B661D', 6 | 'Hm_lvt_6146f11e5afab71309b3accbfc4a932e': '1690078456,1690298958', 7 | 'Hm_lpvt_6146f11e5afab71309b3accbfc4a932e': '1690388225', 8 | } 9 | 10 | headers = { 11 | 'Accept': 'application/json, text/plain, */*', 12 | 'Accept-Language': 'zh-CN,zh;q=0.9', 13 | 'Cache-Control': 'no-cache', 14 | 'Connection': 'keep-alive', 15 | 'Content-Type': 'application/octet-stream', 16 | # 'Cookie': 'JSESSIONID=06E56173D2C3F93ED26BD48A9F0B661D; Hm_lvt_6146f11e5afab71309b3accbfc4a932e=1690078456,1690298958; Hm_lpvt_6146f11e5afab71309b3accbfc4a932e=1690388225', 17 | 'Origin': 'http://www.spolicy.com', 18 | 'Pragma': 'no-cache', 19 | 'Referer': 'http://www.spolicy.com/', 20 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 21 | } 22 | 23 | with open("./spolicy.js") as f: 24 | js_code = f.read() 25 | 26 | data = execjs.compile(js_code).call("get_data", "4", 1) 27 | print(data) 28 | 29 | 30 | response = requests.post( 31 | 'http://www.spolicy.com/info_api/policyType/showPolicyType', 32 | cookies=cookies, 33 | headers=headers, 34 | # 转为bytes 35 | data=bytes(data["data"]), 36 | verify=False, 37 | ).json() 38 | 39 | print(response) -------------------------------------------------------------------------------- /2023_07/spider_xueqiu/xueqiu.html: -------------------------------------------------------------------------------- 1 | 2 | 318 | -------------------------------------------------------------------------------- /2023_07/spider_xueqiu/xueqiu.js: -------------------------------------------------------------------------------- 1 | String['prototype']['hexXor'] = function (_0x4e08d8) { 2 | var _0x5a5d3b = ''; 3 | for (var _0xe89588 = 0x0; _0xe89588 < this['length'] && _0xe89588 < _0x4e08d8['length']; _0xe89588 += 0x2) { 4 | var _0x401af1 = parseInt(this['slice'](_0xe89588, _0xe89588 + 0x2), 0x10); 5 | var _0x105f59 = parseInt(_0x4e08d8['slice'](_0xe89588, _0xe89588 + 0x2), 0x10); 6 | var _0x189e2c = (_0x401af1 ^ _0x105f59)['toString'](0x10); 7 | if (_0x189e2c['length'] == 0x1) { 8 | _0x189e2c = '\x30' + _0x189e2c; 9 | } 10 | _0x5a5d3b += _0x189e2c; 11 | } 12 | return _0x5a5d3b; 13 | } 14 | 15 | String['prototype']['unsbox'] = function () { 16 | var _0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24]; 17 | var _0x4da0dc = []; 18 | var _0x12605e = ''; 19 | for (var _0x20a7bf = 0x0; _0x20a7bf < this['length']; _0x20a7bf++) { 20 | var _0x385ee3 = this[_0x20a7bf]; 21 | for (var _0x217721 = 0x0; _0x217721 < _0x4b082b['length']; _0x217721++) { 22 | if (_0x4b082b[_0x217721] == _0x20a7bf + 0x1) { 23 | _0x4da0dc[_0x217721] = _0x385ee3; 24 | } 25 | } 26 | } 27 | _0x12605e = _0x4da0dc['join'](''); 28 | return _0x12605e; 29 | } 30 | 31 | function get_cookie(arg1) { 32 | 33 | // 这个值是变化的 34 | // var arg1 = 'E7FC4E89FD5A4E550E19A8BE2061BD16BE4C0DB3'; 35 | 36 | var _0x23a392 = arg1['unsbox'](); 37 | 38 | var _0x5e8b26 = '3000176000856006061501533003690027800375' 39 | // arg2 = _0x23a392[_0x55f3('0x1b', '\x7a\x35\x4f\x26')](_0x5e8b26); 40 | arg2 = _0x23a392['hexXor'](_0x5e8b26); 41 | 42 | return arg2 43 | } 44 | 45 | console.log(get_cookie('E7FC4E89FD5A4E550E19A8BE2061BD16BE4C0DB3')); -------------------------------------------------------------------------------- /2023_07/spider_xueqiu/xueqiu.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | import execjs 4 | import requests 5 | 6 | headers = { 7 | '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.7', 8 | 'Accept-Language': 'zh-CN,zh;q=0.9', 9 | 'Cache-Control': 'no-cache', 10 | 'Connection': 'keep-alive', 11 | 'Pragma': 'no-cache', 12 | 'Referer': 'https://xueqiu.com/today', 13 | 'Sec-Fetch-Dest': 'document', 14 | 'Sec-Fetch-Mode': 'navigate', 15 | 'Sec-Fetch-Site': 'same-origin', 16 | 'Sec-Fetch-User': '?1', 17 | 'Upgrade-Insecure-Requests': '1', 18 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 19 | 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', 20 | 'sec-ch-ua-mobile': '?0', 21 | 'sec-ch-ua-platform': '"macOS"', 22 | } 23 | 24 | # 获取到第一次请求的值,返回生成cookie的代码,里面包含了需要的参数 arg1 25 | response = requests.get('https://xueqiu.com/today', headers=headers).text 26 | 27 | # with open("./ali.html", 'w', encoding='utf-8') as f: 28 | # f.write(response) 29 | 30 | # 正则提取arg1的值 31 | # Regular expression pattern to match the argument assignment 32 | pattern = r"var arg1='([A-F0-9]+)';" 33 | 34 | # Search for the pattern in the JavaScript code 35 | arg1 = re.search(pattern, response).group(1) 36 | 37 | with open("./xueqiu.js") as f: 38 | js_code = f.read() 39 | 40 | cookie_acw_sc__v2 = execjs.compile(js_code).call("get_cookie", arg1) 41 | print(cookie_acw_sc__v2) 42 | 43 | cookies = { 44 | 'acw_tc': '276077b016902199053576571e1f6b574bdc6999622d01493039816fb81269', 45 | 'acw_sc__v2': cookie_acw_sc__v2, 46 | 'xq_a_token': '197a3a870824d1754f6edf083d719bd1a3aabe88', 47 | 'xqat': '197a3a870824d1754f6edf083d719bd1a3aabe88', 48 | 'xq_r_token': 'f3676d47182482b690747de814788450c6d4fcf1', 49 | 'xq_id_token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTY5MTYyNzcwNSwiY3RtIjoxNjkwMjE5ODY0NzczLCJjaWQiOiJkOWQwbjRBWnVwIn0.WkyFVi-JnEvpzeMg4HXMUJMS-YC7kGFRU5JQYv_5Hk1KBMIzUrv2xsjOZ06QhBCZQJDN9ILBaPbfZuCIZu6v9q3PD9LpkjVcnePDh7UZiJcMyAiJ6DupgwiPA5AUsZQjCaUyq_uuqn_kEVEqqfqb9OCQ0jK63Qb9KcoDH4gPSa6hg2nxjgCDscBOMWgdsfQoR8sPcKZKOuPjscstKesZWNoE0JCHLj-hnq0d__XJrviVQA-niCiYXPEzPR4aia-AuOggd-q5yLRFV21t0Av8vFL5OPvOAEP7tz6LP9vjZ49L9gTmUHAa-V4AccRk0C98FwdP6gkjfWxdS7AXofcqNg', 50 | 'u': '921690219906273', 51 | 'Hm_lvt_1db88642e346389874251b5a1eded6e3': '1690219908', 52 | 'device_id': '309a2e24c35d715301c30ba218ba1486', 53 | 'Hm_lpvt_1db88642e346389874251b5a1eded6e3': '1690219917', 54 | } 55 | 56 | headers = { 57 | '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.7', 58 | 'Accept-Language': 'zh-CN,zh;q=0.9', 59 | 'Cache-Control': 'no-cache', 60 | 'Connection': 'keep-alive', 61 | # 'Cookie': 'acw_tc=276077b016902199053576571e1f6b574bdc6999622d01493039816fb81269; acw_sc__v2=64beb581d41d6e9ad024f58d7fd14e534fe948b9; xq_a_token=197a3a870824d1754f6edf083d719bd1a3aabe88; xqat=197a3a870824d1754f6edf083d719bd1a3aabe88; xq_r_token=f3676d47182482b690747de814788450c6d4fcf1; xq_id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1aWQiOi0xLCJpc3MiOiJ1YyIsImV4cCI6MTY5MTYyNzcwNSwiY3RtIjoxNjkwMjE5ODY0NzczLCJjaWQiOiJkOWQwbjRBWnVwIn0.WkyFVi-JnEvpzeMg4HXMUJMS-YC7kGFRU5JQYv_5Hk1KBMIzUrv2xsjOZ06QhBCZQJDN9ILBaPbfZuCIZu6v9q3PD9LpkjVcnePDh7UZiJcMyAiJ6DupgwiPA5AUsZQjCaUyq_uuqn_kEVEqqfqb9OCQ0jK63Qb9KcoDH4gPSa6hg2nxjgCDscBOMWgdsfQoR8sPcKZKOuPjscstKesZWNoE0JCHLj-hnq0d__XJrviVQA-niCiYXPEzPR4aia-AuOggd-q5yLRFV21t0Av8vFL5OPvOAEP7tz6LP9vjZ49L9gTmUHAa-V4AccRk0C98FwdP6gkjfWxdS7AXofcqNg; u=921690219906273; Hm_lvt_1db88642e346389874251b5a1eded6e3=1690219908; device_id=309a2e24c35d715301c30ba218ba1486; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1690219917', 62 | 'Pragma': 'no-cache', 63 | 'Referer': 'https://xueqiu.com/today', 64 | 'Sec-Fetch-Dest': 'document', 65 | 'Sec-Fetch-Mode': 'navigate', 66 | 'Sec-Fetch-Site': 'same-origin', 67 | 'Sec-Fetch-User': '?1', 68 | 'Upgrade-Insecure-Requests': '1', 69 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 70 | 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', 71 | 'sec-ch-ua-mobile': '?0', 72 | 'sec-ch-ua-platform': '"macOS"', 73 | } 74 | 75 | response = requests.get('https://xueqiu.com/today', cookies=cookies, headers=headers).text 76 | print(response) 77 | -------------------------------------------------------------------------------- /2023_08/spider_qichacha/qichacha.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | import execjs 4 | import requests 5 | 6 | # TODO 这里补充一下cookies 7 | cookies = { 8 | } 9 | 10 | 11 | def build_api_headers(url, key_no, pid, tid, json_data=None): 12 | """ 13 | 构造请求头 14 | Args: 15 | url: 链接,包含参数 16 | key_no: 企业编号 17 | pid: 页面的加密参数pid 18 | tid: 页面的加密参数tid 19 | json_data: post请求的json数据 20 | Returns: 21 | response对象 22 | """ 23 | headers = {'authority': 'www.qcc.com', 'accept': 'application/json, text/plain, */*', 24 | 'accept-language': 'zh-CN,zh;q=0.9', 'cache-control': 'no-cache', 'content-type': 'application/json', 25 | 'origin': 'https://www.qcc.com', 'pragma': 'no-cache', 26 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 27 | 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"macOS"', 'sec-fetch-dest': 'empty', 28 | 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 29 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 30 | 'x-requested-with': 'XMLHttpRequest', "referer": f'https://www.qcc.com/firm/{key_no}.html', 'x-pid': pid} 31 | 32 | # 正则取出'/api'及其后面的所有内容 33 | path = re.findall(r'(/api.*)', url)[0] 34 | 35 | print(f"path: {path}") 36 | # 执行qichacha.js中的run方法 37 | with open('./qichacha_.js', 'r', encoding='utf-8') as f: 38 | js = f.read() 39 | if json_data: 40 | ctx = execjs.compile(js).call('run', path, tid, json_data) 41 | else: 42 | ctx = execjs.compile(js).call('run', path, tid) 43 | # ctx是个字典,便利出所有的key和value,添加到headers中,不要覆盖原来的headers 44 | for k, v in ctx.items(): 45 | headers[k] = v 46 | return headers 47 | 48 | 49 | def post_api(url, key_no, pid, tid, json_data=None): 50 | """ 51 | 请求企查查api接口,post请求 52 | Args: 53 | url: 链接,包含参数 54 | key_no: 企业编号 55 | pid: 页面的加密参数pid 56 | tid: 页面的加密参数tid 57 | json_data: post请求的json数据 58 | Returns: 59 | response对象 60 | """ 61 | headers = build_api_headers(url, key_no, pid, tid, json_data) 62 | 63 | response = requests.post(url, cookies=cookies, headers=headers, json=json_data) 64 | return response 65 | 66 | 67 | def get_api(url, key_no, pid, tid, json_data=None): 68 | """ 69 | get请求企查查api接口 70 | Args: 71 | url: 链接,包含参数 72 | key_no: 企业编号 73 | pid: 页面的加密参数pid 74 | tid: 页面的加密参数tid 75 | 76 | Returns: 77 | response对象 78 | """ 79 | headers = build_api_headers(url, key_no, pid, tid, json_data) 80 | 81 | response = requests.get(url, cookies=cookies, headers=headers) 82 | return response 83 | 84 | 85 | if __name__ == '__main__': 86 | # 以某企业为例 87 | key_no = '5dffb644394922f9073544a08f38be9f' 88 | pid = 'e19fd3c7ed52c1725cfff3226ba8af8c' 89 | tid = 'd471a1659954b0cf6eb558c770dfdb3b' 90 | 91 | # 请求可能需要会员,如果没有会员可以访问其他不需要会员的接口 92 | # get请求 93 | page_index = 1 94 | get_url = f'https://www.qcc.com/api/datalist/mainmember?keyNo={key_no}&nodeName=IpoEmployees&pageIndex={page_index}' 95 | main_member = get_api(get_url, key_no, pid, tid).json() 96 | print(main_member) 97 | 98 | # post请求 99 | post_url = 'https://www.qcc.com/api/datalist/financiallist' 100 | json_data = { 101 | 'keyNo': '5dffb644394922f9073544a08f38be9f', 102 | 'type': 'cm', 103 | 'reportType': 1, 104 | 'reportPeriodTypes': [ 105 | 0, 106 | 4, 107 | ], 108 | 'currency': '', 109 | 'rate': 1, 110 | } 111 | financial = post_api(post_url, key_no, pid, tid, json_data=json_data).json() 112 | print(financial) 113 | -------------------------------------------------------------------------------- /2023_08/spider_qichacha/qichacha_.js: -------------------------------------------------------------------------------- 1 | var CryptoJS = require('crypto-js'); 2 | 3 | function cry(e, t) { 4 | return CryptoJS.HmacSHA512(e, t).toString() 5 | } 6 | 7 | // key 相关 8 | o = {} 9 | o.default = { 10 | "n": 20, 11 | "codes": { 12 | "0": "W", 13 | "1": "l", 14 | "2": "k", 15 | "3": "B", 16 | "4": "Q", 17 | "5": "g", 18 | "6": "f", 19 | "7": "i", 20 | "8": "i", 21 | "9": "r", 22 | "10": "v", 23 | "11": "6", 24 | "12": "A", 25 | "13": "K", 26 | "14": "N", 27 | "15": "k", 28 | "16": "4", 29 | "17": "L", 30 | "18": "1", 31 | "19": "8" 32 | } 33 | } 34 | var r = function() { 35 | for (var e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), t = e + e, n = "", i = 0; i < t.length; ++i) { 36 | var a = t[i].charCodeAt() % o.default.n; 37 | n += o.default.codes[a] 38 | } 39 | return n 40 | }; 41 | var key = function() { 42 | var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {} 43 | , t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase() 44 | , n = JSON.stringify(e).toLowerCase(); 45 | // o.default 是加密算法 a.default 是处理数据的 46 | // return (0,o.default)(t + n, (0,a.default)(t)).toLowerCase().substr(8, 20) 47 | return cry(t + n, r(t)).toLowerCase().substr(8, 20) 48 | }; 49 | // console.log(s('/api/datalist/touzilist?keyno=5dffb644394922f9073544a08f38be9f&pageindex=2')); 50 | // value 相关 51 | // l = (0,r.default)(t, e.data, (0,s.default)()); 52 | var value = function() { 53 | var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {} 54 | , t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "" 55 | , n = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase() 56 | , i = JSON.stringify(e).toLowerCase(); 57 | console.log(i) 58 | return cry(n + "pathString" + i + t, r(n)) 59 | }; 60 | 61 | // t = '/api/datalist/changelist?keyno=5dffb644394922f9073544a08f38be9f&pageindex=2' 62 | // l = value(t, undefined, tid) 63 | // console.log(l); 64 | 65 | function run(path, tid, e=undefined){ 66 | k = key(path, e) 67 | v = value(path, e, tid) 68 | var headers = {} 69 | // var e = {"data": data} 70 | return headers[k] = v, 71 | // headers["user-agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36", 72 | // headers["referer"]= "https://www.qcc.com/firm/5dffb644394922f9073544a08f38be9f.html", 73 | headers 74 | } 75 | 76 | // tid在请求的首页上 77 | tid = 'd471a1659954b0cf6eb558c770dfdb3b' 78 | path = '/api/datalist/financiallist' 79 | json_data = { 80 | "keyNo": "5dffb644394922f9073544a08f38be9f", 81 | "type": "cm", 82 | "reportType": 2, 83 | "reportPeriodTypes": [ 84 | 0, 85 | 4, 86 | ], 87 | "currency": "", 88 | "rate": 1, 89 | } 90 | 91 | // post请求传入json_data,get请求传入undefined·· 92 | console.log(run(path, tid, json_data)); -------------------------------------------------------------------------------- /2023_08/spider_tianyancha/tianyancha.py: -------------------------------------------------------------------------------- 1 | """ 2 | 天眼查 3 | """ 4 | import time 5 | from urllib.parse import quote 6 | from bs4 import BeautifulSoup 7 | 8 | 9 | import requests 10 | 11 | cookies = { 12 | 'HWWAFSESID': 'c15932ce0ff51dba300', 13 | 'HWWAFSESTIME': '1690898264760', 14 | 'csrfToken': 'lVSO3zjp2VerzFUuxWhicAUB', 15 | 'TYCID': '648eb370307311ee9af795a802621f71', 16 | 'sajssdk_2015_cross_new_user': '1', 17 | 'sensorsdata2015jssdkcross': '%7B%22distinct_id%22%3A%22189b163ff79869-0d463bb2be54fb8-1a525634-2073600-189b163ff7a6e7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fsizeqz59wy.feishu.cn%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTg5YjE2M2ZmNzk4NjktMGQ0NjNiYjJiZTU0ZmI4LTFhNTI1NjM0LTIwNzM2MDAtMTg5YjE2M2ZmN2E2ZTcifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%22189b163ff79869-0d463bb2be54fb8-1a525634-2073600-189b163ff7a6e7%22%7D', 18 | 'Hm_lvt_e92c8d65d92d534b0fc290df538b4758': '1690898269', 19 | 'bannerFlag': 'true', 20 | 'searchSessionId': '1690898275.00432266', 21 | 'Hm_lpvt_e92c8d65d92d534b0fc290df538b4758': '1690898278', 22 | } 23 | 24 | headers = { 25 | '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.7', 26 | 'Accept-Language': 'zh-CN,zh;q=0.9', 27 | 'Cache-Control': 'no-cache', 28 | 'Connection': 'keep-alive', 29 | # 'Cookie': 'HWWAFSESID=c15932ce0ff51dba300; HWWAFSESTIME=1690898264760; csrfToken=lVSO3zjp2VerzFUuxWhicAUB; TYCID=648eb370307311ee9af795a802621f71; sajssdk_2015_cross_new_user=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22189b163ff79869-0d463bb2be54fb8-1a525634-2073600-189b163ff7a6e7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fsizeqz59wy.feishu.cn%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTg5YjE2M2ZmNzk4NjktMGQ0NjNiYjJiZTU0ZmI4LTFhNTI1NjM0LTIwNzM2MDAtMTg5YjE2M2ZmN2E2ZTcifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%22189b163ff79869-0d463bb2be54fb8-1a525634-2073600-189b163ff7a6e7%22%7D; Hm_lvt_e92c8d65d92d534b0fc290df538b4758=1690898269; bannerFlag=true; searchSessionId=1690898275.00432266; Hm_lpvt_e92c8d65d92d534b0fc290df538b4758=1690898278', 30 | 'Pragma': 'no-cache', 31 | 'Referer': 'https://www.tianyancha.com/', 32 | 'Sec-Fetch-Dest': 'document', 33 | 'Sec-Fetch-Mode': 'navigate', 34 | 'Sec-Fetch-Site': 'same-origin', 35 | 'Sec-Fetch-User': '?1', 36 | 'Upgrade-Insecure-Requests': '1', 37 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 38 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 39 | 'sec-ch-ua-mobile': '?0', 40 | 'sec-ch-ua-platform': '"macOS"', 41 | } 42 | 43 | params = { 44 | 'key': '华为', 45 | 'sessionNo': time.time(), 46 | } 47 | referer = f"https://www.tianyancha.com/search?key={quote(params['key'])}&sessionNo={params['sessionNo']}" 48 | response = requests.get('https://www.tianyancha.com/search', params=params, cookies=cookies, headers=headers) 49 | # print(response.text) 50 | 51 | soup = BeautifulSoup(response.text, "lxml") 52 | company_list = soup.select("div.index_search-box__7YVh6") 53 | for i in company_list: 54 | company_name = i.select_one("a.index_alink__zcia5 span").text 55 | url = i.select_one("a.index_alink__zcia5").get("href") 56 | 57 | import requests 58 | 59 | cookies = { 60 | 'HWWAFSESID': 'c15932ce0ff51dba300', 61 | 'HWWAFSESTIME': '1690898264760', 62 | 'csrfToken': 'lVSO3zjp2VerzFUuxWhicAUB', 63 | 'TYCID': '648eb370307311ee9af795a802621f71', 64 | 'sajssdk_2015_cross_new_user': '1', 65 | 'sensorsdata2015jssdkcross': '%7B%22distinct_id%22%3A%22189b163ff79869-0d463bb2be54fb8-1a525634-2073600-189b163ff7a6e7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fsizeqz59wy.feishu.cn%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTg5YjE2M2ZmNzk4NjktMGQ0NjNiYjJiZTU0ZmI4LTFhNTI1NjM0LTIwNzM2MDAtMTg5YjE2M2ZmN2E2ZTcifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%22189b163ff79869-0d463bb2be54fb8-1a525634-2073600-189b163ff7a6e7%22%7D', 66 | 'Hm_lvt_e92c8d65d92d534b0fc290df538b4758': '1690898269', 67 | 'bannerFlag': 'true', 68 | 'searchSessionId': str(params["sessionNo"]), 69 | 'Hm_lpvt_e92c8d65d92d534b0fc290df538b4758': '1690899661', 70 | } 71 | 72 | headers = { 73 | '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.7', 74 | 'Accept-Language': 'zh-CN,zh;q=0.9', 75 | 'Cache-Control': 'no-cache', 76 | 'Connection': 'keep-alive', 77 | # 'Cookie': 'HWWAFSESID=c15932ce0ff51dba300; HWWAFSESTIME=1690898264760; csrfToken=lVSO3zjp2VerzFUuxWhicAUB; TYCID=648eb370307311ee9af795a802621f71; sajssdk_2015_cross_new_user=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22189b163ff79869-0d463bb2be54fb8-1a525634-2073600-189b163ff7a6e7%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fsizeqz59wy.feishu.cn%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTg5YjE2M2ZmNzk4NjktMGQ0NjNiYjJiZTU0ZmI4LTFhNTI1NjM0LTIwNzM2MDAtMTg5YjE2M2ZmN2E2ZTcifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%22189b163ff79869-0d463bb2be54fb8-1a525634-2073600-189b163ff7a6e7%22%7D; Hm_lvt_e92c8d65d92d534b0fc290df538b4758=1690898269; bannerFlag=true; searchSessionId=1690898275.00432266; Hm_lpvt_e92c8d65d92d534b0fc290df538b4758=1690899661', 78 | 'Pragma': 'no-cache', 79 | 'Referer': referer, 80 | 'Sec-Fetch-Dest': 'document', 81 | 'Sec-Fetch-Mode': 'navigate', 82 | 'Sec-Fetch-Site': 'same-origin', 83 | 'Sec-Fetch-User': '?1', 84 | 'Upgrade-Insecure-Requests': '1', 85 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', 86 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 87 | 'sec-ch-ua-mobile': '?0', 88 | 'sec-ch-ua-platform': '"macOS"', 89 | } 90 | 91 | response = requests.get(url, cookies=cookies, headers=headers) 92 | 93 | try: 94 | soup = BeautifulSoup(response.text, "lxml") 95 | text = soup.select_one("span.index_copy-text__ri7W6").text 96 | print(f"统一社会信用代码: {text}") 97 | except Exception as e: 98 | print(e) 99 | print(f"获取失败:{url}") -------------------------------------------------------------------------------- /2023_08/spider_uyanip/uyanip_register.py: -------------------------------------------------------------------------------- 1 | import string 2 | from io import BytesIO 3 | import random 4 | 5 | import ddddocr 6 | import requests 7 | from PIL import Image 8 | 9 | ocr = ddddocr.DdddOcr() 10 | 11 | def register(phone_number:str): 12 | """ 13 | 注册 14 | :param phone_number: 手机号 15 | :return: 成功或None 16 | """ 17 | headers = { 18 | 'Accept': '*/*', 19 | 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 20 | 'Cache-Control': 'no-cache', 21 | 'Connection': 'keep-alive', 22 | 'Content-Type': 'application/json; charset=UTF-8', 23 | 'Origin': 'https://www.uyanip.com', 24 | 'Pragma': 'no-cache', 25 | 'Referer': 'https://www.uyanip.com/', 26 | 'Sec-Fetch-Dest': 'empty', 27 | 'Sec-Fetch-Mode': 'cors', 28 | 'Sec-Fetch-Site': 'cross-site', 29 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188', 30 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"', 31 | 'sec-ch-ua-mobile': '?0', 32 | 'sec-ch-ua-platform': '"Windows"', 33 | } 34 | 35 | # 获取图片验证码和Cookies 36 | img_obj = get_img() 37 | if img_obj: 38 | # 发送短信,返回token。验证码错误会失败 39 | code_obj = send_code(phone_number, img_obj['captcha_code'], img_obj["cookies"]) 40 | if code_obj["errCode"] != 0: 41 | print(code_obj['data']) 42 | return None 43 | print(f"code_obj:{code_obj}") 44 | # 手机验证码 45 | phone_code = '' 46 | phone_code = input("请输入手机验证码:") 47 | 48 | json_data = { 49 | # 这里需要传入短信验证码接口返回的token 50 | 'vtoken': code_obj['data'], 51 | # 手机号 52 | 'phone': phone_number, 53 | # 手机短信验证码 54 | 'smscode': phone_code, 55 | 'password': 'mima123456', 56 | 'confirmPassword': 'mima123456', 57 | # 随机用户名 58 | 'nickname': generate_username(), 59 | 'pinvitationCode': '', 60 | 'type': 0, 61 | } 62 | # 发送注册请求 63 | response = requests.put('https://api.duyandb.com/auth/register/submit', headers=headers, json=json_data) 64 | # 成功会返回{'errCode':0, 'data': ''} 65 | print(response.json()) 66 | return response.json() 67 | 68 | def get_img(): 69 | """ 70 | 获取验证码 71 | :return: 返回cookies和验证码 72 | """ 73 | headers = { 74 | 'Accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8', 75 | 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 76 | 'Cache-Control': 'no-cache', 77 | 'Connection': 'keep-alive', 78 | 'Pragma': 'no-cache', 79 | 'Referer': 'https://www.uyanip.com/', 80 | 'Sec-Fetch-Dest': 'image', 81 | 'Sec-Fetch-Mode': 'no-cors', 82 | 'Sec-Fetch-Site': 'cross-site', 83 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188', 84 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"', 85 | 'sec-ch-ua-mobile': '?0', 86 | 'sec-ch-ua-platform': '"Windows"', 87 | } 88 | 89 | response = requests.get('https://api.duyandb.com/auth/register/captcha', headers=headers) 90 | print(response.cookies) 91 | # 检查响应状态码是否为 200 92 | if response.status_code == 200: 93 | # 将响应的内容解析为图片 94 | image = Image.open(BytesIO(response.content)) 95 | captcha_code = ocr.classification(image) 96 | else: 97 | print("请求失败,状态码:", response.status_code) 98 | return None 99 | # 这里的coockies用于下一次请求 100 | return { 101 | "cookies":response.cookies, "captcha_code":captcha_code 102 | } 103 | 104 | def send_code(phone_number:str, captcha_code, cookies): 105 | """ 106 | 发送短信验证码 107 | :param phone_number: 手机号 108 | :param captcha_code: 图片验证码 109 | :param cookies: 图片验证码拿到的Cookies 110 | :return: {'data':'', 'errCode': 0} 111 | """ 112 | """ 113 | 发送验证码 114 | :param phone_number: 手机号 115 | :return: {'data':'', 'errCode': 0} 116 | """ 117 | 118 | headers = { 119 | 'Accept': '*/*', 120 | 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 121 | 'Cache-Control': 'no-cache', 122 | 'Connection': 'keep-alive', 123 | 'Content-Type': 'application/json; charset=UTF-8', 124 | 'Origin': 'https://www.uyanip.com', 125 | 'Pragma': 'no-cache', 126 | 'Referer': 'https://www.uyanip.com/', 127 | 'Sec-Fetch-Dest': 'empty', 128 | 'Sec-Fetch-Mode': 'cors', 129 | 'Sec-Fetch-Site': 'cross-site', 130 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188', 131 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"', 132 | 'sec-ch-ua-mobile': '?0', 133 | 'sec-ch-ua-platform': '"Windows"', 134 | } 135 | 136 | # 这里传入手机号和图片验证码 137 | json_data = { 138 | 'value': phone_number, 139 | 'captchaCode': captcha_code, 140 | } 141 | 142 | response = requests.post('https://api.duyandb.com/auth/register/smscode', cookies=cookies, headers=headers, 143 | json=json_data) 144 | # 返回data和状态码,状态码为0则请求成功 145 | return response.json() 146 | 147 | 148 | def generate_username(length=8): 149 | # 定义允许使用的字符集合 150 | # characters = string.ascii_letters + string.digits + string.punctuation 151 | characters = string.ascii_letters + string.digits 152 | 153 | # 随机生成指定长度的用户名 154 | username = ''.join(random.choice(characters) for _ in range(length)) 155 | 156 | return username 157 | 158 | 159 | if __name__ == '__main__': 160 | result = register('17118061111') 161 | if result and result.get('errCode') == 0: 162 | print("注册成功") 163 | else: 164 | print('注册失败,请重试') -------------------------------------------------------------------------------- /2023_08/spider_yuekeyun/yuekeyun.js: -------------------------------------------------------------------------------- 1 | window = global; 2 | 3 | // 加载器 4 | var loader; 5 | !function (e) { 6 | function t(t) { 7 | for (var a, o, l = t[0], u = t[1], s = t[2], d = 0, f = []; d < l.length; d++) 8 | o = l[d], 9 | Object.prototype.hasOwnProperty.call(r, o) && r[o] && f.push(r[o][0]), 10 | r[o] = 0; 11 | for (a in u) 12 | Object.prototype.hasOwnProperty.call(u, a) && (e[a] = u[a]); 13 | for (c && c(t); f.length;) 14 | f.shift()(); 15 | return i.push.apply(i, s || []), 16 | n() 17 | } 18 | 19 | function n() { 20 | for (var e, t = 0; t < i.length; t++) { 21 | for (var n = i[t], a = !0, l = 1; l < n.length; l++) { 22 | var u = n[l]; 23 | 0 !== r[u] && (a = !1) 24 | } 25 | a && (i.splice(t--, 1), 26 | e = o(o.s = n[0])) 27 | } 28 | return e 29 | } 30 | 31 | var a = {} 32 | , r = { 33 | 528: 0 34 | } 35 | , i = []; 36 | 37 | function o(t) { 38 | if (a[t]) 39 | return a[t].exports; 40 | var n = a[t] = { 41 | i: t, 42 | l: !1, 43 | exports: {} 44 | }; 45 | return e[t].call(n.exports, n, n.exports, o), 46 | n.l = !0, 47 | n.exports 48 | } 49 | 50 | o.e = function (e) { 51 | var t = [] 52 | , n = r[e]; 53 | if (0 !== n) 54 | if (n) 55 | t.push(n[2]); 56 | else { 57 | var a = new Promise(function (t, a) { 58 | n = r[e] = [t, a] 59 | } 60 | ); 61 | t.push(n[2] = a); 62 | var i, l = document.createElement("script"); 63 | l.charset = "utf-8", 64 | l.timeout = 120, 65 | o.nc && l.setAttribute("nonce", o.nc), 66 | l.src = function (e) { 67 | return o.p + "js/chunks/" + ({ 68 | 133: "agreement", 69 | 134: "cinemaAgreement", 70 | 135: "goodsHoSalesInfo", 71 | 136: "goodsImportData", 72 | 137: "goodsStorageCheck", 73 | 138: "goodsStorageHandout", 74 | 139: "goodsStorageLoss", 75 | 140: "goodsStorageReturn", 76 | 141: "goodsStorageTransfer", 77 | 142: "hoPurchase", 78 | 143: "otherSetting", 79 | 144: "purchase", 80 | 145: "singleSubsidyManagement", 81 | 146: "storageItem" 82 | }[e] || e) + ".chunk.js" 83 | }(e), 84 | 0 !== l.src.indexOf(window.location.origin + "/") && (l.crossOrigin = "anonymous"); 85 | var u = new Error; 86 | i = function (t) { 87 | l.onerror = l.onload = null, 88 | clearTimeout(s); 89 | var n = r[e]; 90 | if (0 !== n) { 91 | if (n) { 92 | var a = t && ("load" === t.type ? "missing" : t.type) 93 | , i = t && t.target && t.target.src; 94 | u.message = "Loading chunk " + e + " failed.\n(" + a + ": " + i + ")", 95 | u.name = "ChunkLoadError", 96 | u.type = a, 97 | u.request = i, 98 | n[1](u) 99 | } 100 | r[e] = void 0 101 | } 102 | } 103 | ; 104 | var s = setTimeout(function () { 105 | i({ 106 | type: "timeout", 107 | target: l 108 | }) 109 | }, 12e4); 110 | l.onerror = l.onload = i, 111 | document.head.appendChild(l) 112 | } 113 | return Promise.all(t) 114 | } 115 | , 116 | o.m = e, 117 | o.c = a, 118 | o.d = function (e, t, n) { 119 | o.o(e, t) || Object.defineProperty(e, t, { 120 | enumerable: !0, 121 | get: n 122 | }) 123 | } 124 | , 125 | o.r = function (e) { 126 | "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { 127 | value: "Module" 128 | }), 129 | Object.defineProperty(e, "__esModule", { 130 | value: !0 131 | }) 132 | } 133 | , 134 | o.t = function (e, t) { 135 | if (1 & t && (e = o(e)), 136 | 8 & t) 137 | return e; 138 | if (4 & t && "object" == typeof e && e && e.__esModule) 139 | return e; 140 | var n = Object.create(null); 141 | if (o.r(n), 142 | Object.defineProperty(n, "default", { 143 | enumerable: !0, 144 | value: e 145 | }), 146 | 2 & t && "string" != typeof e) 147 | for (var a in e) 148 | o.d(n, a, function (t) { 149 | return e[t] 150 | } 151 | .bind(null, a)); 152 | return n 153 | } 154 | , 155 | o.n = function (e) { 156 | var t = e && e.__esModule ? function () { 157 | return e.default 158 | } 159 | : function () { 160 | return e 161 | } 162 | ; 163 | return o.d(t, "a", t), 164 | t 165 | } 166 | , 167 | o.o = function (e, t) { 168 | return Object.prototype.hasOwnProperty.call(e, t) 169 | } 170 | , 171 | o.p = "//g.alicdn.com/alipic-lark/larkportal-front/3.0.144/", 172 | o.oe = function (e) { 173 | throw e 174 | } 175 | ; 176 | var l = window.webpackJsonp = window.webpackJsonp || [] 177 | , u = l.push.bind(l); 178 | l.push = t, 179 | l = l.slice(); 180 | for (var s = 0; s < l.length; s++) 181 | t(l[s]); 182 | var c = u; 183 | i.push([1354, 0]), 184 | n() 185 | loader = o; 186 | }([ 187 | // 把需要的方法放进来 188 | function (e, t) { 189 | var n, a, r, o = 16, l = o, u = 65536, s = u >>> 1, c = u * u, d = u - 1; 190 | 191 | function f(e) { 192 | n = new Array(e); 193 | for (var t = 0; t < n.length; t++) 194 | n[t] = 0; 195 | a = new p, 196 | (r = new p).digits[0] = 1 197 | } 198 | 199 | f(20); 200 | h(1e15); 201 | 202 | function p(e) { 203 | this.digits = "boolean" == typeof e && 1 == e ? null : n.slice(0), 204 | this.isNeg = !1 205 | } 206 | 207 | function A(e) { 208 | var t = new p(!0); 209 | return t.digits = e.digits.slice(0), 210 | t.isNeg = e.isNeg, 211 | t 212 | } 213 | 214 | function h(e) { 215 | var t = new p; 216 | t.isNeg = e < 0, 217 | e = Math.abs(e); 218 | for (var n = 0; e > 0;) 219 | t.digits[n++] = e & d, 220 | e = Math.floor(e / u); 221 | return t 222 | } 223 | 224 | function m(e) { 225 | for (var t = "", n = e.length - 1; n > -1; --n) 226 | t += e.charAt(n); 227 | return t 228 | } 229 | 230 | var v = new Array("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"); 231 | 232 | function g(e, t) { 233 | var n = new p; 234 | n.digits[0] = t; 235 | for (var r = Y(e, n), i = v[r[1].digits[0]]; 1 == U(r[0], a);) 236 | r = Y(r[0], n), 237 | digit = r[1].digits[0], 238 | i += v[r[1].digits[0]]; 239 | return (e.isNeg ? "-" : "") + m(i) 240 | } 241 | 242 | var y = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"); 243 | 244 | function E(e) { 245 | var t = ""; 246 | for (i = 0; i < 4; ++i) 247 | t += y[15 & e], 248 | e >>>= 4; 249 | return m(t) 250 | } 251 | 252 | function b(e) { 253 | for (var t = "", n = (R(e), 254 | R(e)); n > -1; --n) 255 | t += E(e.digits[n]); 256 | return t 257 | } 258 | 259 | function I(e) { 260 | return e >= 48 && e <= 57 ? e - 48 : e >= 65 && e <= 90 ? 10 + e - 65 : e >= 97 && e <= 122 ? 10 + e - 97 : 0 261 | } 262 | 263 | function S(e) { 264 | for (var t = 0, n = Math.min(e.length, 4), a = 0; a < n; ++a) 265 | t <<= 4, 266 | t |= I(e.charCodeAt(a)); 267 | return t 268 | } 269 | 270 | function M(e) { 271 | for (var t = new p, n = e.length, a = 0; n > 0; n -= 4, 272 | ++a) 273 | t.digits[a] = S(e.substr(Math.max(n - 4, 0), Math.min(n, 4))); 274 | return t 275 | } 276 | 277 | function T(e, t) { 278 | var n; 279 | if (e.isNeg != t.isNeg) 280 | t.isNeg = !t.isNeg, 281 | n = w(e, t), 282 | t.isNeg = !t.isNeg; 283 | else { 284 | n = new p; 285 | for (var a, r = 0, i = 0; i < e.digits.length; ++i) 286 | a = e.digits[i] + t.digits[i] + r, 287 | n.digits[i] = a % u, 288 | r = Number(a >= u); 289 | n.isNeg = e.isNeg 290 | } 291 | return n 292 | } 293 | 294 | function w(e, t) { 295 | var n; 296 | if (e.isNeg != t.isNeg) 297 | t.isNeg = !t.isNeg, 298 | n = T(e, t), 299 | t.isNeg = !t.isNeg; 300 | else { 301 | var a, r; 302 | n = new p, 303 | r = 0; 304 | for (var i = 0; i < e.digits.length; ++i) 305 | a = e.digits[i] - t.digits[i] + r, 306 | n.digits[i] = a % u, 307 | n.digits[i] < 0 && (n.digits[i] += u), 308 | r = 0 - Number(a < 0); 309 | if (-1 == r) { 310 | r = 0; 311 | for (i = 0; i < e.digits.length; ++i) 312 | a = 0 - n.digits[i] + r, 313 | n.digits[i] = a % u, 314 | n.digits[i] < 0 && (n.digits[i] += u), 315 | r = 0 - Number(a < 0); 316 | n.isNeg = !e.isNeg 317 | } else 318 | n.isNeg = e.isNeg 319 | } 320 | return n 321 | } 322 | 323 | function R(e) { 324 | for (var t = e.digits.length - 1; t > 0 && 0 == e.digits[t];) 325 | --t; 326 | return t 327 | } 328 | 329 | function N(e) { 330 | var t, n = R(e), a = e.digits[n], r = (n + 1) * l; 331 | for (t = r; t > r - l && 0 == (32768 & a); --t) 332 | a <<= 1; 333 | return t 334 | } 335 | 336 | function D(e, t) { 337 | for (var n, a, r, i = new p, l = R(e), u = R(t), s = 0; s <= u; ++s) { 338 | for (n = 0, 339 | r = s, 340 | j = 0; j <= l; ++j, 341 | ++r) 342 | a = i.digits[r] + e.digits[j] * t.digits[s] + n, 343 | i.digits[r] = a & d, 344 | n = a >>> o; 345 | i.digits[s + l + 1] = n 346 | } 347 | return i.isNeg = e.isNeg != t.isNeg, 348 | i 349 | } 350 | 351 | function k(e, t) { 352 | var n, a, r; 353 | result = new p, 354 | n = R(e), 355 | a = 0; 356 | for (var i = 0; i <= n; ++i) 357 | r = result.digits[i] + e.digits[i] * t + a, 358 | result.digits[i] = r & d, 359 | a = r >>> o; 360 | return result.digits[1 + n] = a, 361 | result 362 | } 363 | 364 | function C(e, t, n, a, r) { 365 | for (var i = Math.min(t + r, e.length), o = t, l = a; o < i; ++o, 366 | ++l) 367 | n[l] = e[o] 368 | } 369 | 370 | var O = new Array(0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535); 371 | 372 | function x(e, t) { 373 | var n = Math.floor(t / l) 374 | , a = new p; 375 | C(e.digits, 0, a.digits, n, a.digits.length - n); 376 | for (var r = t % l, i = l - r, o = a.digits.length - 1, u = o - 1; o > 0; --o, 377 | --u) 378 | a.digits[o] = a.digits[o] << r & d | (a.digits[u] & O[r]) >>> i; 379 | return a.digits[0] = a.digits[o] << r & d, 380 | a.isNeg = e.isNeg, 381 | a 382 | } 383 | 384 | var L = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535); 385 | 386 | function B(e, t) { 387 | var n = Math.floor(t / l) 388 | , a = new p; 389 | C(e.digits, n, a.digits, 0, e.digits.length - n); 390 | for (var r = t % l, i = l - r, o = 0, u = o + 1; o < a.digits.length - 1; ++o, 391 | ++u) 392 | a.digits[o] = a.digits[o] >>> r | (a.digits[u] & L[r]) << i; 393 | return a.digits[a.digits.length - 1] >>>= r, 394 | a.isNeg = e.isNeg, 395 | a 396 | } 397 | 398 | function P(e, t) { 399 | var n = new p; 400 | return C(e.digits, 0, n.digits, t, n.digits.length - t), 401 | n 402 | } 403 | 404 | function Q(e, t) { 405 | var n = new p; 406 | return C(e.digits, t, n.digits, 0, n.digits.length - t), 407 | n 408 | } 409 | 410 | function G(e, t) { 411 | var n = new p; 412 | return C(e.digits, 0, n.digits, 0, t), 413 | n 414 | } 415 | 416 | function U(e, t) { 417 | if (e.isNeg != t.isNeg) 418 | return 1 - 2 * Number(e.isNeg); 419 | for (var n = e.digits.length - 1; n >= 0; --n) 420 | if (e.digits[n] != t.digits[n]) 421 | return e.isNeg ? 1 - 2 * Number(e.digits[n] > t.digits[n]) : 1 - 2 * Number(e.digits[n] < t.digits[n]); 422 | return 0 423 | } 424 | 425 | function Y(e, t) { 426 | var n, a, i = N(e), o = N(t), f = t.isNeg; 427 | if (i < o) 428 | return e.isNeg ? ((n = A(r)).isNeg = !t.isNeg, 429 | e.isNeg = !1, 430 | t.isNeg = !1, 431 | a = w(t, e), 432 | e.isNeg = !0, 433 | t.isNeg = f) : (n = new p, 434 | a = A(e)), 435 | new Array(n, a); 436 | n = new p, 437 | a = e; 438 | for (var h = Math.ceil(o / l) - 1, m = 0; t.digits[h] < s;) 439 | t = x(t, 1), 440 | ++m, 441 | ++o, 442 | h = Math.ceil(o / l) - 1; 443 | a = x(a, m), 444 | i += m; 445 | for (var v = Math.ceil(i / l) - 1, g = P(t, v - h); -1 != U(a, g);) 446 | ++n.digits[v - h], 447 | a = w(a, g); 448 | for (var y = v; y > h; --y) { 449 | var E = y >= a.digits.length ? 0 : a.digits[y] 450 | , b = y - 1 >= a.digits.length ? 0 : a.digits[y - 1] 451 | , I = y - 2 >= a.digits.length ? 0 : a.digits[y - 2] 452 | , S = h >= t.digits.length ? 0 : t.digits[h] 453 | , M = h - 1 >= t.digits.length ? 0 : t.digits[h - 1]; 454 | n.digits[y - h - 1] = E == S ? d : Math.floor((E * u + b) / S); 455 | for (var D = n.digits[y - h - 1] * (S * u + M), C = E * c + (b * u + I); D > C;) 456 | --n.digits[y - h - 1], 457 | D = n.digits[y - h - 1] * (S * u | M), 458 | C = E * u * u + (b * u + I); 459 | (a = w(a, k(g = P(t, y - h - 1), n.digits[y - h - 1]))).isNeg && (a = T(a, g), 460 | --n.digits[y - h - 1]) 461 | } 462 | return a = B(a, m), 463 | n.isNeg = e.isNeg != f, 464 | e.isNeg && (n = f ? T(n, r) : w(n, r), 465 | a = w(t = B(t, m), a)), 466 | 0 == a.digits[0] && 0 == R(a) && (a.isNeg = !1), 467 | new Array(n, a) 468 | } 469 | 470 | function W(e) { 471 | var t = Q(D(Q(e, this.k - 1), this.mu), this.k + 1) 472 | , n = w(G(e, this.k + 1), G(D(t, this.modulus), this.k + 1)); 473 | n.isNeg && (n = T(n, this.bkplus1)); 474 | for (var a = U(n, this.modulus) >= 0; a;) 475 | a = U(n = w(n, this.modulus), this.modulus) >= 0; 476 | return n 477 | } 478 | 479 | function V(e, t) { 480 | var n = D(e, t); 481 | return this.modulo(n) 482 | } 483 | 484 | function z(e, t) { 485 | var n = new p; 486 | n.digits[0] = 1; 487 | for (var a = e, r = t; 0 != (1 & r.digits[0]) && (n = this.multiplyMod(n, a)), 488 | 0 != (r = B(r, 1)).digits[0] || 0 != R(r);) 489 | a = this.multiplyMod(a, a); 490 | return n 491 | } 492 | 493 | e.exports = { 494 | RSAKeyPair: function (e, t, n) { 495 | this.e = M(e), 496 | this.d = M(t), 497 | this.m = M(n), 498 | this.chunkSize = 2 * R(this.m), 499 | this.radix = 16, 500 | this.barrett = new function (e) { 501 | this.modulus = A(e), 502 | this.k = R(this.modulus) + 1; 503 | var t, n, a = new p; 504 | a.digits[2 * this.k] = 1, 505 | this.mu = (t = a, 506 | n = this.modulus, 507 | Y(t, n)[0]), 508 | this.bkplus1 = new p, 509 | this.bkplus1.digits[this.k + 1] = 1, 510 | this.modulo = W, 511 | this.multiplyMod = V, 512 | this.powMod = z 513 | } 514 | (this.m) 515 | }, 516 | setMaxDigits: f, 517 | encryptedString: function (e, t) { 518 | for (var n = new Array, a = t.length, r = 0; r < a;) 519 | n[r] = t.charCodeAt(r), 520 | r++; 521 | for (; n.length % e.chunkSize != 0;) 522 | n[r++] = 0; 523 | var i, o, l, u = n.length, s = ""; 524 | for (r = 0; r < u; r += e.chunkSize) { 525 | for (l = new p, 526 | i = 0, 527 | o = r; o < r + e.chunkSize; ++i) 528 | l.digits[i] = n[o++], 529 | l.digits[i] += n[o++] << 8; 530 | var c = e.barrett.powMod(l, e.e); 531 | s += (16 == e.radix ? b(c) : g(c, e.radix)) + " " 532 | } 533 | return s.substring(0, s.length - 1) 534 | } 535 | } 536 | }, 537 | ]); 538 | // console.log(loader(0)); 539 | 540 | // s是公钥,可以在网页源代码中找到 541 | s = { 542 | "daily": "f15fb948704151452b51b9914d32d5c51083dab544541f115e7afa4e7783a5c9a9537c9478cb284c369e1687c99ae93c2f7fd0b3787194930ba9d3a06a6c15e0eb0dc393eefc6c2ae491f6289c0eed5bae55ef8731928e388b6311a039a9e97ca33199993fc84982b52f09842ebbd93140e1f98fddba791e06a3e36250ac96df", 543 | "zlg_daily": "f15fb948704151452b51b9914d32d5c51083dab544541f115e7afa4e7783a5c9a9537c9478cb284c369e1687c99ae93c2f7fd0b3787194930ba9d3a06a6c15e0eb0dc393eefc6c2ae491f6289c0eed5bae55ef8731928e388b6311a039a9e97ca33199993fc84982b52f09842ebbd93140e1f98fddba791e06a3e36250ac96df", 544 | "pre": "8c99bea915e2f3623d5bb15209ffdde3a0aa1b9652a7a3222423f00994ce2d7b5f8ef837ed2bfe940235932e3ecdabf15f15bd6e71943f5fd5166a1dd0e78f309ba39acfadec05de53c0655342caab2231b63bbbac549ce901085a14709e483b1c4037934f9d3bccd0d8a0291403d6c40b00daea810ec5fdb784591dc03188c5", 545 | "zlg_pre": "8c99bea915e2f3623d5bb15209ffdde3a0aa1b9652a7a3222423f00994ce2d7b5f8ef837ed2bfe940235932e3ecdabf15f15bd6e71943f5fd5166a1dd0e78f309ba39acfadec05de53c0655342caab2231b63bbbac549ce901085a14709e483b1c4037934f9d3bccd0d8a0291403d6c40b00daea810ec5fdb784591dc03188c5", 546 | "prod": "837ec9791ee734418f44220b56cd22252c53309f59c560ff231d71e2579d38ea7a4408b017b1af85c6683111da151af25dddc53904a01e219bd56495a1add8cb70e54428bb87d95cd40478f6f800414be8a334ac779f4b819ae94fec240dc2ace1f99df64de88eef7bcbde4aabbdeac0e70a55e61331a9ea3d0546fe647977f9", 547 | "zlg_prod": "837ec9791ee734418f44220b56cd22252c53309f59c560ff231d71e2579d38ea7a4408b017b1af85c6683111da151af25dddc53904a01e219bd56495a1add8cb70e54428bb87d95cd40478f6f800414be8a334ac779f4b819ae94fec240dc2ace1f99df64de88eef7bcbde4aabbdeac0e70a55e61331a9ea3d0546fe647977f9" 548 | } 549 | // loader(0)是RSA加密的函数 550 | var i = loader(0); 551 | 552 | function get_password(e) { 553 | i.setMaxDigits(130); 554 | var c = new i.RSAKeyPair("10001", "", s['prod']); 555 | // e参数是密码 556 | return i.encryptedString(c, encodeURIComponent(e)); 557 | } 558 | 559 | 560 | console.log(get_password('123456')); -------------------------------------------------------------------------------- /2023_09/geetest_slide/GTrace.py: -------------------------------------------------------------------------------- 1 | """ 2 | 用于生成坐标轨迹 3 | """ 4 | import math 5 | import random 6 | import matplotlib.pyplot as plt 7 | import numpy as np 8 | import matplotlib as mpl 9 | 10 | class GTrace(object): 11 | def __init__(self): 12 | self.__pos_x = [] 13 | self.__pos_y = [] 14 | self.__pos_z = [] 15 | 16 | def __set_pt_time(self): 17 | """ 18 | 设置各节点的时间 19 | 分析不同时间间隔中X坐标数量的占比 20 | 统计结果: 1. 80%~90%的X坐标在15~20毫秒之间 21 | 2. 10%~15%在20~200及以上,其中 [-a, 0, x, ...] 这里x只有一个,取值在110~200之间 22 | 坐标集最后3~5个坐标取值再50~400之间,最后一个坐标数值最大 23 | 24 | 滑动总时间的取值规则: 图片宽度260,去掉滑块的宽度剩下200; 25 | 如果距离小于100,则耗时1300~1900之间 26 | 如果距离大于100,则耗时1700~2100之间 27 | """ 28 | __end_pt_time = [] 29 | __move_pt_time = [] 30 | self.__pos_z = [] 31 | 32 | total_move_time = self.__need_time * random.uniform(0.8, 0.9) 33 | start_point_time = random.uniform(110, 200) 34 | __start_pt_time = [0, 0, int(start_point_time)] 35 | 36 | sum_move_time = 0 37 | 38 | _tmp_total_move_time = total_move_time 39 | while True: 40 | delta_time = random.uniform(15, 20) 41 | if _tmp_total_move_time < delta_time: 42 | break 43 | 44 | sum_move_time += delta_time 45 | _tmp_total_move_time -= delta_time 46 | __move_pt_time.append(int(start_point_time+sum_move_time)) 47 | 48 | last_pt_time = __move_pt_time[-1] 49 | __move_pt_time.append(last_pt_time+_tmp_total_move_time) 50 | 51 | sum_end_time = start_point_time + total_move_time 52 | other_point_time = self.__need_time - sum_end_time 53 | end_first_ptime = other_point_time / 2 54 | 55 | while True: 56 | delta_time = random.uniform(110, 200) 57 | if end_first_ptime - delta_time <= 0: 58 | break 59 | 60 | end_first_ptime -= delta_time 61 | sum_end_time += delta_time 62 | __end_pt_time.append(int(sum_end_time)) 63 | 64 | __end_pt_time.append(int(sum_end_time + (other_point_time/2 + end_first_ptime))) 65 | self.__pos_z.extend(__start_pt_time) 66 | self.__pos_z.extend(__move_pt_time) 67 | self.__pos_z.extend(__end_pt_time) 68 | 69 | def __set_distance(self, _dist): 70 | """ 71 | 设置要生成的轨迹长度 72 | """ 73 | self.__distance = _dist 74 | 75 | if _dist < 100: 76 | self.__need_time = int(random.uniform(500, 1500)) 77 | else: 78 | self.__need_time = int(random.uniform(1000, 2000)) 79 | 80 | def __get_pos_z(self): 81 | return self.__pos_z 82 | 83 | def __get_pos_y(self): 84 | _pos_y = [random.uniform(-40, -18), 0] 85 | point_count = len(self.__pos_z) 86 | x = np.linspace(-10, 15, point_count - len(_pos_y)) 87 | arct_y = np.arctan(x) 88 | 89 | for _, val in enumerate(arct_y): 90 | _pos_y.append(val) 91 | 92 | return _pos_y 93 | 94 | def __get_pos_x(self, _distance): 95 | """ 96 | 绘制标准的数学函数图像: 以 tanh 开始 以 arctan 结尾 97 | 根据此模型用等比时间差生成X坐标 98 | """ 99 | # first_val = random.uniform(-40, -18) 100 | # _distance += first_val 101 | _pos_x = [random.uniform(-40, -18), 0] 102 | self.__set_distance(_distance) 103 | self.__set_pt_time() 104 | 105 | point_count = len(self.__pos_z) 106 | x = np.linspace(-1, 19, point_count-len(_pos_x)) 107 | ss = np.arctan(x) 108 | th = np.tanh(x) 109 | 110 | for idx in range(0, len(th)): 111 | if th[idx] < ss[idx]: 112 | th[idx] = ss[idx] 113 | 114 | th += 1 115 | th *= (_distance / 2.5) 116 | 117 | i = 0 118 | start_idx = int(point_count/10) 119 | end_idx = int(point_count/50) 120 | delta_pt = abs(np.random.normal(scale=1.1, size=point_count-start_idx-end_idx)) 121 | for idx in range(start_idx, point_count): 122 | if idx*1.3 > len(delta_pt): 123 | break 124 | 125 | th[idx] += delta_pt[i] 126 | i+=1 127 | 128 | _pos_x.extend(th) 129 | return _pos_x[-1], _pos_x 130 | 131 | def get_mouse_pos_path(self, distance): 132 | """ 133 | 获取滑动滑块鼠标的滑动轨迹坐标集合 134 | """ 135 | result = [] 136 | _distance, x = self.__get_pos_x(distance) 137 | y = self.__get_pos_y() 138 | z = self.__get_pos_z() 139 | 140 | for idx in range(len(x)): 141 | result.append([int(x[idx]), int(y[idx]), int(z[idx])]) 142 | 143 | return int(_distance), result 144 | 145 | 146 | if __name__ == "__main__": 147 | _color = ["blue", "green", "red", "cyan", "magenta"] 148 | trace = GTrace() 149 | distance , res = trace.get_mouse_pos_path(100) 150 | print(distance) 151 | print(res) 152 | # for idx in range(0, 10): 153 | # distance = random.uniform(70, 150) 154 | # print("长度为: %d , 坐标为: \n" % distance) 155 | # distance, mouse_pos_path = trace.get_mouse_pos_path(distance) 156 | # print("长度为: %d , 坐标为: \" % distance, mouse_pos_path) 157 | -------------------------------------------------------------------------------- /2023_09/geetest_slide/geetest.py: -------------------------------------------------------------------------------- 1 | import io 2 | import json 3 | import random 4 | import re 5 | import time 6 | from pathlib import Path 7 | 8 | import ddddocr 9 | import execjs 10 | from PIL import Image 11 | import requests 12 | 13 | 14 | # 创建会话对象 15 | session = requests.Session() 16 | 17 | 18 | def get_t(): 19 | return str(int(time.time()*1000)) 20 | 21 | 22 | def parse_bg_captcha(img, im_show=False, save_path=None): 23 | """ 24 | 滑块乱序背景图还原 25 | :param img: 图片路径str/图片路径Path对象/图片二进制 26 | eg: 'assets/bg.webp' 27 | Path('assets/bg.webp') 28 | :param im_show: 是否显示还原结果, ; default: False 29 | :param save_path: 保存路径, /; default: None 30 | :return: 还原后背景图 RGB图片格式 31 | """ 32 | if isinstance(img, (str, Path)): 33 | _img = Image.open(img) 34 | elif isinstance(img, bytes): 35 | _img = Image.open(io.BytesIO(img)) 36 | else: 37 | raise ValueError(f'输入图片类型错误, 必须是//: {type(img)}') 38 | # 图片还原顺序, 定值 39 | _Ge = [39, 38, 48, 49, 41, 40, 46, 47, 35, 34, 50, 51, 33, 32, 28, 29, 27, 26, 36, 37, 31, 30, 44, 45, 43, 40 | 42, 12, 13, 23, 22, 14, 15, 21, 20, 8, 9, 25, 24, 6, 7, 3, 2, 0, 1, 11, 10, 4, 5, 19, 18, 16, 17] 41 | w_sep, h_sep = 10, 80 42 | 43 | # 还原后的背景图 44 | new_img = Image.new('RGB', (260, 160)) 45 | 46 | for idx in range(len(_Ge)): 47 | x = _Ge[idx] % 26 * 12 + 1 48 | y = h_sep if _Ge[idx] > 25 else 0 49 | # 从背景图中裁剪出对应位置的小块 50 | img_cut = _img.crop((x, y, x + w_sep, y + h_sep)) 51 | # 将小块拼接到新图中 52 | new_x = idx % 26 * 10 53 | new_y = h_sep if idx > 25 else 0 54 | new_img.paste(img_cut, (new_x, new_y)) 55 | 56 | # new_img转为bytes 57 | if im_show: 58 | new_img.show() 59 | if save_path is not None: 60 | save_path = Path(save_path).resolve().__str__() 61 | new_img.save(save_path) 62 | stream = io.BytesIO() 63 | new_img.save(stream, format='JPEG') 64 | image_bytes = stream.getvalue() 65 | 66 | # 关闭字节流 67 | stream.close() 68 | # TypeError: a bytes-like object is required, not '_io.BytesIO' 69 | return image_bytes 70 | # ———————————————— 71 | # 版权声明:本文为CSDN博主「帯泪的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 72 | # 原文链接:https://blog.csdn.net/qq_42857999/article/details/121628908 73 | 74 | 75 | def get_gt_and_challenge(): 76 | """ 77 | 第一次请求,获取gt和challenge 78 | :return: gt, challenge 79 | """ 80 | 81 | cookies = None 82 | 83 | headers = { 84 | 'authority': 'www.geetest.com', 85 | 'accept': 'application/json, text/javascript, */*; q=0.01', 86 | 'accept-language': 'zh-CN,zh;q=0.9', 87 | 'cache-control': 'no-cache', 88 | # 'cookie': 'AGL_USER_ID=7075d2d8-204a-4342-a886-0f397056a796; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218a7338176f1767-07fece585a75da-19525634-1484784-18a733817701bc3%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Fauth.geetest.com%2Flogin%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThhNzMzODE3NmYxNzY3LTA3ZmVjZTU4NWE3NWRhLTE5NTI1NjM0LTE0ODQ3ODQtMThhNzMzODE3NzAxYmMzIn0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218a7338176f1767-07fece585a75da-19525634-1484784-18a733817701bc3%22%7D; 461cca3146ff093d059dee9439aa6b26=b6642792-7ee3-4fa3-bb03-a44cf78386ec', 89 | 'pragma': 'no-cache', 90 | 'referer': 'https://www.geetest.com/demo/slide-float.html', 91 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 92 | 'sec-ch-ua-mobile': '?0', 93 | 'sec-ch-ua-platform': '"macOS"', 94 | 'sec-fetch-dest': 'empty', 95 | 'sec-fetch-mode': 'cors', 96 | 'sec-fetch-site': 'same-origin', 97 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 98 | 'x-requested-with': 'XMLHttpRequest', 99 | } 100 | 101 | params = { 102 | 't': get_t(), 103 | } 104 | 105 | response = session.get('https://www.geetest.com/demo/gt/register-slide', params=params, cookies=cookies, 106 | headers=headers) 107 | # print(response.json()) 108 | return response.json() 109 | 110 | 111 | def other_static_js(): 112 | 113 | headers = { 114 | 'authority': 'static.geetest.com', 115 | 'accept': '*/*', 116 | 'accept-language': 'zh-CN,zh;q=0.9', 117 | 'cache-control': 'no-cache', 118 | 'origin': 'https://www.geetest.com', 119 | 'pragma': 'no-cache', 120 | 'referer': 'https://www.geetest.com/', 121 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 122 | 'sec-ch-ua-mobile': '?0', 123 | 'sec-ch-ua-platform': '"macOS"', 124 | 'sec-fetch-dest': 'script', 125 | 'sec-fetch-mode': 'cors', 126 | 'sec-fetch-site': 'same-site', 127 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 128 | } 129 | 130 | response = session.get('https://static.geetest.com/static/js/fullpage.9.1.6.js', headers=headers) 131 | 132 | def get_cookie_user(gt): 133 | headers = { 134 | 'Accept': '*/*', 135 | 'Accept-Language': 'zh-CN,zh;q=0.9', 136 | 'Cache-Control': 'no-cache', 137 | 'Connection': 'keep-alive', 138 | 'Pragma': 'no-cache', 139 | 'Referer': 'https://www.geetest.com/', 140 | 'Sec-Fetch-Dest': 'script', 141 | 'Sec-Fetch-Mode': 'no-cors', 142 | 'Sec-Fetch-Site': 'same-site', 143 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 144 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 145 | 'sec-ch-ua-mobile': '?0', 146 | 'sec-ch-ua-platform': '"macOS"', 147 | } 148 | 149 | params = { 150 | 'gt': gt, 151 | 'callback': f'geetest_{get_t()}', 152 | } 153 | 154 | return session.get('https://apiv6.geetest.com/gettype.php', params=params, headers=headers).cookies 155 | 156 | 157 | def get_cookie_ajax_user(gt, challenge): 158 | headers = { 159 | 'Accept': '*/*', 160 | 'Accept-Language': 'zh-CN,zh;q=0.9', 161 | 'Cache-Control': 'no-cache', 162 | 'Connection': 'keep-alive', 163 | 'Pragma': 'no-cache', 164 | 'Referer': 'https://www.geetest.com/', 165 | 'Sec-Fetch-Dest': 'script', 166 | 'Sec-Fetch-Mode': 'no-cors', 167 | 'Sec-Fetch-Site': 'same-site', 168 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 169 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 170 | 'sec-ch-ua-mobile': '?0', 171 | 'sec-ch-ua-platform': '"macOS"', 172 | } 173 | 174 | response = session.get( 175 | f'https://api.geetest.com/ajax.php?gt={gt}&challenge={challenge}&lang=zh-cn&pt=0&client_type=web&w=&callback=geetest_{get_t()}', 176 | headers=headers, 177 | ) 178 | return response.cookies 179 | 180 | 181 | def get_c_and_s(gt, challenge, cookies=None): 182 | """ 183 | 获取c和s参数,需要传入gt和challenge 184 | :return: 185 | """ 186 | # cookies = None 187 | 188 | headers = { 189 | 'Accept': '*/*', 190 | 'Accept-Language': 'zh-CN,zh;q=0.9', 191 | 'Cache-Control': 'no-cache', 192 | 'Connection': 'keep-alive', 193 | # 'Cookie': 'sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218a7338176f1767-07fece585a75da-19525634-1484784-18a733817701bc3%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Fauth.geetest.com%2Flogin%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThhNzMzODE3NmYxNzY3LTA3ZmVjZTU4NWE3NWRhLTE5NTI1NjM0LTE0ODQ3ODQtMThhNzMzODE3NzAxYmMzIn0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218a7338176f1767-07fece585a75da-19525634-1484784-18a733817701bc3%22%7D; GeeTestUser=f0788cd5502fa7cbe41ac24a5992b2d7', 194 | 'Pragma': 'no-cache', 195 | 'Referer': 'https://www.geetest.com/', 196 | 'Sec-Fetch-Dest': 'script', 197 | 'Sec-Fetch-Mode': 'no-cors', 198 | 'Sec-Fetch-Site': 'same-site', 199 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 200 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 201 | 'sec-ch-ua-mobile': '?0', 202 | 'sec-ch-ua-platform': '"macOS"', 203 | } 204 | 205 | response = session.get( 206 | f'https://apiv6.geetest.com/get.php?gt={gt}&challenge={challenge}&lang=zh-cn&pt=0&client_type=web&callback=geetest_1694239359661&w=', 207 | cookies=cookies, 208 | headers=headers, 209 | ) 210 | # 转为json 211 | json_str = get_json(response.text) 212 | return json_str 213 | 214 | 215 | def get_json(text): 216 | """ 217 | 提取出geetest_ddd(*)里的json数据,返回dict 218 | :param text: 219 | :return: 220 | """ 221 | # re取出geetest_1694239359661()中的json 222 | json_str = re.search(r'geetest_\d+\((.*?)\)', text).group(1) 223 | # 转为json 224 | js = json.loads(json_str) 225 | return js 226 | 227 | 228 | def get_img_and_params(gt, challenge, cookies=None): 229 | 230 | headers = { 231 | 'Accept': '*/*', 232 | 'Accept-Language': 'zh-CN,zh;q=0.9', 233 | 'Cache-Control': 'no-cache', 234 | 'Connection': 'keep-alive', 235 | # 'Cookie': 'GeeTestUser=1379c9207f415478e94894e43b879b32; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218a7338176f1767-07fece585a75da-19525634-1484784-18a733817701bc3%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Fauth.geetest.com%2Flogin%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThhNzMzODE3NmYxNzY3LTA3ZmVjZTU4NWE3NWRhLTE5NTI1NjM0LTE0ODQ3ODQtMThhNzMzODE3NzAxYmMzIn0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218a7338176f1767-07fece585a75da-19525634-1484784-18a733817701bc3%22%7D; GeeTestAjaxUser=21fd622449a60f9a7537765de8acbccb', 236 | 'Pragma': 'no-cache', 237 | 'Referer': 'https://www.geetest.com/', 238 | 'Sec-Fetch-Dest': 'script', 239 | 'Sec-Fetch-Mode': 'no-cors', 240 | 'Sec-Fetch-Site': 'same-site', 241 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 242 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 243 | 'sec-ch-ua-mobile': '?0', 244 | 'sec-ch-ua-platform': '"macOS"', 245 | } 246 | 247 | params = { 248 | 'is_next': 'true', 249 | 'type': 'slide3', 250 | 'gt': gt, 251 | 'challenge': challenge, 252 | 'lang': 'zh-cn', 253 | 'https': 'true', 254 | 'protocol': 'https://', 255 | 'offline': 'false', 256 | 'product': 'embed', 257 | 'api_server': 'api.geetest.com', 258 | 'isPC': 'true', 259 | 'autoReset': 'true', 260 | 'width': '100%', 261 | 'callback': f'geetest_{get_t()}', 262 | } 263 | # print(f"callback:{params['callback']}") 264 | 265 | response = session.get('https://api.geetest.com/get.php', params=params, cookies=cookies, headers=headers) 266 | # print(response.text) 267 | return response 268 | 269 | 270 | def get_img(api_server, url): 271 | """ 272 | 网络请求获取图片 273 | :return: 274 | """ 275 | headers = { 276 | 'authority': 'static.geetest.com', 277 | 'accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8', 278 | 'accept-language': 'zh-CN,zh;q=0.9', 279 | 'cache-control': 'no-cache', 280 | 'origin': 'https://www.geetest.com', 281 | 'pragma': 'no-cache', 282 | 'referer': 'https://www.geetest.com/', 283 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 284 | 'sec-ch-ua-mobile': '?0', 285 | 'sec-ch-ua-platform': '"macOS"', 286 | 'sec-fetch-dest': 'image', 287 | 'sec-fetch-mode': 'cors', 288 | 'sec-fetch-site': 'same-site', 289 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 290 | } 291 | print(f"{api_server}{url}") 292 | response = session.get(f"https://{api_server}{url}", headers=headers) 293 | return response.content 294 | 295 | 296 | def get_slice_res(target_bytes, background_bytes): 297 | slide = ddddocr.DdddOcr(det=False, ocr=False) 298 | 299 | res = slide.slide_comparison(target_bytes, background_bytes) 300 | 301 | return res 302 | 303 | 304 | def slice_main(cookies, gt, challenge, w): 305 | 306 | headers = { 307 | 'Accept': '*/*', 308 | 'Accept-Language': 'zh-CN,zh;q=0.9', 309 | 'Cache-Control': 'no-cache', 310 | 'Connection': 'keep-alive', 311 | # 'Cookie': 'GeeTestAjaxUser=151f4bdbc9854e0202a7d4a9b2854baf; GeeTestUser=de604e0d18c12a7c48acdbd9c6d0f40f', 312 | 'Pragma': 'no-cache', 313 | 'Referer': 'https://www.geetest.com/', 314 | 'Sec-Fetch-Dest': 'script', 315 | 'Sec-Fetch-Mode': 'no-cors', 316 | 'Sec-Fetch-Site': 'same-site', 317 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 318 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 319 | 'sec-ch-ua-mobile': '?0', 320 | 'sec-ch-ua-platform': '"macOS"', 321 | } 322 | 323 | response = session.get( 324 | f'https://api.geetest.com/ajax.php?gt={gt}&challenge={challenge}&lang=zh-cn&%24_BCe=0&client_type=web&w={w}&callback=geetest_{get_t()}', 325 | cookies=cookies, 326 | headers=headers, 327 | ) 328 | 329 | return response 330 | 331 | 332 | def get_type(gt, cookies): 333 | 334 | headers = { 335 | 'Accept': '*/*', 336 | 'Accept-Language': 'zh-CN,zh;q=0.9', 337 | 'Cache-Control': 'no-cache', 338 | 'Connection': 'keep-alive', 339 | # 'Cookie': 'GeeTestUser=51a45e772463dc3565fa63cf7ccfaa9a', 340 | 'Pragma': 'no-cache', 341 | 'Referer': 'https://www.geetest.com/', 342 | 'Sec-Fetch-Dest': 'script', 343 | 'Sec-Fetch-Mode': 'no-cors', 344 | 'Sec-Fetch-Site': 'same-site', 345 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 346 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 347 | 'sec-ch-ua-mobile': '?0', 348 | 'sec-ch-ua-platform': '"macOS"', 349 | } 350 | 351 | params = { 352 | 'gt': gt, 353 | 'callback': f'geetest_{get_t()}', 354 | } 355 | 356 | response = session.get('https://apiv6.geetest.com/gettype.php', params=params, cookies=cookies, headers=headers) 357 | 358 | 359 | def other_statis_js_2(): 360 | 361 | headers = { 362 | 'authority': 'static.geetest.com', 363 | 'accept': '*/*', 364 | 'accept-language': 'zh-CN,zh;q=0.9', 365 | 'cache-control': 'no-cache', 366 | 'origin': 'https://www.geetest.com', 367 | 'pragma': 'no-cache', 368 | 'referer': 'https://www.geetest.com/', 369 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 370 | 'sec-ch-ua-mobile': '?0', 371 | 'sec-ch-ua-platform': '"macOS"', 372 | 'sec-fetch-dest': 'script', 373 | 'sec-fetch-mode': 'cors', 374 | 'sec-fetch-site': 'same-site', 375 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 376 | } 377 | 378 | response = session.get('https://static.geetest.com/static/js/slide.7.9.1.js', headers=headers) 379 | def other_static_js_3(): 380 | import requests 381 | 382 | headers = { 383 | 'authority': 'static.geetest.com', 384 | 'accept': '*/*', 385 | 'accept-language': 'zh-CN,zh;q=0.9', 386 | 'cache-control': 'no-cache', 387 | 'origin': 'https://www.geetest.com', 388 | 'pragma': 'no-cache', 389 | 'referer': 'https://www.geetest.com/', 390 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 391 | 'sec-ch-ua-mobile': '?0', 392 | 'sec-ch-ua-platform': '"macOS"', 393 | 'sec-fetch-dest': 'script', 394 | 'sec-fetch-mode': 'cors', 395 | 'sec-fetch-site': 'same-site', 396 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 397 | } 398 | 399 | response = session.get('https://static.geetest.com/static/js/gct.b71a9027509bc6bcfef9fc6a196424f5.js', 400 | headers=headers) 401 | 402 | 403 | def __ease_out_expo(sep): 404 | """ 405 | 缓动函数 easeOutExpo 406 | 参考:https://easings.net/zh-cn#easeOutExpo 407 | """ 408 | if sep == 1: 409 | return 1 410 | else: 411 | return 1 - pow(2, -10 * sep) 412 | 413 | 414 | def get_slide_track(distance): 415 | """ 416 | 根据滑动距离生成滑动轨迹 417 | :param distance: 需要滑动的距离 418 | :return: 滑动轨迹: [[x,y,t], ...] 419 | x: 已滑动的横向距离 420 | y: 已滑动的纵向距离, 除起点外, 均为0 421 | t: 滑动过程消耗的时间, 单位: 毫秒 422 | """ 423 | 424 | if not isinstance(distance, int) or distance < 0: 425 | raise ValueError(f"distance类型必须是大于等于0的整数: distance: {distance}, type: {type(distance)}") 426 | # 初始化轨迹列表 427 | slide_track = [ 428 | [random.randint(-50, -10), random.randint(-50, -10), 0], 429 | [0, 0, 0], 430 | ] 431 | # 共记录count次滑块位置信息 432 | count = 30 + int(distance / 2) 433 | # 初始化滑动时间 434 | t = random.randint(50, 100) 435 | # 记录上一次滑动的距离 436 | _x = 0 437 | _y = 0 438 | for i in range(count): 439 | # 已滑动的横向距离 440 | x = round(__ease_out_expo(i / count) * distance) 441 | # 滑动过程消耗的时间 442 | t += random.randint(10, 20) 443 | if x == _x: 444 | continue 445 | slide_track.append([x, _y, t]) 446 | _x = x 447 | slide_track.append(slide_track[-1]) 448 | return slide_track 449 | 450 | 451 | def main(): 452 | 453 | # 第一次请求,获取gt和challenge 454 | gt_and_challenge = get_gt_and_challenge() 455 | if gt_and_challenge.get('success', 0) != 1: 456 | raise Exception('获取gt和challenge失败') 457 | gt = gt_and_challenge['gt'] 458 | challenge = gt_and_challenge['challenge'] 459 | print(f"第一次请求,获取gt和challenge:{gt_and_challenge}") 460 | # print(gt_and_challenge) 461 | 462 | # get_cookie 463 | cookies_user = get_cookie_user(gt) 464 | # cookies_user = None 465 | # print(cookies_user) 466 | 467 | # 额外的请求 468 | get_type(gt, cookies_user) 469 | other_static_js() 470 | # 第二次请求,获取c和s参数 471 | c_and_s = get_c_and_s(gt, challenge, cookies_user) 472 | if c_and_s.get('status', 'error') != 'success': 473 | raise Exception('获取c和s参数失败') 474 | c = c_and_s.get('data', {}).get('c') 475 | s = c_and_s.get('data', {}).get('s') 476 | print(f"第二次请求,获取c和s参数:{c_and_s}") 477 | # print(c_and_s) 478 | 479 | # get_cookie_ajax_user 480 | cookie_ajax_user = get_cookie_ajax_user(gt, challenge) 481 | # 额外请求 482 | other_statis_js_2() 483 | # time.sleep(2) 484 | 485 | # 第三次请求,获取图片,更新参数 486 | response = get_img_and_params(gt, challenge, cookie_ajax_user) 487 | data_js = get_json(response.text) 488 | print(f"第三次请求,获取图片,更新参数:{data_js}") 489 | # print(data_js) 490 | 491 | # 额外请求 492 | other_static_js_3() 493 | 494 | # 更新参数 495 | gt = data_js['gt'] 496 | challenge = data_js['challenge'] 497 | c = data_js['c'] 498 | s = data_js['s'] 499 | 500 | # 合并两个cookies 501 | cookies = response.cookies.copy() 502 | cookies.update(cookie_ajax_user) 503 | # cookies = None 504 | # print(cookies) 505 | time.sleep(2) 506 | # 第四次请求,获取图片 507 | full_bg = get_img(data_js['static_servers'][0], data_js['fullbg']) 508 | bg = get_img(data_js['static_servers'][0], data_js['bg']) 509 | print(full_bg[:10]) 510 | print(bg[:10]) 511 | 512 | # 识别结果 513 | background_bytes = parse_bg_captcha(full_bg, im_show=False, save_path='full_bg.jpg') 514 | target_bytes = parse_bg_captcha(bg, im_show=False, save_path='bg.jpg') 515 | # Image转bytes 516 | res = get_slice_res(target_bytes, background_bytes) 517 | print(f"识别结果:{res}") 518 | 519 | # 读取slide.js执行get_w()方法 520 | with open('generate_w.js', 'r') as f: 521 | js = f.read() 522 | ctx = execjs.compile(js) 523 | from GTrace import GTrace 524 | gtrace = GTrace() 525 | # -10,图片不是从头部开始的 526 | distance, track = gtrace.get_mouse_pos_path(res['target'][0]-10) 527 | params = { 528 | # , gt, challenge, pass_distance, c, s, trance 529 | 'gt': gt, 530 | 'challenge': challenge, 531 | 'distance': distance, 532 | "passtime": track[len(track)-1][2], 533 | 'c': c, 534 | 's': s, 535 | 'track': track 536 | } 537 | print(params) 538 | w = ctx.call('generate_w', params) 539 | # w = ctx.call('get_w', params) 540 | 541 | print(f"生成参数:{w}") 542 | print(len(w)) 543 | # 第五次请求,验证结果 544 | time.sleep(5) 545 | response = slice_main(cookies, gt, challenge, w) 546 | print(response.text) 547 | 548 | 549 | if __name__ == '__main__': 550 | main() 551 | # 识别结果 552 | # background_bytes = parse_bg_captcha("./61d8ff9ed.webp", im_show=False, save_path='full_bg.jpg') 553 | target_bytes = parse_bg_captcha("./d401d55fc.webp", im_show=False, save_path='bg.jpg') 554 | # Image转bytes 555 | # res = get_slice_res(target_bytes, background_bytes) 556 | # print(f"识别结果:{res}") -------------------------------------------------------------------------------- /2023_09/jsl/jsl.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | import requests 4 | import re 5 | import execjs 6 | 7 | session = requests.session() 8 | headers = { 9 | '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.7', 10 | 'Accept-Language': 'zh-CN,zh;q=0.9', 11 | 'Cache-Control': 'no-cache', 12 | 'Connection': 'keep-alive', 13 | 'Pragma': 'no-cache', 14 | 'Referer': 'https://beian.miit.gov.cn/index', 15 | 'Sec-Fetch-Dest': 'document', 16 | 'Sec-Fetch-Mode': 'navigate', 17 | 'Sec-Fetch-Site': 'same-origin', 18 | 'Sec-Fetch-User': '?1', 19 | 'Upgrade-Insecure-Requests': '1', 20 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 21 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"', 22 | 'sec-ch-ua-mobile': '?0', 23 | 'sec-ch-ua-platform': '"macOS"', 24 | } 25 | 26 | # 第一次请求,获取cookie:__jsl_clearance_s参数 27 | response = session.get('https://beian.miit.gov.cn/index', headers=headers) 28 | cookie_js = re.findall(r'', response.text)[0] 40 | data = json.loads(go_js) 41 | with open('./jsl.js', 'r') as f: 42 | read = f.read() 43 | cookie_value = execjs.compile(read).call('get_cookie', data)[0] 44 | 45 | # 第三次请求,携带一次返回的cookie和第二次请求的js代码生成的cookie,请求页面 46 | session.cookies.set(data['tn'], cookie_value) 47 | res = session.get('https://beian.miit.gov.cn/index', headers=headers) 48 | print(res.text) # 请求成功 49 | -------------------------------------------------------------------------------- /2023_09/rpc/ws_client.js: -------------------------------------------------------------------------------- 1 | !(function () { 2 | // 监听端口 3 | var ws = new WebSocket("ws://127.0.0.1:5678"); // 自定义端口 4 | 5 | ws.onmessage = function (evt) { 6 | console.log("receive msg: " + evt.data); 7 | // 退出 8 | if (evt.data === "quit") { 9 | ws.close(); 10 | } else { 11 | // 调用方法,此处的my_crypto改为定义的函数名 12 | ws.send(my_crypto(evt.data)) 13 | } 14 | }; 15 | })() -------------------------------------------------------------------------------- /2023_09/rpc/ws_server.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import asyncio 3 | import websockets 4 | 5 | 6 | async def receive_massage(websocket): 7 | while True: 8 | # 输入参数 9 | send_text = input("Enter param please: ") 10 | if send_text == "quit": 11 | await websocket.send(send_text) 12 | await websocket.close() 13 | print('quit') 14 | sys.exit() 15 | else: 16 | # 发送参数 17 | await websocket.send(send_text) 18 | # 返回结果 19 | response_text = await websocket.recv() 20 | print("\n result:", response_text) 21 | 22 | 23 | start_server = websockets.serve(receive_massage, '127.0.0.1', 5678) # 自定义端口 24 | asyncio.get_event_loop().run_until_complete(start_server) 25 | asyncio.get_event_loop().run_forever() 26 | 27 | -------------------------------------------------------------------------------- /2023_09/rs4_fangdichan/fangdichan.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | 4 | def get_index(): 5 | headers = { 6 | '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.7', 7 | 'Accept-Language': 'zh-CN,zh;q=0.9', 8 | 'Cache-Control': 'no-cache', 9 | 'Connection': 'keep-alive', 10 | 'Pragma': 'no-cache', 11 | 'Referer': 'http://www.fangdi.com.cn/new_house/new_house.html', 12 | 'Upgrade-Insecure-Requests': '1', 13 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', 14 | } 15 | 16 | response = requests.get('http://www.fangdi.com.cn/new_house/new_house.html', headers=headers, verify=False) 17 | # 写入到first_req.html 18 | with open('first_req.html', 'w') as f: 19 | f.write(response.text) 20 | 21 | 22 | if __name__ == '__main__': 23 | get_index() -------------------------------------------------------------------------------- /2023_09/tonghuashun/tonghuashun.py: -------------------------------------------------------------------------------- 1 | import execjs 2 | import requests 3 | 4 | 5 | # v = '' 6 | # 执行js 7 | with open('./tonghuashun.js', 'r') as f: 8 | read = f.read() 9 | v = execjs.compile(read).call('get_v') 10 | print(v) 11 | 12 | cookies = { 13 | 'v': v, 14 | } 15 | 16 | headers = { 17 | 'Accept': 'text/html, */*; q=0.01', 18 | 'Accept-Language': 'zh-CN,zh;q=0.9', 19 | 'Cache-Control': 'no-cache', 20 | 'Connection': 'keep-alive', 21 | # 'Cookie': 'v=AwXUYMwDzJIULejOHcVDbB0kEko6wrmOA3eciQdqwyNLRyu0zxLJJJPGrWeU', 22 | 'Pragma': 'no-cache', 23 | 'Referer': 'http://q.10jqka.com.cn/', 24 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', 25 | 'X-Requested-With': 'XMLHttpRequest', 26 | 'hexin-v': v, 27 | } 28 | 29 | response = requests.get( 30 | 'http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/', 31 | cookies=cookies, 32 | headers=headers, 33 | verify=False, 34 | ) 35 | 36 | print(response.status_code) 37 | print(response.text) -------------------------------------------------------------------------------- /2023_09/trendinsight/juliang.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | import execjs 4 | import requests 5 | 6 | cookies = { 7 | 'x-jupiter-uuid': '1693558439394154', 8 | 'passport_csrf_token': '0a41ea3b44bd033ef1e823ffa9112f90', 9 | 'passport_csrf_token_default': '0a41ea3b44bd033ef1e823ffa9112f90', 10 | 'tt_scid': 'MyHL03hKf14m8ZilNFlF3pgpjx8Y.8pQtmKZIoH0eepE7ZeM3LGV9WKgv3KdN7cr5382', 11 | 'msToken': '_Kxm05H3L2pUqh4Ri-PSa2ciLgvaopNqTRdq6iG_lYEaYt4SOgSM_tv8MzHrptcNgM4H9nl5w_xnFx6j1OUFIyvPm7w0dtN3gSxITHedK0Xhwg3xqFFvio9u0i5MOd4=', 12 | '_csrf_token': 'bf9QPxmGU8Ufaaes_FNGrmrd', 13 | } 14 | 15 | 16 | def get_ms_token() -> str: 17 | """ 18 | 获取msToken参数,需要cookies 19 | :return: msToken 20 | """ 21 | headers = { 22 | 'authority': 'trendinsight.oceanengine.com', 23 | '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.7', 24 | 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 25 | 'cache-control': 'no-cache', 26 | # 'cookie': 'x-jupiter-uuid=1693558439394154; _csrf_token=9ycwWVOMVVNiE_BmXRwUf8oZ; passport_csrf_token=0a41ea3b44bd033ef1e823ffa9112f90; passport_csrf_token_default=0a41ea3b44bd033ef1e823ffa9112f90; msToken=ehPNdH1mB66AySijgRtx-f1atz9qlcr2uKEHrsypj-ULT02rvlcdiGswv--qeA-EebRhjzQ0YP6iyo-mLZlMdlGmpuMCaFBRgZt2-UyY; msToken=_KcOyW9bDd4mm6XsdqkbSc8qiJqry2VHdwEieICtP4apBltmZE4-2EzjLmqvTsAiNHUegXXU6xOPPF1deza31dEwNywqrULjjJkRRJz-I8q-WdO3QzzyKX145R7YN2I=', 27 | 'pragma': 'no-cache', 28 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"', 29 | 'sec-ch-ua-mobile': '?0', 30 | 'sec-ch-ua-platform': '"macOS"', 31 | 'sec-fetch-dest': 'document', 32 | 'sec-fetch-mode': 'navigate', 33 | 'sec-fetch-site': 'same-origin', 34 | 'sec-fetch-user': '?1', 35 | 'upgrade-insecure-requests': '1', 36 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.62', 37 | } 38 | 39 | params = { 40 | 'dates': 'daily-20230831_weekly-20230827_monthly-202307', 41 | 'area': '["11"]', 42 | 'category_id': '1', 43 | } 44 | # 请求area接口,获取msToken 45 | response = requests.get('https://trendinsight.oceanengine.com/area', params=params, cookies=cookies, 46 | headers=headers).text 47 | if 'msToken' in response: 48 | ms_token = re.search(r'msToken=(.*?);', response).group(1) 49 | return ms_token 50 | else: 51 | return '' 52 | 53 | 54 | def get_poi_list() -> dict: 55 | """ 56 | 获取数据 57 | :return: json格式的数据 58 | """ 59 | # 获取msToken 60 | ms_token = get_ms_token() 61 | if not ms_token: 62 | print("not msToken") 63 | return {} 64 | headers = { 65 | 'authority': 'trendinsight.oceanengine.com', 66 | 'accept': 'application/json, text/plain, */*', 67 | 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 68 | 'cache-control': 'no-cache', 69 | 'content-type': 'application/json', 70 | # 'cookie': 'x-jupiter-uuid=1693558439394154; passport_csrf_token=0a41ea3b44bd033ef1e823ffa9112f90; passport_csrf_token_default=0a41ea3b44bd033ef1e823ffa9112f90; tt_scid=MyHL03hKf14m8ZilNFlF3pgpjx8Y.8pQtmKZIoH0eepE7ZeM3LGV9WKgv3KdN7cr5382; msToken=srj7Ai0cM-Sp0GqCfyqJUcWdK1ywr7c30GiGjRRB1zomE5bDtK1coO-ztZHsS-puVE2q4hU81DCVEltaBMzGFN8JHghbD0fNo6NUwe9YVaMkMRpwdxWBFfn9XndN_bw=; msToken=_Kxm05H3L2pUqh4Ri-PSa2ciLgvaopNqTRdq6iG_lYEaYt4SOgSM_tv8MzHrptcNgM4H9nl5w_xnFx6j1OUFIyvPm7w0dtN3gSxITHedK0Xhwg3xqFFvio9u0i5MOd4=; _csrf_token=bf9QPxmGU8Ufaaes_FNGrmrd', 71 | 'origin': 'https://trendinsight.oceanengine.com', 72 | 'pragma': 'no-cache', 73 | 'referer': 'https://trendinsight.oceanengine.com/area?dates=daily-20230831_weekly-20230827_monthly-202308&area=%5B%2211%22%5D&category_id=0', 74 | 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"', 75 | 'sec-ch-ua-mobile': '?0', 76 | 'sec-ch-ua-platform': '"macOS"', 77 | 'sec-fetch-dest': 'empty', 78 | 'sec-fetch-mode': 'cors', 79 | 'sec-fetch-site': 'same-origin', 80 | 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.62', 81 | } 82 | 83 | # 请求参数,根据需要调整 84 | json_data = { 85 | 'category_id': '0', 86 | 'rank_style': 'daily', 87 | 'rank_level': '2', 88 | 'location_id': '11', 89 | 'rank_date': '20230831', 90 | 'app': 'aweme', 91 | 'pageSize': '10', 92 | 'ranking': 'poi_rank', 93 | 'page': '2', 94 | } 95 | 96 | url = 'https://trendinsight.oceanengine.com/api/open/area/get_poi_list' 97 | 98 | # 读取./juliang.js调用get_params方法,获取两个加密参数 99 | with open('./juliang.js', 'r') as f: 100 | js_code = f.read() 101 | ctx = execjs.compile(js_code) 102 | params_dict = ctx.call('get_param', ms_token, url, json_data) 103 | x_bogus = params_dict['X-Bogus'] 104 | _signature = params_dict['_signature'] 105 | 106 | # 发起请求 107 | response = requests.post( 108 | f'{url}?msToken={ms_token}&X-Bogus={x_bogus}&_signature={_signature}', 109 | cookies=cookies, 110 | headers=headers, 111 | json=json_data, 112 | ) 113 | return response.json() 114 | 115 | 116 | if __name__ == '__main__': 117 | print(get_poi_list()) 118 | -------------------------------------------------------------------------------- /2023_10/wx_betterwood/betterwood.js: -------------------------------------------------------------------------------- 1 | // 导入md5 2 | const CryptoJS = require('crypto-js') 3 | 4 | // url = "https://api.betterwood.com/hotel/brand/museum/list" 5 | 6 | /** 7 | * 传入接口的完整url,返回headers中的参数 8 | * @param url 接口的完整url 9 | * @returns {{Signature: *, MessageId}} 10 | */ 11 | function get_headers(url) { 12 | // MessageId 13 | H = function (t) { 14 | for (var n = [8, 13, 18, 23], e = 0; e < n.length; e++) 15 | t = t.slice(0, n[e]) + "-" + t.slice(n[e]); 16 | return t 17 | } 18 | x = function () { 19 | for (var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "", n = [], e = "0123456789abcdef", r = 0; r < 36; r++) { 20 | var o = Math.floor(16 * Math.random()); 21 | n[r] = e.substring(o, o + 1) 22 | } 23 | n[14] = "4"; 24 | var i = 3 & Number(n[19]) | 8; 25 | n[19] = e.substring(i, i + 1), 26 | n[8] = n[13] = n[18] = n[23] = "-"; 27 | var u = n.join("") 28 | , a = H(CryptoJS.MD5(u + (new Date).getTime() + t).toString()); 29 | return a 30 | } 31 | MessageId = x() 32 | 33 | 34 | // Signature 35 | L = function (t, n, e, r, o, i, u, a, s) { 36 | var d = ""; 37 | return d = a ? "AppVersion=".concat(o, "Authorization=").concat(a, "Channel=").concat(i, "ClientType=").concat(r, "DeviceManufacture=").concat(n, "DeviceModel=").concat(e, "MessageId=").concat(u, "OsVersion=").concat(t, "AppKey=C49E2654AAA94F5085A9C12FE2CAB09CUrl=").concat(s) : "AppVersion=".concat(o, "Channel=").concat(i, "ClientType=").concat(r, "DeviceManufacture=").concat(n, "DeviceModel=").concat(e, "MessageId=").concat(u, "OsVersion=").concat(t, "AppKey=C49E2654AAA94F5085A9C12FE2CAB09CUrl=").concat(s), 38 | d = CryptoJS.MD5(d.replace(/\s*/g, "")).toString().substring(4, 28).toLocaleUpperCase() 39 | } 40 | var o = { 41 | "content-type": "application/json", 42 | "Channel": "bdw", 43 | "AppVersion": "2.3.6", 44 | "BusinessType": 1, 45 | "MessageId": MessageId, 46 | "ClientType": "5", 47 | "OsVersion": "iOS 10.0.1", 48 | "DeviceManufacture": "devtools", 49 | "DeviceModel": "iPhone 5" 50 | } 51 | , i = o.OsVersion 52 | , u = o.DeviceManufacture 53 | , c = o.DeviceModel 54 | , a = o.ClientType 55 | , d = o.AppVersion 56 | , l = o.Channel 57 | , p = o.MessageId 58 | , h = o.Authorization 59 | , g = encodeURIComponent(url.split("betterwood.com")[1].split("?")[0]) 60 | , Signature = L(i, u, c, a, d, l, p, h, g); 61 | 62 | return { 63 | 'Signature': Signature, 64 | 'MessageId': MessageId, 65 | } 66 | } -------------------------------------------------------------------------------- /2023_10/wx_betterwood/betterwood.py: -------------------------------------------------------------------------------- 1 | import execjs 2 | import requests 3 | 4 | # 需要两个参数 5 | # MessageId = '' 6 | # Signature = '' 7 | url = 'https://api.betterwood.com/hotel/brand/museum/list' 8 | 9 | # 执行js 10 | with open('betterwood.js', 'r') as f: 11 | read = f.read() 12 | v = execjs.compile(read).call('get_headers', url) 13 | MessageId = v['MessageId'] 14 | Signature = v['Signature'] 15 | 16 | headers = { 17 | 'Connection': 'keep-alive', 18 | 'BusinessType': '1', 19 | 'MessageId': MessageId, 20 | 'DeviceManufacture': 'devtools', 21 | 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.3 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1 wechatdevtools/1.06.2308310 MicroMessenger/8.0.5 Language/zh_CN webview/', 22 | 'content-type': 'application/json', 23 | 'AppVersion': '2.3.6', 24 | 'OsVersion': 'iOS 10.0.1', 25 | 'Signature': Signature, 26 | 'Channel': 'bdw', 27 | 'ClientType': '5', 28 | 'DeviceModel': 'iPhone 5', 29 | 'Accept': '*/*', 30 | 'Sec-Fetch-Site': 'cross-site', 31 | 'Sec-Fetch-Mode': 'cors', 32 | 'Sec-Fetch-Dest': 'empty', 33 | 'Referer': 'https://servicewechat.com/wx578d66d433900d15/devtools/page-frame.html', 34 | } 35 | response = requests.get(url, headers=headers) 36 | 37 | print(response.json()) 38 | -------------------------------------------------------------------------------- /2023_10/yidun/GTrace.py: -------------------------------------------------------------------------------- 1 | """ 2 | 用于生成坐标轨迹 3 | """ 4 | import math 5 | import random 6 | import matplotlib.pyplot as plt 7 | import numpy as np 8 | import matplotlib as mpl 9 | 10 | 11 | class GTrace: 12 | def __init__(self): 13 | self.__pos_x = [] 14 | self.__pos_y = [] 15 | self.__pos_z = [] 16 | 17 | def __set_pt_time(self): 18 | """ 19 | 设置各节点的时间 20 | 分析不同时间间隔中X坐标数量的占比 21 | 统计结果: 1. 80%~90%的X坐标在15~20毫秒之间 22 | 2. 10%~15%在20~200及以上,其中 [-a, 0, x, ...] 这里x只有一个,取值在110~200之间 23 | 坐标集最后3~5个坐标取值再50~400之间,最后一个坐标数值最大 24 | 25 | 滑动总时间的取值规则: 图片宽度260,去掉滑块的宽度剩下200; 26 | 如果距离小于100,则耗时1300~1900之间 27 | 如果距离大于100,则耗时1700~2100之间 28 | """ 29 | __end_pt_time = [] 30 | __move_pt_time = [] 31 | self.__pos_z = [] 32 | 33 | total_move_time = self.__need_time * random.uniform(0.8, 0.9) 34 | start_point_time = 0 35 | __start_pt_time = [0, 0, int(start_point_time)] 36 | 37 | sum_move_time = 0 38 | 39 | _tmp_total_move_time = total_move_time 40 | while True: 41 | delta_time = random.uniform(15, 20) 42 | if _tmp_total_move_time < delta_time: 43 | break 44 | 45 | sum_move_time += delta_time 46 | _tmp_total_move_time -= delta_time 47 | __move_pt_time.append(int(start_point_time+sum_move_time)) 48 | 49 | last_pt_time = __move_pt_time[-1] 50 | __move_pt_time.append(last_pt_time+_tmp_total_move_time) 51 | 52 | sum_end_time = start_point_time + total_move_time 53 | other_point_time = self.__need_time - sum_end_time 54 | end_first_ptime = other_point_time / 2 55 | 56 | while True: 57 | delta_time = random.uniform(110, 200) 58 | if end_first_ptime - delta_time <= 0: 59 | break 60 | 61 | end_first_ptime -= delta_time 62 | sum_end_time += delta_time 63 | __end_pt_time.append(int(sum_end_time)) 64 | 65 | __end_pt_time.append(int(sum_end_time + (other_point_time/2 + end_first_ptime))) 66 | # self.__pos_z.extend(__start_pt_time) 67 | self.__pos_z.extend(__move_pt_time) 68 | self.__pos_z.extend(__end_pt_time) 69 | 70 | def __set_distance(self, _dist): 71 | """ 72 | 设置要生成的轨迹长度 73 | """ 74 | self.__distance = _dist 75 | 76 | if _dist < 100: 77 | self.__need_time = int(random.uniform(500, 1500)) 78 | else: 79 | self.__need_time = int(random.uniform(1000, 2000)) 80 | 81 | def __get_pos_z(self): 82 | return self.__pos_z 83 | 84 | def __get_pos_y(self): 85 | _pos_y = [] 86 | point_count = len(self.__pos_z) 87 | x = np.linspace(-10, 15, point_count - len(_pos_y)) 88 | arct_y = np.arctan(x) 89 | 90 | for _, val in enumerate(arct_y): 91 | _pos_y.append(val) 92 | 93 | return _pos_y 94 | 95 | def __get_pos_x(self, _distance): 96 | """ 97 | 绘制标准的数学函数图像: 以 tanh 开始 以 arctan 结尾 98 | 根据此模型用等比时间差生成X坐标 99 | """ 100 | # first_val = random.uniform(-40, -18) 101 | # _distance += first_val 102 | # _pos_x = [random.uniform(-40, -18), 0] 103 | _pos_x = [] 104 | self.__set_distance(_distance) 105 | self.__set_pt_time() 106 | 107 | point_count = len(self.__pos_z) 108 | x = np.linspace(-1, 19, point_count-len(_pos_x)) 109 | ss = np.arctan(x) 110 | th = np.tanh(x) 111 | 112 | for idx in range(0, len(th)): 113 | if th[idx] < ss[idx]: 114 | th[idx] = ss[idx] 115 | 116 | th += 1 117 | th *= (_distance / 2.5) 118 | 119 | i = 0 120 | start_idx = int(point_count/10) 121 | end_idx = int(point_count/50) 122 | delta_pt = abs(np.random.normal(scale=1.1, size=point_count-start_idx-end_idx)) 123 | for idx in range(start_idx, point_count): 124 | if idx*1.3 > len(delta_pt): 125 | break 126 | 127 | th[idx] += delta_pt[i] 128 | i+=1 129 | 130 | _pos_x.extend(th) 131 | return _pos_x[-1], _pos_x 132 | 133 | def get_mouse_pos_path(self, distance): 134 | """ 135 | 获取滑动滑块鼠标的滑动轨迹坐标集合 136 | """ 137 | result = [] 138 | _distance, x = self.__get_pos_x(distance) 139 | y = self.__get_pos_y() 140 | z = self.__get_pos_z() 141 | 142 | for idx in range(len(x)): 143 | result.append([int(x[idx]), int(y[idx]), int(z[idx])]) 144 | 145 | return int(_distance), result 146 | 147 | 148 | if __name__ == "__main__": 149 | _color = ["blue", "green", "red", "cyan", "magenta"] 150 | trace = GTrace() 151 | distance , res = trace.get_mouse_pos_path(100) 152 | print(distance) 153 | print(res) 154 | # for idx in range(0, 10): 155 | # distance = random.uniform(70, 150) 156 | # print("长度为: %d , 坐标为: \n" % distance) 157 | # distance, mouse_pos_path = trace.get_mouse_pos_path(distance) 158 | # print("长度为: %d , 坐标为: \" % distance, mouse_pos_path) 159 | -------------------------------------------------------------------------------- /2023_10/yidun/YidunAST1.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs");//文件读写 2 | const parse = require("@babel/parser"); //解析为ast 3 | const traverse = require('@babel/traverse').default;//遍历节点 4 | const types = require('@babel/types');//类型 5 | const generator = require('@babel/generator').default;//ast解析为代码 6 | const jscode = fs.readFileSync( 7 | './watchman.min.js', { 8 | encoding: 'utf-8' 9 | } 10 | ); 11 | let ast_code = parse.parse(jscode); 12 | 13 | console.time("处理完毕,耗时"); 14 | 15 | 16 | console.log('======================================================================') 17 | try { 18 | ast = String_deobfuscation(ast_code)//字符串解混淆 19 | console.log('字符串解混淆结束,共处理', ast["count"]); 20 | ast_code = parse.parse(generator(ast['ast']).code); 21 | } catch (e) { 22 | console.log('失败', e) 23 | } 24 | console.log('======================================================================') 25 | try { 26 | ast = Large_array_decryption(ast_code)//大数组还原 27 | console.log('大数组还原结束,共处理:', ast["count"]); 28 | ast_code = parse.parse(generator(ast['ast']).code); 29 | } catch (e) { 30 | console.log('失败', e) 31 | } 32 | console.log('======================================================================') 33 | try { 34 | ast = String_deobfuscation(ast_code)//字符串解混淆 35 | console.log('字符串解混淆结束,共处理', ast["count"]); 36 | ast_code = parse.parse(generator(ast['ast']).code); 37 | } catch (e) { 38 | console.log('失败', e) 39 | } 40 | console.log('======================================================================') 41 | js_code = generator(ast_code).code 42 | fs.writeFile('./demoWatchman.js', js_code, (err) => { 43 | }); 44 | console.log('文件保存结束'); 45 | console.log('======================================================================') 46 | console.timeEnd("处理完毕,耗时"); 47 | 48 | 49 | //===================================================================================// 50 | //大数组解混淆 51 | function Large_array_decryption(ast) { 52 | let count = 0;//计数 53 | console.log('开始大数组解混淆'); 54 | var DecryptFuncName_assignment = [];//解密函数以及被赋值解密函数的值 55 | let end = 3;//切片需要处理的代码块 56 | let newAst = parse.parse('');//新建ast 57 | decrypt_code = ast.program.body.slice(0, end);//切片 58 | newAst.program.body = decrypt_code;// 将前3个节点替换进新建ast 59 | let stringDecryptFunc = generator(newAst, {compact: true},).code;//转为js 60 | eval(stringDecryptFunc);//执行三部分的代码 61 | let stringDecryptFuncAst = ast.program.body[end - 1];// 拿到解密函数所在的节点 62 | if (stringDecryptFuncAst.type === 'VariableDeclaration') { 63 | var DecryptFuncName = stringDecryptFuncAst.declarations[0].id.name;//拿到解密函数的名字 64 | } else if (stringDecryptFuncAst.type === 'FunctionDeclaration') { 65 | DecryptFuncName = stringDecryptFuncAst.id.name;//拿到解密函数的名字 66 | } else { 67 | throw '未匹配到解密函数'; 68 | } 69 | DecryptFuncName_assignment.push(DecryptFuncName); 70 | console.log('解密函数名称为:', DecryptFuncName);//打印 71 | // rest_code = ast.program.body.slice(end); // 剩下的节点 72 | // ast.program.body = rest_code;//剩下的节点替换 73 | traverse(ast, { 74 | NumericLiteral(path) { 75 | if (path.node.extra && /^0[obx]/i.test(path.node.extra.raw)) { 76 | path.node.extra = undefined; 77 | } 78 | }, 79 | }); 80 | for (j = 0; j < DecryptFuncName_assignment.length; j++) { 81 | DecryptFunc = DecryptFuncName_assignment[j]; 82 | traverse(ast, { 83 | AssignmentExpression(path) {//赋值表达式匹配--替换加密数组为对应的值 84 | if (path.node.right.name === DecryptFunc) { //当变量名与解密函数名相同时,就执行相应操作 85 | DecryptFuncName_assignment.push(path.node.left.name); 86 | path.remove(); 87 | } 88 | }, 89 | VariableDeclarator(path) {//赋值表达式匹配--替换加密数组为对应的值 90 | try { 91 | if (path.node.init.name === DecryptFunc) { //当变量名与解密函数名相同时,就执行相应操作 92 | DecryptFuncName_assignment.push(path.node.id.name); 93 | path.remove(); 94 | } 95 | } catch (e) { 96 | } 97 | }, 98 | }); 99 | } 100 | for (i = 0; i < DecryptFuncName_assignment.length; i++) { 101 | DecryptFunc = DecryptFuncName_assignment[i]; 102 | if (DecryptFunc !== DecryptFuncName) { 103 | traverse(ast, { 104 | CallExpression(path) {//回调表达式匹配--替换加密数组为对应的值 105 | if (types.isIdentifier(path.node.callee, {name: DecryptFunc})) { //当变量名与解密函数名相同时,就执行相应操作 106 | path.node.callee.name = DecryptFuncName; // 值替换节点 107 | } 108 | }, 109 | }); 110 | } 111 | traverse(ast, { 112 | CallExpression(path) {//回调表达式匹配--替换加密数组为对应的值 113 | if (types.isIdentifier(path.node.callee, {name: DecryptFuncName})) { //当变量名与解密函数名相同时,就执行相应操作 114 | try { 115 | path.replaceWith(types.valueToNode(eval(path.toString()))); // 值替换节点 116 | count += 1; 117 | } catch (e) { 118 | 119 | } 120 | } 121 | }, 122 | }); 123 | } 124 | return {ast, count}; 125 | 126 | } 127 | 128 | //===================================================================================// 129 | //字符串解混淆 130 | function String_deobfuscation(ast) { 131 | let count = 0//计数 132 | console.log('开始字符串解混淆'); 133 | traverse(ast, { 134 | 'NumericLiteral|StringLiteral'(path) { 135 | delete path.node.extra//直接删掉,简单粗暴 136 | count += 1 137 | } 138 | }) 139 | return {ast, count} 140 | } 141 | 142 | 143 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /2023_10/yidun/proxy_.js: -------------------------------------------------------------------------------- 1 | proxy_ = function (func){ 2 | return new Proxy(func, { 3 | set(target, key, value,){ 4 | console.table([{'类型': 'set', '调用者': target, '调用属性': key, '调用值': value}]) 5 | return Reflect.set(...arguments) 6 | }, 7 | get(target, key, ){ 8 | console.table([{'类型': 'set', '调用者': target, '调用属性': key, '调用值': target[key]}]) 9 | return target[key] 10 | } 11 | }) 12 | } -------------------------------------------------------------------------------- /2023_10/yidun/trace.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | 4 | import numpy as np 5 | 6 | 7 | def get_track(space): 8 | x = [0, 0] 9 | y = [0, 0, 0] 10 | z = [0] 11 | # x 12 | count = np.linspace(-math.pi / 2, math.pi / 2, random.randrange(20, 30)) 13 | # print(count) 14 | func = list(map(math.sin, count)) 15 | nx = [i + 1 for i in func] 16 | add = random.randrange(10, 15) 17 | sadd = space + add 18 | x.extend(list(map(lambda x: x * (sadd / 2), nx))) 19 | # x.extend(np.linspace(sadd, space, 4 if add > 12 else 3)) 20 | x.extend(np.linspace(sadd, space, 3 if add > 12 else 2)) 21 | x = [math.floor(i) for i in x] 22 | # y 23 | for i in range(len(x) - 2): 24 | if y[-1] < 30: 25 | y.append(y[-1] + random.choice([0, 0, 1, 1, 2, 2, 1, 2, 0, 0, 3, 3])) 26 | else: 27 | y.append(y[-1] + random.choice([0, 0, -1, -1, -2, -2, -1, -2, 0, 0, -3, -3])) 28 | # z 29 | for i in range(len(x) - 1): 30 | z.append((z[-1] // 100 * 100) + 100 + random.choice([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2])) 31 | return list(map(list, zip(x, y, z))) 32 | 33 | 34 | if __name__ == '__main__': 35 | print(get_track(100)) -------------------------------------------------------------------------------- /2023_10/yidun/yidun.py: -------------------------------------------------------------------------------- 1 | import json 2 | import re 3 | import time 4 | 5 | import tqdm 6 | 7 | import trace 8 | import urllib.parse 9 | 10 | import ddddocr 11 | import execjs 12 | import requests 13 | 14 | with open('./core.js', 'r') as f: 15 | js = f.read() 16 | 17 | 18 | def get_actoken(): 19 | headers = { 20 | 'Accept': '*/*', 21 | 'Accept-Language': 'zh-CN,zh;q=0.9', 22 | 'Cache-Control': 'no-cache', 23 | 'Connection': 'keep-alive', 24 | 'Pragma': 'no-cache', 25 | 'Referer': 'http://app.miit-eidc.org.cn/', 26 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 27 | } 28 | 29 | params = { 30 | 'referer': 'http://app.miit-eidc.org.cn/miitxxgk/gonggao/xxgk/queryCpParamPage', 31 | 'zoneId': '', 32 | 'dt': 'QZCRDl9Lpl1BBgQRQAKByyc31aO1bp/J', 33 | 'id': '0b46352afd8742fa934f87745fbf7f36', 34 | 'ipv6': 'false', 35 | 'runEnv': '10', 36 | 'iv': '2', 37 | 'loadVersion': '2.3.0', 38 | 'callback': '__JSONP_x5im7fw_0', 39 | } 40 | 41 | response = requests.get('http://c.dun.163.com/api/v2/getconf', params=params, headers=headers, verify=False) 42 | ac_token = re.findall(r'"token":"(.*?)"', response.text)[0] 43 | dt = re.findall(r'"dt":"(.*?)"', response.text)[0] 44 | return ac_token, dt 45 | 46 | 47 | def get_img(ac_token, dt): 48 | cb = execjs.compile(js).call('get_cb') 49 | headers = { 50 | 'Accept': '*/*', 51 | 'Accept-Language': 'zh-CN,zh;q=0.9', 52 | 'Cache-Control': 'no-cache', 53 | 'Connection': 'keep-alive', 54 | 'Pragma': 'no-cache', 55 | 'Referer': 'http://app.miit-eidc.org.cn/', 56 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', 57 | 'Host': 'c.dun.163.com' 58 | } 59 | 60 | params = { 61 | 'referer': 'http://app.miit-eidc.org.cn/miitxxgk/gonggao/xxgk/queryCpParamPage', 62 | 'zoneId': 'CN31', 63 | 'dt': dt, 64 | 'acToken': ac_token, 65 | 'id': '0b46352afd8742fa934f87745fbf7f36', 66 | 'fp': execjs.compile(js).call('get_fp'), 67 | 'https': 'false', 68 | 'type': 'undefined', 69 | 'version': '2.23.0', 70 | 'dpr': '2', 71 | 'dev': '1', 72 | 'cb': cb, 73 | # 'cb': "OIishntnm3JJhRtSnlq5+xVq1vpcT8cztWDCKc6Y/uxXTbaiYWM.WXkrEYN60ovUXS95SZDHqDubjbjRz6u6lN8VERf7", 74 | 'ipv6': 'false', 75 | 'runEnv': '10', 76 | 'group': '', 77 | 'scene': '', 78 | 'lang': 'zh-CN', 79 | 'sdkVersion': 'undefined', 80 | 'iv': '2', 81 | 'width': '320', 82 | 'audio': 'false', 83 | 'sizeType': '10', 84 | 'smsVersion': 'v3', 85 | 'token': '', 86 | 'callback': '__JSONP_e7b96vq_1', 87 | } 88 | 89 | response = requests.get('http://c.dun.163.com/api/v3/get', params=params, headers=headers, verify=False) 90 | # print(response.text) 91 | # response.text: __JSONP_e7b96vq_1({"data":{"bg":["http://necaptcha.nosdn.127.net/ede3a93be8a4415185cf40d33b9dc866@2x.jpg","http://necaptcha1.nosdn.127.net/ede3a93be8a4415185cf40d33b9dc866@2x.jpg"],"front":["http://necaptcha.nosdn.127.net/d771625d3d35466ba31e4e0a82225829@2x.png","http://necaptcha1.nosdn.127.net/d771625d3d35466ba31e4e0a82225829@2x.png"],"token":"cbefdcb6504041b68089aaff0b69d7d9","type":2,"zoneId":"CN31"},"error":0,"msg":"ok"}); 92 | # 提取出json 93 | import re 94 | import json 95 | res = re.findall(r'__JSONP_e7b96vq_1\((.*)\);', response.text)[0] 96 | res = json.loads(res) 97 | # print(res) 98 | return res 99 | 100 | 101 | def main_(): 102 | ac_token, dt = get_actoken() 103 | res = get_img(ac_token, dt) 104 | bg = res.get('data').get('bg')[0] 105 | front = res.get('data').get('front')[0] 106 | token = res.get('data').get('token') 107 | zone_id = res.get('data').get('zoneId') 108 | 109 | distance = get_distance(bg, front) 110 | data = get_check_data(distance, token) 111 | result = check(zone_id, token, data, dt) 112 | return result 113 | 114 | 115 | def get_distance(bg: str, front: str) -> int: 116 | bg_content = requests.get(bg).content 117 | front_content = requests.get(front).content 118 | with open('./bg.jpg', 'wb') as f: 119 | f.write(bg_content) 120 | with open('./front.png', 'wb') as f: 121 | f.write(front_content) 122 | 123 | slide = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False) 124 | 125 | distance = int(slide.slide_match(front_content, bg_content, simple_target=True).get('target')[0] * 0.66) 126 | # print(distance) 127 | return distance + 10 128 | 129 | 130 | def get_check_data(distance: int, token: str) -> str: 131 | """ 132 | 生成轨迹,返回data参数 133 | :param distance: 134 | :return: data 135 | """ 136 | # distance = distance + 10 137 | # from GTrace import GTrace 138 | # trace = GTrace() 139 | # distance, res = trace.get_mouse_pos_path(distance) 140 | res = trace.get_track(distance) 141 | # print(f'滑块距离:{distance}') 142 | data = execjs.compile(js).call('trace', token, distance, res) 143 | return data['data'] 144 | 145 | 146 | def check(zone_id, token, data, dt): 147 | headers = { 148 | 'Accept': '*/*', 149 | 'Accept-Language': 'zh-CN,zh;q=0.9', 150 | 'Cache-Control': 'no-cache', 151 | 'Connection': 'keep-alive', 152 | 'Pragma': 'no-cache', 153 | 'Referer': 'http://app.miit-eidc.org.cn/', 154 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', 155 | } 156 | 157 | params = { 158 | 'referer': urllib.parse.quote('http://app.miit-eidc.org.cn/miitxxgk/gonggao/xxgk/queryCpParamPage', safe=''), 159 | 'zoneId': zone_id, 160 | 'dt': dt, 161 | 'id': '0b46352afd8742fa934f87745fbf7f36', 162 | 'token': token, 163 | 'acToken': 'undefined', 164 | 'data': urllib.parse.quote(data, safe=''), 165 | 'width': '320', 166 | 'type': '2', 167 | 'version': '2.23.0', 168 | 'cb': execjs.compile(js).call('get_cb'), 169 | 'extraData': '', 170 | 'bf': '0', 171 | 'runEnv': '10', 172 | 'sdkVersion': 'undefined', 173 | 'iv': '2', 174 | 'callback': '__JSONP_8lb964i_1', 175 | } 176 | 177 | url = 'http://c.dun.163.com/api/v3/check' 178 | url_params = f'?referer={params["referer"]}&zoneId=CN31&dt={dt}&id=0b46352afd8742fa934f87745fbf7f36&token={params.get("token")}&acToken=undefined&data={params.get("data")}&width=320&type=2&version=2.23.0&cb={params.get("cb")}&extraData=&bf=0&runEnv=10&sdkVersion=undefined&iv=2&callback={params.get("callback")}' 179 | 180 | response = requests.get(url + url_params, headers=headers, verify=False) 181 | # response = requests.get(url, params=params, headers=headers, verify=False) 182 | # print(response.text) 183 | text_ = re.findall(r'__JSONP_8lb964i_1\((.*)\);', response.text)[0] 184 | result = json.loads(text_) 185 | print(result) 186 | return result 187 | 188 | 189 | if __name__ == '__main__': 190 | count = 0 191 | times = 100 192 | for i in tqdm.trange(times): 193 | result = main_() 194 | if result.get('data', {}).get('result'): 195 | print('验证成功') 196 | count += 1 197 | print(f'成功率:{count / times}') 198 | # main_() 199 | # print(get_actoken()) 200 | # print(get_check_data(100, 'd8243b2617a34dd89b688876d11034b1')) 201 | -------------------------------------------------------------------------------- /2024-4/urbtix_rs6_dp.py: -------------------------------------------------------------------------------- 1 | from DrissionPage import ChromiumOptions, WebPage 2 | import base64 3 | 4 | url = base64.b64decode(b'aHR0cHM6Ly93d3cudXJidGl4LmhrLw==').decode('utf-8') 5 | 6 | # 启动并访问网站 7 | co = ChromiumOptions() 8 | page = WebPage(chromium_options=co) 9 | page.get(url) 10 | 11 | # 开始监听包含'list?AfbF5fe='的接口 12 | page.listen.start('list?AfbF5fe=') 13 | i = 0 14 | for packet in page.listen.steps(): 15 | print(packet.response.body) # body为json格式数据,raw_body可以得到原始数据 16 | # 手动退出 17 | i += 1 18 | if i >= 7: 19 | break 20 | page.close() -------------------------------------------------------------------------------- /2024_02/tls_demo/tls_demo.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/Danny-Dasilva/CycleTLS/cycletls" 5 | "log" 6 | ) 7 | 8 | func main() { 9 | cycle := cycletls.Init() 10 | response, err := cycle.Do("https://tls.browserleaks.com/json", cycletls.Options{ 11 | Body: "", 12 | // 指定ja3 fullstring 13 | Ja3: "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,17513-65281-11-51-13-5-10-45-27-16-65037-18-0-23-35-43,29-23-24,0", 14 | }, "GET") 15 | if err != nil { 16 | log.Print(err) 17 | } 18 | log.Print(response) 19 | 20 | } 21 | -------------------------------------------------------------------------------- /2024_02/tls_demo/tls_demo.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | # 0、普通请求 4 | res = requests.get('https://match.yuanrenxue.cn/api/match/19?page=1') 5 | print(res.text) # TLS指纹校验不通过 6 | 7 | # 1、修改urllib3源码 8 | import urllib3 9 | 10 | urllib3.util.ssl_.DEFAULT_CIPHERS = ":".join( 11 | [ 12 | "ECDHE+AESGCM", 13 | "ECDHE+CHACHA20", 14 | "DHE+AESGCM", 15 | "DHE+CHACHA20", 16 | "ECDH+AESGCM", 17 | "DH+AESGCM", 18 | # 修改掉部分内容 19 | # "ECDH+AES", 20 | # "DH+AES", 21 | # "RSA+AESGCM", 22 | # "RSA+AES", 23 | "!aNULL", 24 | "!eNULL", 25 | "!MD5", 26 | "!DSS", 27 | ] 28 | ) 29 | 30 | res = requests.get('https://match.yuanrenxue.cn/api/match/19?page=1') 31 | print(res.text) # 通过 32 | 33 | # 2、用curl_cffi通过验证 34 | from curl_cffi import requests 35 | 36 | res = requests.get('https://match.yuanrenxue.cn/api/match/19?page=1', impersonate="chrome110") 37 | print(res.text) # 通过 38 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "asn1": { 6 | "version": "0.2.6", 7 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", 8 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", 9 | "requires": { 10 | "safer-buffer": "~2.1.0" 11 | } 12 | }, 13 | "crypto": { 14 | "version": "1.0.1", 15 | "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", 16 | "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" 17 | }, 18 | "crypto-js": { 19 | "version": "4.2.0", 20 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", 21 | "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" 22 | }, 23 | "jsencrypt": { 24 | "version": "3.3.2", 25 | "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.3.2.tgz", 26 | "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==" 27 | }, 28 | "node-forge": { 29 | "version": "1.3.1", 30 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", 31 | "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" 32 | }, 33 | "node-rsa": { 34 | "version": "1.1.1", 35 | "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz", 36 | "integrity": "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==", 37 | "requires": { 38 | "asn1": "^0.2.4" 39 | } 40 | }, 41 | "safer-buffer": { 42 | "version": "2.1.2", 43 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 44 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@babel/parser": "^7.23.0", 4 | "@babel/traverse": "^7.23.2", 5 | "babel": "^6.23.0", 6 | "canvas": "^2.11.2", 7 | "crypto": "^1.0.1", 8 | "crypto-js": "^4.2.0", 9 | "jsdom": "^22.1.0", 10 | "jsencrypt": "^3.3.2", 11 | "node-forge": "^1.3.1", 12 | "node-rsa": "^1.1.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | beautifulsoup4==4.12.2 2 | ddddocr==1.4.8 3 | Pillow==10.0.0 4 | pkcs7==0.1.2 5 | pycryptodome==3.18.0 6 | PyExecJS==1.5.1 7 | Requests==2.31.0 8 | --------------------------------------------------------------------------------