add workflow partner1site,dev
This commit is contained in:
parent
19f9a062cc
commit
ee35021969
|
@ -1,8 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
partner1site 多数据来源 API 请求模块
|
||||
支持自动分页,并存储到 PostgreSQL
|
||||
Partner1site 全接口抓取脚本
|
||||
分页结束条件:hasNext == False
|
||||
"""
|
||||
|
||||
import random
|
||||
|
@ -13,14 +13,14 @@ import requests
|
|||
import json
|
||||
import uuid
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from typing import List, Dict, Any
|
||||
from typing import Dict, Any
|
||||
import psycopg2
|
||||
|
||||
# ======= 配置区 =======
|
||||
ACCESS_KEY = "75c4ab4d-6a67-4aed-8b1d-5bb64fd36afc"
|
||||
SECRET_KEY = "117347a7dd066a50a4d2973c5f3d5ba9101094c5"
|
||||
|
||||
# URL 用占位符,外部替换
|
||||
# URL 用占位符(外部替换)
|
||||
BASE_URLS = {
|
||||
"visits": "http://onesite.tek.cn/api/summary/visits", # 客户拜访数据
|
||||
"reports": "http://onesite.tek.cn/api/summary/visits", # 报备数据
|
||||
|
@ -41,9 +41,7 @@ API_ID = "2460976d-00c1-47d9-84b2-33e66d68" # 外部传入 api_id,占位符
|
|||
|
||||
|
||||
class Partner1SiteClient:
|
||||
"""
|
||||
partner1site API 客户端
|
||||
"""
|
||||
"""Partner1site API 客户端"""
|
||||
|
||||
def __init__(self, access_key: str, secret_key: str):
|
||||
self.ak = access_key
|
||||
|
@ -54,7 +52,7 @@ class Partner1SiteClient:
|
|||
return base64.urlsafe_b64encode(data).decode()
|
||||
|
||||
def gen_token(self, expire_sec: int = 600) -> str:
|
||||
"""生成 token —— 按调通算法"""
|
||||
"""生成 API Token"""
|
||||
random_num = str(random.randint(100000, 999999))
|
||||
deadline = int(datetime.now(timezone.utc).timestamp()) + expire_sec
|
||||
parm_str = f"{random_num}:{deadline}"
|
||||
|
@ -64,14 +62,14 @@ class Partner1SiteClient:
|
|||
return f"{self.ak}:{enc_sign}:{enc_parm}"
|
||||
|
||||
def fetch_all_pages(self, api_name: str, params: Dict[str, Any]):
|
||||
"""通用分页请求"""
|
||||
"""通用分页请求(结束条件:hasNext == False)"""
|
||||
if api_name not in BASE_URLS:
|
||||
raise ValueError(f"未知 API 数据来源: {api_name}")
|
||||
|
||||
base_url = BASE_URLS[api_name]
|
||||
all_data = []
|
||||
page_num = 0
|
||||
page_size = 50 # 固定页容量
|
||||
page_size = 50 # 固定每页大小
|
||||
|
||||
while True:
|
||||
token = self.gen_token()
|
||||
|
@ -82,7 +80,7 @@ class Partner1SiteClient:
|
|||
"page": page_num
|
||||
})
|
||||
|
||||
resp = requests.get(base_url, params=params_with_paging, timeout=15)
|
||||
resp = requests.get(base_url, params=params_with_paging, timeout=30)
|
||||
resp.raise_for_status()
|
||||
data_json = resp.json()
|
||||
|
||||
|
@ -91,9 +89,12 @@ class Partner1SiteClient:
|
|||
|
||||
content = data_json.get("data", {}).get("content", [])
|
||||
all_data.extend(content)
|
||||
print(f"[{api_name}] 页码 {page_num} -> 本页 {len(content)} 条")
|
||||
total_elements = data_json.get("data", {}).get("totalElements")
|
||||
has_next = data_json.get("data", {}).get("hasNext", False)
|
||||
|
||||
if data_json.get("data", {}).get("last", True):
|
||||
print(f"[{api_name}] 页码 {page_num} -> 本页 {len(content)} 条,累计 {len(all_data)} 条 / 总数 {total_elements}")
|
||||
|
||||
if not has_next:
|
||||
break
|
||||
|
||||
page_num += 1
|
||||
|
@ -131,44 +132,43 @@ def save_json_to_pg(data: list, api_id: str) -> None:
|
|||
|
||||
|
||||
def get_previous_date(days: int = 0) -> str:
|
||||
"""获取 N 天前的日期字符串"""
|
||||
return (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d")
|
||||
|
||||
|
||||
def main():
|
||||
client = Partner1SiteClient(ACCESS_KEY, SECRET_KEY)
|
||||
|
||||
# ✅ 1️⃣ 客户拜访数据
|
||||
# ✅ 客户拜访数据(执行)
|
||||
visits_data = client.fetch_all_pages(
|
||||
api_name="visits",
|
||||
# params={"startInsertDate": get_previous_date(5), "endInsertDate": get_previous_date(0)}
|
||||
params={}
|
||||
params={} # 拉全量,若有默认时间限制可改成 {"startInsertDate":"2000-01-01","endInsertDate":get_previous_date(0)}
|
||||
params={"startInsertDate":"2025-08-20","endInsertDate":get_previous_date(0)}
|
||||
)
|
||||
save_json_to_pg(visits_data, API_ID)
|
||||
|
||||
# ❌ 2️⃣ 报备数据(注释掉,后续可启用)
|
||||
# ❌ 报备数据(暂时注释)
|
||||
"""
|
||||
reports_data = client.fetch_all_pages(
|
||||
api_name="reports",
|
||||
params={"startApplyDate": get_previous_date(5), "endApplyDate": get_previous_date(0)}
|
||||
params={}
|
||||
)
|
||||
save_json_to_pg(reports_data, API_ID)
|
||||
"""
|
||||
|
||||
# ❌ 3️⃣ POS 数据(注释掉,后续可启用)
|
||||
# ❌ POS 数据(暂时注释)
|
||||
"""
|
||||
pos_data = client.fetch_all_pages(
|
||||
api_name="pos_datas",
|
||||
params={"startPosInsertDate": get_previous_date(10), "endPosInsertDate": get_previous_date(0)}
|
||||
params={}
|
||||
)
|
||||
save_json_to_pg(pos_data, API_ID)
|
||||
"""
|
||||
|
||||
# ❌ 4️⃣ 客户及联系人数据(注释掉,后续可启用)
|
||||
# ❌ 客户及联系人数据(暂时注释)
|
||||
"""
|
||||
cust_contact_data = client.fetch_all_pages(
|
||||
api_name="customer_and_contact_datas",
|
||||
params={"customerId": 0, "customerContactId": 0}
|
||||
params={}
|
||||
)
|
||||
save_json_to_pg(cust_contact_data, API_ID)
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue