cloudroam
7 天以前 a0e5ee17158d99bd2962d4e25b753b302d2edf12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
import os
import requests
import json
from datetime import datetime
from openai import OpenAI
import re
 
 
# 初始化 OpenAI 客户端
client = OpenAI(
    # 此为默认路径,您可根据业务所在地域进行配置
    base_url="https://ark.cn-beijing.volces.com/api/v3/bots",
    # 从环境变量中获取您的 API Key
    api_key="5017c24f-581f-48fb-abef-8ac4654e9018",  # 直接填写密钥
)
 
 
def generate_xiaohongshu_article(film_name, locations):
    """生成小红书风格的文章"""
    prompt = f"""请为电影《{film_name}》的拍摄地写一篇小红书风格的文章。要求:
1. 标题要吸引人,包含电影名称和拍摄地
2. 开头要吸引人,可以用电影中的经典台词或场景引入
3. 详细介绍每个拍摄地点的特色和亮点
4. 包含实用的参观建议和交通信息
5. 使用emoji表情增加趣味性
6. 最后要有总结和推荐
7. 添加相关标签
 
请以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
 
def generate_travel_route(film_name, locations):
    """生成游玩路线"""
    prompt = f"""请为电影《{film_name}》的拍摄地设计一条最优游玩路线。要求:
1. 考虑各个景点之间的距离和交通方式
2. 合理安排游览顺序,避免来回奔波
3. 预估每个景点的游览时间
4. 提供具体的交通建议
5. 考虑用餐和休息时间
6. 提供备选方案
 
请以JSON格式返回,格式如下:
{{
    "route_name": "路线名称",
    "total_time": "预计总时间",
    "stops": [
        {{
            "location_name": "地点名称",
            "visit_time": "建议游览时间",
            "transportation": "前往下一个地点的交通方式",
            "tips": "游览建议"
        }}
    ],
    "alternative_routes": [
        {{
            "route_name": "备选路线名称",
            "description": "路线说明"
        }}
    ]
}}"""
 
    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
 
def generate_xiaohongshu_route(film_name, locations):
    """生成小红书风格的路线攻略"""
    prompt = f"""请为电影《{film_name}》的拍摄地写一篇小红书风格的路线攻略。要求:
1. 标题要吸引人,突出"最佳路线"或"完美行程"等关键词
2. 开头要说明这条路线是如何规划的,为什么这样安排
3. 详细介绍每个景点的游览时间和交通方式
4. 使用emoji表情增加趣味性
5. 提供实用的时间安排建议
6. 包含备选路线方案
7. 最后要有总结和注意事项
8. 添加相关标签
 
请以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
 
def get_film_works():
    url = "http://192.168.1.213:8090/flower/api/filmWorks/all"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json().get("data", [])
    return []
 
 
def get_location_info_from_model(film_name):
    """使用模型获取多个拍摄地点信息"""
    prompt = f"""请为电影《{film_name}》生成所有主要拍摄地点的详细信息。每部电影通常有多个拍摄地点,请尽可能详细地列出所有重要的拍摄地点。
 
对于每个拍摄地点,请提供以下信息:
1. 拍摄地点名称
2. 详细地址
3. 场景类型
4. 经典画面描述
5. 是否开放参观
6. 参观提示
7. 地标性建筑描述
8. 交通指引说明
9. 停车场信息
10. 周边设施描述
 
请以JSON数组格式返回,格式如下:
[
    {{
        "locationName": "地点1名称",
        "address": "地点1详细地址",
        "gpsLat": "纬度坐标(精确到小数点后6位)",
        "gpsLng": "经度坐标(精确到小数点后6位)",
        "sceneType": "场景类型",
        "classicScene": "经典画面描述",
        "isOpenVisit": 0或1,
        "visitInfo": "参观提示",
        "landmarkDesc": "地标描述",
        "transportGuide": "交通指引",
        "parkingInfo": "停车信息",
        "surroundingFacilities": "周边设施"
    }},
    {{
        "locationName": "地点2名称",
        ...
    }}
]
 
请确保返回所有重要的拍摄地点,每个地点都要包含完整的信息。"""
    # 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
 
 
def create_film_location(film_id, film_name, location_info, article, route_article):
    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  # 新增:小红书风格路线
    }
 
    # 更新默认值
    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()
 
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)
 
def main():
    # 获取所有电影作品
    film_works = get_film_works()
 
    # 为每个电影作品创建拍摄地点
    for film in film_works:
        film_name = film.get("nameCn")
        film_id = film.get("id")  # 新增:获取电影ID
        if film_name:
            print(f"正在处理电影: {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)
                print(f"\n生成的文章:\n{article}")
                
                # 生成游玩路线(JSON格式)
                route = generate_travel_route(film_name, location_info_list)
                print(f"\n生成的路线:\n{json.dumps(route, ensure_ascii=False, indent=2)}")
                
                # 生成小红书风格路线
                route_article = generate_xiaohongshu_route(film_name, location_info_list)
                print(f"\n生成的路线文章:\n{route_article}")
                
                # 为每个拍摄地点创建记录
                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}")
                
                # 保存文章和路线
                save_article_and_route(film_id, film_name, article, route, route_article)
            else:
                print(f"未能获取到电影 {film_name} 的拍摄地点信息")
 
 
if __name__ == "__main__":
    main()