From c19fd9d6b96a0bf661083f2f7bbbf70f9c600bd1 Mon Sep 17 00:00:00 2001 From: zhayujie Date: Sun, 16 Apr 2023 15:48:42 +0800 Subject: [PATCH] feat(planet): fetch all comments --- channel/planet/planet_channel.py | 40 +++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/channel/planet/planet_channel.py b/channel/planet/planet_channel.py index d9fc688..45320bc 100644 --- a/channel/planet/planet_channel.py +++ b/channel/planet/planet_channel.py @@ -9,6 +9,7 @@ from common import const MENTION_STR = '' MENTION_STR2 = '' +MENTION_STR3 = '' class PlanetChannel(Channel): def startup(self): @@ -49,7 +50,7 @@ class PlanetChannel(Channel): except Exception as e: logger.warn("[Planet] process topic failed, exception={}".format(e)) time.sleep(0.5) - time.sleep(30) + time.sleep(60) except Exception as e: logger.exception("[Planet] process failed, exception={}".format(e)) @@ -66,6 +67,7 @@ class PlanetChannel(Channel): # 场景一:用户直接在主题上艾特 query = talk_content.replace(MENTION_STR, '') query = query.replace(MENTION_STR2, '') + query = query.replace(MENTION_STR3, '') # 此时system_prompt使用全局配置, query为主题中的问题 context = {"from_user_id": talk_user_id} @@ -80,6 +82,25 @@ class PlanetChannel(Channel): if not comment_list or len(comment_list) <= 0: return + if len(comment_list) >= 8: + # 评论大于8条时需要展开 + all_comments = self._get_comments(topic['topic_id']) + if all_comments: + for comment in all_comments: + comment['repliee'] = {'user_id': talk_user_id} + comment_part = [comment] + if comment.get('replied_comments'): + comment_part.extend(comment.get('replied_comments')) + self._auto_comment(comment_part, topic) + return + + else: + self._auto_comment(comment_list, topic) + + + + def _auto_comment(self, comment_list: list, topic): + talk_user_id = str(topic['talk']['owner']['user_id']) comment_map = {} for comment in comment_list: comment_map[str(comment['comment_id'])] = comment @@ -98,6 +119,7 @@ class PlanetChannel(Channel): if query.find(self.bot_user_id) != -1: query = query.replace(MENTION_STR, '') query = query.replace(MENTION_STR2, '') + query = query.replace(MENTION_STR3, '') context = {"from_user_id": comment_user_id} reply_txt = super().build_reply_content(query, context) @@ -105,6 +127,7 @@ class PlanetChannel(Channel): logger.info("[Planet] comment success, id={}".format(comment['comment_id'])) return + def _is_reply_bot(self, comment_map, comment): # 是否是回复机器人的评论 if comment.get('repliee'): @@ -150,6 +173,21 @@ class PlanetChannel(Channel): print("Unable to get questions data.") return [] + # 访问知识星球API,获取评论列表 + def _get_comments(self, topic_id): + questions_url = f"https://api.zsxq.com/v2/topics/{topic_id}/comments?sort=asc&count=30&with_sticky=true" + response = requests.get(questions_url, headers=self._create_header()) + if response.status_code == 200: + try: + questions_data = response.json()["resp_data"]["comments"] + except: + logger.error("[Planet] get comments failed, res={}".format(response.text)) + questions_data = [] + return questions_data + else: + print("Unable to get comments data.") + return [] + # 访问知识星球API,回答问题 def _send_reply(self, question_id, answer):