Commit 2f91b362 by baiquan

add setup_proxy

parent af6252a9
import json
import logging
import random
import time
from hashlib import md5
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests
from errors import *
def setup_proxy(addr, port, username, password):
session = requests.Session()
# 配置 SOCKS5 代理 + 远程 DNS 解析
proxy_url = f"socks5h://{username}:{password}@{addr}:{port}"
session.proxies = {
"http": proxy_url,
"https": proxy_url
}
# 配置重试机制
retries = Retry(
total=5,
backoff_factor=0.3,
status_forcelist=[500, 502, 503, 504],
allowed_methods=frozenset(['GET', 'POST'])
)
# 调整 SSL 配置
session.verify = False
session.mount('https://', HTTPAdapter(
max_retries=retries,
pool_connections=100,
pool_maxsize=100
))
# 测试实际业务域名连通性
try:
test_res = session.get(
'https://fxg.jinritemai.com',
timeout=15,
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}
)
if test_res.status_code == 200:
logging.info("业务域名连通性验证成功")
test_res = session.get('http://httpbin.org/ip', timeout=10).json()
if test_res['origin'] == addr:
logging.info(f"代理验证成功")
return session
else:
raise AppError(msg="代理验证失败")
else:
raise AppError(msg="业务域名连通性验证失败")
except Exception as e:
raise AppError(msg=f"代理验证失败: {str(e)}")
def encryptParamsId(login_subject_uid, user_identity_id):
e = {
......@@ -38,9 +85,10 @@ def get_access_key(fp_id, app_key, device_id):
access_key = obj.hexdigest()
return access_key
def update_callback_cookies(cookies, headers, redirect_url, proxies):
callback_res = requests.get(redirect_url, cookies=cookies, headers=headers, allow_redirects=False, proxies=proxies)
def update_callback_cookies(cookies, headers, redirect_url, session):
callback_res = session.get(redirect_url, cookies=cookies, headers=headers, allow_redirects=False)
return update_cookies(callback_res.cookies, cookies)
def get_account_sdk_source_info():
data = {
"hardwareConcurrency": 8,
......
import logging
from urllib.parse import urlencode
import requests
from common import get_account_sdk_source_info, get_ms_token, encryptParams, encryptParamsId, update_cookies, \
update_callback_cookies
update_callback_cookies, setup_proxy
from dy_verify import mouse_verify
def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
def get_callback_cookies(login_cookies, headers, encrypt_params, session):
account_sdk_source_info = get_account_sdk_source_info()
check_login_params = {
'fp': encrypt_params['fp'],
......@@ -22,7 +21,7 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
}
x_bogus_url = 'https://doudian-sso.jinritemai.com/aff/check_login/' + "?" + urlencode(check_login_params)
check_login_url = x_bogus_url + f'&signature=_02B4Z6wo00001k1CzegAAIDCemYJt5a7r6JNQslAAPSgmx8MO5UrYu5YW6SCdzCrIIqaFJbM6j62JJU3g5yarKiSx7EgoKdBA92pBjYFVyjR9yIxwEceUkyEGviysE59DRUIWFyx3Akm0kWcbc'
check_login_res = requests.get(check_login_url, cookies=login_cookies, headers=headers, proxies=proxies)
check_login_res = session.get(check_login_url, cookies=login_cookies, headers=headers)
login_subject_uid = check_login_res.json()['login_list'][0]['login_subject_uid']
user_identity_id = check_login_res.json()['login_list'][0]['user_identity_list'][0]['user_identity_id_str']
encrypt_obj = encryptParamsId(login_subject_uid, user_identity_id)
......@@ -38,7 +37,7 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
'user_identity_id': encrypt_obj['user_identity_id'],
}
ticket_url = f"https://doudian-sso.jinritemai.com/aff/subject/login/?subject_aid=4966&fp={encrypt_params['fp']}&aid=4272&language=zh&account_sdk_source=web&account_sdk_source_info={account_sdk_source_info}&msToken={get_ms_token()}"
ticket_res = requests.post(ticket_url, cookies=login_cookies, headers=headers, data=ticket_data, proxies=proxies)
ticket_res = session.post(ticket_url, cookies=login_cookies, headers=headers, data=ticket_data)
cookies = update_cookies(ticket_res.cookies, login_cookies)
ticket = ticket_res.json()['redirect_url'].split('ticket=')[-1]
redirect_params = {
......@@ -49,8 +48,8 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
'login_member': '1',
'_lid': '312003629857',
}
redirect_res = requests.get('https://fxg.jinritemai.com/index/login', params=redirect_params, cookies=cookies,
headers=headers,allow_redirects=False, proxies=proxies)
redirect_res = session.get('https://fxg.jinritemai.com/index/login', params=redirect_params, cookies=cookies,
headers=headers,allow_redirects=False)
redirect_url = redirect_res.headers.get('Location')
params = {
'login_source': 'doudian_pc_web',
......@@ -59,13 +58,19 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
'entry_source': '0',
'ecom_login_extra': '',
}
cookies = update_callback_cookies(cookies, headers, redirect_url, proxies)
callback_res = requests.get('https://fxg.jinritemai.com/ecomauth/loginv1/callback', params=params, cookies=cookies,
headers=headers, verify=False, proxies=proxies)
cookies = update_callback_cookies(cookies, headers, redirect_url, session)
callback_res = session.get('https://fxg.jinritemai.com/ecomauth/loginv1/callback', params=params, cookies=cookies,
headers=headers, verify=False)
logging.info(f"-------- get_callback_cookies: cookies获取成功!--------")
return update_cookies(callback_res.cookies, cookies)
def login(account, password, headers, proxies):
addr = proxies['addr']
port = proxies['port']
username = proxies['username']
proxies_password = proxies['password']
session = setup_proxy(addr, int(port), username, proxies_password)
encrypt_params = encryptParams(account, password)
login_params = {
'fp': encrypt_params['fp'],
......@@ -88,7 +93,8 @@ def login(account, password, headers, proxies):
'captcha_key': encrypt_params['captcha_key'],
'redirect_sso_to_login': encrypt_params['redirect_sso_to_login'],
}
login_res = requests.post(login_url, headers=headers, data=data, verify=False, proxies=proxies)
login_res = session.post(login_url, headers=headers, data=data, verify=False)
if login_res.json()['error_code'] == 2046:
logging.info(f"-------- login: 登录失败!--------")
logging.info(f"-------- login: {login_res.json()['description']}--------")
......@@ -107,7 +113,7 @@ def login(account, password, headers, proxies):
mouse_verify(encrypt_params['fp'], verify_center_decision_conf)
except:
continue
login_res = requests.post(login_url, headers=headers, data=data, verify=False, proxies=proxies)
login_res = session.post(login_url, headers=headers, data=data, verify=False)
if login_res.json()['description'] != '滑动滑块进行验证':
logging.info(f"-------- login_verify: 滑块处理成功!--------")
break
......@@ -115,6 +121,5 @@ def login(account, password, headers, proxies):
logging.error(f"-------- login_verify: 处理滑块失败!--------")
logging.error(f"-------- login: 登录失败!--------")
return None
logging.info(f"-------- login: 登录成功!--------")
return dict(get_callback_cookies(login_res.cookies, headers, encrypt_params, proxies))
return dict(get_callback_cookies(login_res.cookies, headers, encrypt_params, session))
......@@ -3,7 +3,7 @@ from asyncio.log import logger
from DrissionPage import Chromium
from DrissionPage.common import Settings
from common import setup_proxy
from config import settings
from errors import *
from hub_ import *
......@@ -159,7 +159,12 @@ def getProductName(product_type, product_name):
else:
raise NotFoundError("未找到城市")
async def createTemplate(cookies, template_params):
async def createTemplate(cookies, template_params, proxies):
addr = proxies['addr']
port = proxies['port']
username = proxies['username']
proxies_password = proxies['password']
session = setup_proxy(addr, int(port), username, proxies_password)
params = {
'appid': '1',
'aid': '4272',
......@@ -559,7 +564,7 @@ async def createTemplate(cookies, template_params):
}
logger.info(rule_list)
url = 'https://fxg.jinritemai.com/freight/template/createTemplate'
response = requests.post(url,params=params,cookies=cookies,headers=HEADERS,json=json_data).json()
response = session.post(url,params=params,cookies=cookies,headers=HEADERS,json=json_data).json()
logger.info(response)
if response['code'] != 0:
msg = response.get('msg', '')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment