server启动之后,填入callback

This commit is contained in:
liuwei
2025-04-23 11:48:47 +08:00
parent b8ea01ce4b
commit 1a4d40174e

View File

@@ -41,6 +41,7 @@ class Robot(Job):
def __init__(self, config: Config) -> None: def __init__(self, config: Config) -> None:
self.client = gewe_client.client self.client = gewe_client.client
self.config = config self.config = config
self.app_id = gewe_client.app_id
self.LOG = logging.getLogger("Robot") self.LOG = logging.getLogger("Robot")
self.LOG.info(f"DB+REDIS 连接池开始初始化") self.LOG.info(f"DB+REDIS 连接池开始初始化")
@@ -62,7 +63,7 @@ class Robot(Job):
self.contact_manager.set_contacts(self.allContacts) self.contact_manager.set_contacts(self.allContacts)
# 获取个人信息 # 获取个人信息
obj = json_to_object(self.client.get_profile(self.client.app_id)) obj = json_to_object(self.client.get_profile(self.app_id))
if obj.data.wxid is None: if obj.data.wxid is None:
self.LOG.info(f"获取个人信息失败,退出程序!") self.LOG.info(f"获取个人信息失败,退出程序!")
return return
@@ -407,80 +408,80 @@ class Robot(Job):
try: try:
# 先尝试从数据库获取联系人信息 # 先尝试从数据库获取联系人信息
contacts_dict = self.contacts_db.get_all_contacts() contacts_dict = self.contacts_db.get_all_contacts()
# 如果数据库中有联系人信息,直接返回 # 如果数据库中有联系人信息,直接返回
if contacts_dict: if contacts_dict:
self.LOG.info(f"从数据库成功获取了 {len(contacts_dict)} 个联系人信息") self.LOG.info(f"从数据库成功获取了 {len(contacts_dict)} 个联系人信息")
return contacts_dict return contacts_dict
# 数据库中没有联系人信息,需要初始化 # 数据库中没有联系人信息,需要初始化
self.LOG.info("数据库中没有联系人信息,开始初始化...") self.LOG.info("数据库中没有联系人信息,开始初始化...")
contacts_dict = {} contacts_dict = {}
# 获取所有联系人列表 # 获取所有联系人列表
response = self.client.fetch_contacts_list(self.app_id) response = self.client.fetch_contacts_list(self.app_id)
self.LOG.info(f"获取联系人列表响应: {response}") self.LOG.info(f"获取联系人列表响应: {response}")
if not response or response.get("ret") != 200: if not response or response.get("ret") != 200:
self.LOG.warning(f"获取联系人列表失败: {response}") self.LOG.warning(f"获取联系人列表失败: {response}")
return contacts_dict return contacts_dict
# 从响应中提取联系人数据 # 从响应中提取联系人数据
contact_data = response.get("data", {}) contact_data = response.get("data", {})
# 处理好友列表 # 处理好友列表
friends = contact_data.get("friends", []) friends = contact_data.get("friends", [])
for wxid in friends: for wxid in friends:
contacts_dict[wxid] = wxid # 默认使用wxid作为昵称 contacts_dict[wxid] = wxid # 默认使用wxid作为昵称
# 处理群聊列表 # 处理群聊列表
chatrooms = contact_data.get("chatrooms", []) chatrooms = contact_data.get("chatrooms", [])
for chatroom_id in chatrooms: for chatroom_id in chatrooms:
contacts_dict[chatroom_id] = chatroom_id contacts_dict[chatroom_id] = chatroom_id
# 如果是群聊,则获取群成员信息 # 如果是群聊,则获取群成员信息
self.update_chatroom_member_details(chatroom_id) self.update_chatroom_member_details(chatroom_id)
# 处理公众号列表 # 处理公众号列表
ghs = contact_data.get("ghs", []) ghs = contact_data.get("ghs", [])
for gh_id in ghs: for gh_id in ghs:
contacts_dict[gh_id] = gh_id contacts_dict[gh_id] = gh_id
# 获取联系人详细信息(昵称等) # 获取联系人详细信息(昵称等)
self.update_contact_details(contacts_dict) self.update_contact_details(contacts_dict)
self.LOG.info(f"成功获取并保存{len(contacts_dict)}个联系人信息") self.LOG.info(f"成功获取并保存{len(contacts_dict)}个联系人信息")
return contacts_dict return contacts_dict
except Exception as e: except Exception as e:
self.LOG.error(f"获取联系人信息失败: {e}") self.LOG.error(f"获取联系人信息失败: {e}")
return {} return {}
def update_contact_details(self, contacts_dict): def update_contact_details(self, contacts_dict):
"""更新联系人详细信息(昵称等)""" """更新联系人详细信息(昵称等)"""
try: try:
# 将wxid列表分批处理每批50个 # 将wxid列表分批处理每批50个
batch_size = 10 batch_size = 10
wxids = list(contacts_dict.keys()) wxids = list(contacts_dict.keys())
for i in range(0, len(wxids), batch_size): for i in range(0, len(wxids), batch_size):
batch_wxids = wxids[i:i + batch_size] batch_wxids = wxids[i:i + batch_size]
# 批量获取联系人详细信息 # 批量获取联系人详细信息
contact_info = self.client.get_detail_info(self.client.app_id, batch_wxids) contact_info = self.client.get_detail_info(self.app_id, batch_wxids)
self.LOG.info(f"获取联系人详细信息响应: {contact_info}") self.LOG.info(f"获取联系人详细信息响应: {contact_info}")
# 处理返回的数据 # 处理返回的数据
if contact_info and contact_info.get("ret") == 200 and "data" in contact_info: if contact_info and contact_info.get("ret") == 200 and "data" in contact_info:
contact_data = contact_info.get("data", []) contact_data = contact_info.get("data", [])
if contact_data: if contact_data:
for contact in contact_data: for contact in contact_data:
user_name = contact.get("userName") user_name = contact.get("userName")
if not user_name or user_name not in contacts_dict: if not user_name or user_name not in contacts_dict:
continue continue
# 更新昵称 # 更新昵称
contacts_dict[user_name] = contact.get("nickName") or user_name contacts_dict[user_name] = contact.get("nickName") or user_name
try: try:
# 判断联系人类型 # 判断联系人类型
contact_type = "friends" # 默认为好友类型 contact_type = "friends" # 默认为好友类型
@@ -488,16 +489,16 @@ class Robot(Job):
contact_type = "chatrooms" contact_type = "chatrooms"
elif user_name.startswith("gh_"): elif user_name.startswith("gh_"):
contact_type = "ghs" contact_type = "ghs"
# 保存到数据库 # 保存到数据库
self.contacts_db.save_contacts([contact], contact_type) self.contacts_db.save_contacts([contact], contact_type)
except Exception as e: except Exception as e:
self.LOG.error(f"处理联系人 {user_name} 失败: {e}") self.LOG.error(f"处理联系人 {user_name} 失败: {e}")
continue continue
else: else:
self.LOG.error(f"获取联系人详情失败: {contact_info}") self.LOG.error(f"获取联系人详情失败: {contact_info}")
except Exception as e: except Exception as e:
self.LOG.error(f"更新联系人详细信息失败: {e}") self.LOG.error(f"更新联系人详细信息失败: {e}")
@@ -505,7 +506,7 @@ class Robot(Job):
"""更新群成员详细信息""" """更新群成员详细信息"""
try: try:
# 首先获取群成员列表 # 首先获取群成员列表
members_response = self.client.get_chatroom_member_list(self.client.app_id, chatroom_id) members_response = self.client.get_chatroom_member_list(self.app_id, chatroom_id)
if members_response and members_response.get('ret') == 200: if members_response and members_response.get('ret') == 200:
member_list = members_response.get('data', {}).get('memberList', []) member_list = members_response.get('data', {}).get('memberList', [])
@@ -515,7 +516,7 @@ class Robot(Job):
if member_wxids: if member_wxids:
# 按照官方接口格式传递参数 # 按照官方接口格式传递参数
details_response = self.client.get_chatroom_member_detail( details_response = self.client.get_chatroom_member_detail(
self.client.app_id, self.app_id,
chatroom_id, chatroom_id,
member_wxids # 直接传递列表,不需要转换为集合 member_wxids # 直接传递列表,不需要转换为集合
) )