├── .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 |
--------------------------------------------------------------------------------