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
1505180d
Commit
1505180d
authored
Jul 02, 2025
by
baiquan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加doudian_request
parent
d7c649a4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
154 additions
and
119 deletions
+154
-119
README.md
+1
-1
service/doudian_request.py
+53
-0
service/doudian_service.py
+5
-8
service/upload_video.py
+51
-73
task_worker.py
+44
-37
No files found.
README.md
View file @
1505180d
...
@@ -27,7 +27,7 @@ celery -A celery_app worker -l info -P gevent
...
@@ -27,7 +27,7 @@ celery -A celery_app worker -l info -P gevent
### 启动API服务
### 启动API服务
```
bash
```
bash
uvicorn api:app
--host
0.0.0.0
--port
9001
--reload
uvicorn api:app
--host
0.0.0.0
--port
9001
--reload
--timeout-keep-alive
120
```
```
service/doudian_request.py
0 → 100644
View file @
1505180d
import
requests
from
loguru
import
logger
from
retrying
import
retry
from
utils.errors
import
CookiesExpiredError
HEADERS
=
{
'accept'
:
'application/json, text/plain, */*'
,
'accept-language'
:
'zh-CN,zh;q=0.9'
,
'content-type'
:
'application/json'
,
'origin'
:
'https://fxg.jinritemai.com'
,
'priority'
:
'u=1, i'
,
'referer'
:
'https://fxg.jinritemai.com'
,
'sec-ch-ua'
:
'"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
,
'sec-ch-ua-mobile'
:
'?0'
,
'sec-ch-ua-platform'
:
'"Windows"'
,
'sec-fetch-dest'
:
'empty'
,
'sec-fetch-mode'
:
'cors'
,
'sec-fetch-site'
:
'same-origin'
,
'user-agent'
:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
,
}
@retry
(
stop_max_attempt_number
=
3
,
wait_fixed
=
3000
)
def
doudian_request
(
method
:
str
,
url
:
str
,
proxies
:
dict
,
params
:
dict
=
None
,
data
:
str
=
None
,
json
:
dict
=
None
,
headers
=
None
,
cookies
=
None
,
match_str
=
""
)
->
any
:
if
headers
is
None
:
headers
=
HEADERS
logger
.
info
(
f
'doudian_request-->{url}'
)
method
=
method
.
upper
()
if
method
==
'GET'
:
response
=
requests
.
get
(
url
,
params
=
params
,
headers
=
headers
,
cookies
=
cookies
,
proxies
=
proxies
)
elif
method
==
'POST'
:
response
=
requests
.
post
(
url
,
json
=
json
,
params
=
params
,
data
=
data
,
headers
=
headers
,
cookies
=
cookies
,
proxies
=
proxies
)
else
:
raise
ValueError
(
f
"Unsupported HTTP method: {method}"
)
# 处理响应
if
(
response
.
status_code
==
403
and
"Forbidden"
in
response
.
text
)
or
"登录信息已失效"
in
response
.
text
or
"无权访问此接口"
in
response
.
text
:
raise
CookiesExpiredError
(
"请求失败-->cookies已过期!"
)
if
response
.
text
:
response_data
=
response
.
json
()
if
response_data
.
get
(
'code'
)
==
0
or
response_data
.
get
(
'status_code'
)
==
0
or
response_data
.
get
(
'success'
)
==
0
:
# logger.info(f'send_request响应结果-->{response_data}')
return
{
'data'
:
response_data
.
get
(
'data'
,
{}),
'response_data'
:
response_data
}
elif
match_str
and
match_str
in
response
.
text
:
return
{
'data'
:
response_data
.
get
(
'data'
,
{}),
'response_data'
:
response_data
}
raise
Exception
(
f
"请求失败 --> {response.text}"
)
\ No newline at end of file
service/doudian_service.py
View file @
1505180d
...
@@ -2,10 +2,11 @@ import json
...
@@ -2,10 +2,11 @@ import json
from
urllib.parse
import
urlencode
from
urllib.parse
import
urlencode
import
execjs
import
execjs
import
requests
from
loguru
import
logger
from
service.doudian_request
import
doudian_request
from
utils.common
import
check_proxy
from
utils.common
import
check_proxy
def
generate_a_bogus
(
params
:
str
|
dict
,
data
:
dict
,
ua
:
str
,
params_type
:
int
=
1
):
def
generate_a_bogus
(
params
:
str
|
dict
,
data
:
dict
,
ua
:
str
,
params_type
:
int
=
1
):
"""生成加密参数"""
"""生成加密参数"""
# 直接读取JS文件
# 直接读取JS文件
...
@@ -19,12 +20,8 @@ def generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: int=1):
...
@@ -19,12 +20,8 @@ def generate_a_bogus(params:str | dict,data: dict,ua: str, params_type: int=1):
raise
Exception
(
'params_type error'
)
raise
Exception
(
'params_type error'
)
# 执行加密算法
# 执行加密算法
ctx
=
execjs
.
compile
(
js_code
)
ctx
=
execjs
.
compile
(
js_code
)
logger
.
info
(
f
'params: {params}'
)
logger
.
info
(
f
'params_type: {type(params)}'
)
if
type
(
params
)
==
dict
:
if
type
(
params
)
==
dict
:
params
=
urlencode
(
params
)
params
=
urlencode
(
params
)
logger
.
info
(
f
'data: {data}'
)
logger
.
info
(
f
'data_type: {type(data)}'
)
data
=
json
.
dumps
(
data
)
data
=
json
.
dumps
(
data
)
result
=
ctx
.
call
(
'get_ab'
,
params
,
data
,
ua
)
result
=
ctx
.
call
(
'get_ab'
,
params
,
data
,
ua
)
return
result
return
result
...
@@ -55,7 +52,7 @@ def get_schema(headers: dict, proxy_url: str, category_id: str):
...
@@ -55,7 +52,7 @@ def get_schema(headers: dict, proxy_url: str, category_id: str):
a_bogus
=
generate_a_bogus
(
params
,
json_data
,
ua
)
a_bogus
=
generate_a_bogus
(
params
,
json_data
,
ua
)
params
[
'a_bogus'
]
=
a_bogus
params
[
'a_bogus'
]
=
a_bogus
proxies
=
check_proxy
(
proxy_url
)
proxies
=
check_proxy
(
proxy_url
)
response
=
requests
.
post
(
url
,
params
=
params
,
headers
=
headers
,
json
=
json_data
,
verify
=
False
,
proxies
=
proxie
s
)
response
=
doudian_request
(
"POST"
,
url
,
params
=
params
,
proxies
=
proxies
,
json
=
json_data
,
headers
=
header
s
)
return
response
return
response
def
create_global_promotion
(
params
:
str
|
dict
,
data
:
dict
,
headers
:
dict
,
proxy_url
:
str
):
def
create_global_promotion
(
params
:
str
|
dict
,
data
:
dict
,
headers
:
dict
,
proxy_url
:
str
):
...
@@ -70,5 +67,5 @@ def create_global_promotion(params:str | dict,data: dict,headers: dict, proxy_ur
...
@@ -70,5 +67,5 @@ def create_global_promotion(params:str | dict,data: dict,headers: dict, proxy_ur
params
[
'a_bogus'
]
=
a_bogus
params
[
'a_bogus'
]
=
a_bogus
url_params
=
urlencode
(
params
)
url_params
=
urlencode
(
params
)
url
=
'https://qianchuan.jinritemai.com/ad/api/creation/v1/ad/create?'
+
url_params
url
=
'https://qianchuan.jinritemai.com/ad/api/creation/v1/ad/create?'
+
url_params
response
=
requests
.
post
(
url
,
json
=
data
,
headers
=
headers
,
verify
=
False
,
proxies
=
proxie
s
)
response
=
doudian_request
(
"POST"
,
url
,
proxies
=
proxies
,
json
=
data
,
headers
=
header
s
)
return
response
return
response
service/upload_video.py
View file @
1505180d
This diff is collapsed.
Click to expand it.
task_worker.py
View file @
1505180d
...
@@ -2,7 +2,6 @@ import asyncio
...
@@ -2,7 +2,6 @@ import asyncio
from
celery
import
shared_task
from
celery
import
shared_task
from
loguru
import
logger
from
loguru
import
logger
from
retrying
import
retry
from
service.create_template
import
create_template
from
service.create_template
import
create_template
from
service.doudian_service
import
generate_a_bogus
,
get_schema
,
create_global_promotion
from
service.doudian_service
import
generate_a_bogus
,
get_schema
,
create_global_promotion
...
@@ -10,7 +9,7 @@ from service.hub_ import closeBrowser
...
@@ -10,7 +9,7 @@ from service.hub_ import closeBrowser
from
service.login
import
login
from
service.login
import
login
from
service.sync_shop
import
syncShop
,
syncShopInfo
from
service.sync_shop
import
syncShop
,
syncShopInfo
from
service.upload_video
import
upload_video
from
service.upload_video
import
upload_video
from
utils.errors
import
AppError
,
ABogusParamsError
,
CookiesExpiredError
from
utils.errors
import
AppError
@shared_task
(
name
=
'sync_shop'
)
@shared_task
(
name
=
'sync_shop'
)
...
@@ -26,7 +25,7 @@ def execute_sync_shop(container_name: str):
...
@@ -26,7 +25,7 @@ def execute_sync_shop(container_name: str):
'error_type'
:
''
'error_type'
:
''
}
}
except
AppError
as
e
:
except
AppError
as
e
:
logger
.
error
(
f
'店铺同步
异常
:{e.msg}'
)
logger
.
error
(
f
'店铺同步
失败
:{e.msg}'
)
return
{
return
{
'code'
:
e
.
code
,
'code'
:
e
.
code
,
'msg'
:
e
.
msg
,
'msg'
:
e
.
msg
,
...
@@ -59,7 +58,7 @@ def execute_sync_shop_info(browser_id: str, listen_url: str, open_url: str):
...
@@ -59,7 +58,7 @@ def execute_sync_shop_info(browser_id: str, listen_url: str, open_url: str):
'error_type'
:
''
'error_type'
:
''
}
}
except
AppError
as
e
:
except
AppError
as
e
:
logger
.
error
(
f
'同步店铺信息
异常
:{e.msg}'
)
logger
.
error
(
f
'同步店铺信息
失败
:{e.msg}'
)
return
{
return
{
'code'
:
e
.
code
,
'code'
:
e
.
code
,
'msg'
:
e
.
msg
,
'msg'
:
e
.
msg
,
...
@@ -89,7 +88,7 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies:
...
@@ -89,7 +88,7 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies:
'error_type'
:
''
'error_type'
:
''
}
}
except
AppError
as
e
:
except
AppError
as
e
:
logger
.
error
(
f
'创建运费模板
异常
:{e.msg}'
)
logger
.
error
(
f
'创建运费模板
失败
:{e.msg}'
)
return
{
return
{
'code'
:
e
.
code
,
'code'
:
e
.
code
,
'msg'
:
e
.
msg
,
'msg'
:
e
.
msg
,
...
@@ -97,10 +96,10 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies:
...
@@ -97,10 +96,10 @@ def execute_sync_create_template(cookies: dict, template_params: dict, proxies:
'error_type'
:
type
(
e
)
.
__name__
'error_type'
:
type
(
e
)
.
__name__
}
}
except
Exception
as
e
:
except
Exception
as
e
:
logger
.
error
(
f
'创建运费模板:{e}'
)
logger
.
error
(
f
'创建运费模板
异常
:{e}'
)
return
{
return
{
'code'
:
500
,
'code'
:
500
,
'msg'
:
f
'创建运费模板:{e}'
,
'msg'
:
f
'创建运费模板
异常
:{e}'
,
'data'
:
None
,
'data'
:
None
,
'error_type'
:
'InternalError'
'error_type'
:
'InternalError'
}
}
...
@@ -117,7 +116,7 @@ def execute_doudian_login(account: str, password: str, headers: dict, proxies: d
...
@@ -117,7 +116,7 @@ def execute_doudian_login(account: str, password: str, headers: dict, proxies: d
'error_type'
:
''
'error_type'
:
''
}
}
except
AppError
as
e
:
except
AppError
as
e
:
logger
.
error
(
f
'登录
异常
:{e.msg}'
)
logger
.
error
(
f
'登录
失败
:{e.msg}'
)
return
{
return
{
'code'
:
e
.
code
,
'code'
:
e
.
code
,
'msg'
:
e
.
msg
,
'msg'
:
e
.
msg
,
...
@@ -138,6 +137,7 @@ def execute_doudian_upload_video(task: dict):
...
@@ -138,6 +137,7 @@ def execute_doudian_upload_video(task: dict):
"""上传视频"""
"""上传视频"""
try
:
try
:
result
=
upload_video
(
task
)
result
=
upload_video
(
task
)
logger
.
success
(
f
'视频上传成功-->{result}'
)
return
{
return
{
'code'
:
200
,
'code'
:
200
,
'msg'
:
'success'
,
'msg'
:
'success'
,
...
@@ -145,7 +145,7 @@ def execute_doudian_upload_video(task: dict):
...
@@ -145,7 +145,7 @@ def execute_doudian_upload_video(task: dict):
'error_type'
:
''
'error_type'
:
''
}
}
except
AppError
as
e
:
except
AppError
as
e
:
logger
.
error
(
f
'上传视频
异常
:{e.msg}'
)
logger
.
error
(
f
'上传视频
失败
:{e.msg}'
)
return
{
return
{
'code'
:
e
.
code
,
'code'
:
e
.
code
,
'msg'
:
e
.
msg
,
'msg'
:
e
.
msg
,
...
@@ -166,6 +166,7 @@ def execute_generate_a_bogus(params:str | dict,data: dict,ua: str, params_type:
...
@@ -166,6 +166,7 @@ def execute_generate_a_bogus(params:str | dict,data: dict,ua: str, params_type:
"""生成加密参数"""
"""生成加密参数"""
try
:
try
:
result
=
generate_a_bogus
(
params
,
data
,
ua
,
params_type
)
result
=
generate_a_bogus
(
params
,
data
,
ua
,
params_type
)
logger
.
success
(
f
'生成加密成功-->{result}'
)
return
{
return
{
'code'
:
200
,
'code'
:
200
,
'msg'
:
'success'
,
'msg'
:
'success'
,
...
@@ -186,21 +187,14 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str):
...
@@ -186,21 +187,14 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str):
"""获取类目参数"""
"""获取类目参数"""
try
:
try
:
response
=
get_schema
(
headers
,
proxy_url
,
category_id
)
response
=
get_schema
(
headers
,
proxy_url
,
category_id
)
if
not
response
.
text
:
result
=
response
.
get
(
'data'
,
{})
raise
ABogusParamsError
(
data
=
response
.
text
)
logger
.
success
(
f
'获取类目参数成功-->{result}'
)
if
response
.
json
()
.
get
(
'code'
)
==
0
:
return
{
result
=
response
.
json
()
.
get
(
'data'
,
{})
'code'
:
200
,
return
{
'msg'
:
'success'
,
'code'
:
200
,
'data'
:
result
,
'msg'
:
'success'
,
'error_type'
:
''
'data'
:
result
,
}
'error_type'
:
''
}
elif
response
.
json
()
.
get
(
'code'
)
==
10004
or
response
.
json
()
.
get
(
'code'
)
==
10008
:
raise
CookiesExpiredError
(
data
=
response
.
text
)
logger
.
error
(
f
'获取类目参数异常-->{response.text}'
)
raise
AppError
(
msg
=
response
.
json
()
.
get
(
'msg'
),
data
=
response
.
text
)
except
AppError
as
e
:
except
AppError
as
e
:
logger
.
error
(
f
'获取类目参数失败-->{e.msg}'
)
logger
.
error
(
f
'获取类目参数失败-->{e.msg}'
)
return
{
return
{
...
@@ -218,19 +212,32 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str):
...
@@ -218,19 +212,32 @@ def execute_get_schema(headers: dict, proxy_url: str, category_id: str):
'error_type'
:
'InternalError'
'error_type'
:
'InternalError'
}
}
@retry
(
stop_max_attempt_number
=
3
,
wait_fixed
=
3000
)
@shared_task
(
name
=
'create_global_promotion'
)
@shared_task
(
name
=
'create_global_promotion'
)
def
execute_create_global_promotion
(
params
:
str
|
dict
,
data
:
dict
,
headers
:
dict
,
proxy_url
:
str
):
def
execute_create_global_promotion
(
params
:
str
|
dict
,
data
:
dict
,
headers
:
dict
,
proxy_url
:
str
):
"""创建全域推广"""
"""创建全域推广"""
response
=
create_global_promotion
(
params
,
data
,
headers
,
proxy_url
)
try
:
response_data
=
response
.
json
()
response
=
create_global_promotion
(
params
,
data
,
headers
,
proxy_url
)
if
response_data
.
get
(
'status_code'
,
-
1
)
!=
0
:
result
=
response
.
get
(
'data'
,
{})
logger
.
error
(
f
"创建全局推广失败 --> {response.text}"
)
logger
.
success
(
f
'创建全域推广成功-->{result}'
)
raise
Exception
(
f
"创建全局推广失败 --> {response.text}"
)
return
{
result
=
response_data
.
get
(
'data'
,
{})
'code'
:
200
,
return
{
'msg'
:
'success'
,
'code'
:
200
,
'data'
:
result
,
'msg'
:
'success'
,
'error_type'
:
''
'data'
:
result
,
}
'error_type'
:
''
except
AppError
as
e
:
}
logger
.
error
(
f
'创建全局推广失败-->{e.msg}'
)
return
{
'code'
:
e
.
code
,
'msg'
:
e
.
msg
,
'data'
:
e
.
data
,
'error_type'
:
type
(
e
)
.
__name__
}
except
Exception
as
e
:
logger
.
error
(
f
'创建全局推广错误-->{e}'
)
return
{
'code'
:
500
,
'msg'
:
f
'创建全局推广错误:{e}'
,
'data'
:
None
,
'error_type'
:
'InternalError'
}
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