From 3083ed948fff63dbf06d31759f11bd6214a6962d Mon Sep 17 00:00:00 2001 From: liuwei Date: Wed, 19 Feb 2025 14:51:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E7=BE=A4=E9=85=8D=E7=BD=AE=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=89=8D=E7=AB=AF=E6=8C=87=E4=BB=A4=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=AE=A1=E7=90=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group_auto/group_auto_invite.py | 87 +++++++++++++++++++++------------ robot.py | 12 ++++- task/dateparser_test.py | 20 -------- task/message_task_json.py | 57 +++++++++++++++++++++ task/task_list.py | 35 +++++++------ 5 files changed, 142 insertions(+), 69 deletions(-) delete mode 100644 task/dateparser_test.py create mode 100644 task/message_task_json.py diff --git a/group_auto/group_auto_invite.py b/group_auto/group_auto_invite.py index e389515..c75daac 100644 --- a/group_auto/group_auto_invite.py +++ b/group_auto/group_auto_invite.py @@ -1,7 +1,12 @@ import redis # 创建 Redis 连接 -r = redis.StrictRedis(host='192.168.2.32', port=6379, db=0, decode_responses=True) +try: + r = redis.StrictRedis(host='192.168.2.32', port=6379, db=0, decode_responses=True) + r.ping() # 检查连接是否正常 +except redis.ConnectionError as e: + print(f"Redis连接失败: {e}") + exit(1) # Redis 中存储群组映射的前缀 mapping_prefix = "group:group_mapping:" @@ -9,71 +14,93 @@ mapping_prefix = "group:group_mapping:" # 添加群组ID到指定key def add_mapping(key, group_id): - if r.sismember(mapping_prefix + key, group_id): - print(f"Group ID {group_id} already exists for key {key}.") - else: - r.sadd(mapping_prefix + key, group_id) - print(f"Added: {key} -> {group_id}") + try: + if r.sismember(mapping_prefix + key, group_id): + return f"Group ID {group_id} already exists for key {key}." + else: + r.sadd(mapping_prefix + key, group_id) + return f"Added: {key} -> {group_id}" + except redis.RedisError as e: + return f"操作失败: {e}" # 删除指定key下的某个群组ID def del_mapping(key, group_id): - if r.sismember(mapping_prefix + key, group_id): - r.srem(mapping_prefix + key, group_id) - print(f"Deleted: {key} -> {group_id}") - else: - print(f"Group ID {group_id} not found for key {key}.") + try: + if r.sismember(mapping_prefix + key, group_id): + r.srem(mapping_prefix + key, group_id) + return f"Deleted: {key} -> {group_id}" + else: + return f"Group ID {group_id} not found for key {key}." + except redis.RedisError as e: + return f"操作失败: {e}" # 获取指定key下的所有群组ID def get_group_ids(key): - group_ids = r.smembers(mapping_prefix + key) - if group_ids: - print(f"Group IDs for {key}: {', '.join(group_ids)}") - else: - print(f"Key '{key}' has no associated group IDs.") + try: + group_ids = r.smembers(mapping_prefix + key) + if group_ids: + return f"Group IDs for {key}: {', '.join(group_ids)}" + else: + return f"Key '{key}' has no associated group IDs." + except redis.RedisError as e: + return f"操作失败: {e}" # 获取指定key的第一个群组ID def get_first_group_id(key): - group_ids = r.smembers(mapping_prefix + key) - if group_ids: - first_group_id = next(iter(group_ids)) # 获取集合中的第一个元素 - print(f"First Group ID for {key}: {first_group_id}") - return first_group_id - else: - print(f"Key '{key}' has no associated group IDs.") + try: + group_ids = r.smembers(mapping_prefix + key) + if group_ids: + first_group_id = next(iter(group_ids)) # 获取集合中的第一个元素 + return f"First Group ID for {key}: {first_group_id}" + return first_group_id + else: + return f"Key '{key}' has no associated group IDs." + except redis.RedisError as e: + return f"操作失败: {e}" # 处理命令行输入 def process_command(command): command_parts = command.split() if len(command_parts) == 0: - print("Invalid command.") - return + return "Invalid command." cmd = command_parts[0] if cmd == "add" and len(command_parts) == 3: key = command_parts[1] group_id = command_parts[2] - add_mapping(key, group_id) + return add_mapping(key, group_id) elif cmd == "del" and len(command_parts) == 3: key = command_parts[1] group_id = command_parts[2] - del_mapping(key, group_id) + return del_mapping(key, group_id) elif cmd == "get" and len(command_parts) == 2: key = command_parts[1] - get_group_ids(key) + return get_group_ids(key) elif cmd == "get_first" and len(command_parts) == 2: key = command_parts[1] - get_first_group_id(key) + return get_first_group_id(key) + + elif cmd == "help": + commands = ( + "命令列表:\n" + "'add key group_id' - 添加群组ID\n" + "'del key group_id' - 删除群组ID\n" + "'get key' - 获取所有群组ID\n" + "'get_first key' - 获取第一个群组ID\n" + "'exit' - 退出系统" + ) + return commands else: - print("Unknown command or wrong number of arguments.") + return "Unknown command or wrong number of arguments. please enter : #加群配置|help" # 主函数 diff --git a/robot.py b/robot.py index b3a554d..8773eda 100644 --- a/robot.py +++ b/robot.py @@ -24,7 +24,7 @@ from base.func_xinghuo_web import XinghuoWeb from base.func_claude import Claude from configuration import Config from constants import ChatType -from group_auto.group_auto_invite import get_first_group_id +from group_auto.group_auto_invite import get_first_group_id, process_command from group_auto.group_member_change import GroupMemberChange from robot_cmd.robot_command import GroupBotManager from job_mgmt import Job @@ -267,6 +267,16 @@ class Robot(Job): self.generateSehuatangPdf() if msg.content == 'GROUP_LIST': self.sendTextMsg(self.gbm.get_group_list(), msg.sender) + if msg.content.startswith('#加群配置'): + # msg_content = "# 加群配置|add 原生鱼 xxx@room" + parts = msg.content.split('|') + resp = "" + if len(parts) > 1: + after_pipe = parts[1] + resp = process_command(after_pipe) + else: + resp = process_command("help") + self.sendTextMsg(resp, msg.sender) self.sendTextMsg(f"指令:{msg.content} 已执行", msg.sender) else: self.toChitchat(msg) # 闲聊 diff --git a/task/dateparser_test.py b/task/dateparser_test.py deleted file mode 100644 index ffe04c4..0000000 --- a/task/dateparser_test.py +++ /dev/null @@ -1,20 +0,0 @@ -import parsedatetime as pdt -from datetime import datetime - -# 初始化 Calendar 对象 -cal = pdt.Calendar() - -def parse_natural_language_time(text): - time_struct, parse_status = cal.parse(text) - if parse_status == 1: - # 将解析后的时间结构转换为 datetime 对象 - parsed_time = datetime(*time_struct[:6]) - print(f"Parsed time: {parsed_time}") - return parsed_time - else: - print(f"Could not parse time for: {text}") - return None - -# 示例输入 -test_input = "明天上午9点开会" -parsed_time = parse_natural_language_time(test_input) diff --git a/task/message_task_json.py b/task/message_task_json.py new file mode 100644 index 0000000..e13eea9 --- /dev/null +++ b/task/message_task_json.py @@ -0,0 +1,57 @@ +import requests +import json + + +# 解析JSON +def extract_content(data_string): + try: + data = json.loads(data_string) + # 提取content字段 + content = data["choices"][0]["message"].get("content", "") + return content + except json.JSONDecodeError: + print("Invalid JSON") + return None + + +def message_task_json(content): + # 设置Authorization和URL + authorization = "46a5674a-e978-491b-a810-5d54605f2c36" # 请替换为真实的Authorization token + url = 'http://127.0.0.1:8080/v1/chat/completions' + + prompt = ('你是一个个人助理,请根据用户给的任务要求及时安排日程。需要你理解用户的自然语言,并即时反馈在什么时候加入了日程提醒。提醒时间为什么时候。请只返回json格式的内容用于提取数据。格式如下:{\"task\": \"洗澡\", \"reminder_time\":\"00 20 * * *\", \"reason\": \"用户今天晚上八点要洗澡\"}') + # 设置请求的payload + data = { + # "stream": True, + "model": "windsurf/gpt4o", + "messages": [ + { + "role": "system", + "content": f"{prompt}" + }, + { + "role": "user", + "content": f"{content}" + } + + ] + } + + # 设置请求头 + headers = { + "Content-Type": "application/json; charset=utf-8", + "Authorization": authorization + } + + # 发送POST请求 + response = requests.post(url, headers=headers, data=json.dumps(data), ) + response.encoding = 'utf-8' + + # 输出响应内容 + print(response.status_code) + print(response.text) + return extract_content(response.text) + + +if __name__ == '__main__': + print(message_task_json('提醒我明天晚上9点20要去游泳')) \ No newline at end of file diff --git a/task/task_list.py b/task/task_list.py index e38d0a6..5cd5ad8 100644 --- a/task/task_list.py +++ b/task/task_list.py @@ -1,6 +1,7 @@ import pymysql -import dateparser import schedule +import json +from task.message_task_json import message_task_json # 配置数据库连接 db_config = { @@ -17,12 +18,6 @@ def get_db_connection(): return connection -# 解析自然语言时间 -def parse_natural_language_time(text): - parsed_time = dateparser.parse(text) - return parsed_time - - # 插入任务到数据库 def insert_task_to_db(description, reminder_time, task_type): connection = get_db_connection() @@ -69,14 +64,20 @@ def schedule_recurring_task(reminder_time, task_id): # 处理用户输入 def handle_user_input(user_input, task_type): - parsed_time = parse_natural_language_time(user_input) - print(parsed_time) - if parsed_time: - formatted_time = parsed_time.strftime('%H:%M') - print(f"Scheduling task for {formatted_time}") + task_json = message_task_json(user_input) + print(task_json) + if task_json: + + # 将JSON字符串解析为字典 + data = json.loads(task_json) + + # 提取内容 + task = data["task"] + reminder_time = data["reminder_time"] + reason = data["reason"] # 将任务存入数据库 - insert_task_to_db(user_input, formatted_time, task_type) + insert_task_to_db(user_input, reminder_time, task_type) # 获取插入的任务ID connection = get_db_connection() @@ -88,9 +89,9 @@ def handle_user_input(user_input, task_type): connection.close() # 根据任务类型调度任务 if task_type == 'single': - schedule_single_task(formatted_time, task_id) + schedule_single_task(reminder_time, task_id) elif task_type == 'recurring': - schedule_recurring_task(formatted_time, task_id) + schedule_recurring_task(reminder_time, task_id) # 查询指定类型的任务 @@ -152,6 +153,4 @@ def main(): if __name__ == "__main__": - # main() - parsed_time = dateparser.parse('每天上午9:00提醒我开会', settings={'TIMEZONE': 'Asia/Shanghai'},) - print(parsed_time) + main()