Переглянути джерело

完成报告上传接口,获取阿里云文件数据库中的file_id

Sherlock1011 11 місяців тому
батько
коміт
e70b1d8d72
5 змінених файлів з 76 додано та 80 видалено
  1. 58 46
      api.py
  2. 8 32
      api_test.py
  3. 3 2
      config/__init__.py
  4. 5 0
      config/config.py
  5. 2 0
      config/service_config.yaml

+ 58 - 46
api.py

@@ -1,3 +1,4 @@
+from config
 from fastapi import FastAPI, Request, status, BackgroundTasks
 from fastapi.exceptions import RequestValidationError
 from fastapi.responses import JSONResponse
@@ -7,6 +8,7 @@ import os
 from pydantic import BaseModel
 import uvicorn
 from utils import ReportUtils
+import requests
 from typing import List, Dict
 
 app = FastAPI()
@@ -81,53 +83,63 @@ def generate_report(city_uuid, product_id, recall_count, delivery_count):
     """生成报告"""
     report_util = ReportUtils(city_uuid, product_id)
     report_util.generate_all_data(recall_count, delivery_count)
+    repots_dir = os.path.join('./data/reports', city_uuid, product_id)
+    upload_file(repots_dir)
     
-REPORT_FILES = [
-    "卷烟信息表.xlsx",
-    "品规商户特征关系表.xlsx",
-    "商户售卖推荐表.xlsx",
-    "相似卷烟表.xlsx"
-]
-
-@app.get("/brandcultivation/api/v1/download_report")
-async def get_report_files(city_uuid: str, product_code: str) -> JSONResponse:
-    report_dir = os.path.join("./data/reports", city_uuid, product_code)
-    
-    # 检查报告是否存在
-    if not os.path.exists(report_dir):
-        return JSONResponse(
-            status_code=200,
-            content={
-                "code": 200,
-                "msg": "report directory not found",
-                "data": {"reportDownloadInfo": "该品规报告还未生成!"}
-            }
-        )
-    
-    # 收集所有存在的文件
-    available_files:List[Dict[str, str]] = []
-    base_url = "http://127.0.0.1:7960"
-    
-    for filename in REPORT_FILES:
-        file_path = os.path.join(report_dir, filename)
-        if os.path.exists(file_path):
-            file_url = f"{base_url}/brandcultivation/api/v1/download_file/{city_uuid}/{product_code}/{filename}"
-            available_files.append({
-                "filename": filename,
-                "download_url": file_url
-            })
-            
-    return JSONResponse(
-        status_code=200,
-        content={
-            "code": 200,
-            "msg": "success",
-            "data": {
-                "reportDownloadInfo": available_files
-            }
-        }
-    )
+def upload_file(reports_dir):
+    """上传报告文件"""
+    base_url = "https://10-79-117-86-8p1kxyomtjwgt3.ztna-dingtalk.com/screen/mapi/file/fileUpload"
+    files = [
+        "卷烟信息表.xlsx",
+        "品规商户特征关系表.xlsx",
+        "相似卷烟表.xlsx"
+    ]
+    # 设置请求头
+    headers = {
+        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
+        "Accept": "*/*",
+    }
+    # 设置Cookie
+    cookies = {
+        "ecp_token": "ZXlKamIyUmxJam9pTURZMVltUXpZbUV5T0dWaFl6ZzRPREJqTkRjNU5ERXpaV0k0T1dRd1pERWlMQ0p6WTI5d1pTSTZJbkJ5YjNSbFkzUmxaQ0lzSW1Oc2FXVnVkQ0k2SW1Oc2FXVnVkRjlzYjI1bmFta2lmUT09",
+        "acw_tc": "0a03176c17452016143048775e73c8e9556c4c3ee2dbc80f405a9314a5d0e5",
+        "cna": "09T8H5zH8SoCASeqHG9RyLbu",
+        "isg": "BDAwNyXyI9cQD__-0PkIodjTAfiCeRTD-vUtYyqmIw3d5bGP0Y0nUayWOe2F3syb",
+        "dd-ztna-token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIwNTAwMzQzMDM4MjYxNDMwOTQiLCJjb3JwSWQiOiJkaW5nYzc2YTJhMzdiMjRhODYwYTRhYzVkNjk4MDg2NGQzMzUiLCJkZXB0SWRzIjoiW1s4Mzk0NzIxNjAsODM2MjQ1MTUzLDFdXSIsInJvbGVJZHMiOiJbMjEwNDk3MDY1OF0iLCJ1bmlvbklkIjoiVXFyYTB4U0VQcWNxdFNhQTFqSzRzZ2lFaUUiLCJleHAiOjE3NDU4MDY0MjIsImlhdCI6MTc0NTIwMTYyMn0.S0K3UWF0fBP5fF6TQaUkxe8I7piSQjrXqG3DdviqTzdO9Y0J7wsydcRvfp-OuHUkXbY92diIBGRHBr5Bb0eYgmCZ946Q8CHk12WXWvJmMDPrQ4i2C1J7W7uzUuPYJiWQLGQd40iCxNKfZIGq2ML-6r1i_k0iA7L_f6En1e9b5gLIs0GaluUwhCTTpAHBsmb-FquQER2Um9igARbMT6aaNrJzQbcPPWntQ3Pz_65PgjtTUMiFtBZW-YeAm2iB9JtYo_SJUsoX0d_oYo-6D4IfgZtkYKZZxbLj5rWnhoaJHm5acELAO8otQNZYQra0PfRIaKTT1vNkr1L5rShIxZk3yQ"
+    }
+    files_id = {}
+    for file in files:
+        file_path = os.path.join(reports_dir, file)
+        try:
+            with open(file_path, 'rb') as f:
+                files = {'file': (os.path.basename(file_path), f)}
+                
+                response = requests.post(
+                    base_url,
+                    headers=headers,
+                    cookies=cookies,
+                    files=files,
+                    verify=True
+                )
+                
+                if response.json()["success"]:
+                    file_id = response.json()["data"]["file_info"]["fileid"]
+                    files_id[os.path.basename(file_path).split('.')[0]] = file_id
+        except requests.exceptions.RequestException as e:
+            print("请求出错:", e)
+        except Exception as e:
+            print("发生错误:", e)
     
+    files_id_str = ""
+    if files_id:
+        for filename, file_id in files_id.items():
+            files_id_str += f"{filename}, {file_id}\n"
+    else:
+        files_id_str = "failed"
+    with open(os.path.join(reports_dir, "files_id.txt"), 'w', encoding="utf-8") as file:
+        file.write(files_id_str)
 
 if __name__ == "__main__":
-    uvicorn.run(app, host="0.0.0.0", port=7960)
+    uvicorn.run(app, host="0.0.0.0", port=7960)
+    # report_dir = "./data/reports/00000000000000000000000011445301/440298"
+    # upload_file(report_dir)

+ 8 - 32
api_test.py

@@ -1,38 +1,14 @@
 import requests
 import json
 
-# url = "http://127.0.0.1:7960/brandcultivation/api/v1/recommend"
-# payload = {
-#     "city_uuid": "00000000000000000000000011445301",
-#     "product_code": "440298",
-#     "recall_cust_count": 500,
-#     "delivery_count": 5000
-# }
-# headers = {'Content-Type': 'application/json'}
-
-# response = requests.post(url, data=json.dumps(payload), headers=headers)
-# print(response.json())
-
-# 2. 然后调用报告下载接口
-download_url = "http://127.0.0.1:7960/brandcultivation/api/v1/download_report"
-download_payload = {
+url = "http://127.0.0.1:7960/brandcultivation/api/v1/recommend"
+payload = {
     "city_uuid": "00000000000000000000000011445301",
-    "product_code": "440298"
+    "product_code": "440298",
+    "recall_cust_count": 500,
+    "delivery_count": 5000
 }
-download_headers = {'Content-Type': 'application/json'}
-
-print("\n调用报告下载接口...")
-download_response = requests.get(
-    download_url,
-    params=download_payload,  # 注意GET请求使用params而不是data
-    headers=download_headers
-)
-print(json.dumps(download_response.json(), indent=2))
+headers = {'Content-Type': 'application/json'}
 
-if download_response.json().get("code") == 200:
-    for file_info in download_response.json()["data"]["reportDownloadInfo"]:
-        print(f"\n下载文件: {file_info['filename']}")
-        file_response = requests.get(file_info["download_url"])
-        with open(file_info["filename"], "wb") as f:
-            f.write(file_response.content)
-        print(f"已保存到: {file_info['filename']}")
+response = requests.post(url, data=json.dumps(payload), headers=headers)
+print(response.json())

+ 3 - 2
config/__init__.py

@@ -1,8 +1,9 @@
 #!/usr/bin/env python3
 # -*- coding:utf-8 -*-
-from config.config import load_config, load_model_config
+from config.config import load_config, load_model_config, load_service_config
 
 __all__ = [
     "load_config",
-    "load_model_config"
+    "load_model_config",
+    "load_service_config"
 ]

+ 5 - 0
config/config.py

@@ -8,4 +8,9 @@ def load_config():
 def load_model_config():
     with open('./config/model_config.yaml') as file:
         config = yaml.safe_load(file)
+    return config
+
+def load_service_config():
+    with open("./config/model_config.yaml") as file:
+        config = yaml,safe_load(file)
     return config

+ 2 - 0
config/service_config.yaml

@@ -0,0 +1,2 @@
+aliyun:
+  upload_url: "https://10-79-117-86-8p1kxyomtjwgt3.ztna-dingtalk.com/screen/mapi/file/fileUpload"