diff --git a/app.py b/app.py index 3c2dae1..5b74201 100644 --- a/app.py +++ b/app.py @@ -4,7 +4,7 @@ from resources.messages_resource import MessagesResource from resources.contacts_resources import DeleteFriendResource,GetFriendsInfoResource from resources.config_reources import GetWxchatConfigResource ,SaveWxchatConfigResource from resources.groups_resources import GetGroupsInfoResource -from resources.login_resources import GetLoginInfoResource,GetLoginWxQRCodeResource +from resources.login_resources import GetLoginInfoResource,GetLoginWxQRCodeResource,LoginWxCaptchCodeResource from resources.sns_resources import SendSNSTextResource,SendSNSImageResource, SendSNSVideoResource from common.log import logger, log_exception from common.interceptors import before_request, after_request, handle_exception @@ -226,6 +226,7 @@ flask_api.add_resource(GetGroupsInfoResource, '/api/groups/getchatroominfo') flask_api.add_resource(GetLoginInfoResource, '/api/agent/getlogin') flask_api.add_resource(GetLoginWxQRCodeResource, '/api/agent/getwxqrcode') +flask_api.add_resource(LoginWxCaptchCodeResource, '/api/agent/logincaptchcode') flask_api.add_resource(SendSNSTextResource, '/api/sns/sendtext') flask_api.add_resource(SendSNSImageResource, '/api/sns/sendimages') diff --git a/resources/login_resources.py b/resources/login_resources.py index badfe56..060d4b6 100644 --- a/resources/login_resources.py +++ b/resources/login_resources.py @@ -4,6 +4,9 @@ from common import redis_helper,utils from wechat import gewe_chat,biz from common.log import logger, log_exception import time +import threading + +from model import Models @@ -52,9 +55,9 @@ class GetLoginWxQRCodeResource(Resource): response=jsonify({'code': 501, 'message': msg}) response.status_code = 501 return response - - expried_time=int(time.time())+800 - flag=gewe_chat.wxchat.acquire_login_lock(token_id,800) + now=time.time() + expried_time=int(now)+150 + flag=gewe_chat.wxchat.acquire_login_lock(token_id,150) if not flag: msg=f'手机号{tel}, wx_token{token_id} 登录进行中,稍后再试' logger.info(msg) @@ -63,7 +66,6 @@ class GetLoginWxQRCodeResource(Resource): return response app_id=loginfo.get('app_id','') - qr_code = gewe_chat.wxchat.get_login_qr_code(token_id, app_id,region_id) base64_string = qr_code.get('qrImgBase64') uuid = qr_code.get('uuid') @@ -75,7 +77,12 @@ class GetLoginWxQRCodeResource(Resource): response.status_code = 501 return response - + gewe_chat.wxchat.qrCallback(uuid,base64_string) + hash_key = f"__AI_OPS_WX__:LOGININFO:{tel}" + thread = threading.Thread(target=waitting_login_result, args=(gewe_chat.wxchat,token_id, app_id,region_id, agent_token_id,hash_key, uuid,now)) + thread.daemon = True + thread.start() + data={ "tokenId": token_id, "tel": tel, @@ -83,4 +90,60 @@ class GetLoginWxQRCodeResource(Resource): "expiredTime": expried_time, } return jsonify(data) - + + + + +def waitting_login_result(wxchat:gewe_chat.GeWeChatCom, token_id, app_id,region_id, agent_token_id,hash_key, uuid,start_time): + agent_tel=hash_key.split(":")[-1] + while True: + now = time.time() + if now - start_time > 150: + logger.info(f'{token_id} 使用 {app_id} 扫二维码登录超时') + break + + logger.info(f"{token_id} 使用 {app_id},等待扫码登录,二维码有效时间 {150 - int(now - start_time)} 秒") + captch_code = wxchat.get_login_wx_captch_code_from_cache(token_id) + captch_code= captch_code if captch_code else '' + logger.info(f"{token_id} 使用 {app_id} 的验证码 {captch_code}") + ret,msg,res = wxchat.check_login(token_id, app_id, uuid,captch_code) + + if ret == 200: + flag = res.get('status') + if flag == 2: + logger.info(f"登录成功: {res}") + head_img_url=res.get('headImgUrl','') + login_info = res.get('loginInfo', {}) + + login_info.update({'appId': app_id, 'uuid': uuid, 'tokenId': token_id,'status': 1,'headImgUrl':head_img_url,'regionId':region_id}) + cache_login_info=redis_helper.redis_helper.get_hash(hash_key) + if 'appId' not in cache_login_info: + login_info.update({"create_at":int(time.time()),"modify_at":int(time.time())}) + else: + login_info.update({"modify_at":int(time.time())}) + # if 'appId' in cache_login_info: + # login_info.update({"reg_time":datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],"login_time":datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]}) + # else: + # 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) + wxchat.release_login_lock(token_id) + # 默认配置 + + config=Models.AgentConfig.model_validate({ + "chatroomIdWhiteList": [], + "agentTokenId": agent_token_id, + "agentEnabled": True, + "addContactsFromChatroomIdWhiteList": [], + "chatWaitingMsgEnabled": True + }) + + config_dict=config.model_dump() + wxid=cleaned_login_info.get('wxid',agent_tel) + wxchat.save_wxchat_config(wxid,config_dict) + else: + logger.info(f"登录检查中: {ret}-{msg}-{res}") + + time.sleep(5) + wxchat.release_login_lock(token_id) \ No newline at end of file diff --git a/wechat/biz.py b/wechat/biz.py index c03ea65..8328661 100644 --- a/wechat/biz.py +++ b/wechat/biz.py @@ -319,7 +319,7 @@ def login_or_reconnect(wxchat:gewe_chat.GeWeChatCom, token_id, app_id, region_id if now- start_time > 150: #150 秒 二维码失效 break logger.info(f"{token_id} 使用 {app_id},等待扫码登录,二维码有效时间 {150 - int(now - start_time)} 秒") - captch_code = wxchat.get_login_wx_captch_code_to_cache(token_id) + captch_code = wxchat.get_login_wx_captch_code_from_cache(token_id) captch_code= captch_code if captch_code else '' ret,msg,res = wxchat.check_login(token_id, app_id, uuid,captch_code) if ret == 200: diff --git a/wechat/gewe_chat.py b/wechat/gewe_chat.py index 93dbddc..2655e2e 100644 --- a/wechat/gewe_chat.py +++ b/wechat/gewe_chat.py @@ -91,7 +91,7 @@ class GeWeChatCom: response = requests.post(url=api_url, headers=headers, data=json.dumps(data)) response_data = response.json() data=json.dumps(response_data, separators=(',', ':'),ensure_ascii=False) - logger.info(f'{token_id} 的登录APP信息:{data}') + #logger.info(f'{token_id} 的登录APP信息:{data}') return response_data.get('data') def qrCallback(self,uuid, base64_string): @@ -964,9 +964,9 @@ class GeWeChatCom: def save_login_wx_captch_code_to_cache(self,token_id,captch_code): hash_key = f"__AI_OPS_WX__:WXCAPTCHCODE:{token_id}" - redis_helper.redis_helper.set_hash(hash_key,{"data":captch_code},15) + redis_helper.redis_helper.set_hash(hash_key,{"data":captch_code},30) - def get_login_wx_captch_code_to_cache(self,token_id)->str: + def get_login_wx_captch_code_from_cache(self,token_id)->str: hash_key = f"__AI_OPS_WX__:WXCAPTCHCODE:{token_id}" r=redis_helper.redis_helper.get_hash_field(hash_key,"data") return r