From 8c5bb34e5a627b74fb5ab6df159fb6fff1a03df3 Mon Sep 17 00:00:00 2001 From: blade <8019068@qq.com> Date: Mon, 27 Oct 2025 15:07:12 +0800 Subject: [PATCH] support analyze image --- .../truth_social_retriever.cpython-312.pyc | Bin 15205 -> 18034 bytes core/media/truth_social_retriever.py | 99 ++++++++++++++---- core/wechat.py | 20 ++-- instructions/media_article_instructions.json | 2 +- instructions/media_image_instructions.json | 4 + .../media_image_post_instructions.json | 4 + 6 files changed, 103 insertions(+), 26 deletions(-) create mode 100644 instructions/media_image_instructions.json create mode 100644 instructions/media_image_post_instructions.json diff --git a/core/media/__pycache__/truth_social_retriever.cpython-312.pyc b/core/media/__pycache__/truth_social_retriever.cpython-312.pyc index a48cd429a9c3341f9249e2665eb17ed7ab9a5cee..150311b5027bc8f1856c76540fbd493a3417f737 100644 GIT binary patch delta 5601 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�A%n#Pd#JYoBb&1taim)0^n`g2Fxhi*4BVVN8TkUO-$*gifa1 zx3O&dex1JR3%C5AUoZ8m`kc%<0__QH3X?G68gW`jxx`nAdvNXPXq nk_fZq{vC7MVSFWRo$@m?lWaTpA26q7pL&=AhR+F1g--tqaFF}w delta 3433 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 diff --git a/core/media/truth_social_retriever.py b/core/media/truth_social_retriever.py index f4e7b67..5b4a6d3 100644 --- a/core/media/truth_social_retriever.py +++ b/core/media/truth_social_retriever.py @@ -41,9 +41,17 @@ class TruthSocialRetriever: os.makedirs(self.save_path, exist_ok=True) self.ali_api_key = ALI_API_KEY - instruction_file = r"./instructions/media_article_instructions.json" - with open(instruction_file, "r", encoding="utf-8") as f: - self.instruction = json.load(f) + text_instruction_file = r"./instructions/media_article_instructions.json" + with open(text_instruction_file, "r", encoding="utf-8") as f: + self.text_instruction = json.load(f) + + image_instruction_file = r"./instructions/media_image_instructions.json" + with open(image_instruction_file, "r", encoding="utf-8") as f: + self.image_instruction = json.load(f) + + image_post_instruction_file = r"./instructions/media_image_post_instructions.json" + with open(image_post_instruction_file, "r", encoding="utf-8") as f: + self.image_post_instruction = json.load(f) def get_user_id_from_page(self, handle="realDonaldTrump"): url = f"https://truthsocial.com/@{handle}" @@ -135,14 +143,6 @@ class TruthSocialRetriever: print("获取帖子失败,请检查 API 密钥或网络。") if len(results) > 0: - # user_path = os.path.join(self.save_path, user_name) - # os.makedirs(user_path, exist_ok=True) - # now_date_time = datetime.now().strftime("%Y%m%d%H%M%S") - # json_file_name = os.path.join(user_path, f"{user_name}_{now_date_time}.json") - # # 将results内容写入json_file_name文件中 - # with open(json_file_name, 'w', encoding='utf-8') as f: - # json.dump(results, f, ensure_ascii=False, indent=2) - # logger.info(f"已将{len(results)}条数据保存到: {json_file_name}") result_df = pd.DataFrame(results) result_df = self.remove_duplicate_posts(result_df) @@ -214,7 +214,27 @@ class TruthSocialRetriever: text = row["text"] media_thumbnail = row["media_thumbnail"] if media_thumbnail and len(media_thumbnail) > 0: - self.wechat.send_image(media_thumbnail) + response, image_path, base64_str, md5_str = self.wechat.send_image(media_thumbnail) + image_format = "jpg" + if image_path is not None and len(image_path) > 0: + image_format = image_path.split(".")[-1] + if image_format == "jpeg": + image_format = "jpg" + analysis_result, analysis_token = self.analyze_truth_social_content( + text=None, + image_stream=base64_str, + image_format=image_format, + media_type="image" + ) + if analysis_result is not None and len(analysis_result) > 0: + result_df.at[index, "analysis_result"] = analysis_result + result_df.at[index, "analysis_token"] = analysis_token + else: + result_df.at[index, "analysis_result"] = "" + result_df.at[index, "analysis_token"] = 0 + analysis_text = f"\n\n## 上述图片分析结果\n\n{analysis_result}" + analysis_text += f"\n\n## 上述图片分析token\n\n{analysis_token}" + self.wechat.send_markdown(analysis_text) else: contents = [] contents.append(f"## 川普推文") @@ -223,7 +243,10 @@ class TruthSocialRetriever: contents.append(date_time) mark_down_text = "\n\n".join(contents) analysis_result, analysis_token = self.analyze_truth_social_content( - text + text=text, + image_stream=None, + image_format=None, + media_type="text" ) result_df.at[index, "analysis_result"] = analysis_result result_df.at[index, "analysis_token"] = analysis_token @@ -253,12 +276,52 @@ class TruthSocialRetriever: def calculate_bytes(self, text: str): return len(text.encode("utf-8")) - def analyze_truth_social_content(self, text: str): + def analyze_truth_social_content(self, text: str, image_stream: str, image_format: str, media_type: str): try: + token = 0 + if media_type == "image": + if image_stream is None or len(image_stream) == 0: + return "", 0 + instructions = self.image_instruction.get("Instructions", "") + output = self.image_instruction.get("Output", "") + prompt = f"# Instructions\n\n{instructions}\n\n# Output\n\n{output}" + messages_local = [ + { + "role": "user", + "content": [ + {"image": f"data:image/{image_format};base64,{image_stream}"}, # base64 字符串 + {"text": prompt} # 你的 prompt + ] + } + ] + response = dashscope.MultiModalConversation.call( + api_key=self.ali_api_key, + model='qwen-vl-plus', + messages=messages_local, + ) + if response.status_code == 200: + text = ( + response.get("output", {}) + .get("choices", [])[0] + .get("message", {}) + .get("content", "") + ) + token = response.get("usage", {}).get("total_tokens", 0) + else: + text = f"{response.code} {response.message} 无法分析图片" + token = 0 + + if text is None or len(text) == 0: + return "", 0 context = text - instructions = self.instruction.get("Instructions", "") - output = self.instruction.get("Output", "") - prompt = f"# Context\n\n{context}\n\n# Instructions\n\n{instructions}\n\n# Output\n\n{output}" + if media_type == "text": + instructions = self.text_instruction.get("Instructions", "") + output = self.text_instruction.get("Output", "") + prompt = f"# Context\n\n{context}\n\n# Instructions\n\n{instructions}\n\n# Output\n\n{output}" + else: + instructions = self.image_post_instruction.get("Instructions", "") + output = self.image_post_instruction.get("Output", "") + prompt = f"# Context\n\n{context}\n\n# Instructions\n\n{instructions}\n\n# Output\n\n{output}" response = dashscope.Generation.call( api_key=self.ali_api_key, model="qwen-plus", @@ -276,7 +339,7 @@ class TruthSocialRetriever: .get("message", {}) .get("content", "") ) - token = response.get("usage", {}).get("total_tokens", 0) + token += response.get("usage", {}).get("total_tokens", 0) else: response_contents = f"{response.code} {response.message}" token = 0 diff --git a/core/wechat.py b/core/wechat.py index 14ce006..1b4403d 100644 --- a/core/wechat.py +++ b/core/wechat.py @@ -9,6 +9,8 @@ import requests import base64 import hashlib import json +import os +import time logger = logging.logger class Wechat: @@ -17,6 +19,8 @@ class Wechat: # 只要启动代码文件在根目录,config就能找到 self.key = key self.url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={self.key}" + self.image_path = r"./output/wechat/image" + os.makedirs(self.image_path, exist_ok=True) def send_text(self, text: str): """ @@ -46,12 +50,6 @@ class Wechat: """ 发送图片消息 """ - # data = { - # "msgtype": "image", - # "image": {"url": image_url} - # } - # response = requests.post(self.url, json=data) - # return response.json() image_bytes = self.download_image(image_url) base64_str, md5_str = self.get_base64_and_md5(image_bytes) data = { @@ -61,9 +59,17 @@ class Wechat: "md5": md5_str, } } + # 获取url中图片的名称 + image_name = image_url.split("/")[-1].split(".")[0] + # 获取当前时间,格式为YYYYMMDDHHMMSS + now_time = time.strftime("%Y%m%d%H%M%S", time.localtime()) + image_name = f"{image_name}_{now_time}.jpg" + image_path = os.path.join(self.image_path, image_name) + with open(image_path, "wb") as f: + f.write(image_bytes) response = requests.post(self.url, json=data) response.raise_for_status() - return response.json() + return response.json(), image_path, base64_str, md5_str def download_image(self, image_url): """下载图片并返回 bytes""" diff --git a/instructions/media_article_instructions.json b/instructions/media_article_instructions.json index c21925e..f2f62cd 100644 --- a/instructions/media_article_instructions.json +++ b/instructions/media_article_instructions.json @@ -1,5 +1,5 @@ { "Context": "{0}\n\n", - "Instructions": "你是一个专业的时政与金融分析师,你的任务是分析推文,结合推文时间(北京时间),联网搜索,并给出分析结果。\n\nContext中的文章,就是特朗普在社交媒体发布的文章,不要怀疑这一点。\n并基于此文章内容进行分析。\n\n要求:\n1. 翻译推文为中文,要求符合中文表达习惯;\n2. 分析推文内容,给出推文的核心观点;\n3. 人物分析:分析推文涉及人物以及人物简介;\n4. 区域分析:包括国家与地区;\n5. 行业以及影响分析;\n6. 经济与金融分析:分析涉及经济与金融影响,包括美股、虚拟货币以及中国A股,并列出最有可能被影响的股票品种或虚拟货币的名称与代码;\n\n", + "Instructions": "您是一位资深的国际时事与军事政治评论员与经济、金融分析师,你的任务是分析推文,结合推文时间(北京时间),联网搜索,并给出分析结果。\n\nContext中的文章,就是特朗普在社交媒体发布的文章,不要怀疑这一点。\n并基于此文章内容进行分析。\n\n要求:\n1. 翻译推文为中文,要求符合中文表达习惯;\n2. 分析推文内容,给出推文的核心观点;\n3. 人物分析:分析推文涉及人物以及人物简介;\n4. 区域分析:包括国家与地区;\n5. 行业以及影响分析;\n6. 经济与金融分析:分析涉及经济与金融影响,包括美股、虚拟货币以及中国A股,并列出最有可能被影响的股票品种或虚拟货币的名称与代码;\n\n", "Output": "## 输出要求\n\n除了翻译之外,核心观点+人物分析+区域分析+行业及影响分析+经济与金融分析,不超过1000汉字。\n要求对人名、区域、行业、金融产品、股票代码等专属名词,进行粗体处理。\n\n## 输出格式\n\n### 翻译\n\n### 人物分析\n\n### 区域分析\n\n### 行业及影响分析\n\n### 经济与金融分析\n\n" } \ No newline at end of file diff --git a/instructions/media_image_instructions.json b/instructions/media_image_instructions.json new file mode 100644 index 0000000..e38c8a4 --- /dev/null +++ b/instructions/media_image_instructions.json @@ -0,0 +1,4 @@ +{ + "Instructions": "您是一位资深的国际时事与军事政治评论员与经济、金融分析师,请阅读这张图片,并给出分析结果,分析内容包括:图片文字翻译为中文,将非文字部分的图像,做出图像场景描述。\n\n要求:\n1. 如果图片只有图像信息,请根据图像做出场景描述。\n2. 如果图片既有文字又有图像内容,请提取其中的文字,并将文字翻译为中文,并对非文字部分的图像,做出图像场景描述。\n3. 如果图片中只有文字,请提取其中的文字,并将文字翻译为中文。", + "Output": "## 输出要求\n\n图片中的文字原文、文字中文翻译、图片场景描述。\n\n## 输出格式如下:\n\n### 图中文字原文\n\n### 图中文字中文翻译\n\n### 图片场景描述" +} \ No newline at end of file diff --git a/instructions/media_image_post_instructions.json b/instructions/media_image_post_instructions.json new file mode 100644 index 0000000..9511a77 --- /dev/null +++ b/instructions/media_image_post_instructions.json @@ -0,0 +1,4 @@ +{ + "Instructions": "您是一位资深的国际时事与军事政治评论员与经济、金融分析师,Context的内容是通过图片分析到的信息,你的任务是分析其中的信息,进行联网搜索,并给出分析结果。\n\n该信息,就是特朗普在社交媒体发布的,不要怀疑这一点。\n并基于此文章内容进行分析。\n\n要求:\n1. 分析图片中的文字与图像场景描述,给出推文的核心观点;\n2. 人物分析:分析推文涉及人物以及人物简介;\n3. 区域分析:包括国家与地区;\n4. 行业以及影响分析;\n5. 经济与金融分析:分析涉及经济与金融影响,包括美股、虚拟货币以及中国A股,并列出最有可能被影响的股票品种或虚拟货币的名称与代码;\n\n", + "Output": "## 输出要求\n\n要求将Context中的文字原文,中文翻译与图片场景描述,进行原文输出,之外的核心观点+人物分析+区域分析+行业及影响分析+经济与金融分析,不超过1000汉字。\n要求对人名、区域、行业、金融产品、股票代码等专属名词,进行粗体处理。\n\n## 输出格式\n\n### 图中文字原文\n\n### 图中文字中文翻译\n\n### 图片场景描述\n\n### 人物分析\n\n### 区域分析\n\n### 行业及影响分析\n\n### 经济与金融分析\n\n" +} \ No newline at end of file