Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
doudian-py
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
baiquan
doudian-py
Commits
2f91b362
Commit
2f91b362
authored
Apr 16, 2025
by
baiquan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add setup_proxy
parent
af6252a9
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
79 additions
and
21 deletions
+79
-21
common.py
+51
-3
login.py
+20
-15
main.py
+8
-3
No files found.
common.py
View file @
2f91b362
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
,
...
...
login.py
View file @
2f91b362
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
=
proxie
s
)
check_login_res
=
session
.
get
(
check_login_url
,
cookies
=
login_cookies
,
headers
=
header
s
)
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
))
main.py
View file @
2f91b362
...
...
@@ -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'
,
''
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment