| | |
| | | self.session = requests.Session() |
| | | self.session.headers.update(self.headers) |
| | | |
| | | def _filter_keywords(self, content: str) -> str: |
| | | """ |
| | | 过滤消息内容中的关键词 |
| | | |
| | | Args: |
| | | content: 原始消息内容 |
| | | |
| | | Returns: |
| | | 过滤后的消息内容 |
| | | """ |
| | | if not settings.keyword_filter_enabled or not settings.keyword_filter_keywords: |
| | | return content |
| | | |
| | | filtered_content = content |
| | | for keyword in settings.keyword_filter_keywords: |
| | | if keyword in filtered_content: |
| | | filtered_content = filtered_content.replace(keyword, "") |
| | | logger.info(f"过滤关键词: {keyword}") |
| | | |
| | | return filtered_content |
| | | |
| | | def get_contact_info(self, w_id: str, wc_id: str) -> Optional[Dict[str, Any]]: |
| | | """ |
| | | 获取联系人信息 |
| | |
| | | Returns: |
| | | 发送成功返回True,失败返回False |
| | | """ |
| | | # 过滤关键词 |
| | | filtered_content = self._filter_keywords(content) |
| | | |
| | | if max_retries is None: |
| | | from config import settings |
| | | max_retries = settings.max_retry_count |
| | | |
| | | |
| | | retry_count = 0 |
| | | while retry_count <= max_retries: |
| | | try: |
| | | url = f"{self.base_url}/sendText" |
| | | payload = {"wId": w_id, "wcId": wc_id, "content": content} |
| | | payload = {"wId": w_id, "wcId": wc_id, "content": filtered_content} |
| | | |
| | | logger.info( |
| | | f"发送文本消息: wId={w_id}, wcId={wc_id}, content_length={len(content)}, retry={retry_count}" |
| | | f"发送文本消息: wId={w_id}, wcId={wc_id}, content_length={len(filtered_content)}, retry={retry_count}" |
| | | ) |
| | | |
| | | response = self.session.post(url, json=payload, timeout=30) |
| | |
| | | Returns: |
| | | 发送成功返回True,失败返回False |
| | | """ |
| | | return self.send_text_message(w_id, group_id, content) |
| | | # 过滤关键词 |
| | | filtered_content = self._filter_keywords(content) |
| | | return self.send_text_message(w_id, group_id, filtered_content) |
| | | |
| | | def init_address_list(self, w_id: str) -> bool: |
| | | """ |
| | |
| | | Returns: |
| | | 发送成功返回True,失败返回False |
| | | """ |
| | | # 过滤关键词 |
| | | filtered_content = self._filter_keywords(content) |
| | | |
| | | if max_retries is None: |
| | | from config import settings |
| | | max_retries = settings.max_retry_count |
| | |
| | | payload = { |
| | | "wId": w_id, |
| | | "wcId": wc_id, |
| | | "content": content, |
| | | "content": filtered_content, |
| | | "at": at_str |
| | | } |
| | | |
| | | logger.info( |
| | | f"发送群聊@消息: wId={w_id}, wcId={wc_id}, at={at_str}, content_length={len(content)}, retry={retry_count}" |
| | | f"发送群聊@消息: wId={w_id}, wcId={wc_id}, at={at_str}, content_length={len(filtered_content)}, retry={retry_count}" |
| | | ) |
| | | |
| | | response = self.session.post(url, json=payload, timeout=30) |
| | |
| | | ) |
| | | return False |
| | | |
| | | def query_online_wechat_list(self) -> Optional[List[Dict[str, str]]]: |
| | | """ |
| | | 查询账号中在线的微信列表 |
| | | |
| | | Returns: |
| | | 在线微信列表,每个元素包含wcId和wId,失败返回None |
| | | 返回格式: [ |
| | | { |
| | | "wcId": "wxid_i6qsbbjenju2", |
| | | "wId": "72223018-7f2a-4f4f-bfa3-26e47dbd61" |
| | | } |
| | | ] |
| | | """ |
| | | try: |
| | | url = f"{self.base_url}/queryLoginWx" |
| | | payload = {} |
| | | |
| | | logger.info("查询在线微信列表") |
| | | |
| | | response = self.session.post(url, json=payload, timeout=30) |
| | | response.raise_for_status() |
| | | |
| | | result = response.json() |
| | | |
| | | if result.get("code") == "1000": |
| | | online_list = result.get("data", []) |
| | | logger.info(f"成功查询在线微信列表: count={len(online_list)}") |
| | | return online_list |
| | | else: |
| | | logger.warning( |
| | | f"查询在线微信列表失败: code={result.get('code')}, message={result.get('message')}" |
| | | ) |
| | | return [] |
| | | |
| | | except requests.exceptions.RequestException as e: |
| | | logger.error(f"查询在线微信列表网络错误: error={str(e)}") |
| | | return None |
| | | except Exception as e: |
| | | logger.error(f"查询在线微信列表异常: error={str(e)}") |
| | | return None |
| | | |
| | | |
| | | # 全局E云管家客户端实例 |
| | | ecloud_client = ECloudClient() |