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
Hide 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
json
import
logging
import
random
import
random
import
time
import
time
from
hashlib
import
md5
from
hashlib
import
md5
from
urllib3.util.retry
import
Retry
from
requests.adapters
import
HTTPAdapter
import
requests
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
):
def
encryptParamsId
(
login_subject_uid
,
user_identity_id
):
e
=
{
e
=
{
...
@@ -38,9 +85,10 @@ def get_access_key(fp_id, app_key, device_id):
...
@@ -38,9 +85,10 @@ def get_access_key(fp_id, app_key, device_id):
access_key
=
obj
.
hexdigest
()
access_key
=
obj
.
hexdigest
()
return
access_key
return
access_key
def
update_callback_cookies
(
cookies
,
headers
,
redirect_url
,
proxies
):
def
update_callback_cookies
(
cookies
,
headers
,
redirect_url
,
session
):
callback_res
=
requests
.
get
(
redirect_url
,
cookies
=
cookies
,
headers
=
headers
,
allow_redirects
=
False
,
proxies
=
proxies
)
callback_res
=
session
.
get
(
redirect_url
,
cookies
=
cookies
,
headers
=
headers
,
allow_redirects
=
False
)
return
update_cookies
(
callback_res
.
cookies
,
cookies
)
return
update_cookies
(
callback_res
.
cookies
,
cookies
)
def
get_account_sdk_source_info
():
def
get_account_sdk_source_info
():
data
=
{
data
=
{
"hardwareConcurrency"
:
8
,
"hardwareConcurrency"
:
8
,
...
...
login.py
View file @
2f91b362
import
logging
import
logging
from
urllib.parse
import
urlencode
from
urllib.parse
import
urlencode
import
requests
from
common
import
get_account_sdk_source_info
,
get_ms_token
,
encryptParams
,
encryptParamsId
,
update_cookies
,
\
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
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
()
account_sdk_source_info
=
get_account_sdk_source_info
()
check_login_params
=
{
check_login_params
=
{
'fp'
:
encrypt_params
[
'fp'
],
'fp'
:
encrypt_params
[
'fp'
],
...
@@ -22,7 +21,7 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
...
@@ -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
)
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_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'
]
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'
]
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
)
encrypt_obj
=
encryptParamsId
(
login_subject_uid
,
user_identity_id
)
...
@@ -38,7 +37,7 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
...
@@ -38,7 +37,7 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
'user_identity_id'
:
encrypt_obj
[
'user_identity_id'
],
'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_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
)
cookies
=
update_cookies
(
ticket_res
.
cookies
,
login_cookies
)
ticket
=
ticket_res
.
json
()[
'redirect_url'
]
.
split
(
'ticket='
)[
-
1
]
ticket
=
ticket_res
.
json
()[
'redirect_url'
]
.
split
(
'ticket='
)[
-
1
]
redirect_params
=
{
redirect_params
=
{
...
@@ -49,8 +48,8 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
...
@@ -49,8 +48,8 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
'login_member'
:
'1'
,
'login_member'
:
'1'
,
'_lid'
:
'312003629857'
,
'_lid'
:
'312003629857'
,
}
}
redirect_res
=
requests
.
get
(
'https://fxg.jinritemai.com/index/login'
,
params
=
redirect_params
,
cookies
=
cookies
,
redirect_res
=
session
.
get
(
'https://fxg.jinritemai.com/index/login'
,
params
=
redirect_params
,
cookies
=
cookies
,
headers
=
headers
,
allow_redirects
=
False
,
proxies
=
proxies
)
headers
=
headers
,
allow_redirects
=
False
)
redirect_url
=
redirect_res
.
headers
.
get
(
'Location'
)
redirect_url
=
redirect_res
.
headers
.
get
(
'Location'
)
params
=
{
params
=
{
'login_source'
:
'doudian_pc_web'
,
'login_source'
:
'doudian_pc_web'
,
...
@@ -59,13 +58,19 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
...
@@ -59,13 +58,19 @@ def get_callback_cookies(login_cookies, headers, encrypt_params, proxies):
'entry_source'
:
'0'
,
'entry_source'
:
'0'
,
'ecom_login_extra'
:
''
,
'ecom_login_extra'
:
''
,
}
}
cookies
=
update_callback_cookies
(
cookies
,
headers
,
redirect_url
,
proxies
)
cookies
=
update_callback_cookies
(
cookies
,
headers
,
redirect_url
,
session
)
callback_res
=
requests
.
get
(
'https://fxg.jinritemai.com/ecomauth/loginv1/callback'
,
params
=
params
,
cookies
=
cookies
,
callback_res
=
session
.
get
(
'https://fxg.jinritemai.com/ecomauth/loginv1/callback'
,
params
=
params
,
cookies
=
cookies
,
headers
=
headers
,
verify
=
False
,
proxies
=
proxies
)
headers
=
headers
,
verify
=
False
)
logging
.
info
(
f
"-------- get_callback_cookies: cookies获取成功!--------"
)
logging
.
info
(
f
"-------- get_callback_cookies: cookies获取成功!--------"
)
return
update_cookies
(
callback_res
.
cookies
,
cookies
)
return
update_cookies
(
callback_res
.
cookies
,
cookies
)
def
login
(
account
,
password
,
headers
,
proxies
):
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
)
encrypt_params
=
encryptParams
(
account
,
password
)
login_params
=
{
login_params
=
{
'fp'
:
encrypt_params
[
'fp'
],
'fp'
:
encrypt_params
[
'fp'
],
...
@@ -88,7 +93,8 @@ def login(account, password, headers, proxies):
...
@@ -88,7 +93,8 @@ def login(account, password, headers, proxies):
'captcha_key'
:
encrypt_params
[
'captcha_key'
],
'captcha_key'
:
encrypt_params
[
'captcha_key'
],
'redirect_sso_to_login'
:
encrypt_params
[
'redirect_sso_to_login'
],
'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
:
if
login_res
.
json
()[
'error_code'
]
==
2046
:
logging
.
info
(
f
"-------- login: 登录失败!--------"
)
logging
.
info
(
f
"-------- login: 登录失败!--------"
)
logging
.
info
(
f
"-------- login: {login_res.json()['description']}--------"
)
logging
.
info
(
f
"-------- login: {login_res.json()['description']}--------"
)
...
@@ -107,7 +113,7 @@ def login(account, password, headers, proxies):
...
@@ -107,7 +113,7 @@ def login(account, password, headers, proxies):
mouse_verify
(
encrypt_params
[
'fp'
],
verify_center_decision_conf
)
mouse_verify
(
encrypt_params
[
'fp'
],
verify_center_decision_conf
)
except
:
except
:
continue
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'
]
!=
'滑动滑块进行验证'
:
if
login_res
.
json
()[
'description'
]
!=
'滑动滑块进行验证'
:
logging
.
info
(
f
"-------- login_verify: 滑块处理成功!--------"
)
logging
.
info
(
f
"-------- login_verify: 滑块处理成功!--------"
)
break
break
...
@@ -115,6 +121,5 @@ def login(account, password, headers, proxies):
...
@@ -115,6 +121,5 @@ def login(account, password, headers, proxies):
logging
.
error
(
f
"-------- login_verify: 处理滑块失败!--------"
)
logging
.
error
(
f
"-------- login_verify: 处理滑块失败!--------"
)
logging
.
error
(
f
"-------- login: 登录失败!--------"
)
logging
.
error
(
f
"-------- login: 登录失败!--------"
)
return
None
return
None
logging
.
info
(
f
"-------- login: 登录成功!--------"
)
return
dict
(
get_callback_cookies
(
login_res
.
cookies
,
headers
,
encrypt_params
,
session
))
return
dict
(
get_callback_cookies
(
login_res
.
cookies
,
headers
,
encrypt_params
,
proxies
))
main.py
View file @
2f91b362
...
@@ -3,7 +3,7 @@ from asyncio.log import logger
...
@@ -3,7 +3,7 @@ from asyncio.log import logger
from
DrissionPage
import
Chromium
from
DrissionPage
import
Chromium
from
DrissionPage.common
import
Settings
from
DrissionPage.common
import
Settings
from
common
import
setup_proxy
from
config
import
settings
from
config
import
settings
from
errors
import
*
from
errors
import
*
from
hub_
import
*
from
hub_
import
*
...
@@ -159,7 +159,12 @@ def getProductName(product_type, product_name):
...
@@ -159,7 +159,12 @@ def getProductName(product_type, product_name):
else
:
else
:
raise
NotFoundError
(
"未找到城市"
)
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
=
{
params
=
{
'appid'
:
'1'
,
'appid'
:
'1'
,
'aid'
:
'4272'
,
'aid'
:
'4272'
,
...
@@ -559,7 +564,7 @@ async def createTemplate(cookies, template_params):
...
@@ -559,7 +564,7 @@ async def createTemplate(cookies, template_params):
}
}
logger
.
info
(
rule_list
)
logger
.
info
(
rule_list
)
url
=
'https://fxg.jinritemai.com/freight/template/createTemplate'
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
)
logger
.
info
(
response
)
if
response
[
'code'
]
!=
0
:
if
response
[
'code'
]
!=
0
:
msg
=
response
.
get
(
'msg'
,
''
)
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