From 90e496298b21f0594b85535ec47d26d2d7d5a9ed Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期四, 03 七月 2025 17:33:09 +0800
Subject: [PATCH] fix:生成的内容
---
app.py | 200 ++++++++++++++++++-
test2.py | 381 +++++++++++++++++++++----------------
2 files changed, 404 insertions(+), 177 deletions(-)
diff --git a/app.py b/app.py
index 9a8237a..872cff9 100644
--- a/app.py
+++ b/app.py
@@ -203,13 +203,14 @@
# 还款短信特征
repayment_keywords = [
"还款", "账单", "信用卡", "借款", "贷款", "逾期", "欠款", "最低还款",
- "应还金额", "到期还款", "还清", "应还", "还款日", "账单¥", "账单¥", "查账还款"
+ "应还金额", "到期还款", "还清", "应还", "还款日", "账单¥", "账单¥", "查账还款",
+ "扣款用于", "房贷还款", "信用卡还款", "车贷还款", "应还款额", "最低还款额"
]
# 收入短信特征
income_keywords = [
"收入", "转账", "入账", "到账", "支付", "工资", "报销", "余额",
- "成功收款", "收到", "款项"
+ "成功收款", "收到", "款项", "收入金额"
]
# 航班/火车票特征
@@ -342,8 +343,15 @@
# 快递关键词
"快递", "包裹", "取件码", "取件", "签收", "派送", "配送",
# 收入关键词
- "收入", "转账", "入账", "到账", "支付成功", "工资"
+ "收入", "转账", "入账", "到账", "支付成功", "工资", "支付宝转账", "微信转账"
]
+
+ # 先检查是否为收入短信(优先于通知判断)
+ income_indicators = ["收入", "入账", "转账", "工资"]
+ for indicator in income_indicators:
+ if indicator in text and "元" in text:
+ # 可能是收入短信,不要判断为通知
+ return False
# 运营商余额通知特征
telecom_balance_patterns = [
@@ -458,20 +466,62 @@
if word in code:
code = code[:code.index(word)]
- # 只保留字母、数字和连字符
- code = ''.join(c for c in code if c.isalnum() or c == "-")
+ # 针对不同快递公司采取不同策略
+ if "丰巢" in text or "蜂巢" in text:
+ # 对于丰巢快递,只保留数字
+ code = ''.join(c for c in code if c.isdigit())
+ elif "中国邮政" in text:
+ # 对于中国邮政,尝试提取完整货位号
+ cargo_match = re.search(r'货号[::]\s*([0-9A-Za-z\-]+)', text)
+ if cargo_match:
+ code = cargo_match.group(1)
+ else:
+ # 保留原始格式(字母、数字和连字符)
+ code = ''.join(c for c in code if c.isalnum() or c == "-")
+ else:
+ # 对于其他快递,保留字母、数字和连字符
+ code = ''.join(c for c in code if c.isalnum() or c == "-")
# 确保格式正确
- parts = code.split("-")
- valid_parts = []
- for part in parts:
- if part and any(c.isalnum() for c in part):
- valid_parts.append(part)
-
- if valid_parts:
- result["pickup_code"] = "-".join(valid_parts)
+ if "丰巢" in text or "蜂巢" in text:
+ # 对于丰巢快递,只保留数字
+ if code.isdigit():
+ result["pickup_code"] = code
+ else:
+ # 如果没有数字,尝试再次从文本中匹配纯数字取件码
+ pickup_code_match = re.search(r'码[^0-9]*(\d+)', text)
+ if pickup_code_match:
+ result["pickup_code"] = pickup_code_match.group(1)
+ else:
+ result["pickup_code"] = None
+ elif "中国邮政" in text:
+ # 对于中国邮政,验证格式是否合理
+ if re.match(r'[0-9A-Za-z\-]+', code):
+ result["pickup_code"] = code
+ else:
+ # 二次尝试:从文本中直接获取货位号
+ cargo_match = re.search(r'货号[::]\s*([0-9A-Za-z\-]+)', text)
+ if cargo_match:
+ result["pickup_code"] = cargo_match.group(1)
+ else:
+ # 最后尝试:提取"取件密码"后的纯数字序列
+ password_match = re.search(r'密码\s*(\d+)', text)
+ if password_match:
+ result["pickup_code"] = password_match.group(1)
+ else:
+ result["pickup_code"] = None
else:
- result["pickup_code"] = None
+ # 对于其他快递,保持原有逻辑
+ parts = code.split("-")
+ valid_parts = []
+ for part in parts:
+ if part and any(c.isalnum() for c in part):
+ valid_parts.append(part)
+
+ if valid_parts:
+ result["pickup_code"] = "-".join(valid_parts)
+ else:
+ result["pickup_code"] = None
# 清理公司名称
if result["company"]:
@@ -480,7 +530,16 @@
for word in invalid_words:
if company.endswith(word):
company = company[:-len(word)]
+
+ # 特殊处理中国邮政
+ if company == "中国" and "中国邮政" in text:
+ company = "邮政"
+ elif "中国邮政" in text and not company:
+ company = "邮政"
+
result["company"] = company.strip()
+ elif "中国邮政" in text: # 如果NER未识别但文本中有中国邮政
+ result["company"] = "邮政"
# 清理地址
if result["address"]:
@@ -623,7 +682,8 @@
# 尝试查找最低还款金额
min_amount_match = re.search(r'最低还款([\d,]+\.?\d*)(?:元|块钱|块|万元|万)?', context)
- if min_amount_match and "MIN_CODE" in current_entity["type"]:
+ # 修复:确保current_entity存在且有type属性再使用
+ if min_amount_match and 'current_entity' in locals() and current_entity is not None and "MIN_CODE" in current_entity["type"]:
return min_amount_match.group(1) # 直接返回匹配到的最低还款金额,保留原始格式
# 在上下文中查找完整金额
@@ -1360,6 +1420,103 @@
# 保存原始短信内容到文件
save_sms_to_file(text)
+ # 已还清或已结清的短信模式
+ already_paid_patterns = [
+ r"已还清",
+ r"已结清",
+ r"还款.*?入账后.*?已还清",
+ r"还款.*?入账.*?结清"
+ ]
+
+ # 检查是否为已还清/已结清的短信
+ for pattern in already_paid_patterns:
+ if re.search(pattern, text):
+ logger.info(f"识别为已还清/已结清短信,归类为其他: {text[:30]}...")
+ category = "其他"
+ save_sms_to_file(text, category, 1.0)
+ return jsonify({
+ "status": "success",
+ "data": {
+ "category": category,
+ "details": {}
+ }
+ })
+
+ # 银行收入短信特征识别
+ income_patterns = [
+ r"收入金额[\d,.]+元",
+ r"账户.*?收入.*?[\d,.]+元",
+ r"账户.*?工资",
+ r"工资.*?收入",
+ r"入账[\d,.]+元",
+ # 添加新模式匹配南京银行等类似格式
+ r"收入\d+\.\d+元",
+ r"账号.*?收入\d+\.\d+元",
+ r"尾号\d+的账号.*?收入\d+\.\d+元",
+ r"支付宝转账",
+ r"转账.*?收入"
+ ]
+
+ # 银行还款短信特征识别
+ repayment_patterns = [
+ r"信用卡.*?还款",
+ r"账单.*?[\d,.]+元",
+ r"应还款额.*?[\d,.]+元",
+ r"最低还款额.*?[\d,.]+元",
+ r"到期还款日",
+ r"扣款.*?用于.*?还款",
+ r"扣款.*?用于.*?贷款",
+ r"扣款.*?用于.*?信用卡",
+ r"车贷还款",
+ r"房贷还款",
+ r"贷款还款",
+ r"信用卡账单",
+ r"下次还款日"
+ ]
+
+ # 检查是否为收入短信
+ for pattern in income_patterns:
+ if re.search(pattern, text):
+ logger.info(f"识别为收入短信: {text[:30]}...")
+ category = "收入"
+ details = model_manager.extract_income_entities(text)
+ save_sms_to_file(text, category, 1.0)
+ return jsonify({
+ "status": "success",
+ "data": {
+ "category": category,
+ "details": details
+ }
+ })
+
+ # 检查是否为还款短信
+ for pattern in repayment_patterns:
+ if re.search(pattern, text):
+ # 二次检查:如果包含"已还清"或"已结清"等词,归类为"其他"
+ if any(re.search(paid_pattern, text) for paid_pattern in already_paid_patterns):
+ logger.info(f"虽然识别为还款短信,但包含已还清/已结清,归类为其他: {text[:30]}...")
+ category = "其他"
+ save_sms_to_file(text, category, 1.0)
+ return jsonify({
+ "status": "success",
+ "data": {
+ "category": category,
+ "details": {}
+ }
+ })
+
+ logger.info(f"识别为还款短信: {text[:30]}...")
+ category = "还款"
+ details = model_manager.extract_repayment_entities(text)
+ save_sms_to_file(text, category, 1.0)
+ return jsonify({
+ "status": "success",
+ "data": {
+ "category": category,
+ "details": details
+ }
+ })
+
# 特定短信识别逻辑 - 针对百度通知和招商银行账单
# 识别百度通知
if "百度智能云" in text and "尊敬的用户" in text and "免费额度" in text:
@@ -1376,6 +1533,19 @@
# 识别招商银行账单
if "招商银行" in text and ("账单¥" in text or "账单¥" in text or "还款日" in text):
+ # 检查是否为已还清/已结清短信
+ if any(re.search(paid_pattern, text) for paid_pattern in already_paid_patterns):
+ logger.info(f"招商银行短信包含已还清/已结清,归类为其他: {text[:30]}...")
+ category = "其他"
+ save_sms_to_file(text, category, 1.0)
+ return jsonify({
+ "status": "success",
+ "data": {
+ "category": category,
+ "details": {}
+ }
+ })
+
logger.info(f"直接识别为招商银行还款短信: {text[:30]}...")
category = "还款"
details = model_manager.extract_repayment_entities(text)
diff --git a/test2.py b/test2.py
index aec0dcb..d8105ab 100644
--- a/test2.py
+++ b/test2.py
@@ -17,7 +17,8 @@
def generate_xiaohongshu_article(film_name, locations):
"""生成小红书风格的文章"""
- prompt = f"""请为电影《{film_name}》的拍摄地写一篇小红书风格的文章。要求:
+ try:
+ prompt = f"""请为电影《{film_name}》的拍摄地写一篇小红书风格的文章。要求:
1. 标题要吸引人,包含电影名称和拍摄地
2. 开头要吸引人,可以用电影中的经典台词或场景引入
3. 详细介绍每个拍摄地点的特色和亮点
@@ -28,19 +29,23 @@
请以html格式返回,包含标题、正文和标签.生成内容字体要符合在小程序上合适的大小阅读,标题不要超过h3。"""
- completion = client.chat.completions.create(
- model="bot-20250512103613-6rwj8",
- messages=[
- {"role": "system", "content": "你是一个专业的小红书文案写手,擅长写吸引人的旅游攻略。"},
- {"role": "user", "content": prompt},
- ],
- )
-
- return completion.choices[0].message.content
+ completion = client.chat.completions.create(
+ model="bot-20250512103613-6rwj8",
+ messages=[
+ {"role": "system", "content": "你是一个专业的小红书文案写手,擅长写吸引人的旅游攻略。"},
+ {"role": "user", "content": prompt},
+ ],
+ )
+
+ return completion.choices[0].message.content
+ except Exception as e:
+ print(f"生成小红书文章失败: {str(e)}")
+ return ""
def generate_travel_route(film_name, locations):
"""生成游玩路线"""
- prompt = f"""请为电影《{film_name}》的拍摄地设计一条最优游玩路线。要求:
+ try:
+ prompt = f"""请为电影《{film_name}》的拍摄地设计一条最优游玩路线。要求:
1. 考虑各个景点之间的距离和交通方式
2. 合理安排游览顺序,避免来回奔波
3. 预估每个景点的游览时间
@@ -68,26 +73,30 @@
]
}}"""
- completion = client.chat.completions.create(
- model="bot-20250512103613-6rwj8",
- messages=[
- {"role": "system", "content": "你是一个专业的旅游路线规划师,擅长设计最优游览路线。"},
- {"role": "user", "content": prompt},
- ],
- )
-
- try:
- response_text = completion.choices[0].message.content
- cleaned_text = re.sub(r'```json|```', '', response_text)
- cleaned_text = re.sub(r'^[^{[]*', '', cleaned_text)
- return json.loads(cleaned_text)
+ completion = client.chat.completions.create(
+ model="bot-20250512103613-6rwj8",
+ messages=[
+ {"role": "system", "content": "你是一个专业的旅游路线规划师,擅长设计最优游览路线。"},
+ {"role": "user", "content": prompt},
+ ],
+ )
+
+ try:
+ response_text = completion.choices[0].message.content
+ cleaned_text = re.sub(r'```json|```', '', response_text)
+ cleaned_text = re.sub(r'^[^{[]*', '', cleaned_text)
+ return json.loads(cleaned_text)
+ except Exception as e:
+ print(f"解析路线失败: {str(e)}\n原始响应: {response_text}")
+ return None
except Exception as e:
- print(f"解析路线失败: {str(e)}\n原始响应: {response_text}")
+ print(f"生成游玩路线失败: {str(e)}")
return None
def generate_xiaohongshu_route(film_name, locations):
"""生成小红书风格的路线攻略"""
- prompt = f"""请为电影《{film_name}》的拍摄地写一篇小红书风格的路线攻略。要求:
+ try:
+ prompt = f"""请为电影《{film_name}》的拍摄地写一篇小红书风格的路线攻略。要求:
1. 标题要吸引人,突出"最佳路线"或"完美行程"等关键词
2. 开头要说明这条路线是如何规划的,为什么这样安排
3. 详细介绍每个景点的游览时间和交通方式
@@ -99,27 +108,37 @@
请以html格式返回,包含标题、正文和标签,生成内容字体要符合在小程序上合适的大小阅读,标题不要超过h3。"""
- completion = client.chat.completions.create(
- model="bot-20250512103613-6rwj8",
- messages=[
- {"role": "system", "content": "你是一个专业的小红书文案写手,擅长写吸引人的旅游路线攻略。"},
- {"role": "user", "content": prompt},
- ],
- )
-
- return completion.choices[0].message.content
+ completion = client.chat.completions.create(
+ model="bot-20250512103613-6rwj8",
+ messages=[
+ {"role": "system", "content": "你是一个专业的小红书文案写手,擅长写吸引人的旅游路线攻略。"},
+ {"role": "user", "content": prompt},
+ ],
+ )
+
+ return completion.choices[0].message.content
+ except Exception as e:
+ print(f"生成小红书路线攻略失败: {str(e)}")
+ return ""
def get_film_works():
- url = "http://192.168.1.213:8090/flower/api/filmWorks/pending/create"
- response = requests.get(url)
- if response.status_code == 200:
- return response.json().get("data", [])
- return []
+ try:
+ url = "http://192.168.1.213:8090/flower/api/filmWorks/pending/create"
+ response = requests.get(url)
+ if response.status_code == 200:
+ return response.json().get("data", [])
+ else:
+ print(f"获取电影作品失败,状态码: {response.status_code}")
+ return []
+ except Exception as e:
+ print(f"获取电影作品失败: {str(e)}")
+ return []
def get_location_info_from_model(film_name):
"""使用模型获取多个拍摄地点信息"""
- prompt = f"""请为电影《{film_name}》生成所有主要拍摄地点的详细信息。每部电影通常有多个拍摄地点,请尽可能详细地列出所有重要的拍摄地点。
+ try:
+ prompt = f"""请为电影《{film_name}》生成所有主要拍摄地点的详细信息。每部电影通常有多个拍摄地点,请尽可能详细地列出所有重要的拍摄地点。
对于每个拍摄地点,请提供以下信息:
1. 拍摄地点名称
@@ -156,165 +175,203 @@
]
请确保返回所有重要的拍摄地点,每个地点都要包含完整的信息。"""
- # Non-streaming:
- print("----- standard request -----")
- completion = client.chat.completions.create(
- model="bot-20250512103613-6rwj8", # bot-20250512103613-6rwj8 为您当前的智能体的ID,注意此处与Chat API存在差异。差异对比详见 SDK使用指南
- # messages=[
- # {"role": "system", "content": "你是DeepSeek,是一个 AI 人工智能助手"},
- # {"role": "user", "content": "常见的十字花科植物有哪些?"},
- # ],
- messages=[
- {"role": "system",
- "content": "你是一个专业的影视拍摄地点信息专家,请根据电影名称生成所有重要拍摄地点的详细信息。"},
- {"role": "user", "content": prompt},
- ],
- )
- print(completion.choices[0].message.content)
- if hasattr(completion, "references"):
- print(completion.references)
- if hasattr(completion.choices[0].message, "reasoning_content"):
- print(completion.choices[0].message.reasoning_content) # 对于R1模型,输出reasoning content
- # try:
- # # 尝试解析模型返回的JSON
- # response_text = completion.choices[0].message.content
- # location_info_list = json.loads(response_text)
- # return location_info_list
- # except:
- # # 如果解析失败,返回默认值
- # return None
- try:
- response_text = completion.choices[0].message.content
- # 清理响应内容
- cleaned_text = re.sub(r'```json|```', '', response_text) # 移除Markdown标记
- cleaned_text = re.sub(r'^[^{[]*', '', cleaned_text) # 清理开头非JSON内容
+ # Non-streaming:
+ print("----- standard request -----")
+ completion = client.chat.completions.create(
+ model="bot-20250512103613-6rwj8", # bot-20250512103613-6rwj8 为您当前的智能体的ID,注意此处与Chat API存在差异。差异对比详见 SDK使用指南
+ # messages=[
+ # {"role": "system", "content": "你是DeepSeek,是一个 AI 人工智能助手"},
+ # {"role": "user", "content": "常见的十字花科植物有哪些?"},
+ # ],
+ messages=[
+ {"role": "system",
+ "content": "你是一个专业的影视拍摄地点信息专家,请根据电影名称生成所有重要拍摄地点的详细信息。"},
+ {"role": "user", "content": prompt},
+ ],
+ )
+ print(completion.choices[0].message.content)
+ if hasattr(completion, "references"):
+ print(completion.references)
+ if hasattr(completion.choices[0].message, "reasoning_content"):
+ print(completion.choices[0].message.reasoning_content) # 对于R1模型,输出reasoning content
+ # try:
+ # # 尝试解析模型返回的JSON
+ # response_text = completion.choices[0].message.content
+ # location_info_list = json.loads(response_text)
+ # return location_info_list
+ # except:
+ # # 如果解析失败,返回默认值
+ # return None
+ try:
+ response_text = completion.choices[0].message.content
+ # 清理响应内容
+ cleaned_text = re.sub(r'```json|```', '', response_text) # 移除Markdown标记
+ cleaned_text = re.sub(r'^[^{[]*', '', cleaned_text) # 清理开头非JSON内容
- # 解析
- location_info_list = json.loads(cleaned_text)
- return location_info_list
- except Exception as e:
- print(f"解析失败: {str(e)}\n原始响应: {response_text}")
- return None
+ # 解析
+ location_info_list = json.loads(cleaned_text)
+ return location_info_list
+ except Exception as e:
+ print(f"解析失败: {str(e)}\n原始响应: {response_text}")
+ return None
+ except Exception as e:
+ print(f"获取拍摄地点信息失败: {str(e)}")
+ return None
def create_film_location(film_id, film_name, location_info, article, route_article):
- url = "http://192.168.1.213:8090/flower/api/filmLocation/new"
+ try:
+ url = "http://192.168.1.213:8090/flower/api/filmLocation/new"
- # 默认值设置
- default_data = {
- "filmId": film_id,
- "locationName": f"{film_name}拍摄地",
- "address": "待补充",
- "gpsLat": 0.0,
- "gpsLng": 0.0,
- "startDate": datetime.now().strftime("%Y-%m-%d"),
- "endDate": datetime.now().strftime("%Y-%m-%d"),
- "sceneType": "外景",
- "classicScene": "待补充",
- "isOpenVisit": 0,
- "visitInfo": json.dumps({"tips": "暂无参观信息"}),
- "landmarkDesc": "待补充",
- "transportGuide": "待补充",
- "parkingInfo": "待补充",
- "surroundingFacilities": "待补充",
- "arEntry": "",
- "status": 1,
- "deleted": 0,
- "createBy": "system",
- "updateBy": "system",
- "checkinCount": 0,
- "visitorPhotos": json.dumps([]),
- "xiaohongshuArticle": article, # 新增:小红书风格文章
- "xiaohongshuRoute": route_article # 新增:小红书风格路线
- }
+ # 默认值设置
+ default_data = {
+ "filmId": film_id,
+ "locationName": f"{film_name}拍摄地",
+ "address": "待补充",
+ "gpsLat": 0.0,
+ "gpsLng": 0.0,
+ "startDate": datetime.now().strftime("%Y-%m-%d"),
+ "endDate": datetime.now().strftime("%Y-%m-%d"),
+ "sceneType": "外景",
+ "classicScene": "待补充",
+ "isOpenVisit": 0,
+ "visitInfo": json.dumps({"tips": "暂无参观信息"}),
+ "landmarkDesc": "待补充",
+ "transportGuide": "待补充",
+ "parkingInfo": "待补充",
+ "surroundingFacilities": "待补充",
+ "arEntry": "",
+ "status": 1,
+ "deleted": 0,
+ "createBy": "system",
+ "updateBy": "system",
+ "checkinCount": 0,
+ "visitorPhotos": json.dumps([]),
+ "xiaohongshuArticle": article, # 新增:小红书风格文章
+ "xiaohongshuRoute": route_article # 新增:小红书风格路线
+ }
- # 更新默认值
- if location_info:
- for key, value in location_info.items():
- if key in default_data:
- if key in ['visit_info', 'visitor_photos']:
- default_data[key] = json.dumps(value)
- else:
- default_data[key] = value
+ # 更新默认值
+ if location_info:
+ for key, value in location_info.items():
+ if key in default_data:
+ if key in ['visit_info', 'visitor_photos']:
+ default_data[key] = json.dumps(value)
+ else:
+ default_data[key] = value
- response = requests.post(url, json=default_data)
- return response.json()
+ response = requests.post(url, json=default_data)
+ return response.json()
+ except Exception as e:
+ print(f"创建拍摄地点失败: {str(e)}")
+ return {"error": str(e)}
def save_article_and_route(film_id, film_name, article, route, route_article):
"""保存文章和路线到文件"""
- # 创建输出目录
- output_dir = "output"
- if not os.path.exists(output_dir):
- os.makedirs(output_dir)
-
- # 保存文章
- article_file = os.path.join(output_dir, f"{film_name}_article.md")
- with open(article_file, "w", encoding="utf-8") as f:
- f.write(article)
-
- # 保存路线(JSON格式)
- route_file = os.path.join(output_dir, f"{film_name}_route.json")
- with open(route_file, "w", encoding="utf-8") as f:
- json.dump(route, f, ensure_ascii=False, indent=2)
-
- # 保存路线(小红书风格)
- route_article_file = os.path.join(output_dir, f"{film_name}_route_article.md")
- with open(route_article_file, "w", encoding="utf-8") as f:
- f.write(route_article)
+ try:
+ # 创建输出目录
+ output_dir = "output"
+ if not os.path.exists(output_dir):
+ os.makedirs(output_dir)
+
+ # 保存文章
+ article_file = os.path.join(output_dir, f"{film_name}_article.md")
+ with open(article_file, "w", encoding="utf-8") as f:
+ f.write(article if article else "文章生成失败")
+
+ # 保存路线(JSON格式)
+ route_file = os.path.join(output_dir, f"{film_name}_route.json")
+ with open(route_file, "w", encoding="utf-8") as f:
+ if route:
+ json.dump(route, f, ensure_ascii=False, indent=2)
+ else:
+ json.dump({"error": "路线生成失败"}, f, ensure_ascii=False, indent=2)
+
+ # 保存路线(小红书风格)
+ route_article_file = os.path.join(output_dir, f"{film_name}_route_article.md")
+ with open(route_article_file, "w", encoding="utf-8") as f:
+ f.write(route_article if route_article else "路线文章生成失败")
+ except Exception as e:
+ print(f"保存文件失败: {str(e)}")
def main():
# 获取所有电影作品
- film_works = get_film_works()
+ try:
+ film_works = get_film_works()
+ except Exception as e:
+ print(f"获取电影作品失败: {str(e)}")
+ return
# 为每个电影作品创建拍摄地点
for film in film_works:
- film_name = film.get("nameCn")
- film_id = film.get("id")
- if film_name:
- print(f"正在处理电影: {film_name}")
+ try:
+ film_name = film.get("nameCn")
+ film_id = film.get("id")
+ if film_name:
+ print(f"正在处理电影: {film_name}")
- # 获取所有拍摄地点信息
- location_info_list = get_location_info_from_model(film_name)
+ # 获取所有拍摄地点信息
+ location_info_list = get_location_info_from_model(film_name)
- if location_info_list:
# 生成小红书文章
article = generate_xiaohongshu_article(film_name, location_info_list)
# 清理文章中的HTML标记
- article = re.sub(r'```html|```', '', article)
- print(f"\n生成的文章:\n{article}")
+ if article:
+ article = re.sub(r'```html|```', '', article)
+ print(f"\n生成的文章:\n{article}")
+ else:
+ print("文章生成失败,使用空内容")
# 生成游玩路线(JSON格式)
route = generate_travel_route(film_name, location_info_list)
- print(f"\n生成的路线:\n{json.dumps(route, ensure_ascii=False, indent=2)}")
+ if route:
+ print(f"\n生成的路线:\n{json.dumps(route, ensure_ascii=False, indent=2)}")
+ else:
+ print("路线生成失败,使用空内容")
# 生成小红书风格路线
route_article = generate_xiaohongshu_route(film_name, location_info_list)
# 清理路线文章中的HTML标记
- route_article = re.sub(r'```html|```', '', route_article)
- print(f"\n生成的路线文章:\n{route_article}")
+ if route_article:
+ route_article = re.sub(r'```html|```', '', route_article)
+ print(f"\n生成的路线文章:\n{route_article}")
+ else:
+ print("路线文章生成失败,使用空内容")
# 合并文章和路线
combined_content = f"{article}\n\n{route_article}"
# 保存到新接口
- save_url = "http://192.168.1.213:8090/flower/api/filmWorks/edit"
- save_data = {
- "id": film_id,
- "type": "sys",
- "filmContent": combined_content
- }
- save_response = requests.post(save_url, json=save_data)
- print(f"保存到新接口结果: {save_response.json()}")
+ try:
+ save_url = "http://192.168.1.213:8090/flower/api/filmWorks/edit"
+ save_data = {
+ "id": film_id,
+ "type": "sys",
+ "filmContent": combined_content
+ }
+ save_response = requests.post(save_url, json=save_data)
+ print(f"保存到新接口结果: {save_response.json()}")
+ except Exception as e:
+ print(f"保存到新接口失败: {str(e)}")
# 为每个拍摄地点创建记录
- for location_info in location_info_list:
- result = create_film_location(film_id, film_name, location_info, article, route_article)
- print(f"创建拍摄地点 {location_info.get('locationName', '未知地点')} 结果: {result}")
+ if location_info_list:
+ for location_info in location_info_list:
+ result = create_film_location(film_id, film_name, location_info, article, route_article)
+ print(f"创建拍摄地点 {location_info.get('locationName', '未知地点')} 结果: {result}")
+ else:
+ print("没有拍摄地点信息,跳过创建拍摄地点记录")
# 保存文章和路线到文件
- save_article_and_route(film_id, film_name, article, route, route_article)
+ try:
+ save_article_and_route(film_id, film_name, article, route, route_article)
+ except Exception as e:
+ print(f"保存文件失败: {str(e)}")
else:
- print(f"未能获取到电影 {film_name} 的拍摄地点信息")
+ print(f"电影名称为空,跳过处理")
+ except Exception as e:
+ print(f"处理电影 {film.get('nameCn', '未知电影')} 时发生错误: {str(e)}")
+ continue
if __name__ == "__main__":
--
Gitblit v1.9.3