发送时,上传到微信,获取URL,进行发送
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
|
import base64
|
||||||
import json
|
import json
|
||||||
|
import os
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Dict, Any, List, Optional, Tuple
|
from typing import Dict, Any, List, Optional, Tuple
|
||||||
|
|
||||||
@@ -142,7 +144,7 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
# 检查任务是否应该执行
|
# 检查任务是否应该执行
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
schedule_time = task['schedule_time']
|
schedule_time = task['schedule_time']
|
||||||
|
|
||||||
# 对于重复任务,检查是否到达执行时间点
|
# 对于重复任务,检查是否到达执行时间点
|
||||||
if task['schedule_type'] == 'recurring':
|
if task['schedule_type'] == 'recurring':
|
||||||
recurring_time = task.get('recurring_time')
|
recurring_time = task.get('recurring_time')
|
||||||
@@ -162,26 +164,26 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
else:
|
else:
|
||||||
hour, minute = map(int, time_parts)
|
hour, minute = map(int, time_parts)
|
||||||
second = 0
|
second = 0
|
||||||
|
|
||||||
# 检查当前时间是否在目标时间的前后5秒内
|
# 检查当前时间是否在目标时间的前后5秒内
|
||||||
target_time = now.replace(hour=hour, minute=minute, second=second, microsecond=0)
|
target_time = now.replace(hour=hour, minute=minute, second=second, microsecond=0)
|
||||||
time_diff = abs((now - target_time).total_seconds())
|
time_diff = abs((now - target_time).total_seconds())
|
||||||
if time_diff > 5: # 允许5秒的误差
|
if time_diff > 5: # 允许5秒的误差
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 检查是否已经在这个时间点执行过
|
# 检查是否已经在这个时间点执行过
|
||||||
execution_key = self._get_execution_key(task['task_id'], hour, minute)
|
execution_key = self._get_execution_key(task['task_id'], hour, minute)
|
||||||
if execution_key in self._task_execution_records:
|
if execution_key in self._task_execution_records:
|
||||||
self.LOG.debug(f"任务 {task['task_id']} 今天已经执行过,跳过")
|
self.LOG.debug(f"任务 {task['task_id']} 今天已经执行过,跳过")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 记录执行状态
|
# 记录执行状态
|
||||||
self._task_execution_records[execution_key] = now
|
self._task_execution_records[execution_key] = now
|
||||||
|
|
||||||
except (ValueError, AttributeError) as e:
|
except (ValueError, AttributeError) as e:
|
||||||
self.LOG.error(f"无效的执行时间格式: {recurring_time}, 错误: {e}")
|
self.LOG.error(f"无效的执行时间格式: {recurring_time}, 错误: {e}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 更新任务状态为执行中
|
# 更新任务状态为执行中
|
||||||
self.db.update_task(task['task_id'], {'status': 'running'})
|
self.db.update_task(task['task_id'], {'status': 'running'})
|
||||||
|
|
||||||
@@ -209,6 +211,22 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
if not self.bot:
|
if not self.bot:
|
||||||
raise Exception("机器人实例未初始化")
|
raise Exception("机器人实例未初始化")
|
||||||
|
|
||||||
|
# 发送链接消息,提前进行数据整理,上传缩略图
|
||||||
|
if content_link:
|
||||||
|
# content_link json 读取内容
|
||||||
|
link_data = json.loads(content_link)
|
||||||
|
thumburl_path = link_data.get('thumburl', '')
|
||||||
|
thumburl_wx = ""
|
||||||
|
if thumburl_path and os.path.exists(thumburl_path):
|
||||||
|
# Read local image file
|
||||||
|
with open(thumburl_path, 'rb') as image_file:
|
||||||
|
# Convert image to base64
|
||||||
|
base64_string = base64.b64encode(image_file.read()).decode('utf-8')
|
||||||
|
# Call upload method with base64 string
|
||||||
|
thumburl_wx = await self.bot.friend_circle_upload(base64=base64_string)
|
||||||
|
else:
|
||||||
|
print(f"Image file not found at: {thumburl_path}")
|
||||||
|
|
||||||
success_count = 0
|
success_count = 0
|
||||||
fail_count = 0
|
fail_count = 0
|
||||||
|
|
||||||
@@ -229,7 +247,7 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
xml_content = f"{LINK_XML_NORMAL}".format(title=link_data.get('title', ''),
|
xml_content = f"{LINK_XML_NORMAL}".format(title=link_data.get('title', ''),
|
||||||
des=link_data.get('des', ''),
|
des=link_data.get('des', ''),
|
||||||
url=link_data.get('url', ''),
|
url=link_data.get('url', ''),
|
||||||
thumburl=link_data.get('thumburl', '')
|
thumburl=thumburl_wx
|
||||||
)
|
)
|
||||||
await self.bot.send_link_xml_message(xml_content, group_id)
|
await self.bot.send_link_xml_message(xml_content, group_id)
|
||||||
|
|
||||||
@@ -305,8 +323,8 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
self.LOG.error(f"处理定时任务出错: {e}")
|
self.LOG.error(f"处理定时任务出错: {e}")
|
||||||
|
|
||||||
def _calculate_next_schedule_time(self, schedule_time: datetime, recurring_interval: str,
|
def _calculate_next_schedule_time(self, schedule_time: datetime, recurring_interval: str,
|
||||||
recurring_end: datetime, recurring_time: str,
|
recurring_end: datetime, recurring_time: str,
|
||||||
weekly_days: str = None, monthly_day: int = None) -> Optional[datetime]:
|
weekly_days: str = None, monthly_day: int = None) -> Optional[datetime]:
|
||||||
"""计算下次执行时间"""
|
"""计算下次执行时间"""
|
||||||
try:
|
try:
|
||||||
# 解析执行时间
|
# 解析执行时间
|
||||||
@@ -335,7 +353,7 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
|
|
||||||
# 获取当前时间
|
# 获取当前时间
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
|
|
||||||
# 如果已经超过结束时间,返回None
|
# 如果已经超过结束时间,返回None
|
||||||
if recurring_end and now > recurring_end:
|
if recurring_end and now > recurring_end:
|
||||||
return None
|
return None
|
||||||
@@ -346,7 +364,7 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
next_time = now.replace(hour=hour, minute=minute, second=second, microsecond=0)
|
next_time = now.replace(hour=hour, minute=minute, second=second, microsecond=0)
|
||||||
if next_time <= now:
|
if next_time <= now:
|
||||||
next_time = next_time + timedelta(days=1)
|
next_time = next_time + timedelta(days=1)
|
||||||
|
|
||||||
elif recurring_interval == 'weekly':
|
elif recurring_interval == 'weekly':
|
||||||
# 每周执行
|
# 每周执行
|
||||||
try:
|
try:
|
||||||
@@ -354,10 +372,10 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
weekly_days = json.loads(weekly_days)
|
weekly_days = json.loads(weekly_days)
|
||||||
if not weekly_days:
|
if not weekly_days:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# 获取当前是周几(0-6,0是周一)
|
# 获取当前是周几(0-6,0是周一)
|
||||||
current_weekday = now.weekday()
|
current_weekday = now.weekday()
|
||||||
|
|
||||||
# 找到下一个执行日
|
# 找到下一个执行日
|
||||||
next_weekday = None
|
next_weekday = None
|
||||||
for day in sorted(weekly_days):
|
for day in sorted(weekly_days):
|
||||||
@@ -365,31 +383,32 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
if day > current_weekday:
|
if day > current_weekday:
|
||||||
next_weekday = day
|
next_weekday = day
|
||||||
break
|
break
|
||||||
|
|
||||||
# 如果本周没有下一个执行日,取下周的第一个执行日
|
# 如果本周没有下一个执行日,取下周的第一个执行日
|
||||||
if next_weekday is None:
|
if next_weekday is None:
|
||||||
next_weekday = int(weekly_days[0])
|
next_weekday = int(weekly_days[0])
|
||||||
days_ahead = 7 - current_weekday + next_weekday
|
days_ahead = 7 - current_weekday + next_weekday
|
||||||
else:
|
else:
|
||||||
days_ahead = next_weekday - current_weekday
|
days_ahead = next_weekday - current_weekday
|
||||||
|
|
||||||
next_time = now.replace(hour=hour, minute=minute, second=second, microsecond=0) + timedelta(days=days_ahead)
|
next_time = now.replace(hour=hour, minute=minute, second=second, microsecond=0) + timedelta(
|
||||||
|
days=days_ahead)
|
||||||
|
|
||||||
except (json.JSONDecodeError, ValueError, IndexError) as e:
|
except (json.JSONDecodeError, ValueError, IndexError) as e:
|
||||||
self.LOG.error(f"处理每周执行日失败: {e}")
|
self.LOG.error(f"处理每周执行日失败: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
elif recurring_interval == 'monthly':
|
elif recurring_interval == 'monthly':
|
||||||
# 每月执行
|
# 每月执行
|
||||||
try:
|
try:
|
||||||
if not monthly_day:
|
if not monthly_day:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# 获取当前日期
|
# 获取当前日期
|
||||||
current_day = now.day
|
current_day = now.day
|
||||||
current_month = now.month
|
current_month = now.month
|
||||||
current_year = now.year
|
current_year = now.year
|
||||||
|
|
||||||
# 如果当前日期已经过了执行日,移到下个月
|
# 如果当前日期已经过了执行日,移到下个月
|
||||||
if current_day >= monthly_day:
|
if current_day >= monthly_day:
|
||||||
if current_month == 12:
|
if current_month == 12:
|
||||||
@@ -401,7 +420,7 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
else:
|
else:
|
||||||
next_month = current_month
|
next_month = current_month
|
||||||
next_year = current_year
|
next_year = current_year
|
||||||
|
|
||||||
# 处理无效日期(如2月30日)
|
# 处理无效日期(如2月30日)
|
||||||
try:
|
try:
|
||||||
next_time = datetime(next_year, next_month, monthly_day, hour, minute, second)
|
next_time = datetime(next_year, next_month, monthly_day, hour, minute, second)
|
||||||
@@ -412,7 +431,7 @@ class MessagePushTask(MessagePluginInterface):
|
|||||||
else:
|
else:
|
||||||
last_day = (datetime(next_year, next_month + 1, 1) - timedelta(days=1)).day
|
last_day = (datetime(next_year, next_month + 1, 1) - timedelta(days=1)).day
|
||||||
next_time = datetime(next_year, next_month, last_day, hour, minute, second)
|
next_time = datetime(next_year, next_month, last_day, hour, minute, second)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.LOG.error(f"处理每月执行日失败: {e}")
|
self.LOG.error(f"处理每月执行日失败: {e}")
|
||||||
return None
|
return None
|
||||||
|
|||||||
Reference in New Issue
Block a user