From f28ac0166536a2a4b68cac685a41ea667f60f7e9 Mon Sep 17 00:00:00 2001 From: yj <2077506045@qq.com> Date: 星期三, 03 九月 2025 14:43:03 +0800 Subject: [PATCH] 兼容企业微信 --- app/services/friend_ignore_service.py | 5 -- app/services/silence_service.py | 2 app/services/contact_sync.py | 47 +++++++++++++++++++++++ app/services/message_processor.py | 46 +++++++++++++++-------- logs/app.log | 13 +++++- 5 files changed, 89 insertions(+), 24 deletions(-) diff --git a/app/services/contact_sync.py b/app/services/contact_sync.py index a775333..b5453c6 100644 --- a/app/services/contact_sync.py +++ b/app/services/contact_sync.py @@ -133,6 +133,9 @@ existing_contact.small_head = contact_data.get("smallHead") existing_contact.label_list = contact_data.get("labelList") existing_contact.v1 = contact_data.get("v1") + # 鍙湁褰撴柊鐨剋orkWcId涓嶄负绌烘椂鎵嶆洿鏂� + if contact_data.get("workWcId"): + existing_contact.work_wc_id = contact_data.get("workWcId") updated_count += 1 logger.debug(f"鏇存柊鑱旂郴浜轰俊鎭�: wc_id={wc_id}, nick_name={contact_data.get('nickName')}") else: @@ -150,6 +153,7 @@ small_head=contact_data.get("smallHead"), label_list=contact_data.get("labelList"), v1=contact_data.get("v1"), + work_wc_id=contact_data.get("workWcId"), # 娣诲姞浼佷笟寰俊ID ) db.add(new_contact) saved_count += 1 @@ -158,6 +162,10 @@ # 鎻愪氦浜嬪姟 db.commit() logger.info(f"鑱旂郴浜轰俊鎭繚瀛樺畬鎴�: 鏂板={saved_count}, 鏇存柊={updated_count}") + + # 鍚屾鑱旂郴浜哄悗鏇存柊Redis蹇界暐鍒楄〃 + self._update_redis_ignore_list(db) + return True except Exception as e: @@ -166,6 +174,45 @@ db.rollback() return False + def _update_redis_ignore_list(self, db: Session) -> bool: + """ + 鍚屾鑱旂郴浜哄悗鏇存柊Redis蹇界暐鍒楄〃 + 灏嗘暟鎹簱涓璫ontacts琛ㄤ腑work_wc_id涓嶄负绌虹殑璁板綍鐨剋ork_wc_id浣滀负wc_id娣诲姞鍒癛edis蹇界暐鍒楄〃 + + Args: + db: 鏁版嵁搴撲細璇� + + Returns: + 鏇存柊鎴愬姛杩斿洖True锛屽け璐ヨ繑鍥濬alse + """ + try: + # 鏌ヨ鎵�鏈墂ork_wc_id涓嶄负绌轰笖涓嶄负绌哄瓧绗︿覆鐨勮仈绯讳汉 + contacts_with_work_wc_id = db.query(Contact).filter( + Contact.work_wc_id.isnot(None) & (Contact.work_wc_id != "") + ).all() + + if not contacts_with_work_wc_id: + logger.info("娌℃湁鎵惧埌work_wc_id涓嶄负绌虹殑鑱旂郴浜�") + return True + + # 鎻愬彇鎵�鏈墂ork_wc_id + work_wc_ids = [contact.work_wc_id for contact in contacts_with_work_wc_id] + logger.info(f"鎵惧埌 {len(work_wc_ids)} 涓獁ork_wc_id涓嶄负绌虹殑鑱旂郴浜�") + + # 灏嗚繖浜泈ork_wc_id娣诲姞鍒癛edis蹇界暐鍒楄〃 + success = friend_ignore_service.add_friends_to_ignore_list(work_wc_ids) + + if success: + logger.info(f"鎴愬姛灏� {len(work_wc_ids)} 涓獁ork_wc_id娣诲姞鍒癛edis蹇界暐鍒楄〃") + else: + logger.error("娣诲姞work_wc_id鍒癛edis蹇界暐鍒楄〃澶辫触") + + return success + + except Exception as e: + logger.error(f"鏇存柊Redis蹇界暐鍒楄〃寮傚父: error={str(e)}") + return False + # 鍏ㄥ眬鑱旂郴浜哄悓姝ユ湇鍔″疄渚� contact_sync_service = ContactSyncService() diff --git a/app/services/friend_ignore_service.py b/app/services/friend_ignore_service.py index 2a8f71d..9752dde 100644 --- a/app/services/friend_ignore_service.py +++ b/app/services/friend_ignore_service.py @@ -77,10 +77,7 @@ logger.info("濂藉弸鍒楄〃涓虹┖锛屾棤闇�娣诲姞鍒板拷鐣ュ垪琛�") return True - # 娓呯┖鐜版湁鐨勫拷鐣ュ垪琛� - redis_queue.redis_client.delete(self.ignore_list_key) - - # 鎵归噺娣诲姞濂藉弸w_id鍒板拷鐣ュ垪琛� + # 鎵归噺娣诲姞濂藉弸w_id鍒板拷鐣ュ垪琛紙涓嶆竻绌虹幇鏈夊垪琛級 redis_queue.redis_client.sadd(self.ignore_list_key, *friends) logger.info(f"宸插皢 {len(friends)} 涓ソ鍙嬫坊鍔犲埌蹇界暐鍒楄〃") diff --git a/app/services/message_processor.py b/app/services/message_processor.py index fecc840..8a79a72 100644 --- a/app/services/message_processor.py +++ b/app/services/message_processor.py @@ -94,7 +94,7 @@ # 寮傚父鎯呭喌涓嬭繑鍥炲師濮媍ontent return callback_data.get("data", {}).get("content", "") - def parse_at_mentions(self, ai_answer: str) -> Tuple[str, List[str]]: + def parse_at_mentions(self, ai_answer: str, from_user: str) -> Tuple[str, List[str]]: """ 瑙f瀽AI鍥炲涓殑@瀛楃锛屾彁鍙栧鏈嶅悕绉� @@ -130,10 +130,17 @@ db.query(Contact).filter(Contact.nick_name == name).first() ) if contact: - at_wc_ids.append(contact.wc_id) - logger.info( - f"鎵惧埌瀹㈡湇鑱旂郴浜�: name={name}, wc_id={contact.wc_id}" - ) + # 濡傛灉from_user鍖呭惈@openim琛ㄧず鏄紒涓氬井淇★紝浣跨敤work_wc_id + if "@openim" in from_user: + at_wc_ids.append(contact.work_wc_id) + logger.info( + f"鎵惧埌瀹㈡湇鑱旂郴浜�-寰俊: name={name}, wc_id={contact.work_wc_id}" + ) + else: + at_wc_ids.append(contact.wc_id) + logger.info( + f"鎵惧埌瀹㈡湇鑱旂郴浜�-浼佷笟寰俊: name={name}, wc_id={contact.wc_id}" + ) else: logger.warning(f"鏈壘鍒板鏈嶈仈绯讳汉: name={name}") @@ -371,12 +378,14 @@ return False # 3.2 鑾峰彇缇ょ粍涓彂瑷�娆℃暟鏈�澶氱殑鐢ㄦ埛鏄电О - most_active_nickname = ( - group_stats_service.get_most_active_user_nickname(from_group) - ) - logger.info( - f"缇ょ粍鏈�娲昏穬鐢ㄦ埛鏄电О: group={from_group}, nickname={most_active_nickname}" - ) + # most_active_nickname = ( + # group_stats_service.get_most_active_user_nickname(from_group) + # ) + # logger.info( + # f"缇ょ粍鏈�娲昏穬鐢ㄦ埛鏄电О: group={from_group}, nickname={most_active_nickname}" + # ) + # 鑾峰彇榛樿瀹㈡湇鍚嶇О + nickname = settings.customer_service_default_name # 3.3 鑾峰彇鐢ㄦ埛鍦ㄥ綋鍓嶇兢缁勭殑conversation_id conversation_id = redis_queue.get_conversation_id(from_user, from_group) @@ -386,7 +395,7 @@ query=content, user=from_user, conversation_id=conversation_id, - nick_name=most_active_nickname, + nick_name=nickname, ) if silence_service.is_silence_active(from_group): @@ -475,7 +484,7 @@ success = False if ai_answer: # 瑙f瀽AI鍥炲涓殑@瀛楃 - processed_answer, at_wc_ids = self.parse_at_mentions(ai_answer) + processed_answer, at_wc_ids = self.parse_at_mentions(ai_answer, from_user) # 鍒ゆ柇AI鍥炲鏄惁鏄粨鏉熷瓧绗︿覆 is_end_str = self.is_end_str(ai_answer) # 鍙戦�佹秷鎭紝鏈�澶氶噸璇�3娆� @@ -495,10 +504,15 @@ ) else: # 濡傛灉璇ョ兢缁勯潤榛樻ā寮忔湭婵�娲伙紝婵�娲婚潤榛樻ā寮� - silence_service.activate_silence_mode(from_group) - logger.info( + flag = silence_service.activate_silence_mode(from_group) + if flag: + logger.info( f"AI鍥炲@瀹㈡湇锛岀兢缁勯潤榛樻ā寮忓凡婵�娲�: fromUser={from_user}, fromGroup={from_group}" - ) + ) + else: + logger.info( + f"AI鍥炲@瀹㈡湇锛屾湭婵�娲婚潤榛樻ā寮�: fromUser={from_user}, fromGroup={from_group}" + ) success = True break else: diff --git a/app/services/silence_service.py b/app/services/silence_service.py index 10727ae..1e09770 100644 --- a/app/services/silence_service.py +++ b/app/services/silence_service.py @@ -75,7 +75,7 @@ # 妫�鏌ユ槸鍚︿负娴嬭瘯缇ょ粍锛屽鏋滄槸鍒欎笉婵�娲婚潤榛樻ā寮� if self.is_test_group(group_id): logger.info(f"娴嬭瘯缇ょ粍涓嶆縺娲婚潤榛樻ā寮�: group_id={group_id}") - return True + return False if not settings.silence_mode_enabled: logger.debug("闈欓粯妯″紡鍔熻兘宸茬鐢�") diff --git a/logs/app.log b/logs/app.log index dc08815..cd3b4c8 100644 --- a/logs/app.log +++ b/logs/app.log @@ -1,3 +1,10 @@ -2025-08-26 15:35:24 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 -2025-08-26 15:55:13 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 -2025-08-26 16:08:41 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 17:06:10 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 17:15:21 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 17:20:38 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 17:20:55 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 17:24:47 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 17:25:26 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 17:37:52 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 17:42:02 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 18:01:43 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 +2025-08-27 18:11:34 | INFO | __main__:<module>:132 - 鍚姩E浜戠瀹�-DifyAI瀵规帴鏈嶅姟 -- Gitblit v1.9.1