From 888e53fcb2211d2c2031daab308dc2c95ca59599 Mon Sep 17 00:00:00 2001 From: H Vs Date: Sat, 22 Feb 2025 15:00:04 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/messages_resource.py | 2 +- wechat/biz.py | 17 +++++++++++------ wechat/gewe_chat.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/resources/messages_resource.py b/resources/messages_resource.py index d82f500..8ec7717 100644 --- a/resources/messages_resource.py +++ b/resources/messages_resource.py @@ -873,6 +873,6 @@ def check_chatroom(userName): def remove_markdown_symbol(text: str): # 移除markdown格式,目前先移除** - if not text: + if not text or not isinstance(text, str): return text return re.sub(r'\*\*(.*?)\*\*', r'\1', text) \ No newline at end of file diff --git a/wechat/biz.py b/wechat/biz.py index f2b23c3..6a7b829 100644 --- a/wechat/biz.py +++ b/wechat/biz.py @@ -300,7 +300,7 @@ def login_or_reconnect(wxchat:gewe_chat.GeWeChatCom, token_id, app_id, region_id uuid = qr_code.get('uuid') if not uuid: logger.error(f"uuid获取二维码失败: {qr_code}") - redis_helper.redis_helper.release_lock(f"__AI_OPS_WX__:LOGINLOCK:{token_id}") + wxchat.release_login_lock(token_id) break @@ -341,7 +341,7 @@ def login_or_reconnect(wxchat:gewe_chat.GeWeChatCom, token_id, app_id, region_id # login_info.update({"login_time":datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]}) cleaned_login_info = {k: (v if v is not None else '') for k, v in login_info.items()} redis_helper.redis_helper.set_hash(hash_key, cleaned_login_info) - redis_helper.redis_helper.release_lock(f"__AI_OPS_WX__:LOGINLOCK:{token_id}") + wxchat.release_login_lock(token_id) return login_info else: logger.info(f"登录检查中: {ret}-{msg}-{res}") @@ -349,7 +349,7 @@ def login_or_reconnect(wxchat:gewe_chat.GeWeChatCom, token_id, app_id, region_id time.sleep(5) logger.error(f"登录失败,二维码生成 {max_retries} 次") - redis_helper.redis_helper.release_lock(f"__AI_OPS_WX__:LOGINLOCK:{token_id}") + wxchat.release_login_lock(token_id) def fetch_and_save_contacts(wxchat:gewe_chat.GeWeChatCom, token_id, app_id, hash_key): """ @@ -420,14 +420,19 @@ def ops_messages_process(message): tel=content_data.get('tel', '18029274615') token_id=content_data.get('token_id', 'f828cb3c-1039-489f-b9ae-7494d1778a15') region_id=content_data.get('region_id', '440000') - #wx_login(wxchat,tel,token_id) - flag=redis_helper.redis_helper.acquire_lock(f"__AI_OPS_WX__:LOGINLOCK:{token_id}", expire_time=800, timeout=830) + loginfo=redis_helper.redis_helper.get_hash(f"__AI_OPS_WX__:LOGININFO:{tel}") + status=loginfo.get('status',0) + if status==1: + logger.info(f'手机号{tel},wx_token{token_id} 已经登录') + return + + flag=gewe_chat.wxchat.acquire_login_lock(token_id,800) if flag: thread = threading.Thread(target=wx_login, args=(wxchat,tel,token_id,region_id)) thread.daemon = True thread.start() else: - logger.info(f'登录进行中,获取锁失败 {token_id}') + logger.info(f'手机号{tel}, wx_token{token_id} 登录进行中,稍后再试') elif msg_type_data == 'group-sending': agent_tel=content_data.get('agent_tel', '18029274615') # 使用线程处理 diff --git a/wechat/gewe_chat.py b/wechat/gewe_chat.py index 24ad09c..f356698 100644 --- a/wechat/gewe_chat.py +++ b/wechat/gewe_chat.py @@ -6,6 +6,7 @@ import json import os import threading import time +import uuid import requests from io import BytesIO @@ -907,6 +908,36 @@ class GeWeChatCom: r=redis_helper.redis_helper.get_hash_field(hash_key,"data") return r + # def get_login_lock_from_cache(self,token_id)->bool: + # hash_key = f"__AI_OPS_WX__:LOGINLOCK:{token_id}" + # cache = redis_helper.redis_helper.get_hash_field(hash_key,"data") + # if cache: + # return True + # else: + # return False + + # def save_login_lock_to_cache(self,token_id,expire_time:int): + # hash_key = f"__AI_OPS_WX__:LOGINLOCK:{token_id}" + # redis_helper.redis_helper.set_hash(hash_key,{"data":str(uuid.uuid4())},expire_time) + + # def delete_login_lock_from_cache(self,token_id): + # hash_key = f"__AI_OPS_WX__:LOGINLOCK:{token_id}" + # redis_helper.redis_helper.delete_hash_field(hash_key,"data") + + + def acquire_login_lock(self, token_id, expire_time=10): + hash_key = f"__AI_OPS_WX__:LOGINLOCK:{token_id}" + identifier=str(uuid.uuid4()) + if redis_helper.redis_helper.client.setnx(hash_key, identifier): + redis_helper.redis_helper.client.expire(hash_key, expire_time) + return True + return False + + def release_login_lock(self, token_id): + hash_key = f"__AI_OPS_WX__:LOGINLOCK:{token_id}" + redis_helper.redis_helper.client.delete(hash_key) + + def start(): global wxchat # base_url = "http://192.168.88.11:2531"