import threading from common import kafka_helper,redis_helper,utils import json,time,re,random from common.log import logger, log_exception from wechat import gewe_chat def wx_messages_process_callback(message): wxchat=gewe_chat.wxchat msg_content= message cleaned_content = clean_json_string(msg_content) content=json.loads(cleaned_content) data = content.get("data", {}) msg_type_data=data.get("msg_type",None) content_data = data.get("content",{}) agent_tel=content_data.get("agent_tel",None) # print(message) print(msg_type_data) # # 更新好友缓存 # save_friends_to_redis(agent_tel,agent_nickname_data,friends) if msg_type_data=='group-sending': hash_key = f"__AI_OPS_WX__:LOGININFO:{agent_tel}" # print('群发') logininfo=redis_helper.redis_helper.get_hash(hash_key) if logininfo: token_id=logininfo.get('tokenId') app_id=logininfo.get('appId') agent_wxid=logininfo.get('wxid') # print(token_id) # print(app_id) contacts_list=wxchat.fetch_contacts_list(token_id, app_id) friend_wxids=contacts_list['friends'] wxid_contact_list_content_data=[c['wxid'] for c in content_data.get("contact_list",None)] intersection = list(set(friend_wxids) & set(wxid_contact_list_content_data)) # print(intersection) wx_content_list=content_data.get("wx_content",[]) for wx_content in wx_content_list: if wx_content["type"]=="text": for t in intersection: res=wxchat.post_text(token_id,app_id,t,wx_content["text"]) logger.info(f'{agent_wxid} 向 {t} 发送 文字【{wx_content["text"]}】') input_wx_content_dialogue_message=[{"type": "text", "text": wx_content["text"]}] input_message=utils.dialogue_message(agent_wxid,t,input_wx_content_dialogue_message) kafka_helper.kafka_client.produce_message(input_message) logger.info("发送对话 %s",input_message) # 等待随机时间 time.sleep(random.uniform(5, 15)) if wx_content["type"]=="image_url": aeskey="" cdnthumburl="" cdnthumblength=0 cdnthumbheight=0 cdnthumbwidth=0 length=0 md5="" image_url= wx_content.get("image_url",{}) url=image_url.get("url",None) for t in intersection: if t == intersection[0]: res=wxchat.post_image(token_id,app_id,t,url) aeskey=res["aesKey"] cdnthumburl=res["fileId"] cdnthumblength=res["cdnThumbLength"] cdnthumbheight=res["height"] cdnthumbwidth=res["width"] length=res["length"] md5=res["md5"] logger.info(f'{agent_wxid} 向 {t} 发送 图片【{url}】') else: res=wxchat.forward_image(token_id,app_id,t,aeskey,cdnthumburl,cdnthumblength,cdnthumbheight,cdnthumbwidth,length,md5) logger.info(f'{agent_wxid} 向 {t} 转发送 图片【{url}】') wx_content_dialogue_message=[{"type": "image_url", "image_url": {"url": url}}] input_message=utils.dialogue_message(agent_wxid,t,wx_content_dialogue_message) kafka_helper.kafka_client.produce_message(input_message) logger.info("发送对话 %s",input_message) time.sleep(random.uniform(5, 15)) def clean_json_string(json_str): # 删除所有控制字符(非打印字符),包括换行符、回车符等 return re.sub(r'[\x00-\x1f\x7f]', '', json_str) # 启动 Kafka 消费者线程 def start_kafka_consumer_thread(): consumer_thread = threading.Thread(target=kafka_helper.kafka_client.consume_messages, args=(wx_messages_process_callback,)) consumer_thread.daemon = True # 设置为守护线程,应用退出时会自动结束 consumer_thread.start()