選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

102 行
4.5KB

  1. import threading
  2. from common import kafka_helper,redis_helper,utils
  3. import json,time,re,random
  4. from common.log import logger, log_exception
  5. from wechat import gewe_chat
  6. def wx_messages_process_callback(message):
  7. wxchat=gewe_chat.wxchat
  8. msg_content= message
  9. cleaned_content = clean_json_string(msg_content)
  10. content=json.loads(cleaned_content)
  11. data = content.get("data", {})
  12. msg_type_data=data.get("msg_type",None)
  13. content_data = data.get("content",{})
  14. agent_tel=content_data.get("agent_tel",None)
  15. # print(message)
  16. print(msg_type_data)
  17. # # 更新好友缓存
  18. # save_friends_to_redis(agent_tel,agent_nickname_data,friends)
  19. if msg_type_data=='group-sending':
  20. hash_key = f"__AI_OPS_WX__:LOGININFO:{agent_tel}"
  21. # print('群发')
  22. logininfo=redis_helper.redis_helper.get_hash(hash_key)
  23. if logininfo:
  24. token_id=logininfo.get('tokenId')
  25. app_id=logininfo.get('appId')
  26. agent_wxid=logininfo.get('wxid')
  27. # print(token_id)
  28. # print(app_id)
  29. contacts_list=wxchat.fetch_contacts_list(token_id, app_id)
  30. friend_wxids=contacts_list['friends']
  31. wxid_contact_list_content_data=[c['wxid'] for c in content_data.get("contact_list",None)]
  32. intersection = list(set(friend_wxids) & set(wxid_contact_list_content_data))
  33. # print(intersection)
  34. wx_content_list=content_data.get("wx_content",[])
  35. for wx_content in wx_content_list:
  36. if wx_content["type"]=="text":
  37. for t in intersection:
  38. res=wxchat.post_text(token_id,app_id,t,wx_content["text"])
  39. logger.info(f'{agent_wxid} 向 {t} 发送 文字【{wx_content["text"]}】')
  40. input_wx_content_dialogue_message=[{"type": "text", "text": wx_content["text"]}]
  41. input_message=utils.dialogue_message(agent_wxid,t,input_wx_content_dialogue_message)
  42. kafka_helper.kafka_client.produce_message(input_message)
  43. logger.info("发送对话 %s",input_message)
  44. # 等待随机时间
  45. time.sleep(random.uniform(5, 15))
  46. if wx_content["type"]=="image_url":
  47. aeskey=""
  48. cdnthumburl=""
  49. cdnthumblength=0
  50. cdnthumbheight=0
  51. cdnthumbwidth=0
  52. length=0
  53. md5=""
  54. image_url= wx_content.get("image_url",{})
  55. url=image_url.get("url",None)
  56. for t in intersection:
  57. if t == intersection[0]:
  58. res=wxchat.post_image(token_id,app_id,t,url)
  59. aeskey=res["aesKey"]
  60. cdnthumburl=res["fileId"]
  61. cdnthumblength=res["cdnThumbLength"]
  62. cdnthumbheight=res["height"]
  63. cdnthumbwidth=res["width"]
  64. length=res["length"]
  65. md5=res["md5"]
  66. logger.info(f'{agent_wxid} 向 {t} 发送 图片【{url}】')
  67. else:
  68. res=wxchat.forward_image(token_id,app_id,t,aeskey,cdnthumburl,cdnthumblength,cdnthumbheight,cdnthumbwidth,length,md5)
  69. logger.info(f'{agent_wxid} 向 {t} 转发送 图片【{url}】')
  70. wx_content_dialogue_message=[{"type": "image_url", "image_url": {"url": url}}]
  71. input_message=utils.dialogue_message(agent_wxid,t,wx_content_dialogue_message)
  72. kafka_helper.kafka_client.produce_message(input_message)
  73. logger.info("发送对话 %s",input_message)
  74. time.sleep(random.uniform(5, 15))
  75. def clean_json_string(json_str):
  76. # 删除所有控制字符(非打印字符),包括换行符、回车符等
  77. return re.sub(r'[\x00-\x1f\x7f]', '', json_str)
  78. # 启动 Kafka 消费者线程
  79. def start_kafka_consumer_thread():
  80. consumer_thread = threading.Thread(target=kafka_helper.kafka_client.consume_messages, args=(wx_messages_process_callback,))
  81. consumer_thread.daemon = True # 设置为守护线程,应用退出时会自动结束
  82. consumer_thread.start()