|
|
@@ -779,7 +779,60 @@ async def handle_text_group_async(request: Request,token_id,app_id, wxid,msg_dat |
|
|
|
|
|
|
|
reply_content='@'+extract_nickname(msg_push_content) + reply_content |
|
|
|
|
|
|
|
await request.app.state.gewe_service.post_text_async(token_id,app_id,callback_to_user,reply_content) |
|
|
|
#await request.app.state.gewe_service.post_text_async(token_id,app_id,callback_to_user,reply_content) |
|
|
|
if '不回复' in reply_content: |
|
|
|
|
|
|
|
logger.warning(f"{from_wxid} 群聊中 AI回答<不回复>,跳过微信回复") |
|
|
|
await request.app.state.gewe_service.save_session_messages_to_cache_async(hash_key, {"role": "assistant", "content": reply_content}) |
|
|
|
return |
|
|
|
|
|
|
|
k,loginfo=await request.app.state.gewe_service.get_login_info_by_wxid_async(wxid) |
|
|
|
wxid_nickname=loginfo.get("nickName") |
|
|
|
|
|
|
|
message_lock=request.app.state.message_lock[app_id] |
|
|
|
# 昵称替换 |
|
|
|
replacements = { |
|
|
|
'{昵称}': wxid_nickname, |
|
|
|
'{好友昵称}': extract_nickname(msg_push_content) |
|
|
|
} |
|
|
|
reply_content=replace_placeholders(reply_content, replacements) |
|
|
|
|
|
|
|
# 判断图片url |
|
|
|
img_urls,reply_content=extract_and_replace_image_urls(reply_content) |
|
|
|
if img_urls: |
|
|
|
async with message_lock: |
|
|
|
await ai_post_text_split_async_async(request, token_id, app_id, callback_to_user, reply_content) |
|
|
|
await asyncio.sleep(random.uniform(1.5, 3)) |
|
|
|
for img_url in img_urls: |
|
|
|
await request.app.state.gewe_service.post_image_async(token_id, app_id, callback_to_user, img_url) |
|
|
|
await asyncio.sleep(random.uniform(1.5, 3)) |
|
|
|
|
|
|
|
# 判断视频url |
|
|
|
video_urls,reply_content=extract_and_replace_video_urls(reply_content) |
|
|
|
if video_urls: |
|
|
|
async with message_lock: |
|
|
|
await ai_post_text_split_async_async(request, token_id, app_id, callback_to_user, reply_content) |
|
|
|
await asyncio.sleep(random.uniform(1.5, 3)) |
|
|
|
for video_url in video_urls: |
|
|
|
parsed_url = urlparse(video_url) |
|
|
|
filename = os.path.basename(parsed_url.path) |
|
|
|
tmp_file_path = os.path.join(os.getcwd(),'tmp', filename) # 拼接完整路径 |
|
|
|
thumbnail_path=tmp_file_path.replace('.mp4','.jpg') |
|
|
|
|
|
|
|
video_thumb_url,video_duration =download_video_and_get_thumbnail(video_url,thumbnail_path) |
|
|
|
logger.info(f'{wxid} 视频缩略图 {video_thumb_url} 时长 {video_duration}') |
|
|
|
ret,ret_msg,res = await request.app.state.gewe_service.post_video_async(token_id, app_id, callback_to_user, video_url,video_thumb_url,video_duration) |
|
|
|
if ret!=200: |
|
|
|
logger.warning(f'{wxid} 发送视频{video_url} 到 {callback_to_user} 失败,{ret_msg}') |
|
|
|
await asyncio.sleep(random.uniform(1.5, 3)) |
|
|
|
|
|
|
|
# 发送AI微信回复 |
|
|
|
if (not video_urls) and (not img_urls): |
|
|
|
async with message_lock: |
|
|
|
await ai_post_text_split_async_async(request, token_id, app_id, callback_to_user, reply_content) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await request.app.state.gewe_service.save_session_messages_to_cache_async(hash_key, {"role": "assistant", "content": reply_content}) |
|
|
|
# 回复的对话 |
|
|
|
reply_content=f'{wxid}:\n'+ reply_content |
|
|
|