添加 刷新通讯录功能,用于解决冗余数据问题。

This commit is contained in:
liuwei
2025-05-07 11:38:45 +08:00
parent 9a2d9f3f12
commit 19d56afc8d
5 changed files with 175 additions and 8 deletions

View File

@@ -181,9 +181,7 @@ class Robot(Job):
self.allContacts = self.get_all_contacts()
self.contact_manager.set_contacts(self.allContacts)
# 开启自动心跳(作为后台任务)
heartbeat_task = asyncio.create_task(self._heartbeat_task())
heartbeat_task_long = asyncio.create_task(self._heartbeat_task_long())
self.message_storage = MessageStorage(self.ipad_bot)
# 初始化消息工具类 - 使用联系人管理器
@@ -209,7 +207,9 @@ class Robot(Job):
# 标记为运行中
self.ipad_running = True
# 开启自动心跳(作为后台任务)
heartbeat_task = asyncio.create_task(self._heartbeat_task())
heartbeat_task_long = asyncio.create_task(self._heartbeat_task_long())
# 开始处理消息
self.LOG.info("开始处理wechat_ipad消息")
while self.ipad_running:
@@ -276,6 +276,7 @@ class Robot(Job):
self.ipad_config["wxid"] = self.ipad_bot.wxid
self.ipad_config["device_name"] = device_name
self.ipad_config["device_id"] = device_id
self.ipad_config["login_time"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
with open("wechat_ipad/config.toml", "w", encoding="utf-8") as f:
toml.dump(self.ipad_config, f)
@@ -298,7 +299,7 @@ class Robot(Job):
async def _heartbeat_task(self):
"""wechat_ipad心跳任务"""
self.LOG.info("开启wechat_ipad心跳")
while True:
while self.ipad_running:
try:
success = await self.ipad_bot.heartbeat()
if success:
@@ -312,7 +313,7 @@ class Robot(Job):
async def _heartbeat_task_long(self):
"""wechat_ipad心跳任务"""
self.LOG.info("开启wechat_ipad长连接心跳")
while True:
while self.ipad_running:
try:
success = await self.ipad_bot.heartbeat_long()
if success:
@@ -513,6 +514,69 @@ class Robot(Job):
self.LOG.error(f"获取联系人信息失败: {e}")
return {}
def refresh_contacts_db(self):
"""刷新联系人信息"""
#获取用户所有的联系人,并保存到数据库
self.LOG.info("开始刷新联系人信息")
#删除所有的联系人信息
self.contacts_db.delete_all_contacts()
self.LOG.debug("已删除所有的联系人信息")
contacts = self.ipad_bot.get_contract_list()
self.LOG.debug(f"获取到的联系人数量:{len(contacts)}")
#获取联系人详细信息,get_contract_detail每次可以获取20个
#每次获取20个需要循环获取
# 将联系人列表分成每组20个
batch_size = 20
for i in range(0, len(contacts), batch_size):
# 获取当前批次的联系人
batch_contacts = contacts[i:i + batch_size]
# 获取这批联系人的详细信息
contact_info = self.ipad_bot.get_contract_detail(batch_contacts)
self.LOG.debug(f"获取到的联系人详细信息数量:{len(contact_info)}")
self.contacts_db.save_contacts(contact_info,"friends")
# 获取群聊列表
groups = self.contacts_db.get_chatroom_list()
# 调用接口完成群成员信息获取与保存逻辑
for group in groups:
# 调用接口获取群成员信息
group_id = group["UserName"]
chatroom_info = self.ipad_bot.get_chatroom_info(group_id)
self.LOG.debug(f"获取到的群成员信息:{chatroom_info}")
if chatroom_info:
# 保存群信息到数据库
self.contacts_db.save_chatroom_info(chatroom_info)
# 保存群成员信息
if "NewChatroomData" in chatroom_info and "ChatRoomMember" in chatroom_info["NewChatroomData"]:
member_list = chatroom_info["NewChatroomData"]["ChatRoomMember"]
self.contacts_db.save_chatroom_member_simple(group_id, member_list)
# 更新联系人缓存
for member in member_list:
wxid = ""
if isinstance(member.get("UserName"), dict):
wxid = member["UserName"].get("string", "")
else:
wxid = member.get("UserName", "")
nick_name = ""
if isinstance(member.get("NickName"), dict):
nick_name = member["NickName"].get("string", "")
else:
nick_name = member.get("NickName", "")
if wxid:
self.allContacts[wxid] = nick_name
self.contact_manager.set_contacts(self.allContacts)
self.LOG.info(f"已更新群 {group_id} 的成员信息")
else:
self.LOG.error(f"获取群 {group_id} 信息失败,证明用户无该群信息,删除群的相关资料。")
#删除群数据库中的群信息
self.contacts_db.delete_chatroom_member_info(group_id)
self.LOG.info("联系人信息刷新完成")
# ============================================== 业务内容==========================================================
def news_baidu_report_auto(self) -> None: