Compare commits

...

31 Commits

Author SHA1 Message Date
panleicim 32eb83c5d6 added jspl_encoder_wrapper.py 2025-08-13 16:26:49 +02:00
panleicim 9b191be6d6 added jspl_encoder_wrapper.py 2025-08-13 08:58:09 +02:00
panleicim 8a6444cb14 more fields in JsDataPojo 2025-08-09 23:28:52 +02:00
panleicim 1b18804b2b check always saigecong1990@pissmail.com 2025-07-23 11:26:52 +02:00
panleicim aa540ac622 Merge branch 'feature/with_lan' of git.lpaconsulting.fr:panleicim/appointment_request into feature/with_lan 2025-07-15 19:29:56 +02:00
panleicim c9ee7d9a4f update requirements 2025-07-15 19:28:20 +02:00
panleicim f71650c347 fix mail read errors 2025-07-15 18:59:09 +02:00
panleicim a690ca7fe5 syntax fix 2025-07-15 18:32:02 +02:00
panleicim ea07867b67 add sleep to lan helper 2025-07-12 11:39:38 +02:00
panleicim 1eedb1468e specify the subject for lan mail helper 2025-07-11 19:25:18 +02:00
panleicim 0870a040b6 Merge branch 'refs/heads/feature/token_from_cookies' into feature/with_lan
# Conflicts:
#	mail/mail_reader_all_contacts.py
#	queue_message/appointmentrequestsender.py
2025-07-11 12:50:50 +02:00
panleicim 8ae6a7593b Merge branch 'feature/5_0_2' into feature/with_lan 2025-07-11 12:07:32 +02:00
panleicim c6ac87bdfa support model and wait only for 30s for cookie used by csrf 2025-07-10 19:58:31 +02:00
panleicim 3d05f739b4 Merge branch 'feature/5_0_2' of git.lpaconsulting.fr:panleicim/appointment_request into feature/5_0_2 2025-07-04 11:30:18 +02:00
panleicim 2dfb483161 handle not valid json exception 2025-07-04 11:30:15 +02:00
panleicim 991602afd7 wait 20s when cookies is blocked while validating links 2025-07-02 17:26:34 +02:00
panleicim 5cda2f5acb wait 20s when cookies is blocked while validating links 2025-07-02 15:46:29 +02:00
panleicim 1a9a88c49a save phone model 2025-07-01 15:01:46 +02:00
panleicim d35c667b5f update oxy sticky credentiels 2025-07-01 00:28:21 +02:00
panleicim 62a7cc020d pb with data in the queue 2025-06-30 17:49:52 +02:00
panleicim 343a14f6a2 read hotmail after appointment request 2025-06-28 12:56:42 +02:00
panleicim 62cdb55da2 read hotmail after appointment request 2025-06-28 11:14:56 +02:00
panleicim 3a2983a932 use more thread to validate urls 2025-06-27 11:59:57 +02:00
panleicim 487b907bb7 support hotmail.com 2025-06-24 14:02:41 +02:00
panleicim 1cf546286e read pissmail 2025-06-18 17:34:07 +02:00
panleicim a32da93aed read pissmail 2025-06-17 19:02:08 +02:00
panleicim 0f23d848ab try to support forward 2025-06-17 12:59:00 +02:00
panleicim dae681f9a0 use BAK queue for url validation 2025-06-12 14:48:44 +02:00
panleicim 6fe96ffa87 rm commits 2025-06-11 19:07:37 +02:00
panleicim bcab7f40c0 can read mails and send appointment request 2025-06-11 16:30:47 +02:00
panleicim 4d493a3e92 use anyip proxy 2025-06-09 12:35:55 +02:00
23 changed files with 1790 additions and 268 deletions
View File
+445
View File
@@ -0,0 +1,445 @@
// JSPL的计算过程总结:
//
// 输入: 传入的会话ID或相关数据
// 哈希处理: 使用DJB2算法变种对输入进行哈希
// 种子生成: 结合时间戳和常量生成加密种子
// 数据收集: 收集各种浏览器指纹和环境信息
// 加密处理: 使用自定义的流加密算法对数据进行加密
// Base64编码: 最终使用自定义字符集进行Base64编码
// 这个函数生成的第三个返回值就是用于JSPL参数的加密字符串
var zn = (function () {
// 检查是否已经初始化
// if (Pn) {
// return Nn;
// }
Pn = true;
var n = "unknown"; // 默认返回值
var constantSeed = 11027890091; // 常量种子
var o = true; // 状态标志
// 字符串哈希函数 - DJB2算法的变种
function djb2HashString(str) {
if (!str) {
return n;
}
var hash = 0;
for (var i = 0; i < str.length; i++) {
hash = (hash << 8) - hash + str.charCodeAt(i) | 0;
}
return hash === 0 ? n : hash;
}
// 映射函数 - 用于Base64编码的自定义字符集
function mapChar(n) {
if (n > 37) {
return 59 + n;
} else if (n > 11) {
return 53 + n;
} else if (n > 1) {
return 46 + n;
} else {
return n * 50 + 45;
}
}
// 线性同余生成器 - 用于生成伪随机数
function lcg(n) {
return (n = (n ^= n << 13) ^ n >> 17) ^ n << 5;
}
// 加密随机数生成器
function createRandomGenerator(seed, initialValue) {
var state = seed;
var counter = -1;
var value = initialValue;
var firstCall = o;
o = false;
var buffer = null;
return function (peek) {
var result;
if (buffer !== null) {
result = buffer;
buffer = null;
} else {
if (++counter > 2) {
state = lcg(state);
counter = 0;
}
result = ((result = state >> 16 - counter * 8) ^ (firstCall ? --value : 0)) & 255;
if (peek) {
buffer = result;
}
}
return result;
};
}
// 主加密函数
return Nn = function (inputString, additionalData) {
// console.log("inputString:" + inputString)
// console.log("additionalData:" + additionalData)
// 混合输入数据生成种子
var seed = constantSeed ^ djb2HashString(inputString) ^ additionalData;
// 生成基于时间的随机数
var timeBasedRandom = lcg(lcg(Date.now() >> 3 ^ constantSeed) * constantSeed);
// 创建随机数生成器
var randomGenerator = createRandomGenerator(seed, timeBasedRandom);
// 存储加密数据的数组
var encryptedData = [];
var isFirstCall = true;
var callCounter = 0;
// UTF-8编码和加密函数
function utf8EncodeAndEncrypt(str) {
var bytes = [];
var byteIndex = 0;
// UTF-8编码
for (var i = 0; i < str.length; i++) {
var charCode = str.charCodeAt(i);
if (charCode < 128) {
bytes[byteIndex++] = charCode;
} else {
if (charCode < 2048) {
bytes[byteIndex++] = charCode >> 6 | 192;
} else {
if ((charCode & 64512) == 55296 && i + 1 < str.length && (str.charCodeAt(i + 1) & 64512) == 56320) {
charCode = 65536 + ((charCode & 1023) << 10) + (str.charCodeAt(++i) & 1023);
bytes[byteIndex++] = charCode >> 18 | 240;
bytes[byteIndex++] = charCode >> 12 & 63 | 128;
} else {
bytes[byteIndex++] = charCode >> 12 | 224;
}
bytes[byteIndex++] = charCode >> 6 & 63 | 128;
}
bytes[byteIndex++] = charCode & 63 | 128;
}
}
// XOR加密
for (var j = 0; j < bytes.length; j++) {
bytes[j] ^= randomGenerator();
}
return bytes;
}
// JSON序列化函数
function safeJsonStringify(obj) {
try {
return JSON.stringify(obj);
} catch (e) {
}
}
// 数据收集和加密函数
function collectAndEncrypt(key, value) {
// console.log("key:" + key)
// console.log("value:" + value)
if (!(typeof key != "string" || key.length == 0 || value && ["number", "string", "boolean"].indexOf(typeof value) == -1)) {
let serializedKey = safeJsonStringify(key);
// console.log("serializedKey:" + serializedKey)
value = safeJsonStringify(value);
// console.log("serializedValue:" + value)
if (key && value !== undefined && key !== "xt1") {
// 添加分隔符和加密数据
encryptedData.push(randomGenerator() ^ (encryptedData.length ? 44 : 123));
Array.prototype.push.apply(encryptedData, utf8EncodeAndEncrypt(serializedKey));
encryptedData.push(randomGenerator() ^ 58);
Array.prototype.push.apply(encryptedData, utf8EncodeAndEncrypt(value));
// 第一次调用时添加额外数据
if (isFirstCall) {
isFirstCall = false;
// var hsv = typeof window._hsv == "string" && window._hsv.length > 0 ||
// typeof window._hsv == "number" && !isNaN(window._hsv) ? window._hsv : 33;
//todo hsv 怎么拿到
var hsv = 33;
collectAndEncrypt("r3n", hsv);
}
}
}
}
var processedKeys = new Set();
// 返回三个函数的数组
return [
// 1. 主要的数据收集函数
collectAndEncrypt,
// 2. 带去重保护的数据收集函数
function (key, value) {
if (!processedKeys.has(key)) {
processedKeys.add(key);
collectAndEncrypt(key, value);
}
},
// 3. 最终生成加密字符串的函数
function (finalKey) {
var finalRandomGen = createRandomGenerator(djb2HashString(finalKey) ^ 1809053797, timeBasedRandom);
collectAndEncrypt("bpc", ++callCounter);
// 对收集的数据进行最终加密
var finalEncrypted = [];
for (var i = 0; i < encryptedData.length; i++) {
finalEncrypted.push(encryptedData[i] ^ finalRandomGen());
}
// 添加结束标记
finalEncrypted.push(randomGenerator(true) ^ 125 ^ finalRandomGen());
// Base64编码
var resultBytes = finalEncrypted;
var resultChars = [];
var baseValue = timeBasedRandom;
for (var pos = 0; pos < resultBytes.length;) {
var triplet = (--baseValue & 255 ^ resultBytes[pos++]) << 16 |
(--baseValue & 255 ^ resultBytes[pos++]) << 8 |
--baseValue & 255 ^ resultBytes[pos++];
resultChars.push(String.fromCharCode(mapChar(triplet >> 18 & 63)));
resultChars.push(String.fromCharCode(mapChar(triplet >> 12 & 63)));
resultChars.push(String.fromCharCode(mapChar(triplet >> 6 & 63)));
resultChars.push(String.fromCharCode(mapChar(triplet & 63)));
}
// 处理剩余字节
if (resultBytes.length % 3) {
resultChars.length -= 3 - (resultBytes.length % 3);
}
return resultChars.join("");
}
];
};
})();
// 创建一个工具函数来生成JSPL
function createJSPLGenerator(dateTimeStamp) {
return {
generate: function (sessionData, fingerprintData) {
// let dateTimeStamp = Math.floor(Date.now() / 1000)
// console.log("dateTimeStamp : " + dateTimeStamp)
// 使用会话数据作为输入
var functions = zn(sessionData, dateTimeStamp);
var collect = functions[1]; // 收集函数
var generate = functions[2]; //加密函数
// 收集指纹数据
for (var key in fingerprintData) {
if (fingerprintData.hasOwnProperty(key)) {
collect(key, fingerprintData[key]);
}
}
// 生成并返回JSPL
return generate("jspl");
}
};
}
// print process.argv
// process.argv.forEach(function (val, index, array) {
// console.log(index + ': ' + val);
// });
var fingerprint = undefined
var dateTimeStamp = undefined
if (process.argv[2] != undefined) {
fingerprint = JSON.parse(process.argv[2])
}
dateTimeStamp = JSON.parse(process.argv[3])
// main
// if (dateTimeStamp == undefined) {
// dateTimeStamp = Math.floor(Date.now() / 1000)
// }
// let dateTimeStamp = Math.floor(Date.now() / 1000)
// let dateTimeStamp = 1754908260
// console.log(dateTimeStamp)
// 使用示例
let jsplGenerator = createJSPLGenerator(dateTimeStamp);
// fingerprint = {
// "nddc": 1,
// "r3n": 33,
// "exp8": 0,
// "uid": null,
// "bci": true,
// "bcl": 0.8,
// "bct": "Infinity",
// "bdt": "Infinity",
// "dp0": false,
// "ucdv": false,
// "wdifrm": false,
// "iwgl": "undefined",
// "npmtm": false,
// "wdif": false,
// "wdifpnh": 2800984568,
// "lg": "fr-FR",
// "isb": false,
// "idp": true,
// "crt": 0,
// "vnd": "Google Inc.",
// "bid": "NA",
// "med": "defined",
// "pltod": false,
// "csssp": "",
// "awe": false,
// "phe": false,
// "dat": false,
// "nm": false,
// "geb": false,
// "sqt": false,
// "pf": "Linux armv81",
// "hc": 8,
// "br_oh": 745,
// "br_ow": 393,
// "ua": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
// "wbd": false,
// "ts_mtp": 5,
// "mob": true,
// "lgs": ["fr-FR", "en-US", "zh-CN", "zh", "fr", "en"],
// "dvm": 4,
// "hcovdr": false,
// "plovdr": false,
// "ftsovdr": false,
// "orf": "debug",
// "ttst": 0.8517814137469564,
// "br_w": 393,
// "br_h": 745,
// "br_iw": 513,
// "br_ih": 847,
// "ars_w": 393,
// "ars_h": 876,
// "rs_w": 393,
// "rs_h": 876,
// "rs_cd": 24,
// "pr": 2.75,
// "so": "portrait-primary",
// "vco": "",
// "vcots": false,
// "vch": "probably",
// "vchts": true,
// "vcw": "probably",
// "vcwts": true,
// "vc3": "maybe",
// "vc3ts": false,
// "vcmp": "",
// "vcmpts": false,
// "vcq": "",
// "vcqts": false,
// "vc1": "probably",
// "vc1ts": true,
// "cssS": "3.93,0.39,12.24,9.75,5.64,10.98,13.46,2.19,6.51",
// "css0": "7,75,0",
// "css1": "9.74354,0.354646,-0.00922698,0.000685511,0.203723,-5.61673,-0.755238,0.0561098,-0.0279023,0.481607,-10.9534,0.813777,-0.375565,6.48243,-147.433,11.9534",
// "cssH": "15px",
// "plu": "",
// "plgod": false,
// "plg": 0,
// "plgne": "NA",
// "plgre": "NA",
// "plgof": "NA",
// "plggt": "NA",
// "mmt": "empty",
// "bchk": "3223aeb6721e0d0917e792818d193ac88dcd62fad5cad7bf7a2b2b473ecf58ee60f018dbdb1a5832e8dc6528387b0745971dbcd82387261e9a4e3f",
// "nt_tcp": 0,
// "nt_dns": 0,
// "nt_rd": 0,
// "nt_irt": -29.600000008940697,
// "nt_rt": 1129,
// "nt_tls": 6.700000002980232,
// "nt_ttf": 1166.7000000029802,
// "nt_swt": 22.900000005960464,
// "nt_csd": 411060,
// "nt_nhp": "h2",
// "nt_rdc": 0,
// "nt_it": "navigation",
// "nt_prs": 6.700000002980232,
// "nt_esc": 0,
// "nt_ttrd": null,
// "nt_le": 3.0999999940395355,
// "nt_dcle": 141.79999999701977,
// "nt_di": 1415.2000000029802,
// "nt_dc": 2862.6000000089407,
// "ccsT": "Error\nat S (https://d.digital.hermes/tags.js:173:22)\nat Un.C (https://d.digital.hermes/tags.js:1252:41\nat nrWrapper (https://www.hermes.com/fr/fr/category/femme/Sacs%20et%20pochettes%20pour%20Femme%20_%20Herme%CC%80s%20France.html:7:13468)",
// "ccsB": "tags.js:1252:41 at nrWrapper (sac-p-tit-arcon-H085871CKAO.html:7:13468)",
// "ccsH": "1050544242",
// "ccsV": ",993b46baf0942a343b7e6b02fa3f8eef64727f077d3b0055af56e6994dcaf046",
// "muev": false,
// "pro_t": true,
// "wglo": true,
// "prso": true,
// "wbst": true,
// "psn": true,
// "edp": true,
// "addt": true,
// "wsdc": true,
// "ccsr": true,
// "nuad": true,
// "bcda": true,
// "idn": true,
// "capi": true,
// "svde": true,
// "vpbq": true,
// "mq": "aptr:coarse,ahvr:none",
// "aco": "probably",
// "acots": false,
// "acmp": "probably",
// "acmpts": true,
// "acw": "probably",
// "acwts": false,
// "acma": "maybe",
// "acmats": false,
// "acaa": "probably",
// "acaats": true,
// "ac3": "",
// "ac3ts": false,
// "acf": "probably",
// "acfts": false,
// "acmp4": "maybe",
// "acmp4ts": false,
// "acmp3": "probably",
// "acmp3ts": false,
// "acwm": "maybe",
// "acwmts": false,
// "ocpt": false,
// "ckwa": false,
// "spwn": false,
// "emt": false,
// "bfr": false,
// "tz": -120,
// "hdn": false,
// "xt1": false,
// "cdhf": false,
// "eva": 33,
// "cokys": ",loadTimes,csi,app",
// "ecpc": false,
// "nhi": ",64,true,Nexus 5,Android,6.0,138.0.7204.184,false",
// "k_lyts": 48,
// "k_lytk": "kg20va`l\u00a7'w8mh.71pdfoqcn[zy365x/\\,-4bt9siu=j;r]e",
// "emd": "k:ai,vi,ao",
// "wwl": false,
// "glvd": "Google Inc. (ARM)",
// "glrd": "ANGLE (ARM,Mali-G57 MC2,OpenGL ES 3.2)",
// "tzp": "Europe/Paris",
// "isf": true,
// "isf2": false,
// "dt": false,
// "fph": 416468867,
// "jset": 1754750959
// }
// console.log("received fringerprint is :"+fingerprint)
// console.log(fingerprint)
let jspl = jsplGenerator.generate("user_session_12345", fingerprint);
console.log(jspl);
+189
View File
@@ -0,0 +1,189 @@
import json
import os
import subprocess
import time
def encrpte_to_jspl(fingerprint_json):
dir = os.path.dirname(__file__)
# print(fingerprint_json)
_timestamp = int(time.time())
p = subprocess.Popen(['node', dir + '/jspl_encoder.js', fingerprint_json, str(_timestamp)], stdout=subprocess.PIPE)
encrypted_fingerprint = p.stdout.read()
_result = encrypted_fingerprint.decode('utf-8')
return _result
if __name__ == '__main__':
fingerprint = {
"nddc": 1,
"r3n": 33,
"exp8": 0,
"uid": None,
"bci": True,
"bcl": 0.8,
"bct": "Infinity",
"bdt": "Infinity",
"dp0": False,
"ucdv": False,
"wdifrm": False,
"iwgl": "undefined",
"npmtm": False,
"wdif": False,
"wdifpnh": 2800984568,
"lg": "fr-FR",
"isb": False,
"idp": True,
"crt": 0,
"vnd": "Google Inc.",
"bid": "NA",
"med": "defined",
"pltod": False,
"csssp": "",
"awe": False,
"phe": False,
"dat": False,
"nm": False,
"geb": False,
"sqt": False,
"pf": "Linux armv81",
"hc": 8,
"br_oh": 745,
"br_ow": 393,
"ua": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
"wbd": False,
"ts_mtp": 5,
"mob": True,
"lgs": ["fr-FR", "en-US", "zh-CN", "zh", "fr", "en"],
"dvm": 4,
"hcovdr": False,
"plovdr": False,
"ftsovdr": False,
"orf": "debug",
"ttst": 0.8517814137469564,
"br_w": 393,
"br_h": 745,
"br_iw": 513,
"br_ih": 847,
"ars_w": 393,
"ars_h": 876,
"rs_w": 393,
"rs_h": 876,
"rs_cd": 24,
"pr": 2.75,
"so": "portrait-primary",
"vco": "",
"vcots": False,
"vch": "probably",
"vchts": True,
"vcw": "probably",
"vcwts": True,
"vc3": "maybe",
"vc3ts": False,
"vcmp": "",
"vcmpts": False,
"vcq": "",
"vcqts": False,
"vc1": "probably",
"vc1ts": True,
"cssS": "3.93,0.39,12.24,9.75,5.64,10.98,13.46,2.19,6.51",
"css0": "7,75,0",
"css1": "9.74354,0.354646,-0.00922698,0.000685511,0.203723,-5.61673,-0.755238,0.0561098,-0.0279023,0.481607,-10.9534,0.813777,-0.375565,6.48243,-147.433,11.9534",
"cssH": "15px",
"plu": "",
"plgod": False,
"plg": 0,
"plgne": "NA",
"plgre": "NA",
"plgof": "NA",
"plggt": "NA",
"mmt": "empty",
"bchk": "3223aeb6721e0d0917e792818d193ac88dcd62fad5cad7bf7a2b2b473ecf58ee60f018dbdb1a5832e8dc6528387b0745971dbcd82387261e9a4e3f",
"nt_tcp": 0,
"nt_dns": 0,
"nt_rd": 0,
"nt_irt": -29.600000008940697,
"nt_rt": 1129,
"nt_tls": 6.700000002980232,
"nt_ttf": 1166.7000000029802,
"nt_swt": 22.900000005960464,
"nt_csd": 411060,
"nt_nhp": "h2",
"nt_rdc": 0,
"nt_it": "navigation",
"nt_prs": 6.700000002980232,
"nt_esc": 0,
"nt_ttrd": None,
"nt_le": 3.0999999940395355,
"nt_dcle": 141.79999999701977,
"nt_di": 1415.2000000029802,
"nt_dc": 2862.6000000089407,
"ccsT": "Error\nat S (https://d.digital.hermes/tags.js:173:22)\nat Un.C (https://d.digital.hermes/tags.js:1252:41\nat nrWrapper (https://www.hermes.com/fr/fr/category/femme/Sacs%20et%20pochettes%20pour%20Femme%20_%20Herme%CC%80s%20France.html:7:13468)",
"ccsB": "tags.js:1252:41 at nrWrapper (sac-p-tit-arcon-H085871CKAO.html:7:13468)",
"ccsH": "1050544242",
"ccsV": ",993b46baf0942a343b7e6b02fa3f8eef64727f077d3b0055af56e6994dcaf046",
"muev": False,
"pro_t": True,
"wglo": True,
"prso": True,
"wbst": True,
"psn": True,
"edp": True,
"addt": True,
"wsdc": True,
"ccsr": True,
"nuad": True,
"bcda": True,
"idn": True,
"capi": True,
"svde": True,
"vpbq": True,
"mq": "aptr:coarse,ahvr:none",
"aco": "probably",
"acots": False,
"acmp": "probably",
"acmpts": True,
"acw": "probably",
"acwts": False,
"acma": "maybe",
"acmats": False,
"acaa": "probably",
"acaats": True,
"ac3": "",
"ac3ts": False,
"acf": "probably",
"acfts": False,
"acmp4": "maybe",
"acmp4ts": False,
"acmp3": "probably",
"acmp3ts": False,
"acwm": "maybe",
"acwmts": False,
"ocpt": False,
"ckwa": False,
"spwn": False,
"emt": False,
"bfr": False,
"tz": -120,
"hdn": False,
"xt1": False,
"cdhf": False,
"eva": 33,
"cokys": ",loadTimes,csi,app",
"ecpc": False,
"nhi": ",64,true,Nexus 5,Android,6.0,138.0.7204.184,false",
"k_lyts": 48,
"k_lytk": "kg20va`l\u00a7'w8mh.71pdfoqcn[zy365x/\\,-4bt9siu=j;r]e",
"emd": "k:ai,vi,ao",
"wwl": False,
"glvd": "Google Inc. (ARM)",
"glrd": "ANGLE (ARM,Mali-G57 MC2,OpenGL ES 3.2)",
"tzp": "Europe/Paris",
"isf": True,
"isf2": False,
"dt": False,
"fph": 416468867,
"jset": 1754750959
}
fingerprint_json = json.dumps(fingerprint)
print(encrpte_to_jspl(fingerprint_json))
+6 -1
View File
@@ -83,10 +83,11 @@ class MongoDbManager:
result_list.append(ContactPojo.from_firestore_dict(document))
return result_list
def save_links_to_validate(self, link: str, mail_address: str, _all_contact_list: list):
def save_links_to_validate(self, link: str, mail_address: str, model: str, _all_contact_list: list):
collection_to_use = self.db[LINKS_TO_VALIDATE]
updated_at = time.strftime("%H:%M:%S", time.localtime())
_ip_country = "FR"
serial = "requests"
# find ip_country info
for _contact in _all_contact_list:
if _contact.mail == mail_address:
@@ -96,6 +97,8 @@ class MongoDbManager:
collection_to_use.replace_one(filter={'_id': mail_address, }, replacement={
u'url': link,
u'email': mail_address,
u'serial': serial,
u'model': model,
u'ip_country': _ip_country,
"updated_at": updated_at
},
@@ -103,6 +106,8 @@ class MongoDbManager:
else:
collection_to_use.replace_one(filter={'_id': link, }, replacement={
u'url': link,
u'serial': serial,
u'model': model,
u'ip_country': _ip_country,
"updated_at": updated_at
},
+423
View File
@@ -0,0 +1,423 @@
nddc:1 --> OK, 1, 需要从网页中获得
数值应该就是1
var nddc;
try {
if ((nddc = (document.cookie.match(/datadome=/g) || []).length) > 1) {
t.deleteAllDDCookies();
}
} catch (n) {
nddc = "err";
}
r3n:33
r3n 数值是window._hsv 的值,如果没有window._hsv的值,那么返回33
// var hsv = typeof window._hsv == "string" && window._hsv.length > 0 ||
// typeof window._hsv == "number" && !isNaN(window._hsv) ? window._hsv : 33;
exp8:0
固定是0
uid:null
默认为null
n.i("uid", t.getCookie("correlation_id"));
bci:true
bcl:0.8
bct:Infinity
bdt:Infinity
window.navigator.getBattery().then(function (batteryManager) {
n("bci", batteryManager.charging);
n("bcl", batteryManager.level);
n("bct", batteryManager.chargingTime);
n("bdt", batteryManager.dischargingTime);
});
dp0:false
默认为false ?
ucdv:false
默认为false
ucdv = typeof objectToInspect != "undefined" && objectToInspect === "null" && typeof result != "undefined" && !!result)
wdifrm:false
默认为false
iwgl:undefined ??
npmtm:false
默认为false
wdif:false
wdifpnh:2800984568
lg:fr-FR
n("lg", window.navigator.language || window.navigator.userLanguage || window.navigator.browserLanguage || window.navigator.systemLanguage || "");
isb:false
n("isb", !!window.navigator.brave);
idp:true
crt:0
crt = window.navigator.connection && window.navigator.connection['rtt']
vnd:Google Inc.
OK
bid:NA
OK
med:defined
OK
pltod:false
默认为false
csssp:
为空
awe:false
默认为false
phe:false
默认为false
dat:false
默认为false
nm:false
默认为false
geb:false
默认为false
sqt:false
默认为false
pf:MacIntel
pf = window.navigator.platform
hc:12
ok
br_oh:847
ok
br_ow:513
ok
ua:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Mobile Safari/537.36
ok
wbd:false
默认为false
ts_mtp:0
ok
mob:true
mob = navigator.userAgentData?navigator.userAgentData.mobile:"NA"
lgs:["fr-FR","en-US","zh-CN","zh","fr","en"]
lgs=JSON.stringify(navigator.languages)
dvm:8
ok
hcovdr:false
默认为false
plovdr:false
默认为false
ftsovdr:false
默认为false
orf:debug
trrd:0.5678095129748595
0到1之间的,小数后面有15位的随机数
br_w:513
ok
br_h:847
ok
br_iw:513
window.innerWidth || 0
br_ih:847
window.innerHeight || 0
ars_w:513
ok
ars_h:847
ok
rs_w:513
ok
rs_h:847
ok
rs_cd:24
ok
pr:2
ok
so:portrait-primary
ok
vco:
ok
vcots:false
ok
vch:probably
ok
vchts:true
ok
vcw:probably
ok
vcwts:true
ok
vc3:maybe
ok
vc3ts:false
ok
vcmp:
ok
vcmpts:false
ok
vcq:
ok
vcqts:false
ok
vc1:probably
ok
vc1ts:true
ok
cssS:3.93,0.39,12.24,9.75,5.64,10.98,13.46,2.19,6.51
css0:7, 75, 0
css1:9.74354, 0.354646, -0.00922698, 0.000685511, 0.203723, -5.61673, -0.755238, 0.0561098, -0.0279023, 0.481607, -10.9534, 0.813777, -0.375565, 6.48243, -147.433, 11.9534
cssH:15px
plu:empty
plgod:false
plg:0
plgne:NA
plgre:NA
plgof:NA
plggt:NA
mmt:empty
bchk:3223aeb6721e0d0917e7928181193ac88dcd62fad5cadfbe7a2b2b473ecf58ee70f098dbdb1a1832e8dc6528387b0745971dbcd82384261e9a4e3f
for (var n = ["AppBannerPromptResult", "webkitRTCPeerConnection", "webkitAudioContext", "webkitRequestAnimationFrame", "chrome.runtime",
"chrome.webstore", "console.context", "InputMethodContext", "SVGAnimationElement", "SVGPathSegList", "PasswordCredential", "ViewTransition",
"VisualViewport.prototype.segments", "DeprecationReportBody", "MathMLElement", "opr", "CSS2Properties.prototype.colorScheme", "WebKitCSSMatrix",
"SVGTextPositioningElement", "XMLHttpRequestEventTarget", "TextDecoderStream", "onloadend", "WritableStream", "TransformStream", "TextTrackCue",
"-283", "VisualViewport", "StyleSheet", "RTCDtlsTransport", "Atomics", "StaticRange", "UIEvent", "VideoStreamTrack", "OfflineResourceList",
"SVGGeometryElement", "RTCDataChannel", "VTTRegion", "AbortController", "Controllers", "onanimationcancel",
"SVGDocument", "IIRFilterNode", "RTCStatsReport", "MediaStreamTrack", "CSS2Properties.prototype.MozOsxFontSmoothing", "CropTarget", "BatteryManager",
"LaunchQueue", "CSSFontPaletteValuesRule", "PushSubscriptionOptions", "DOMSettableTokenList", "RTCTrackEvent",
"MozSmsMessage", "ServiceWorkerContainer", "CanvasCaptureMediaStream", "DeviceStorage", "XPathNSResolver", "SmartCardEvent", "WeakSet",
"MozMobileMessageManager", "External.prototype.getHostEnvironmentValue", "WindowUtils", "XPathNamespace", "SVGFEDropShadowElement",
"SharedWorker", "WorkerMessageEvent", "CSS2Properties.prototype.MozOSXFontSmoothing", "AudioSinkInfo",
"Notification.prototype.image", "ContentVisibilityAutoStateChangeEvent", "PerformanceResourceTiming.prototype.renderBlockingStatus", "console.createTask",
"PerformanceServerTiming", "CanvasFilter", "structuredClone", "onslotchange", "EyeDropper", "URLPattern", "VideoFrame", "WritableStreamDefaultController", "SharedArrayBuffer",
"CSSCounterStyleRule", "CustomStateSet", "ReadableStreamDefaultController", "XMLDocument.prototype.hasStorageAccess",
"CryptoKey", "SubmitEvent", "MediaMetadata", "VideoPlaybackQuality", "ReadableStreamDefaultReader", "UserActivation", "FragmentDirective",
"WebKitMediaKeyError", "RTCRtpTransceiver.prototype.stop", "Scheduling", "EventCounts", "VideoTrackList", "SourceBuffer", "RTCError", "FontFaceSet", "CSSCharsetRule", "MediaDeviceInfo",
"RTCPeerConnectionIceErrorEvent", "RTCSctpTransport", "MediaSessionCoordinator", "XULPopupElement", "MediaSourceHandle",
"366", "__REACT_DEVTOOLS_GLOBAL_HOOK__", "ShadowRealm", "HTMLSlotElement", "DetachedViewControlEvent", "GeolocationPosition", "SiteBoundCredential", "MediaSource",
"WebTransport", "GPUSupportedLimits", "ToggleEvent"], bchk = "", e = 0; e < n.length; e++) {
for (var r = n[e].split("."), i = window, o = true, c = 0; c < r.length; c++) {
var s = r[c];
if (!(s in i)) {
o = false;
break;
}
if (c < r.length - 1) {
i = i[s];
}
}
if (o) {
bchk += "52738db37a1ea50137e79e8181193ac872cd325ba5cacfbe7aab5b36b9c9879e7c0018dbd31a1832a8dc6528387b67451719dcd8b784a518904e3f07c69b9d30"[e];
} else {
bchk += "3829ae9642df0d791e41d2159da28bd18d056afadf1bd70fc9222a473eaf58e860ff950e7bf35b66e4aa90b156c80c96913dbd9c23c7262e4adbc3ddd77ff263"[e];
}
}
nt_tcp:0
var performanceNavigationTiming = window.performance.getEntriesByType && window.performance.getEntriesByType("navigation")[0];
nt_tcp = performanceNavigationTiming.connectEnd - performanceNavigationTiming.connectStart
nt_dns:0
nt_dns =performanceNavigationTiming.domainLookupEnd - performanceNavigationTiming.domainLookupStart
nt_rd:0
nt_rd = performanceNavigationTiming.redirectEnd - performanceNavigationTiming.redirectStart
nt_irt:-3.400000002235174
nt_irt = performanceNavigationTiming.firstInterimResponseStart - performanceNavigationTiming.requestStart
nt_rt:0
nt_rt = performanceNavigationTiming.responseStart - performanceNavigationTiming.requestStart
nt_tls:3.400000002235174
let nt_tls = performanceNavigationTiming.requestStart - performanceNavigationTiming.secureConnectionStart
nt_ttf:3.099999997764826
let nt_ttf = performanceNavigationTiming.responseEnd - performanceNavigationTiming.fetchStart
nt_swt:3.400000002235174
let nt_swt = performanceNavigationTiming.fetchStart - performanceNavigationTiming.workerStart
nt_csd:0
let nt_csd = performanceNavigationTiming.decodedBodySize - performanceNavigationTiming.encodedBodySize
nt_nhp:
let nt_nhp = performanceNavigationTiming.nextHopProtocol
nt_rdc:0
let nt_rdc = performanceNavigationTiming.redirectCount
nt_it:navigation
let nt_it = performanceNavigationTiming.initiatorType
nt_prs:0
let nt_prs = performanceNavigationTiming.requestStart - performanceNavigationTiming.connectEnd
nt_esc:-3.400000002235174
let nt_esc = performanceNavigationTiming.secureConnectionStart - performanceNavigationTiming.connectStart
nt_ttrd:-2
e = performanceNavigationTiming.secureConnectionStart - performanceNavigationTiming.connectStart
nt_ttrd = (e - (e = performanceNavigationTiming.connectEnd - performanceNavigationTiming.connectStart)) / e)
nt_le:0
nt_le = performanceNavigationTiming.loadEventEnd - performanceNavigationTiming.loadEventStart
nt_dcle:0.10000000149011612
nt_dcle = performanceNavigationTiming.domContentLoadedEventEnd - performanceNavigationTiming.domContentLoadedEventStart
nt_di:74.80000000074506
nt_di = performanceNavigationTiming.domInteractive
nt_dc:0
nt_dc = performanceNavigationTiming.domComplete
ccsT:Error
at S (https://d.digital.hermes/tags.js:173:22)
at Un.C (https://d.digital.hermes/tags.js:1252:41
ccsB:/tags.js:1252:41
at nrWrapper (file:///Users/lpan/Downloads/Sacs%20et%20pochettes%20pour%20Femme%20_%20Herme%CC%80s%20France.html:7:13468)
ccsH:1050544242
ccsV:,993b46baf0942a343b7e6b02fa3f8eef64727f077d3b0055af56e6994dcaf046
muev:false
let muev = !!window.MutationEvent
pro_t:true
let pro_t = typeof window.Promise != "undefined" && !!window.Promise.try
wglo:true
!!window.WebGLObject
prso:true
!!window.PressureObserver
wbst:true
!!window.WebSocketStream
psn:true
!!window.PermissionStatus && window.PermissionStatus.prototype.hasOwnProperty('name')
edp:true
!!window.EyeDropper
addt:true
!window.AudioData
wsdc:true
!!window.WritableStreamDefaultController
ccsr:true
!!window.CSSCounterStyleRule
nuad:true
!!window.NavigatorUAData
bcda:true
!!window.BarcodeDetector
idn:true
!(!window.Intl || !window.Intl.DisplayNames)
capi:false
capi = !!(window.navigator && window.navigator.contacts && window.navigator[2])
svde:false
!!window.SVGDiscardElement
vpbq:true
!!(window.HTMLVideoElement && window.HTMLVideoElement.prototype && window.HTMLVideoElement.prototype.getVideoPlaybackQuality)
mq:aptr:coarse, ahvr:none
aco:probably
var audioElement = document.createElement("audio");
aco = audioElement.canPlayType("audio/ogg; codecs=\"vorbis\"")
acots:false
window.MediaSource.isTypeSupported("audio/ogg; codecs=\"vorbis\"")
acmp:probably
ok audioElement.canPlayType("audio/mpeg;")
acmpts:true
ok, default to true
acw:probably
ok, default to probably
acwts:false
ok, default to false
acma:maybe
ok, default to maybe
acmats:false
ok, default to false
acaa:probably
ok, default to probably
acaats:true
ok, default to true
ac3:
default to empty: ""
ac3ts:false
ok, default to false
acf:probably
ok, default to probably
acfts:false
ok, default to false
acmp4:maybe
ok, default to maybe
acmp4ts:false
ok, default to false
acmp3:probably
ok, default to probably
acmp3ts:false
ok, default to false
acwm:maybe
ok, default to maybe
acwmts:false
ok, default to false
ocpt:false
ok ocpt = audioElement.canPlayType.toString().indexOf('canPlayType') === -1
ckwa:false
ok, default to false
spwn:false
spwn = !!window.spawn
emt:false
emt = !!window.emit
bfr:false
bfr = !!window.Buffer
tz:-120
ok
hdn:false
hdn = !!window.hidden
ok, default to false
xt1:false
xt1 = !!window.navigator.pdfViewerEnabled
cdhf:false
cdhf = window.hasFocus()
eva:40
eva = window.XMLDocument.toString().length
cokys:,loadTimes,csi,app
default to ",loadTimes,csi,app"
var cokys = ""
for (var v in window.chrome) {
cokys += "," + v;
}
ecpc:false
default to false
ecpc = !!window.process
nhi:,64,true,Nexus 5,Android,6.0,138.0.7204.184,false
let results = await window.navigator.userAgentData.getHighEntropyValues(["architecture", "bitness", "model", "platformVersion", "uaFullVersion", "wow64"])
for (var e = ["architecture", "bitness", "mobile", "model", "platform", "platformVersion", "uaFullVersion", "wow64"], r = [], i = 0; i < e.length; i++) {
r.push(results[e[i]]);
}
nhi = r.join(",");
k_lyts:48
k_lytk:kg20va`l§'w8mh.71pdfoqcn[zy365x/\,-4bt9siu=j;r]e
let keyboardLayoutMap = await window.navigator.keyboard.getLayoutMap()
let k_lyts = keyboardLayoutMap.size
for (var e = "", r = window.Array.from(keyboardLayoutMap.values()), i = 0; i < r.length; i++) {
e += r[i];
}
let k_lytk = e
//}
//).catch(function (t) {
// n("k_lyts", "Err: " + Q(t.message));
//});
emd:k:ai,vi,ao
ok
wwl:false
glvd:Google Inc. (Apple)
ok
glrd:ANGLE (Apple, ANGLE Metal Renderer: Apple M2 Pro, Unspecified Version)
ok
tzp:Europe/Paris
ok: Intl.DateTimeFormat().resolvedOptions().timeZone
isf:true
isf = window.outerHeight - window.innerHeight <= 1
isf2:false
isf2 = window.matchMedia && window.matchMedia("(display-mode: fullscreen)").matches
dt:false
dt = (window.outerHeight - window.innerHeight > 170)
fph:416468867
jset:1754233764
jset = Math.floor(Date.now() / 1000)
+1 -4
View File
@@ -2,9 +2,6 @@ import time
from workers.link_validator_with_provided_list import validate_all_links
# if __name__ == '__main__':
# # link_list = MONGO_STORE_MANAGER.get_links_to_validate()
# validate_with_FR_ip(segment_position=2)
if __name__ == '__main__':
# generate test data
@@ -12,4 +9,4 @@ if __name__ == '__main__':
print("call validate_all_links()")
validate_all_links([])
print("wait for 30 seconds")
time.sleep(30)
time.sleep(10)
+123
View File
@@ -0,0 +1,123 @@
import logging
import random
import time
import requests
from db.mongo_manager import MONGO_STORE_MANAGER
from mail.mail_reader_all_contacts import find_links_to_validate_from_mail_list
from models.mail_pojo import MailAddress
host = "https://authhk.bhdata.com:30015/bhmailer?uid=482391396&sign=32d7748da00047b9a1054c81a5750365"
HERMES_EMAIL = "no-reply@hermes.com"
def get_api_info():
_time = str(int(time.time() * 1000))
_api_info = host + "&act=getApiInfo&t=" + _time
print(_api_info)
res = requests.get(_api_info, verify=False)
print(res.text)
def get_mail(mail: str):
_time = str(int(time.time() * 1000))
_hermes_mail = "Votre demande de rendez-vous"
_api_info = host + "&act=getMail&email={}&title={}&t={}".format(mail, _hermes_mail, _time)
print(_api_info)
res = requests.get(_api_info, verify=False)
print(res.text)
def check_mail(mail: str):
print("check_mail called for {}".format(mail))
_time = str(int(time.time() * 1000))
_hermes_mail = HERMES_EMAIL
_subjet = "Votre rendez-vous est confirmé"
_api_info = host + "&act=checkMail&email={}&from={}&title={}&t={}".format(mail, _hermes_mail, _subjet, _time)
print(_api_info)
res = requests.get(_api_info, verify=False)
print(res.text)
def check_appointment_link_mail(mail: str):
print("check_mail called for {}".format(mail))
_time = str(int(time.time() * 1000))
_hermes_mail = HERMES_EMAIL
_subjet = "Votre demande de rendez-vous"
_api_info = host + "&act=checkMail&email={}&from={}&title={}&t={}".format(mail, _hermes_mail, _subjet, _time)
print(_api_info)
res = requests.get(_api_info, verify=False)
print(res.text)
def get_account(mail: str):
_time = str(int(time.time() * 1000))
_api_info = host + "&act=getAccount&email={}&t={}".format(mail, _time)
print(_api_info)
res = requests.get(_api_info, verify=False)
print(res.text)
def filter_mail_with_links(_mail_list_to_filter):
_new_mail_list = []
_link_to_validate_list = MONGO_STORE_MANAGER.get_links_to_validate()
for _mail in _mail_list_to_filter:
_to_add = True
for _link in _link_to_validate_list:
if _link.email == _mail:
_to_add = False
if _to_add:
_new_mail_list.append(_mail)
return _new_mail_list
def get_mail_list_to_check():
successful_items = MONGO_STORE_MANAGER.get_all_successful_items_for_day()
_mail_list = []
for _item in successful_items:
if _item.url_validated is None or _item.url_validated != True:
_mail_list.append(_item.email)
return _mail_list
def check_confirmed_mails():
successful_items = MONGO_STORE_MANAGER.get_all_successful_items_for_day()
# _mail_list = []
for _item in successful_items:
if "outlook" in _item.email or "hotmail" in _item.email:
check_mail(_item.email)
time.sleep(random.randint(1, 5))
def check_all_need_to_check_emails():
logger = logging.getLogger()
_mail_list_before_filter = get_mail_list_to_check()
_mails = filter_mail_with_links(_mail_list_before_filter)
for _mail in _mails:
if "outlook.com" in _mail or "hotmail.com" in _mail:
check_mail(_mail)
time.sleep(2)
_mail_list = [MailAddress("saigecong1990@pissmail.com", "cvExXKOP8oY1D@")]
find_links_to_validate_from_mail_list(_mail_list, logger)
def try_to_check_all_mails():
logger = logging.getLogger()
_mail_list_before_filter = get_mail_list_to_check()
_mails = filter_mail_with_links(_mail_list_before_filter)
for _mail in _mails:
if "outlook.com" in _mail or "hotmail.com" in _mail:
check_appointment_link_mail(_mail)
time.sleep(2)
_mail_list = [MailAddress("saigecong1990@pissmail.com", "cvExXKOP8oY1D@")]
find_links_to_validate_from_mail_list(_mail_list, logger)
if __name__ == '__main__':
# check_all_need_to_check_emails()
try_to_check_all_mails()
# check_confirmed_mails()
# check_appointment_link_mail("hcunlvi533@outlook.com")
+36 -18
View File
@@ -86,47 +86,65 @@ def create_imap(login: str):
if DOMAIN_163 in login:
imap = IMAPClient(IMAP_SERVER_163, use_uid=True)
elif DOMAIN_YAHOO in login:
imap = imaplib.IMAP4_SSL(YAHOO_IMAP_SERVER)
# imap = imaplib.IMAP4_SSL(YAHOO_IMAP_SERVER)
imap = IMAPClient(YAHOO_IMAP_SERVER, use_uid=True)
elif DOMAIN_FIREMAIL_DE in login:
# imap = imaplib.IMAP4_SSL(SERVER_FIREMAIL_DE)
imap = IMAPClient(SERVER_FIREMAIL_DE, use_uid=True)
elif DOMAIN_GMX in login or DOMAIN_GMX_FR in login or DOMAIN_GMX_US in login or DOMAIN_GMX_CH in login or DOMAIN_GMX_PT in login or DOMAIN_GMX_SG in login:
imap = imaplib.IMAP4_SSL(SERVER_GMX)
# imap = imaplib.IMAP4_SSL(SERVER_GMX)
imap = IMAPClient(SERVER_GMX, use_uid=True)
elif DOMAIN_SINA in login:
# imap = imaplib.IMAP4_SSL(IMAP_SERVER_SINA)
imap = IMAPClient(IMAP_SERVER_SINA, use_uid=True)
elif DOMAIN_HOTMAIL in login or DOMAIN_OUTLOOK_COM in login:
imap = imaplib.IMAP4_SSL(HOTMAIL_IMAP_SERVER)
# imap = imaplib.IMAP4_SSL(HOTMAIL_IMAP_SERVER)
imap = IMAPClient(HOTMAIL_IMAP_SERVER, use_uid=True)
elif DOMAIN_RAMBLER_RU in login:
imap = imaplib.IMAP4_SSL(RAMBLER_IMAP_SERVER)
# imap = imaplib.IMAP4_SSL(RAMBLER_IMAP_SERVER)
imap = IMAPClient(RAMBLER_IMAP_SERVER, use_uid=True)
elif DOMAN_BTVM_NE_JP in login:
imap = imaplib.IMAP4_SSL(BTVM_NE_JP)
# imap = imaplib.IMAP4_SSL(BTVM_NE_JP)
imap = IMAPClient(BTVM_NE_JP, use_uid=True)
elif DOMAN_GMAIL in login:
imap = imaplib.IMAP4_SSL(SEREVER_GMAIL, port=993)
# imap = imaplib.IMAP4_SSL(SEREVER_GMAIL, port=993)
imap = IMAPClient(SEREVER_GMAIL, use_uid=True)
elif DOMAIN_ONET in login:
imap = IMAPClient(SERVER_IMAGE_ONET, use_uid=True)
elif DOMAIN_TIM_IT in login:
imap = imaplib.IMAP4(TIME_IT_SERVER)
# imap = imaplib.IMAP4(TIME_IT_SERVER)
imap = IMAPClient(TIME_IT_SERVER, use_uid=True)
elif DOMAIN_ALICE_IT in login:
imap = imaplib.IMAP4(ALICE_IMAP_SERVER, port=143)
# imap = imaplib.IMAP4(ALICE_IMAP_SERVER, port=143)
imap = IMAPClient(ALICE_IMAP_SERVER, use_uid=True)
elif DOMAIN_MARS_DTI_NE_JP in login:
imap = imaplib.IMAP4(MARS_DTI_NE_JP_SERVER, port=143)
# imap = imaplib.IMAP4(MARS_DTI_NE_JP_SERVER, port=143)
imap = IMAPClient(MARS_DTI_NE_JP_SERVER, use_uid=True)
elif DOMAN_AURORA_DTI_NE_JP in login:
imap = imaplib.IMAP4(MARS_DTI_NE_JP_SERVER, port=143)
# imap = imaplib.IMAP4(MARS_DTI_NE_JP_SERVER, port=143)
imap = IMAPClient(MARS_DTI_NE_JP_SERVER, use_uid=True)
elif DOMAIN_NAVER in login:
imap = imaplib.IMAP4_SSL(NAVER_SERVER, port=993)
# imap = imaplib.IMAP4_SSL(NAVER_SERVER, port=993)
imap = IMAPClient(NAVER_SERVER, use_uid=True)
elif DOMAIN_GMX_DE in login or DOMAIN_GMX_NET in login:
imap = imaplib.IMAP4_SSL(SERVER_GMX_NET, port=993)
# imap = imaplib.IMAP4_SSL(SERVER_GMX_NET, port=993)
imap = IMAPClient(SERVER_GMX_NET, use_uid=True)
elif DOMAIN_GMX_AT in login:
imap = imaplib.IMAP4_SSL(SERVER_GMX_AT, port=993)
# imap = imaplib.IMAP4_SSL(SERVER_GMX_AT, port=993)
imap = IMAPClient(SERVER_GMX_AT, use_uid=True)
elif DOMAIN_GAZETA_PL in login:
imap = imaplib.IMAP4_SSL(IMAP_SERVER_DOMAIN_GAZETA_PL, port=993)
# imap = imaplib.IMAP4_SSL(IMAP_SERVER_DOMAIN_GAZETA_PL, port=993)
imap = IMAPClient(IMAP_SERVER_DOMAIN_GAZETA_PL, use_uid=True)
elif DOMAIN_INBOX_LV in login:
imap = imaplib.IMAP4_SSL(INBOX_LV, port=993)
# imap = imaplib.IMAP4_SSL(INBOX_LV, port=993)
imap = IMAPClient(INBOX_LV, use_uid=True)
elif DOMAIN_WEB_DE in login:
imap = imaplib.IMAP4_SSL(SERVER_WEB_DE, port=993)
# imap = imaplib.IMAP4_SSL(SERVER_WEB_DE, port=993)
imap = IMAPClient(SERVER_WEB_DE, use_uid=True)
elif DOMAIN_PISS_MAIL in login or DOMAIN_CHILD_PIZZA in login or DOMAIN_DMC_CHAT in login or DOMAIN_GENOCIDE_FUN in login or DOMAIN_HATESJE_WS in login or DOMAIN_INCEL_EMAIL in login or DOMAIN_SHITPOSTING_EXPERT in login:
imap = imaplib.IMAP4_SSL(SERVER_PISS_MAIL, port=993)
# imap = imaplib.IMAP4_SSL(SERVER_PISS_MAIL, port=993)
imap = IMAPClient(SERVER_PISS_MAIL, use_uid=True)
else:
imap = imaplib.IMAP4_SSL(AOL_IMAP_SERVER)
# imap = imaplib.IMAP4_SSL(AOL_IMAP_SERVER)
imap = IMAPClient(AOL_IMAP_SERVER, use_uid=True)
return imap
+101 -47
View File
@@ -6,10 +6,13 @@ from builtins import list
from concurrent.futures import ThreadPoolExecutor
from email.header import decode_header
from email.message import Message
from typing import Union
from imapclient import IMAPClient
from db.mongo_manager import MONGO_STORE_MANAGER
from excel_reader import read_contacts
from mail.mail_constants import DOMAIN_HOTMAIL, create_imap
from models.ReserveResultPojo import ReserveResultPojo
from models.mail_pojo import MailPojo, MailAddress
VALIDATION_URL_SUBJECT_fr = 'Validation de votre demande de rendez-vous'
@@ -48,6 +51,11 @@ def find_from_mail(param):
return from_address.strip(" ").strip(">").strip("<")
def extract_email_from_from_address(content: str):
_match = re.search(r'[\w.+-]+@[\w-]+\.[\w.-]+', content)
return _match.group(0)
class MailReader():
def __init__(self, login, password):
self.login = login
@@ -95,7 +103,10 @@ class MailReader():
folder_list = self.show_folders(imap)
for folder in folder_list:
print("folder is " + folder)
mail_list.extend(self._get_messages_from_folder_for_imapclient(imap, folder=folder))
if folder == "Sent" or folder == "Drafts":
pass
else:
mail_list.extend(self._get_messages_from_folder_for_imapclient(imap, folder=folder))
if not isImapClient:
imap.close()
imap.logout()
@@ -161,32 +172,38 @@ class MailReader():
search_terms = 'SINCE "{}"'.format(
datetime.datetime.today().strftime(
date_format))
print("search terms is " + search_terms)
print("{}: search terms is {}".format(self.login,search_terms))
imap.select_folder(folder)
messages = imap.search(['SINCE', datetime.datetime.today()])
print("%d messages from our best friend" % len(messages))
print("{}: {} messages from our best friend".format(self.login, len(messages)))
if len(messages) ==0:
return mail_messages
for uid, message_data in imap.fetch(messages, 'RFC822').items():
try:
email_message = email.message_from_bytes(message_data[b'RFC822'])
from_address = email_message.get('FROM')
subject = email_message.get('subject')
# print("{}, {},{}".format(from_address, subject, email_message))
body = ""
if "no-reply@hermes.com" in from_address or "appointment2022@aol.com":
hermes_mail_adress = "no-reply@hermes.com"
if hermes_mail_adress in from_address or "outlook.com" in from_address or "hotmail" in from_address:
for part in email_message.walk():
print(part.get_content_type())
if part.get_content_type() == "text/html":
body = body + part.get_payload(decode=True).decode("utf-8")
elif part.get_content_type() == "text/plain":
body = body + part.get_payload()
if VALIDATION_URL_SUBJECT_fr in subject or VALIDATION_URL_SUBJECT_EN in subject or "Validation=20de=20votre=20demande=20de=20rendez-vous" in subject:
if VALIDATION_URL_SUBJECT_fr in subject or VALIDATION_URL_SUBJECT_EN in subject or "Votre=20demande=20de=20rendez-vous" in subject or "Votre demande de rendez-vous" in body:
mail = MailPojo(subject=subject, body=body, from_address=from_address)
mail.isImapClient = True
print("email is {}".format(self.login))
print("body is {}".format(body))
print("subject is {}".format(subject))
if len(mail.to_address) == 0:
mail.to_address = self.login
if "outlook.com" in from_address or "hotmail.com" in from_address:
# it is a transferred email
mail.to_address = extract_email_from_from_address(from_address)
else:
mail.to_address = self.login
mail_messages.append(mail)
except Exception as error:
print(error)
@@ -194,21 +211,31 @@ class MailReader():
return mail_messages
def need_to_valid_url(url: str, successful_items) -> bool:
# return True
# if len(successful_items) == 0:
# return False
#
# Find the ReserveResultPojo object from persisted items of DB
#
def find_item_by_url(url: str, successful_items) -> Union[None, ReserveResultPojo]:
print("url is :" + url)
parts = url.split('/')
_id = parts[5]
if len(_id) == 6:
for item in successful_items:
if item.id == _id:
return item
return None
def need_to_valid_url(url: str, item: Union[ReserveResultPojo, None]) -> bool:
print("url is :" + url)
parts = url.split('/')
id = parts[5]
if len(id) == 6:
for item in successful_items:
if item.id == id:
if item.url_validated is not None:
return not item.url_validated
else:
# if url_validated is None
return True
if item:
if item.url_validated is not None:
return not item.url_validated
else:
# if url_validated is None
return True
return True
else:
print("id not valid:{}".format(id))
@@ -217,6 +244,8 @@ def need_to_valid_url(url: str, successful_items) -> bool:
def need_to_check_email(mail: str, successful_items) -> bool:
print("successful_items size is " + str(len(successful_items)))
if mail =="saigecong1990@pissmail.com":
return True
filtered_items = list(filter(lambda item: item.email == mail, successful_items))
# has validated value
if len(filtered_items) > 0:
@@ -232,37 +261,62 @@ def need_to_check_email(mail: str, successful_items) -> bool:
def find_links_to_validate_from_mail_list(mail_list: list, logger):
if not mail_list:
return
# check time before start checking emails
if len(mail_list) > 0:
contact_to_book_list = MONGO_STORE_MANAGER.get_all_contact_to_book_list()
successful_items = MONGO_STORE_MANAGER.get_all_successful_items_for_day()
mails_messages = []
with ThreadPoolExecutor(max_workers=len(mail_list)) as executor:
for mail in mail_list:
# check whether we need to read mail
if need_to_check_email(mail.mail, successful_items):
mail_reader = MailReader(mail.mail, mail.password)
executor.submit(mail_reader.read_emails, mails_messages)
# for mail in mail_list:
# # check whether we need to read mail
# if need_to_check_email(mail.mail, successful_items):
# mail_reader = MailReader(mail.mail, mail.password)
# mail_reader.read_emails(mails_messages)
_refreshed_successful_items = MONGO_STORE_MANAGER.get_all_successful_items_for_day()
for mail in mails_messages:
match = re.search(VALIDATION_URL_REGEX, mail.body)
if match:
url = match.group(0)
if need_to_valid_url(url, _refreshed_successful_items):
logger.info("need to validate url: " + url)
MONGO_STORE_MANAGER.save_links_to_validate(url, mail.to_address,
_all_contact_list=contact_to_book_list)
else:
logger.info("do not need to click url --> {}".format(mail.mail_address))
contact_to_book_list = MONGO_STORE_MANAGER.get_all_contact_to_book_list()
successful_items = MONGO_STORE_MANAGER.get_all_successful_items_for_day()
mails_messages = []
with ThreadPoolExecutor(max_workers=200) as executor:
for mail in mail_list:
# check whether we need to read mail
if need_to_check_email(mail.mail, successful_items):
mail_reader = MailReader(mail.mail, mail.password)
executor.submit(mail_reader.read_emails, mails_messages)
_refreshed_successful_items = MONGO_STORE_MANAGER.get_all_successful_items_for_day()
for mail in mails_messages:
match = re.search(VALIDATION_URL_REGEX, mail.body)
if match:
url = match.group(0)
_item = find_item_by_url(url, _refreshed_successful_items)
if need_to_valid_url(url, _item):
logger.info("need to validate url: " + url)
_model = ""
if _item:
_model = _item.model
MONGO_STORE_MANAGER.save_links_to_validate(url, mail.to_address, model=_model,
_all_contact_list=contact_to_book_list)
else:
logger.info("do not need to click url --> {}".format(mail.mail_address))
if __name__ == '__main__':
mail_address1 = MailAddress(mail="tzfhygwwjiwnf@hotmail.com", password="rqO4Pjm7NQ")
mail_list = [mail_address1]
# mail_address1 = MailAddress(mail="tinagonzales685585@aol.com", password="yhihvdkrbxnksema")
# mail_list = [mail_address1]
contact_to_book_list = read_contacts(
# file_name="/Users/rdv/Desktop/contact_list_not_used_contacts.xlsx")
# file_name="/Users/lpan/Desktop/contact_list_not_used_contacts.xlsx")
# file_name="/Users/rdv/Desktop/real_name_contacts_100_hotmail.xlsx")
# file_name="~/Desktop/contact_list_2025-07-11.xlsx")
file_name="~/Desktop/contact_list_all_studio.xlsx")
# file_name="/Users/rdv/Desktop/contact_list_all_studo_gmx_us.xlsx")
# file_name="/Users/rdv/Desktop/contact_list_2025-05-24.xlsx")
all_mail_list = MONGO_STORE_MANAGER.get_destination_emails()
mail_list_to_check = []
for contact in contact_to_book_list:
for mail in all_mail_list:
if contact.mail == mail.mail:
mail_list_to_check.append(mail)
logger = logging.getLogger()
find_links_to_validate_from_mail_list(mail_list, logger)
_all_links = MONGO_STORE_MANAGER.get_links_to_validate()
filter_mail = []
for mail_pojo in mail_list_to_check:
_to_add = True
for _link in _all_links:
if _link.email == mail_pojo.mail:
_to_add = False
if _to_add:
filter_mail.append(mail_pojo)
filter_mail.append(MailAddress("saigecong1990@pissmail.com", "cvExXKOP8oY1D@"))
# filter_mail = [MailAddress("saigecong1990@pissmail.com", "cvExXKOP8oY1D@")]
find_links_to_validate_from_mail_list(filter_mail, logger)
+1 -1
View File
@@ -3,6 +3,6 @@ from queue_message.CookiesPublisher import MORNING_DATA_CACHE_2, MORNING_DATA_CA
from workers.MessagerTransporter import migrate_message_to_queue, empty_message_just_to
if __name__ == '__main__':
migrate_message_to_queue(from_queue=MORNING_DATA_CACHE_BAK, to_queue=MORNING_DATA_CACHE)
migrate_message_to_queue(from_queue=MORNING_DATA_CACHE, to_queue=MORNING_DATA_CACHE_BAK)
# empty_message_just_to(2000, queue_name=MORNING_DATA_CACHE_BAK)
# migrate_message_to_queue(from_queue=MORNING_DATA_CACHE_BAK,to_queue=REQUEST_DATA_QUEUE_DE)
+3 -1
View File
@@ -11,7 +11,9 @@ class LinkPojo():
def from_firestore_dict(source):
updated_at = source['updated_at']
email = source['email']
model = source['model']
model = ""
if 'model' in source:
model = source['model']
serial = source['serial']
url = source['url']
ip_country = "FR"
+5 -2
View File
@@ -29,6 +29,7 @@ class ReserveResultPojo:
slot_position = None
sim_position = None
ccid: str = ""
model: str = ""
source_from: str = socket.gethostname()
store_type = 0
url_validated = None
@@ -106,6 +107,9 @@ class ReserveResultPojo:
if 'created_at' in source:
created_at = source['created_at']
result.created_at = created_at
if 'model' in source:
model = source['model']
result.model = model
if 'validated_at' in source:
validated_at = source['validated_at']
result.validated_at = validated_at
@@ -122,8 +126,7 @@ class ReserveResultPojo:
u'email': self.email,
u'passport': self.passport,
u'url': self.url,
# u'sim_position': self.sim_position,
# u'slot_position': self.slot_position,
u'model': self.model,
u'source_from': self.source_from,
u'hostName': self.source_from,
u'created_at': self.created_at,
+65 -8
View File
@@ -1,6 +1,8 @@
import json
import random
import time
from captcha.jspl_encoder_wrapper import encrpte_to_jspl
from models.jsdata_pojo import JsDataPojo
@@ -21,9 +23,29 @@ from models.jsdata_pojo import JsDataPojo
class JsDataLeTypePojo(JsDataPojo):
def __init__(self, glrd, glvd, hc, br_oh, ua, br_ow, br_h, br_w, rs_h, rs_w, rs_cd, ars_h, ars_w, plg, eva, plu,
vnd, pr, ts_mtp, dvm, m_s_c, m_m_c, m_c_c, m_cm_r, m_ms_r, emd: str):
vnd, pr, ts_mtp, dvm, m_s_c, m_m_c, m_c_c, m_cm_r, m_ms_r, emd: str, ccsB,
br_iw=513, br_ih=847, pf="Linux armv81", mob=True,
lgs=["fr-FR", "en-US", "zh-CN", "zh", "fr", "en"],
orf="debug",
bchk="3223aeb6721e0d0917e7928181193ac88dcd62fad5cadfbe7a2b2b473ecf58ee70f098dbdb1a1832e8dc6528387b0745971dbcd82384261e9a4e3f",
nt_tcp=0, nt_dns=0, nt_rd=0, nt_irt=-3.400000002235174, nt_rt=0, nt_tls=3.400000002235174,
nt_ttf=3.099999997764826, nt_swt=3.400000002235174, nt_csd=0, nt_nhp="", nt_rdc=0, nt_it="navigation",
nt_prs=0, nt_esc=-3.400000002235174, nt_ttrd=-2, nt_le=0, nt_dcle=0.10000000149011612,
nt_di=74.80000000074506, nt_dc=0, ccsT="""Error
at S (https://d.digital.hermes/tags.js:173:22)
at Un.C (https://d.digital.hermes/tags.js:1252:41
at nrWrapper (https://www.hermes.com/fr/fr/category/femme/Sacs%20et%20pochettes%20pour%20Femme%20_%20Herme%CC%80s%20France.html:7:13468)""",
ccsH="1050544242",
ccsV=",993b46baf0942a343b7e6b02fa3f8eef64727f077d3b0055af56e6994dcaf046", muev=False, prso=True,
nhi=",64,true,Nexus 5,Android,6.0,138.0.7204.184,false", k_lyts=48,
k_lytk="kg20va`l§'w8mh.71pdfoqcn[zy365x/\,-4bt9siu=j;r]e", tzp="Europe/Paris", isf2=False):
super().__init__(glrd, glvd, hc, br_oh, ua, br_ow, br_h, br_w, rs_h, rs_w, rs_cd, ars_h, ars_w, plg, eva, plu,
vnd, pr, ts_mtp, dvm, emd=emd)
vnd, pr, ts_mtp, dvm, emd=emd, ccsB=ccsB, br_iw=br_iw, br_ih=br_ih, pf=pf, mob=mob, lgs=lgs,
orf=orf, bchk=bchk, nt_tcp=nt_tcp, nt_dns=nt_dns, nt_rd=nt_rd, nt_irt=nt_irt, nt_rt=nt_rt,
nt_tls=nt_tls, nt_ttf=nt_ttf, nt_swt=nt_swt, nt_csd=nt_csd, nt_nhp=nt_nhp, nt_rdc=nt_rdc,
nt_it=nt_it, nt_prs=nt_prs, nt_esc=nt_esc, nt_ttrd=nt_ttrd, nt_le=nt_le, nt_dcle=nt_dcle,
nt_di=nt_di, nt_dc=nt_dc, ccsT=ccsT, ccsH=ccsH, ccsV=ccsV, muev=muev, prso=prso, nhi=nhi,
k_lyts=k_lyts, k_lytk=k_lytk, tzp=tzp, isf2=isf2)
self.jset = int(time.time()) # override from 4_34_2
self.emd = emd
self.dcok = ".hermes.com"
@@ -50,14 +72,32 @@ class JsDataLeTypePojo(JsDataPojo):
self.m_c_c = m_c_c
self.m_cm_r = m_cm_r
self.m_ms_r = m_ms_r
self.cfpfe = "ZnVuY3Rpb24oKXt2YXIgbj10LGk9ZG9jdW1lbnRbJ1x4NzFceDc1XHg2NVx4NzJceDc5XHg1M1x4NjVceDZjXHg2NVx4NjNceDc0XHg2Zlx4NzInXShuKDQ2MSkpO2lmKGkpeyFmdW5jdGlvbiB0KCl7dHJ5e3ZhciBuPWlbJ1x4NzNceDY4XHg2MVx4NjRceDZmXHg3" # 4.40.0
self.stcfp = "Ly9kLmRpZ2l0YWwuaGVybWVzL3RhZ3MuanM6Mjo4ODYzNSkKICAgIGF0IHQuZXhwb3J0cy5kZF9hZCAoaHR0cHM6Ly9kLmRpZ2l0YWwuaGVybWVzL3RhZ3MuanM6MjoxMDc3OTYpCiAgICBhdCBodHRwczovL2QuZGlnaXRhbC5oZXJtZXMvdGFncy5qczoyOjYzNzkw" # 4.40.0
self.cfpfe = "KHIsbixvLGEpPT57aWYoZVtyXSllW3JdLnB1c2gobik7ZWxzZXt2YXIgcyxjO2lmKHZvaWQgMCE9PW8pZm9yKHZhciB1PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxkPTA7ZDx1Lmxlbmd0aDtkKyspe3ZhciBsPXVbZF07aWYobC5nZXRB" # 5.1.5
self.stcfp = "MjYxMzEpCmF0IGEgKGZpbGU6Ly8vVXNlcnMvbHBhbi9Eb2N1bWVudHMvd29ya3NwYWNlL3RhZ3NyZWNoZXJjaGUvNV8xXzUvU2FjcyUyMGV0JTIwcG9jaGV0dGVzJTIwcG91ciUyMEZlbW1lJTIwXyUyMEhlcm1lJUNDJTgwcyUyMEZyYW5jZS5odG1sOjc6Mjk4MjQp" # 5.1.5
test_data_json = """{"glvd":"ARM","glrd":"Mali-G57 MC2","hc":5,"br_oh":620,"br_ow":360,"br_h":620,"br_w":360,"rs_h":804,"rs_w":360,"rs_cd":24,"ars_h":804,"ars_w":360,"plg":2,"eva":33,"vnd":"Google Inc.","plu":["eTJjZUp","iZMOHLs1"],"ua":"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36","dvm":4,"acw":"probably","pr":3,"ts_mtp":5,"tz":-120,"emd":"k:ai,vi,ao,vi d:defau,8f9de,defau,24476 g:4e652,f9991,defau,d5801","cookiesStr":"app.sig=_FqS3_SPN2D40Z4Qlq-_ybxzRvQ;datadome=VSGCNMYkY6L81typRJUpurlyd39dHxdfxIYc6DzRWDT7_rtZ8UodGcbow1okQR2zg_t4d_NcP0rC1ZHNz3XSDAGFZCJhFI49lai~x2Nb2unkhOlY8o4E04Wjmde~auDZ;app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiLW9jbktLVXAzMjVTOEFEdFpLUU9kSXlMIn0=;policy=accepted;lang=fr;"}"""
test_data_json = """{"glvd":"Google Inc. (ARM)","glrd":"ANGLE (ARM, Mali-G57 MC2, OpenGL ES 3.2)","hc":8,"br_oh":745,"br_ow":393,
"br_h":745,"br_w":393,"rs_h":876,"rs_w":393,"rs_cd":24,"ars_h":876,"ars_w":393,"plg":0,"eva":33,
"vnd":"Google Inc.","plu":[],"ua":"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36","dvm":4,"acw":"probably",
"pr":2.75,"ts_mtp":5,"tz":-120,"emd":"k:ai,vi,ao",
"cookiesStr":"rskxRunCookie=0;datadome=GIfiRxEgyr5dwsnV0NoR9WPO3oA0CkMVLsqdvZLmuxHi81JFRbG7LaWKiAkSQRJTBkv3qBkGlCOC3uR00yZ9XSoCQFyE~1FcumXV8W_bgVPxfNzs6uQcZM8Ec61Q72UT;correlation_id=xlvzlpuwkh6syuqdfze05q7n41qle27qop4yjjvuifzapdo4npjlbi43uwbgle2m;ECOM_SESS=f2c2aihm0ocesmvx3dcs06ysh6;rCookie=0f3nn11uqq28ci5bqnveg5wme4bsr6e;lastRskxRun=1754748244881;x-xsrf-token=7ca984dc-6d35-4720-b77b-465392521d1b;__cf_bm=Szm2hZl9.PTO_DQF5DihrAOTq.dSmSrkKHsTqVenUxo-1754748237-1.0.1.1-gfLAB1wWYyHUb_scXGpXzAk6IkrkhvdNalhhsVhujY7xeFm02lwFKGUiTrBknONdwmvV3EKilTfiFORmJUDrjj3st4hoNdnrk0MT0SVed5w;OptanonConsent=isGpcEnabled=0&datestamp=Sat+Aug+09+2025+16%3A04%3A04+GMT%2B0200+(heure+d%E2%80%99%C3%A9t%C3%A9+d%E2%80%99Europe+centrale)&version=6.32.0&isIABGlobal=false&hosts=&landingPath=https%3A%2F%2Fwww.hermes.com%2Ffr%2Ffr%2Fproduct%2Fsac-p-tit-arcon-H085871CKAO%2F&groups=C0001%3A1%2CC0002%3A0%2CC0003%3A0%2CC0004%3A0;","model":"22041219PG",
"lgs":"[fr-FR,fr,en-US,en]",
"bchk":"3223aeb6721e0d0917e792818d193ac88dcd62fad5cad7bf7a2b2b473ecf58ee60f018dbdb1a5832e8dc6528387b0745971dbcd82387261e9a4e3f",
"nt_tcp":0,"nt_dns":0,"nt_rd":0,"nt_irt":-29.600000008940697,"nt_rt":1129,"nt_tls":6.700000002980232,"nt_ttf":1166.7000000029802,"nt_swt":22.900000005960464,
"nt_csd":411060,"nt_nhp":"h2","nt_rdc":0,"nt_it":"navigation","nt_prs":6.700000002980232,"nt_esc":0,"nt_ttrd":null,"nt_le":3.0999999940395355,"nt_dcle":141.79999999701977,
"nt_di":1415.2000000029802,"nt_dc":2862.6000000089407,"ccsB":"tags.js:1252:41 at nrWrapper (sac-p-tit-arcon-H085871CKAO.html:7:13468)",
"muev":false,"pro_t":false,"nhi":",,true,22041219PG,Android,14.0.0,128.0.6613.146,false","k_lyts":0,"k_lytk":"","serial":"fuljaueqguugf6pn"}"""
if __name__ == '__main__':
test_data_dict = json.loads(test_data_json)
m_s_c = random.randint(0, 3)
m_c_c = random.randint(3, 5) # click count
m_m_c = random.randint(3, 5) # move count
m_cm_r = m_c_c / m_m_c
m_ms_r = -1 # move scroll ratio
if m_s_c == 0:
m_ms_r = -1
else:
m_ms_r = m_m_c / m_s_c
le_js_data = JsDataLeTypePojo(glrd=test_data_dict['glrd'], glvd=test_data_dict['glvd'], hc=test_data_dict['hc'],
ua=test_data_dict['ua'], br_oh=test_data_dict['br_oh'], br_ow=test_data_dict['br_ow'],
ars_h=test_data_dict['ars_h'], ars_w=test_data_dict['ars_w'], pr=test_data_dict['pr'],
@@ -65,6 +105,23 @@ if __name__ == '__main__':
plu=test_data_dict['plu'], vnd=test_data_dict['vnd'], dvm=test_data_dict['dvm'],
ts_mtp=test_data_dict['ts_mtp'], eva=test_data_dict['eva'],
rs_h=test_data_dict['rs_h'],
rs_w=test_data_dict['rs_w'], rs_cd=test_data_dict['rs_cd'], m_s_c=0, m_m_c=3, m_c_c=3,
m_cm_r=1, m_ms_r=-1, emd=test_data_dict['emd'])
rs_w=test_data_dict['rs_w'], rs_cd=test_data_dict['rs_cd'],
m_s_c=m_s_c, m_m_c=m_m_c, m_c_c=m_c_c, m_cm_r=m_cm_r, m_ms_r=m_ms_r,
emd=test_data_dict['emd'],
bchk=test_data_dict['bchk'],
ccsB=test_data_dict['ccsB'],
nt_tcp=test_data_dict['nt_tcp'],
nt_dns=test_data_dict['nt_dns'],
nt_rd=test_data_dict['nt_rd'], nt_irt=test_data_dict['nt_irt'],
nt_rt=test_data_dict['nt_rt'],
nt_tls=test_data_dict['nt_tls'], nt_ttf=test_data_dict['nt_ttf'],
nt_swt=test_data_dict['nt_swt'],
nt_csd=test_data_dict['nt_csd'], nt_nhp=test_data_dict['nt_nhp'],
nt_rdc=test_data_dict['nt_rdc'],
nt_it=test_data_dict['nt_it'], nt_prs=test_data_dict['nt_prs'],
nt_esc=test_data_dict['nt_esc'],
nt_ttrd=test_data_dict['nt_ttrd'], nt_le=test_data_dict['nt_le'],
nt_dcle=test_data_dict['nt_dcle'], nt_di=test_data_dict['nt_di'],
nt_dc=test_data_dict['nt_dc'])
print(le_js_data.to_url_encoded_json())
print(encrpte_to_jspl(le_js_data.to_url_encoded_json()))
+222 -85
View File
@@ -10,8 +10,19 @@ import jsonpickle
@dataclass
class JsDataPojo:
# opts: str
ttst: int
ifov: bool
r3n: int
exp8: int
# uid: str
bci: bool
bcl: float
bct: str
bdt: str
dp0: bool
ucdv: bool
wdifrm: bool
iwgl: str
ttst: float
# ifov: bool
hc: int
br_oh: int
br_ow: int
@@ -19,7 +30,12 @@ class JsDataPojo:
wbd: bool
tagpu: float
wdif: bool
wdifrm: bool
wdifpnh: int
lg: str
isb: bool
idp: bool
crt: int
npmtm: bool
br_h: int
br_w: int
@@ -31,7 +47,6 @@ class JsDataPojo:
phe: bool
nm: bool
jsf: bool
lg: str
pr: int
ars_h: int
ars_w: int
@@ -109,7 +124,7 @@ class JsDataPojo:
wdw: bool
cokys: str
ecpc: bool
lgs: bool
lgs: list
lgsod: bool
psn: bool
edp: bool
@@ -136,69 +151,151 @@ class JsDataPojo:
jset: int
def __init__(self, glrd, glvd, hc, br_oh, ua, br_ow, br_h, br_w, rs_h, rs_w, rs_cd, ars_h, ars_w, plg, eva, plu,
vnd, pr, ts_mtp, dvm, emd):
vnd, pr, ts_mtp, dvm, emd,
ccsB,
br_iw=513, br_ih=847, pf="Linux armv81", mob=True,
lgs=["fr-FR", "en-US", "zh-CN", "zh", "fr", "en"],
orf="debug",
bchk="3223aeb6721e0d0917e7928181193ac88dcd62fad5cadfbe7a2b2b473ecf58ee70f098dbdb1a1832e8dc6528387b0745971dbcd82384261e9a4e3f",
nt_tcp=0, nt_dns=0, nt_rd=0, nt_irt=-3.400000002235174, nt_rt=0, nt_tls=3.400000002235174,
nt_ttf=3.099999997764826, nt_swt=3.400000002235174, nt_csd=0, nt_nhp="", nt_rdc=0, nt_it="navigation",
nt_prs=0, nt_esc=-3.400000002235174, nt_ttrd=-2, nt_le=0, nt_dcle=0.10000000149011612,
nt_di=74.80000000074506, nt_dc=0, ccsT="""Error
at S (https://d.digital.hermes/tags.js:173:22)
at Un.C (https://d.digital.hermes/tags.js:1252:41
at nrWrapper (https://www.hermes.com/fr/fr/category/femme/Sacs%20et%20pochettes%20pour%20Femme%20_%20Herme%CC%80s%20France.html:7:13468)""",
ccsH="1050544242",
ccsV=",993b46baf0942a343b7e6b02fa3f8eef64727f077d3b0055af56e6994dcaf046", muev=False, prso=True,
nhi=",64,true,Nexus 5,Android,6.0,138.0.7204.184,false", k_lyts=48,
k_lytk="kg20va`l§'w8mh.71pdfoqcn[zy365x/\,-4bt9siu=j;r]e", tzp="Europe/Paris", isf2=False
):
# self.opts = "endpoint,ajaxListenerPath"
self.ttst = (random.randint(5, 46) * 10 ** 16 + random.randint(1 * 10 ** 7, 9 * 10 ** 7)) / 10 ** 16
self.ifov = False
self.nddc = 1
self.r3n = 33
self.exp8 = 0
self.uid = None
self.bci = True # batteryManager.charging
self.bcl = 0.8 # batteryManager.level
self.bct = "Infinity" # batteryManager.chargingTime #to check
self.bdt = "Infinity" # batteryManager.chargingTime #to check
self.dp0 = False
self.ucdv = False
self.wdifrm = False
self.iwgl = "undefined" # to check
self.npmtm = False
self.wdif = False
self.wdifpnh = 2800984568
self.lg = "fr-FR"
self.isb = False # is brave
self.idp = True
self.crt = 0
self.vnd = vnd
self.bid = "NA"
self.med = "defined"
self.pltod = False
self.csssp = ""
self.awe = False
self.phe = False
self.dat = False
self.nm = False
self.geb = False
self.sqt = False
self.pf = pf
self.hc = hc
self.br_oh = br_oh
self.br_ow = br_ow
self.ua = ua
self.wbd = False
tag_pu = random.uniform(1, 10)
while len(str(tag_pu)) != 17:
tag_pu = random.uniform(1, 10)
self.tagpu = tag_pu
self.wdif = False
self.wdifrm = False
self.npmtm = False
self.br_h = br_h
self.ts_mtp = ts_mtp
self.mob = mob
self.lgs = lgs
self.dvm = dvm
self.hcovdr = False
self.plovdr = False
self.ftsovdr = False
self.orf = orf # to check
self.ttst = round(random.random(), 16)
self.br_w = br_w
self.isf = True
self.nddc = 1
self.rs_h = rs_h
self.rs_w = rs_w
self.rs_cd = rs_cd
self.phe = False
self.nm = False
self.jsf = False
self.lg = "fr-FR"
self.pr = pr
self.ars_h = ars_h
self.br_h = br_h
self.br_iw = br_iw
self.br_ih = br_ih
self.ars_w = ars_w
self.tz = -120
self.str_ss = True
self.str_ls = True
self.str_idb = True
self.str_odb = True
self.ars_h = ars_h
self.rs_w = rs_w
self.rs_h = rs_h
self.rs_cd = rs_cd
self.pr = pr
self.so = "portrait-primary"
self.vco = ""
self.vcots = False
self.vch = "probably"
self.vchts = True
self.vcw = "probably"
self.vcwts = True
self.vc3 = "maybe"
self.vc3ts = False
self.vcmp = ""
self.vcmpts = False
self.vcq = ""
self.vcqts = False
self.vc1 = "probably"
self.vc1ts = True
self.cssS = "3.93,0.39,12.24,9.75,5.64,10.98,13.46,2.19,6.51"
self.css0 = "7, 75, 0"
self.css1 = "9.74354, 0.354646, -0.00922698, 0.000685511, 0.203723, -5.61673, -0.755238, 0.0561098, -0.0279023, 0.481607, -10.9534, 0.813777, -0.375565, 6.48243, -147.433, 11.9534"
self.cssH = "15px"
self.plu = str.join(",", plu) if isinstance(plu, list) else plu
self.plgod = False
self.plg = plg
self.plgne = "err"
self.plgre = "err"
self.plgof = "err"
self.plggt = "err"
self.pltod = False
self.hcovdr = False
self.hcovdr2 = False
self.plovdr = False
self.plovdr2 = False
self.ftsovdr = False
self.ftsovdr2 = False
self.lb = False
self.eva = eva
self.lo = False
self.ts_mtp = ts_mtp
self.ts_tec = True
self.ts_tsa = True
self.vnd = vnd
self.bid = "NA"
self.plgne = "NA"
self.plgre = "NA"
self.plgof = "NA"
self.plggt = "NA"
self.mmt = "empty"
self.plu = str.join(",", plu) if isinstance(plu, list) else plu
self.hdn = False
self.awe = False
self.geb = False
self.dat = False
self.med = "defined"
self.bchk = bchk
self.nt_tcp = nt_tcp
self.nt_dns = nt_dns
self.nt_rd = nt_rd
self.nt_irt = nt_irt
self.nt_rt = nt_rt
self.nt_tls = nt_tls
self.nt_ttf = nt_ttf
self.nt_swt = nt_swt
self.nt_csd = nt_csd
self.nt_nhp = nt_nhp
self.nt_rdc = nt_rdc
self.nt_it = nt_it
self.nt_prs = nt_prs
self.nt_esc = nt_esc
self.nt_ttrd = nt_ttrd
self.nt_le = nt_le
self.nt_dcle = nt_dcle
self.nt_di = nt_di
self.nt_dc = nt_dc
self.ccsT = ccsT
self.ccsB = ccsB
self.ccsH = ccsH
self.ccsV = ccsV
self.muev = muev
self.pro_t = True
self.wglo = True
self.prso = prso
self.wbst = True
self.psn = True
self.edp = True
self.addt = True
self.wsdc = True
self.ccsr = True
self.nuad = True
self.bcda = True
self.idn = True
self.capi = True
self.svde = True
self.vpbq = True
self.mq = "aptr:coarse, ahvr:none" # to check
self.aco = "probably"
self.acots = False
self.acmp = "probably"
@@ -220,35 +317,58 @@ class JsDataPojo:
self.acwm = "maybe"
self.acwmts = False
self.ocpt = False
self.vco = ""
self.vcots = False
self.vch = "probably"
self.vchts = True
self.vcw = "probably"
self.vcwts = True
self.vc3 = "maybe"
self.vc3ts = False
self.vcmp = ""
self.vcmpts = False
self.vcq = ""
self.vcqts = False
self.vc1 = "probably"
self.vc1ts = True
self.dvm = dvm
self.set_default_values()
self.ckwa = False
self.spwn = False
self.emt = False
self.bfr = False
self.tz = -120
self.hdn = False
self.xt1 = False # pdfViewerEnabled
self.cdhf = False # window.hasFocus()
self.eva = eva
self.cokys = ",loadTimes,csi,app"
self.ecpc = False
self.nhi = nhi
self.k_lyts = k_lyts
self.k_lytk = k_lytk
self.emd = emd
self.wwl = False
self.glvd = glvd
self.glrd = glrd
self.wwl = False
self.tzp = tzp
self.isf = True
self.isf2 = isf2
self.dt = False
self.fph = 416468867
# self.ifov = False
# tag_pu = random.uniform(1, 10)
# while len(str(tag_pu)) != 17:
# tag_pu = random.uniform(1, 10)
# self.tagpu = tag_pu
# self.jsf = False
# self.str_ss = True
# self.str_ls = True
# self.str_idb = True
# self.str_odb = True
#
# # self.hcovdr2 = False
# # self.plovdr2 = False
# # self.ftsovdr2 = False
# self.lb = False
# self.lo = False
# self.ts_tec = True
# self.ts_tsa = True
# self.set_default_values()
self.jset = int(time.time())
def set_default_values(self):
self.sqt = False
self.so = "portrait-primary"
self.wdw = True
self.cokys = "bG9hZFRpbWVzY3NpL="
self.ecpc = False
self.lgs = True
self.lgs = ["fr-FR", "en-US", "zh-CN", "zh", "fr", "en"]
self.lgsod = False
self.psn = True
self.edp = False
@@ -262,21 +382,28 @@ class JsDataPojo:
self.svde = False
self.vpbq = True
self.ucdv = False
self.spwn = False
self.emt = False
self.bfr = False
self.dbov = False
self.cfpfe = "ZnVuY3Rpb24oKXt2YXIgbj10LGk9ZG9jdW1lbnRbJ1x4NzFceDc1XHg2NVx4NzJceDc5XHg1M1x4NjVceDZjXHg2NVx4NjNceDc0XHg2Zlx4NzInXShuKDQ2MSkpO2lmKGkpeyFmdW5jdGlvbiB0KCl7dHJ5e3ZhciBuPWlbJ1x4NzNceDY4XHg2MVx4NjRceDZmXHg3" # 4.40.0
self.stcfp = "Ly9kLmRpZ2l0YWwuaGVybWVzL3RhZ3MuanM6Mjo4ODYzNSkKICAgIGF0IHQuZXhwb3J0cy5kZF9hZCAoaHR0cHM6Ly9kLmRpZ2l0YWwuaGVybWVzL3RhZ3MuanM6MjoxMDc3OTYpCiAgICBhdCBodHRwczovL2QuZGlnaXRhbC5oZXJtZXMvdGFncy5qczoyOjYzNzkw" # 4.40.0
self.ckwa = True
def to_url_encoded_json(self):
js_str = jsonpickle.encode(self, unpicklable=False).replace(": ", ":").replace(", ", ",")
_safe_string = urllib.parse.quote(js_str)
return _safe_string
# _safe_string = urllib.parse.quote(js_str)
return js_str
test_data_json = """{"glvd":"ARM","glrd":"Mali-G57 MC2","hc":5,"br_oh":620,"br_ow":360,"br_h":620,"br_w":360,"rs_h":804,"rs_w":360,"rs_cd":24,"ars_h":804,"ars_w":360,"plg":2,"eva":33,"vnd":"Google Inc.","plu":["eTJjZUp","iZMOHLs1"],"ua":"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36","dvm":4,"acw":"probably","pr":3,"ts_mtp":5,"tz":-120,"emd":"k:ai,vi,ao,vi d:defau,8f9de,defau,24476 g:4e652,f9991,defau,d5801","cookiesStr":"app.sig=_FqS3_SPN2D40Z4Qlq-_ybxzRvQ;datadome=VSGCNMYkY6L81typRJUpurlyd39dHxdfxIYc6DzRWDT7_rtZ8UodGcbow1okQR2zg_t4d_NcP0rC1ZHNz3XSDAGFZCJhFI49lai~x2Nb2unkhOlY8o4E04Wjmde~auDZ;app=eyJmbGFzaCI6e30sImNhY2hlZmxhc2giOltdLCJjc3JmU2VjcmV0IjoiLW9jbktLVXAzMjVTOEFEdFpLUU9kSXlMIn0=;policy=accepted;lang=fr;"}"""
test_data_json = """{"glvd":"Google Inc. (ARM)","glrd":"ANGLE (ARM, Mali-G57 MC2, OpenGL ES 3.2)","hc":8,"br_oh":745,"br_ow":393,
"br_h":745,"br_w":393,"rs_h":876,"rs_w":393,"rs_cd":24,"ars_h":876,"ars_w":393,"plg":0,"eva":33,
"vnd":"Google Inc.","plu":[],"ua":"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36","dvm":4,"acw":"probably",
"pr":2.75,"ts_mtp":5,"tz":-120,"emd":"k:ai,vi,ao",
"cookiesStr":"rskxRunCookie=0;datadome=GIfiRxEgyr5dwsnV0NoR9WPO3oA0CkMVLsqdvZLmuxHi81JFRbG7LaWKiAkSQRJTBkv3qBkGlCOC3uR00yZ9XSoCQFyE~1FcumXV8W_bgVPxfNzs6uQcZM8Ec61Q72UT;correlation_id=xlvzlpuwkh6syuqdfze05q7n41qle27qop4yjjvuifzapdo4npjlbi43uwbgle2m;ECOM_SESS=f2c2aihm0ocesmvx3dcs06ysh6;rCookie=0f3nn11uqq28ci5bqnveg5wme4bsr6e;lastRskxRun=1754748244881;x-xsrf-token=7ca984dc-6d35-4720-b77b-465392521d1b;__cf_bm=Szm2hZl9.PTO_DQF5DihrAOTq.dSmSrkKHsTqVenUxo-1754748237-1.0.1.1-gfLAB1wWYyHUb_scXGpXzAk6IkrkhvdNalhhsVhujY7xeFm02lwFKGUiTrBknONdwmvV3EKilTfiFORmJUDrjj3st4hoNdnrk0MT0SVed5w;OptanonConsent=isGpcEnabled=0&datestamp=Sat+Aug+09+2025+16%3A04%3A04+GMT%2B0200+(heure+d%E2%80%99%C3%A9t%C3%A9+d%E2%80%99Europe+centrale)&version=6.32.0&isIABGlobal=false&hosts=&landingPath=https%3A%2F%2Fwww.hermes.com%2Ffr%2Ffr%2Fproduct%2Fsac-p-tit-arcon-H085871CKAO%2F&groups=C0001%3A1%2CC0002%3A0%2CC0003%3A0%2CC0004%3A0;","model":"22041219PG",
"lgs":"[fr-FR,fr,en-US,en]",
"bchk":"3223aeb6721e0d0917e792818d193ac88dcd62fad5cad7bf7a2b2b473ecf58ee60f018dbdb1a5832e8dc6528387b0745971dbcd82387261e9a4e3f",
"nt_tcp":0,"nt_dns":0,"nt_rd":0,"nt_irt":-29.600000008940697,"nt_rt":1129,"nt_tls":6.700000002980232,"nt_ttf":1166.7000000029802,"nt_swt":22.900000005960464,
"nt_csd":411060,"nt_nhp":"h2","nt_rdc":0,"nt_it":"navigation","nt_prs":6.700000002980232,"nt_esc":0,"nt_ttrd":null,"nt_le":3.0999999940395355,"nt_dcle":141.79999999701977,
"nt_di":1415.2000000029802,"nt_dc":2862.6000000089407,"ccsB":"tags.js:1252:41 at nrWrapper (sac-p-tit-arcon-H085871CKAO.html:7:13468)",
"muev":false,"pro_t":false,"nhi":",,true,22041219PG,Android,14.0.0,128.0.6613.146,false","k_lyts":0,"k_lytk":"","serial":"fuljaueqguugf6pn"}"""
if __name__ == '__main__':
test_data_dict = json.loads(test_data_json)
@@ -286,7 +413,17 @@ if __name__ == '__main__':
plg=test_data_dict['plg'], br_h=test_data_dict['br_h'], br_w=test_data_dict['br_w'],
plu=test_data_dict['plu'], vnd=test_data_dict['vnd'], dvm=test_data_dict['dvm'],
ts_mtp=test_data_dict['ts_mtp'], eva=test_data_dict['eva'], rs_h=test_data_dict['rs_h'],
rs_w=test_data_dict['rs_w'], rs_cd=test_data_dict['rs_cd'], emd=test_data_dict['emd'])
rs_w=test_data_dict['rs_w'], rs_cd=test_data_dict['rs_cd'], emd=test_data_dict['emd'],
bchk=test_data_dict['bchk'],
ccsB=test_data_dict['ccsB'],
nt_tcp=test_data_dict['nt_tcp'],
nt_dns=test_data_dict['nt_dns'],
nt_rd=test_data_dict['nt_rd'], nt_irt=test_data_dict['nt_irt'], nt_rt=test_data_dict['nt_rt'],
nt_tls=test_data_dict['nt_tls'], nt_ttf=test_data_dict['nt_ttf'], nt_swt=test_data_dict['nt_swt'],
nt_csd=test_data_dict['nt_csd'], nt_nhp=test_data_dict['nt_nhp'], nt_rdc=test_data_dict['nt_rdc'],
nt_it=test_data_dict['nt_it'], nt_prs=test_data_dict['nt_prs'], nt_esc=test_data_dict['nt_esc'],
nt_ttrd=test_data_dict['nt_ttrd'], nt_le=test_data_dict['nt_le'],
nt_dcle=test_data_dict['nt_dcle'], nt_di=test_data_dict['nt_di'], nt_dc=test_data_dict['nt_dc'] )
print(js.to_url_encoded_json())
# text_file = open("jsdata.txt", "w")
# # write string to file
+29 -15
View File
@@ -1,5 +1,8 @@
import logging
import random
import requests
FR_ASOCKS_MOBILE_PROXY = {
'http': 'http://11797317-mobile-country-FR:nv958134x@190.2.151.110:14046',
'https': 'http://11797317-mobile-country-FR:nv958134x@190.2.151.110:14046',
@@ -16,8 +19,8 @@ FR_PROXY_RES_PARIS_OXY = {
}
FR_PROXY_MOB_OXY = {
'http': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@pr.oxylabs.io:7777',
'https': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@pr.oxylabs.io:7777'
'http': 'http://customer-rendezvousmob-cc-FR:Rdv+20222021@pr.oxylabs.io:7777',
'https': 'http://customer-rendezvousmob-cc-FR:Rdv+20222021@pr.oxylabs.io:7777'
}
FR_PROXY_ASOCK_RES_2 = {
@@ -25,8 +28,8 @@ FR_PROXY_ASOCK_RES_2 = {
'https': 'http://zd6fbrujot-res-country-FR-hold-query:8k8avNlnLHQaMsWg@217.23.6.161:9999'
}
FR_PROXY_MOB_OXY_STICKY = {
'http': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@fr-pr.oxylabs.io:{}',
'https': 'http://customer-rendezvousmob-cc-FR:Rdv202220212023@fr-pr.oxylabs.io:{}'
'http': 'http://customer-rendezvousmob-cc-fr-sessid-0{}-sesstime-2:Rdv+202220212023@pr.oxylabs.io:7777',
'https': 'http://customer-rendezvousmob-cc-fr-sessid-0{}-sesstime-2:Rdv+202220212023@pr.oxylabs.io:7777'
}
FR_PROXY_DATA_IMPULSE_STICKY = {
@@ -52,17 +55,16 @@ FR_MOBILE_ANY_IP_ROTATING = {
'https': 'http://user_6a7f21,type_residential,country_FR:d5c051@portal.anyip.io:1080',
}
# 八分之一用data_impulse
MOBILE_PROXY_LIST = [FR_PROXY_MOB_OXY_STICKY, FR_PROXY_MOB_OXY_STICKY, FR_PROXY_MOB_OXY_STICKY, FR_PROXY_MOB_OXY_STICKY,
FR_PROXY_MOB_OXY_STICKY, FR_MOBILE_ANY_IP_STICKY, FR_MOBILE_ANY_IP_STICKY, FR_MOBILE_ANY_IP_STICKY,
FR_MOBILE_ANY_IP_STICKY, FR_MOBILE_ANY_IP_STICKY,
FR_PROXY_RES_OXY_STICKY,
FR_PROXY_DATA_IMPULSE_STICKY]
# MOBILE_PROXY_LIST = [FR_PROXY_MOB_OXY_STICKY, FR_PROXY_MOB_OXY_STICKY, FR_PROXY_MOB_OXY_STICKY, FR_PROXY_MOB_OXY_STICKY,
# FR_PROXY_MOB_OXY_STICKY, FR_MOBILE_ANY_IP_STICKY, FR_MOBILE_ANY_IP_STICKY, FR_MOBILE_ANY_IP_STICKY,
# FR_MOBILE_ANY_IP_STICKY, FR_MOBILE_ANY_IP_STICKY,
# FR_PROXY_RES_OXY_STICKY,
# FR_PROXY_DATA_IMPULSE_STICKY]
# MOBILE_PROXY_LIST = [FR_MOBILE_ANY_IP_STICKY]
# MOBILE_PROXY_LIST = [FR_MOBILE_ANY_IP_STICKY]
# MOBILE_PROXY_LIST = [FR_MOBILE_ANY_IP_STICKY, FR_PROXY_MOB_OXY_STICKY]
# MOBILE_PROXY_LIST = [FR_PROXY_MOB_OXY_STICKY]
MOBILE_PROXY_LIST = [FR_MOBILE_ANY_IP_STICKY]
class ProxyManager:
@@ -72,7 +74,8 @@ class ProxyManager:
def get_link_validate_proxy(self, links_to_validate: list) -> list:
# return [FR_PROXY_RES_PARIS_OXY]
return [FR_MOBILE_ANY_IP_ROTATING]
# return [FR_MOBILE_ANY_IP_ROTATING]
return [FR_PROXY_RES_OXY]
# if len(links_to_validate) > 15:
# return [FR_PROXY_RES_OXY, FR_PROXY_MOB_OXY, FR_PROXY_ASOCK_RES_2, FR_DATA_IMPULSE_RES]
# # return [FR_PROXY_RES_OXY, FR_PROXY_ASOCK_RES_2, FR_DATA_IMPULSE_RES, FR_ASOCKS_MOBILE_PROXY]
@@ -88,7 +91,7 @@ class ProxyManager:
_chosen_proxy = random.choice(MOBILE_PROXY_LIST)
if "oxylabs" in _chosen_proxy["http"]:
self.logger.info("use oxylabs proxy")
_port = random.randint(40001, 49999)
_port = random.randint(900000000, 995869818)
elif "anyip" in _chosen_proxy["http"]:
self.logger.info("use anyip proxy")
_port = random.randint(40001, 49999)
@@ -100,3 +103,14 @@ class ProxyManager:
_proxy_to_use["http"] = _chosen_proxy["http"].format(_port)
_proxy_to_use["https"] = _chosen_proxy["https"].format(_port)
return _proxy_to_use
if __name__ == '__main__':
_logger = logging.getLogger()
_proxy = ProxyManager(logger=_logger)
_proxise = _proxy.get_proxy_for_appointment_request()
print(_proxise)
response = requests.get(
"https://ip.oxylabs.io/location",
proxies=_proxise)
print(response.content)
+55 -19
View File
@@ -3,10 +3,13 @@ import json
import random
import threading
import time
from http.cookies import SimpleCookie
from typing import Optional
import pika
from db.mongo_manager import MONGO_STORE_MANAGER
from mail.lan_mail_helper import check_mail, check_all_need_to_check_emails
from mail.mail_reader_all_contacts import find_links_to_validate_from_mail_list
from models.ReserveResultPojo import ReserveResultPojo
from models.contact_pojo import ContactPojo
@@ -62,6 +65,24 @@ def is_open():
return is_time_between(datetime.time(10, 30), datetime.time(19, 00))
def check_ms_mails(_mail_list_filtered):
print("check_ms_mails() called.")
check_all_need_to_check_emails()
# for _mail in _mail_list_filtered:
# if "outlook.com" in _mail.mail or "hotmail.com" in _mail.mail:
# check_mail(_mail.mail)
def get_xsfr_token_from_cookies(cookies_str: str) -> Optional[str]:
_simple_cookies = SimpleCookie()
_simple_cookies.load(cookies_str)
if "x-xsrf-token" not in _simple_cookies:
return None
else:
_xsfr_token = _simple_cookies["x-xsrf-token"].value
return _xsfr_token
class AppointmentRequestSender(threading.Thread):
def __init__(self, sub_contact_list: list, logger, cookiesPublisher: CookiesPublisher,
bakeUpCookiesPublisher: CookiesPublisher,
@@ -110,9 +131,18 @@ class AppointmentRequestSender(threading.Thread):
ars_h=_received_dict['ars_h'], ars_w=_received_dict['ars_w'], pr=_received_dict['pr'],
plg=_received_dict['plg'], br_h=_received_dict['br_h'], br_w=_received_dict['br_w'],
plu=_received_dict['plu'], vnd=_received_dict['vnd'], dvm=_received_dict['dvm'],
ts_mtp=_received_dict['ts_mtp'], eva=_received_dict['eva'],
rs_h=_received_dict['rs_h'],
rs_w=_received_dict['rs_w'], rs_cd=_received_dict['rs_cd'], emd=_received_dict['emd'])
ts_mtp=_received_dict['ts_mtp'], eva=_received_dict['eva'], rs_h=_received_dict['rs_h'],
rs_w=_received_dict['rs_w'], rs_cd=_received_dict['rs_cd'], emd=_received_dict['emd'],
bchk=_received_dict['bchk'],
ccsB=_received_dict['ccsB'],
nt_tcp=_received_dict['nt_tcp'],
nt_dns=_received_dict['nt_dns'],
nt_rd=_received_dict['nt_rd'], nt_irt=_received_dict['nt_irt'], nt_rt=_received_dict['nt_rt'],
nt_tls=_received_dict['nt_tls'], nt_ttf=_received_dict['nt_ttf'], nt_swt=_received_dict['nt_swt'],
nt_csd=_received_dict['nt_csd'], nt_nhp=_received_dict['nt_nhp'], nt_rdc=_received_dict['nt_rdc'],
nt_it=_received_dict['nt_it'], nt_prs=_received_dict['nt_prs'], nt_esc=_received_dict['nt_esc'],
nt_ttrd=_received_dict['nt_ttrd'], nt_le=_received_dict['nt_le'],
nt_dcle=_received_dict['nt_dcle'], nt_di=_received_dict['nt_di'], nt_dc=_received_dict['nt_dc'] )
_received_cookies = _received_dict["cookiesStr"]
# remove already sent contacts
self.contact_list = filter_contacts(self.contact_list, self.already_tried_contact_list)
@@ -157,21 +187,25 @@ class AppointmentRequestSender(threading.Thread):
else:
m_ms_r = m_m_c / m_s_c
js_le_data = JsDataLeTypePojo(glrd=_received_dict['glrd'], glvd=_received_dict['glvd'],
hc=_received_dict['hc'],
ua=_received_dict['ua'], br_oh=_received_dict['br_oh'],
br_ow=_received_dict['br_ow'],
ars_h=_received_dict['ars_h'], ars_w=_received_dict['ars_w'],
pr=_received_dict['pr'],
plg=_received_dict['plg'], br_h=_received_dict['br_h'],
br_w=_received_dict['br_w'],
plu=_received_dict['plu'], vnd=_received_dict['vnd'],
dvm=_received_dict['dvm'],
ts_mtp=_received_dict['ts_mtp'], eva=_received_dict['eva'],
rs_h=_received_dict['rs_h'],
rs_w=_received_dict['rs_w'], rs_cd=_received_dict['rs_cd'],
js_le_data = JsDataLeTypePojo(glrd=_received_dict['glrd'], glvd=_received_dict['glvd'], hc=_received_dict['hc'],
ua=_received_dict['ua'], br_oh=_received_dict['br_oh'], br_ow=_received_dict['br_ow'],
ars_h=_received_dict['ars_h'], ars_w=_received_dict['ars_w'], pr=_received_dict['pr'],
plg=_received_dict['plg'], br_h=_received_dict['br_h'], br_w=_received_dict['br_w'],
plu=_received_dict['plu'], vnd=_received_dict['vnd'], dvm=_received_dict['dvm'],
ts_mtp=_received_dict['ts_mtp'], eva=_received_dict['eva'], rs_h=_received_dict['rs_h'],
rs_w=_received_dict['rs_w'], rs_cd=_received_dict['rs_cd'], emd=_received_dict['emd'],
bchk=_received_dict['bchk'],
ccsB=_received_dict['ccsB'],
nt_tcp=_received_dict['nt_tcp'],
nt_dns=_received_dict['nt_dns'],
nt_rd=_received_dict['nt_rd'], nt_irt=_received_dict['nt_irt'], nt_rt=_received_dict['nt_rt'],
nt_tls=_received_dict['nt_tls'], nt_ttf=_received_dict['nt_ttf'], nt_swt=_received_dict['nt_swt'],
nt_csd=_received_dict['nt_csd'], nt_nhp=_received_dict['nt_nhp'], nt_rdc=_received_dict['nt_rdc'],
nt_it=_received_dict['nt_it'], nt_prs=_received_dict['nt_prs'], nt_esc=_received_dict['nt_esc'],
nt_ttrd=_received_dict['nt_ttrd'], nt_le=_received_dict['nt_le'],
nt_dcle=_received_dict['nt_dcle'], nt_di=_received_dict['nt_di'], nt_dc=_received_dict['nt_dc'],
m_s_c=m_s_c, m_m_c=m_m_c, m_c_c=m_c_c,
m_cm_r=m_cm_r, m_ms_r=m_ms_r, emd=_received_dict['emd'])
m_cm_r=m_cm_r, m_ms_r=m_ms_r)
time.sleep(random.randint(1, 4))
_new_le_cookies = captchaResultGetter.get_le_valid_cookie(proxy_to_use=_proxy_to_use,
js_le_type_data=js_le_data,
@@ -213,9 +247,9 @@ class AppointmentRequestSender(threading.Thread):
# 如果在发送请求时出现csrf被拦截的情况,那么就需要重新发布cookie以目前的队列中,因为这个cookie可能重新利用
self.logger.info("csrf blocked, will republish cookie")
self.cookiesPublisher.publish_body(_received_object)
self.logger.info("csrf blocked, will wait 60 seconds")
time.sleep(60)
ch.basic_ack(delivery_tag=method.delivery_tag)
self.logger.info("csrf blocked, will wait 30 seconds")
time.sleep(30)
elif can_continue is not None and can_continue == RequestResult.BLOCKED:
self.logger.info("这个cookies可以给点链接用")
self.bakeUpCookiesPublisher.publish_body(_received_object)
@@ -239,6 +273,7 @@ class AppointmentRequestSender(threading.Thread):
self.channel.start_consuming()
def retrieve_invalidate_urls(self):
self.list_to_retrieve_mails = self.initial_contact_list
# 如果没有已读邮件,而且需要读邮件的联系人表不为空,就读取未读邮件
if not self.already_read_emails and len(self.list_to_retrieve_mails) > 0:
self.logger.info("will retrieve validate urls")
@@ -251,6 +286,7 @@ class AppointmentRequestSender(threading.Thread):
self.logger.info("will get mail from " + mail.mail)
_mail_list_filtered.append(mail)
self.logger.info("will call find_links_to_validate_from_mail_list, size = " + str(len(_mail_list_filtered)))
check_ms_mails(_mail_list_filtered)
find_links_to_validate_from_mail_list(_mail_list_filtered, self.logger)
self.already_read_emails = True
else:
+3 -3
View File
@@ -71,10 +71,10 @@ def send_appointment_request(message_queue_name, _contact_list):
def start_send_requests():
print("start send requests")
contacts_file_path = '~/Desktop/11_05_to_test.xlsx'
_contact_list = read_contacts(contacts_file_path)[:-1]
contacts_file_path = '~/Desktop/06_05_to_test.xlsx'
_contact_list = read_contacts(contacts_file_path)[:1]
_contact_list_to_book = filter_contacts(_contact_list)
_segment_number = 5
_segment_number = 1
logger.info("{} contacts to book".format(len(_contact_list_to_book)))
last_thread = None
for i in range(0, _segment_number):
+4 -4
View File
@@ -10,9 +10,7 @@ from models.contact_pojo import ContactPojo
from queue_message.CookiesPublisher import CookiesPublisher, SHARED_OBJECT, TEST_QUEUE, MORNING_DATA_CACHE, \
MORNING_DATA_CACHE_2, MORNING_DATA_CACHE_BAK
from queue_message.appointmentrequestsender import AppointmentRequestSender
from utiles import is_time_between
from utils.AppLogging import init_logger
from workers.proxies_constants import MOBILE_PROXY_LIST_FR
def is_already_sent(contact: ContactPojo) -> bool:
@@ -103,6 +101,8 @@ if __name__ == '__main__':
# '~/Desktop/contact_list_2024-05-21.xlsx',
# '~/Desktop/15_05_to_test.xlsx']
# file_list = ['~/Desktop/15_05_to_test.xlsx', '~/Desktop/16_05_to_test.xlsx']
file_list = ['~/Desktop/contact_list_2024-10-05_gmx_net_100.xlsx']
send_request_for_file_list(file_list=file_list, thread_number=1,
file_list = ['~/Desktop/contact_list_2025-07-11.xlsx']
# file_list = ['~/Desktop/contact_list_all_studio.xlsx']
# file_list = ['~/Desktop/real_name_contacts_100_27_06.xlsx']
send_request_for_file_list(file_list=file_list, thread_number=20,
data_queue_name=MORNING_DATA_CACHE, stop_at_hour=19, stop_at_mins=50)
+2
View File
@@ -0,0 +1,2 @@
curl_cffi==0.7.1
openpyxl
+2 -4
View File
@@ -6,10 +6,8 @@ from request_sender_test import send_request_for_file_list
def start_book_appointment():
file_list = ['~/Desktop/contact_list_2024-09-06.xlsx',
'~/Desktop/contact_list_all.xlsx',
'~/Desktop/contact_list_2024-05-27.xlsx']
send_request_for_file_list(file_list=file_list, thread_number=80,
file_list = ['~/Desktop/contact_list_2025-07-11.xlsx']
send_request_for_file_list(file_list=file_list, thread_number=60,
data_queue_name=MORNING_DATA_CACHE, stop_at_hour=11, stop_at_mins=20)
+10 -7
View File
@@ -2,14 +2,15 @@ import json
import random
import re
from typing import Union
import requests
# import requests
from curl_cffi import requests
from captcha.jspl_encoder_wrapper import encrpte_to_jspl
from models.jsdata_le_pojo import JsDataLeTypePojo
from models.jsdata_pojo import JsDataPojo
from models.result_pojo import RequestResult
from utils.get_only_datadome_cookies import get_datadome_cookies, get_app_cookies, get_lang_cookies, \
retain_only_dataome_cookies
from workers.proxies_constants import PROXY_LIST_FR
API_KEY = "d66aaf490d8aa424a5175e1fbd1aadea"
@@ -105,9 +106,10 @@ class CaptchaResultGetter:
return None
def get_ch_raw_data_from_js_data(self, js_data: JsDataPojo, old_valid_cookie) -> str:
_tag_version = "4.35.0"
_raw_data = "jsData={}&eventCounters=%5B%5D&jsType=ch&cid={}&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv={}".format(
js_data.to_url_encoded_json(), old_valid_cookie, _tag_version)
_tag_version = "5.1.5"
_jspl = encrpte_to_jspl(js_data.to_url_encoded_json())
_raw_data = "jspl={}&eventCounters=%5B%5D&jsType=ch&cid={}&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv={}".format(
_jspl, old_valid_cookie, _tag_version)
print("raw ch data is " + _raw_data)
return _raw_data
@@ -174,8 +176,9 @@ class CaptchaResultGetter:
# _le_js_raw_data = self.get_le_raw_data_from_js_data(js_le_type_data=js_le_type_data,
# old_valid_cookie=old_valid_cookie)
_cid = get_datadome_cookies(old_valid_cookie)
_raw_data = "jsData={}&eventCounters=%7B%22mousemove%22%3A{}%2C%22click%22%3A{}%2C%22scroll%22%3A{}%2C%22touchstart%22%3A{}%2C%22touchend%22%3A{}%2C%22touchmove%22%3A{}%2C%22keydown%22%3A{}%2C%22keyup%22%3A{}%7D&jsType=le&cid={}&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv=4.35.0".format(
js_le_type_data.to_url_encoded_json(), mousemove_count, click_count, scroll_count, touch_count, touch_count,
_jspl = encrpte_to_jspl(js_le_type_data.to_url_encoded_json())
_raw_data = "jsData={}&eventCounters=%7B%22mousemove%22%3A{}%2C%22click%22%3A{}%2C%22scroll%22%3A{}%2C%22touchstart%22%3A{}%2C%22touchend%22%3A{}%2C%22touchmove%22%3A{}%2C%22keydown%22%3A{}%2C%22keyup%22%3A{}%7D&jsType=le&cid={}&ddk=789361B674144528D0B7EE76B35826&Referer=https%253A%252F%252Frendezvousparis.hermes.com%252Fclient%252Fregister&request=%252Fclient%252Fregister&responsePage=origin&ddv=5.1.5".format(
_jspl, mousemove_count, click_count, scroll_count, touch_count, touch_count,
touch_move,
key_count,
key_count, _cid)
+58 -42
View File
@@ -19,7 +19,7 @@ from utils.AppLogging import init_logger
from utils.user_agent_helper import generate_headers_from_request_message
DOUBLE_MESSAGE = "Une demande de rendez-vous a déjà été enregistrée avec ces coordonnées"
INVALID = "Depuis plus de 130 ans,"
INVALID = "nos conseillers vous accueillent sur rendez-vous dans nos magasins"
init_logger()
logger = logging.getLogger()
@@ -28,7 +28,7 @@ logger = logging.getLogger()
def filter_link_pojo_list_with_serial(_received_dict, link_to_validate_list):
_serial = _received_dict["serial"]
_model = _received_dict["model"]
_bit_browser_list = list(filter(lambda link_pojo: link_pojo.serial == "bitbrowser", link_to_validate_list))
_bit_browser_list = list(filter(lambda link_pojo: link_pojo.serial == "requests", link_to_validate_list))
if len(_bit_browser_list) > 0:
return _bit_browser_list
else:
@@ -149,44 +149,51 @@ class LinkValidatorWithProvidedList(threading.Thread):
_message_in_queue_count = self.cookiesPublisher.message_count()
print("message count in queue is {}".format(_message_in_queue_count))
_received_object = body.decode("UTF-8")
_received_dict = json.loads(_received_object)
_received_cookies = _received_dict["cookiesStr"]
self.cookie_str = _received_cookies
_links_to_validate = filter_link_pojo_list_with_serial(_received_dict, self.link_to_validate_list)
random.shuffle(_links_to_validate)
if len(_links_to_validate) > 0 and _message_in_queue_count >= self.limit:
print("{}:links number is {}".format(threading.currentThread().name, len(_links_to_validate)))
can_continue = None
for link_to_validate in _links_to_validate:
print(link_to_validate)
self.proxy_to_use = random.choice(
self.proxy_manager.get_link_validate_proxy(_links_to_validate))
print("proxy to use is {}".format(self.proxy_to_use))
can_continue = self.send_request(link_to_validate, _received_dict)
# remove the tested link from link list
self.link_to_validate_list.remove(link_to_validate)
if can_continue == RequestResult.BLOCKED:
print("cannot continue, blocked, then skip")
break
else:
if can_continue == RequestResult.BAD_GATEWAY:
time.sleep(30)
try:
_received_dict = json.loads(_received_object)
_received_cookies = _received_dict["cookiesStr"]
self.cookie_str = _received_cookies
_links_to_validate = filter_link_pojo_list_with_serial(_received_dict, self.link_to_validate_list)
random.shuffle(_links_to_validate)
if len(_links_to_validate) > 0 and _message_in_queue_count >= self.limit:
print("{}:links number is {}".format(threading.currentThread().name, len(_links_to_validate)))
can_continue = None
for link_to_validate in _links_to_validate:
print(link_to_validate)
self.proxy_to_use = random.choice(
self.proxy_manager.get_link_validate_proxy(_links_to_validate))
print("proxy to use is {}".format(self.proxy_to_use))
can_continue = self.send_request(link_to_validate, _received_dict)
# remove the tested link from link list
self.link_to_validate_list.remove(link_to_validate)
if can_continue == RequestResult.BLOCKED:
print("cannot continue, blocked, then skip")
break
time.sleep(random.randint(2, 5))
print("can continue, continue")
if can_continue == RequestResult.BAD_GATEWAY or can_continue == RequestResult.PROXY_ERROR or can_continue == RequestResult.SUCCESS:
print("will requeue the message")
ch.basic_reject(delivery_tag=method.delivery_tag, requeue=True)
else:
if can_continue == RequestResult.BAD_GATEWAY:
time.sleep(30)
break
time.sleep(random.randint(2, 5))
print("can continue, continue")
if can_continue == RequestResult.BAD_GATEWAY or can_continue == RequestResult.PROXY_ERROR or can_continue == RequestResult.SUCCESS:
print("will requeue the message")
ch.basic_reject(delivery_tag=method.delivery_tag, requeue=True)
else:
print("will ack")
print("will wait for 40s")
time.sleep(20)
ch.basic_ack(delivery_tag=method.delivery_tag)
else:
print("will ack")
print("empty list, will republish message")
time.sleep(0)
print("body in json:{}".format(json.dumps(_received_dict)))
self.cookiesPublisher.publish_body(json.dumps(_received_dict))
ch.basic_ack(delivery_tag=method.delivery_tag)
else:
print("empty list, will republish message")
time.sleep(0)
print("body in json:{}".format(json.dumps(_received_dict)))
self.cookiesPublisher.publish_body(json.dumps(_received_dict))
self.channel.stop_consuming()
except Exception as error:
print(error)
print("not json format will ack")
ch.basic_ack(delivery_tag=method.delivery_tag)
self.channel.stop_consuming()
def filter_with_ip_country(self):
_link_list_to_click = []
@@ -210,15 +217,21 @@ def validate_links(cookiesPublisher, queue_name: str, link_list: list, _contact_
def validate_all_links(_contact_serial_list):
print("will get all links")
all_link_list = MONGO_STORE_MANAGER.get_links_to_validate()
link_to_validated = []
for _link in all_link_list:
# print("serial is "+_link.serial)
print("email is " + _link.email)
if _link.serial == "requests":
link_to_validated.append(_link)
# get the first 50 links
if len(all_link_list) == 0:
if len(link_to_validated) == 0:
return
# divided = 1
divided = 1
# default_segment_number = 20
# _first_25_percent_links = all_link_list[0:(int(len(all_link_list) / divided))]
_first_25_percent_links = link_to_validated[0:(int(len(all_link_list) / divided))]
_first_25_percent_links = all_link_list
_queue_name = MORNING_DATA_CACHE
# _queue_name = MORNING_DATA_CACHE_BAK
# _queue_name = MORNING_DATA_CACHE
_queue_name = MORNING_DATA_CACHE_BAK
# if len(all_link_list) > divided * default_segment_number:
# _segment_number = default_segment_number
# else:
@@ -228,7 +241,10 @@ def validate_all_links(_contact_serial_list):
# else:
# _segment_number = 1
_thread_list = []
_segment_number = 1
if len(_first_25_percent_links) >= 10:
_segment_number = 10
else:
_segment_number = len(_first_25_percent_links)
for i in range(0, _segment_number):
logger.info("{}:{} links to validate".format(threading.currentThread().name, len(_first_25_percent_links)))
logger.info("segment is {}".format(i))
+7 -7
View File
@@ -1,7 +1,5 @@
import datetime
import json
import logging
import random
import re
import time
from http.cookies import SimpleCookie
@@ -40,7 +38,8 @@ class Sender:
self.proxy_to_use = proxy_to_use
self.cookie.load(self.cookie_str)
def publish_message_to_queue(self, contact: ContactPojo, status: PublishType, url: str, store_type: str):
def publish_message_to_queue(self, contact: ContactPojo, status: PublishType, url: str, store_type: str,
model: str = ""):
# create the message
if url == "https://rendezvousparis.hermes.com/client/welcome":
return
@@ -61,11 +60,12 @@ class Sender:
result.proxy = "data_impulse"
result.id = id
result.store_type = store_type
result.model = model
result.created_at = time.strftime("%H:%M:%S", time.localtime())
collection_name = str(datetime.date.today())
MONGO_STORE_MANAGER.insert_reserve_result(collection_name=collection_name, reserve=result)
def apply_redirect(self, response, old_headers, contact, js_data, selected_store):
def apply_redirect(self, response, old_headers, contact, js_data, selected_store, model=""):
# /client/register/5XD2E2
_res_headers = response.headers
_location = _res_headers['location']
@@ -89,7 +89,7 @@ class Sender:
contact.current_ip = get_address_ip(proxy_to_use=self.proxy_to_use)
_appointment_url = _redirect_url
self.publish_message_to_queue(contact, status=PublishType.SUCCESS, url=_appointment_url,
store_type=selected_store)
store_type=selected_store, model=model)
self.cookie.load(_cookies_to_set)
new_cookies = {k: v.value for k, v in self.cookie.items()}
new_coolies_str = ""
@@ -162,7 +162,7 @@ class Sender:
headers['sec-ch-ua-full-version-list'] = _chrome_ua_version
data = {'check': '', '_csrf': _csrf, 'prefer': _selected_store,
'surname': contact.last_name.capitalize(), 'name': contact.first_name.capitalize(),
'phone_country': "FR", 'phone_number': "+33 " + contact.phone, 'email': contact.mail,
'phone_country': "FR", 'phone_number': "0" + contact.phone, 'email': contact.mail,
'passport_id': contact.passport, 'processing': 'on', 'cgu': 'on'}
self.logger.info(data)
self.logger.info("try to request for mail:{}".format(contact.mail))
@@ -177,7 +177,7 @@ class Sender:
# add to mongodb
self.logger.info(response.text)
self.apply_redirect(response=response, old_headers=headers, contact=contact, js_data=js_data,
selected_store=_selected_store)
selected_store=_selected_store, model=model)
# self.logger.info("{}:{}".format(contact.mail, response.url))
# contact.ua = js_data.ua
# contact.current_ip = get_address_ip(proxy_to_use=proxy_to_use)