From 454d084715c8522bbfdaaf489cd5b00fee4e055d Mon Sep 17 00:00:00 2001 From: liuwei Date: Wed, 30 Apr 2025 13:22:33 +0800 Subject: [PATCH] =?UTF-8?q?855=20=E5=8D=8F=E8=AE=AE=E7=89=88=E6=9C=AC-?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=AE=8C=E6=AF=95=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/dashboard/blueprints/contacts.py | 3 +- admin/dashboard/blueprints/messages.py | 4 +- admin/dashboard/blueprints/plugin_routes.py | 4 +- admin/dashboard/blueprints/robot.py | 26 +- admin/dashboard/blueprints/stats.py | 3 +- admin/dashboard/blueprints/system.py | 4 +- admin/dashboard/blueprints/virtual_group.py | 4 +- admin/dashboard/server.py | 60 +- base/func_claude.py | 4 +- base/func_deepseek.py | 4 +- base/func_doubao.py | 4 +- base/func_english_news.py | 12 +- base/func_news.py | 4 +- db/base.py | 23 +- db/connection.py | 17 +- db/contacts_db.py | 196 +- db/group_virtual_redis.py | 4 +- db/kid_photo_redis.py | 38 +- db/message_storage.py | 2 +- db/points_db.py | 40 +- event_system/event_manager.py | 10 +- gewechat.zip | Bin 0 -> 175086 bytes gewechat/__init__.py | 0 gewechat/api/callback.py | 124 - gewechat/api/start_server.py | 89 - .../call_back_message/Gewechat.apifox.json | 1 - gewechat/call_back_message/Gewechat.md | 4616 ----------------- gewechat/call_back_message/model.md | 1200 ----- gewechat/client.py | 48 - gewechat/client/fetchContactsList.py | 20 - gewechat/client/get_chatroom_members.py | 120 - gewechat/client/get_token.py | 30 - gewechat/client/login.py | 12 - gewechat/client/set_call_back.py | 17 - gewechat/config.toml | 5 - gewechat/response/__init__.py | 0 gewechat/response/gewe_resp.py | 56 - gewechat/response/model/__init__.py | 0 gewechat/response/model/contacts/__init__.py | 0 .../response/model/contacts/brief_info.py | 31 - .../response/model/contacts/contacts_list.py | 19 - .../response/model/contacts/detail_info.py | 53 - gewechat/response/model/group/__init__.py | 0 .../response/model/group/chatroom_info.py | 54 - .../model/group/chatroom_member_detail.py | 61 - .../model/group/chatroom_member_list.py | 37 - gewechat/response/model/personal/__init__.py | 0 gewechat/response/model/personal/profile.py | 41 - main.py | 70 +- message_util.py | 33 +- plugin_common/message_plugin_interface.py | 11 +- plugin_common/plugin_interface.py | 6 +- plugin_common/plugin_manager.py | 5 +- plugins/beautyleg/main.py | 3 - plugins/dify/main.py | 26 +- plugins/douyin_parser/main.py | 5 +- plugins/game_task/main.py | 151 +- plugins/global_news/main.py | 26 +- plugins/global_news/news_crawler.py | 12 +- plugins/group_auto_invite/main.py | 39 +- plugins/group_member_change/main.py | 35 +- plugins/group_virtual/main.py | 6 +- plugins/message_recall/main.py | 4 +- plugins/message_sign/main.py | 89 +- plugins/music/main.py | 31 +- plugins/plugin_manager/main.py | 4 +- plugins/point_trade/main.py | 144 +- plugins/stats_collector/main.py | 18 +- plugins/system_updater/main.py | 4 +- plugins/video/main.py | 26 +- plugins/video_man/main.py | 4 +- plugins/xiuren_image/main.py | 20 +- robot.py | 829 ++- utils/decorator/plugin_decorators.py | 129 +- utils/decorator/points_decorator.py | 177 +- utils/media_downloader.py | 20 +- utils/robot_cmd/robot_command.py | 4 +- utils/wechat/contact_manager.py | 6 +- utils/wechat/message_to_db.py | 81 +- wechat_ipad/bot-core.py | 8 +- wechat_ipad/client/__init__.py | 5 +- wechat_ipad/client/fallback.png | Bin 0 -> 1025077 bytes wechat_ipad/client/firends.py | 4 +- wechat_ipad/client/group.py | 51 +- wechat_ipad/client/login.py | 3 +- wechat_ipad/client/message.py | 164 +- wechat_ipad/client/tools.py | 8 +- .../models}/message.py | 20 +- 88 files changed, 1565 insertions(+), 7816 deletions(-) create mode 100644 gewechat.zip delete mode 100644 gewechat/__init__.py delete mode 100644 gewechat/api/callback.py delete mode 100644 gewechat/api/start_server.py delete mode 100644 gewechat/call_back_message/Gewechat.apifox.json delete mode 100644 gewechat/call_back_message/Gewechat.md delete mode 100644 gewechat/call_back_message/model.md delete mode 100644 gewechat/client.py delete mode 100644 gewechat/client/fetchContactsList.py delete mode 100644 gewechat/client/get_chatroom_members.py delete mode 100644 gewechat/client/get_token.py delete mode 100644 gewechat/client/login.py delete mode 100644 gewechat/client/set_call_back.py delete mode 100644 gewechat/config.toml delete mode 100644 gewechat/response/__init__.py delete mode 100644 gewechat/response/gewe_resp.py delete mode 100644 gewechat/response/model/__init__.py delete mode 100644 gewechat/response/model/contacts/__init__.py delete mode 100644 gewechat/response/model/contacts/brief_info.py delete mode 100644 gewechat/response/model/contacts/contacts_list.py delete mode 100644 gewechat/response/model/contacts/detail_info.py delete mode 100644 gewechat/response/model/group/__init__.py delete mode 100644 gewechat/response/model/group/chatroom_info.py delete mode 100644 gewechat/response/model/group/chatroom_member_detail.py delete mode 100644 gewechat/response/model/group/chatroom_member_list.py delete mode 100644 gewechat/response/model/personal/__init__.py delete mode 100644 gewechat/response/model/personal/profile.py create mode 100644 wechat_ipad/client/fallback.png rename {gewechat/call_back_message => wechat_ipad/models}/message.py (97%) diff --git a/admin/dashboard/blueprints/contacts.py b/admin/dashboard/blueprints/contacts.py index 955660b..1cff6fc 100644 --- a/admin/dashboard/blueprints/contacts.py +++ b/admin/dashboard/blueprints/contacts.py @@ -1,10 +1,9 @@ from flask import Blueprint, render_template, jsonify, request, current_app from .auth import login_required -import logging +from loguru import logger # 创建联系人管理蓝图 contacts_bp = Blueprint('contacts', __name__, url_prefix='/contacts') -logger = logging.getLogger("ContactsBlueprint") # 联系人管理页面 @contacts_bp.route('/') diff --git a/admin/dashboard/blueprints/messages.py b/admin/dashboard/blueprints/messages.py index 1e5a8ff..c5d7380 100644 --- a/admin/dashboard/blueprints/messages.py +++ b/admin/dashboard/blueprints/messages.py @@ -1,13 +1,13 @@ from flask import Blueprint, render_template, jsonify, request, current_app from .auth import login_required -import logging +from loguru import logger import xml.etree.ElementTree as ET from datetime import datetime from utils.message_formatter import format_quote_message # 创建消息管理蓝图 messages_bp = Blueprint('messages', __name__) -logger = logging.getLogger("MessagesBlueprint") +logger = logger # 消息列表页面 @messages_bp.route('/messages') diff --git a/admin/dashboard/blueprints/plugin_routes.py b/admin/dashboard/blueprints/plugin_routes.py index 83437d8..73972fa 100644 --- a/admin/dashboard/blueprints/plugin_routes.py +++ b/admin/dashboard/blueprints/plugin_routes.py @@ -1,5 +1,5 @@ import json -import logging +from loguru import logger import os import toml @@ -9,7 +9,7 @@ from admin.dashboard.blueprints.auth import login_required # 创建蓝图 plugin_routes = Blueprint('plugin_routes', __name__) -LOG = logging.getLogger(__name__) +LOG = logger # 机器人管理页面 diff --git a/admin/dashboard/blueprints/robot.py b/admin/dashboard/blueprints/robot.py index c7cbe42..cc385de 100644 --- a/admin/dashboard/blueprints/robot.py +++ b/admin/dashboard/blueprints/robot.py @@ -1,12 +1,12 @@ from flask import Blueprint, render_template, jsonify, request, current_app from .auth import login_required -import logging +from loguru import logger from utils.robot_cmd.robot_command import GroupBotManager, Feature, PermissionStatus from datetime import datetime # 创建机器人管理蓝图 robot_bp = Blueprint('robot', __name__, url_prefix='/robot') -logger = logging.getLogger("RobotBlueprint") +LOG = logger # 机器人管理页面 @robot_bp.route('/') @@ -31,7 +31,7 @@ def api_robot_groups(): if groups is None: groups = set() - logger.info(f"获取到 {len(groups)} 个群组") + LOG.info(f"获取到 {len(groups)} 个群组") group_data = [] for group_id in groups: @@ -53,7 +53,7 @@ def api_robot_groups(): "robot_status": robot_status.value if robot_status else "unknown" }) except Exception as e: - logger.warning(f"处理群组 {group_id} 信息时出错: {e}") + LOG.warning(f"处理群组 {group_id} 信息时出错: {e}") # 添加基本信息,避免单个群组错误影响整个列表 group_data.append({ "group_id": group_id, @@ -63,7 +63,7 @@ def api_robot_groups(): return jsonify({"success": True, "data": group_data}) except Exception as e: - logger.error(f"获取群组列表失败: {e}") + LOG.error(f"获取群组列表失败: {e}") return jsonify({"success": False, "error": str(e)}), 500 @robot_bp.route('/api/group//permissions') @@ -83,7 +83,7 @@ def api_robot_group_permissions(group_id): return jsonify({"success": True, "data": permission_data}) except Exception as e: - logger.error(f"获取群组权限失败: {e}") + LOG.error(f"获取群组权限失败: {e}") return jsonify({"success": False, "error": str(e)}), 500 @robot_bp.route('/api/group//permissions', methods=['POST']) @@ -112,7 +112,7 @@ def api_update_robot_permissions(group_id): GroupBotManager.set_group_permission(group_id, feature, new_status) return jsonify({"success": True}) except Exception as e: - logger.error(f"更新群组权限失败: {e}") + LOG.error(f"更新群组权限失败: {e}") return jsonify({"success": False, "error": str(e)}), 400 @robot_bp.route('/api/batch_operation', methods=['POST']) @@ -135,7 +135,7 @@ def api_robot_batch_operation(): else: return jsonify({"success": False, "error": "不支持的操作类型"}), 400 except Exception as e: - logger.error(f"批量操作失败: {e}") + LOG.error(f"批量操作失败: {e}") return jsonify({"success": False, "error": str(e)}), 400 @robot_bp.route('/api/add_group', methods=['POST']) @@ -179,7 +179,7 @@ def api_add_group(): } }) except Exception as e: - logger.error(f"添加群组失败: {e}") + LOG.error(f"添加群组失败: {e}") return jsonify({"success": False, "error": str(e)}), 500 @robot_bp.route('/api/group//message_trend') @@ -211,7 +211,7 @@ def api_group_message_trend(group_id): } }) except Exception as e: - logger.error(f"获取群组消息趋势数据出错: {e}") + LOG.error(f"获取群组消息趋势数据出错: {e}") return jsonify({'success': False, 'error': str(e)}), 500 # 添加缺失的群组状态更新接口 @@ -225,7 +225,7 @@ def api_update_group_status(group_id): if status == 'disabled': # 禁用该群组的所有功能 - logger.info(f"正在禁用群组 {group_id} 的所有功能") + LOG.info(f"正在禁用群组 {group_id} 的所有功能") # 获取所有功能并禁用 for feature in Feature: @@ -245,7 +245,7 @@ def api_update_group_status(group_id): }) elif status == 'enabled': # 启用该群组的基本功能 - logger.info(f"正在启用群组 {group_id} 的基本功能") + LOG.info(f"正在启用群组 {group_id} 的基本功能") # 添加到群组列表 if group_id not in GroupBotManager.local_cache["group_list"]: @@ -269,5 +269,5 @@ def api_update_group_status(group_id): }), 400 except Exception as e: - logger.error(f"更新群组状态失败: {e}") + LOG.error(f"更新群组状态失败: {e}") return jsonify({"success": False, "error": str(e)}), 500 \ No newline at end of file diff --git a/admin/dashboard/blueprints/stats.py b/admin/dashboard/blueprints/stats.py index ed6be8a..95a8bd8 100644 --- a/admin/dashboard/blueprints/stats.py +++ b/admin/dashboard/blueprints/stats.py @@ -1,12 +1,11 @@ from flask import Blueprint, render_template, jsonify, request from .auth import login_required -import logging +from loguru import logger from datetime import datetime from flask import current_app # 创建统计数据蓝图 stats_bp = Blueprint('stats', __name__) -logger = logging.getLogger("StatsBlueprint") # 页面路由 @stats_bp.route('/plugins') diff --git a/admin/dashboard/blueprints/system.py b/admin/dashboard/blueprints/system.py index 01cffe2..d2f568c 100644 --- a/admin/dashboard/blueprints/system.py +++ b/admin/dashboard/blueprints/system.py @@ -1,6 +1,6 @@ from flask import Blueprint, render_template, jsonify, request, send_from_directory, current_app from .auth import login_required -import logging +from loguru import logger import os import time from datetime import datetime @@ -10,7 +10,7 @@ from collections import deque # 创建系统信息蓝图 system_bp = Blueprint('system', __name__) -logger = logging.getLogger("SystemBlueprint") + # 记录应用启动时间 APP_START_TIME = time.time() diff --git a/admin/dashboard/blueprints/virtual_group.py b/admin/dashboard/blueprints/virtual_group.py index fdaaabc..bce4404 100644 --- a/admin/dashboard/blueprints/virtual_group.py +++ b/admin/dashboard/blueprints/virtual_group.py @@ -1,9 +1,9 @@ -import logging +from loguru import logger import uuid from flask import Blueprint, jsonify, request, current_app, render_template from .auth import login_required -logger = logging.getLogger(__name__) + virtual_group_bp = Blueprint('virtual_group', __name__) # 添加虚拟群组管理视图 diff --git a/admin/dashboard/server.py b/admin/dashboard/server.py index 5d6144b..616faa8 100644 --- a/admin/dashboard/server.py +++ b/admin/dashboard/server.py @@ -2,23 +2,22 @@ """ 统计看板服务器 - 使用Flask蓝图重构版 """ -import logging import os import sys import threading -import time -from datetime import datetime - -from gewechat_client import GewechatClient +from loguru import logger from db.message_storage import MessageStorageDB from db.stats_db import StatsDBOperator from flask import Flask, send_from_directory import toml +from wechat_ipad import WechatAPIClient + # 添加项目根目录到系统路径,确保可以导入项目模块 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) + class DashboardServer: """统计看板服务器""" @@ -34,10 +33,8 @@ class DashboardServer: self.username = username or self.config.get("auth", {}).get("username", "admin") self.password = password or self.config.get("auth", {}).get("password", "admin123") - self.logger = logging.getLogger("DashboardServer") - self.logger.info(f"Dashboard配置加载完成: 服务器将运行在 {self.host}:{self.port}") - logging.getLogger("werkzeug").setLevel(logging.WARNING) - + self.LOG = logger + self.LOG.info(f"Dashboard配置加载完成: 服务器将运行在 {self.host}:{self.port}") # 如果提供了robot实例,则使用其对象 if robot_instance: self.db_manager = robot_instance.db_manager @@ -47,11 +44,10 @@ class DashboardServer: self.contact_manager = robot_instance.contact_manager self.plugin_manager = robot_instance.plugin_manager self.plugin_registry = robot_instance.plugin_registry - self.client:GewechatClient= robot_instance.client - self.app_id = robot_instance.app_id - self.logger.info("使用Robot实例的对象进行初始化") + self.client: WechatAPIClient = robot_instance.ipad_bot + self.LOG.info("使用Robot实例的对象进行初始化") else: - self.logger.error("未提供Robot实例,Dashboard无法正常工作") + self.LOG.error("未提供Robot实例,Dashboard无法正常工作") raise ValueError("必须提供Robot实例") self.app = self._create_app() @@ -75,7 +71,7 @@ class DashboardServer: toml.dump(default_config, f) return default_config except Exception as e: - self.logger.error(f"加载Dashboard配置文件失败: {e}") + self.LOG.error(f"加载Dashboard配置文件失败: {e}") # 返回默认配置 return { "server": {"host": "0.0.0.0", "port": 8888}, @@ -90,10 +86,10 @@ class DashboardServer: app.secret_key = "stats_dashboard_secret_key" # 禁用模板缓存,使修改HTML文件后立即生效 app.config['TEMPLATES_AUTO_RELOAD'] = True - + # 将dashboard_server实例设置为app的属性 app.dashboard_server = self - + # 配置静态文件访问 static_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static') @@ -120,9 +116,9 @@ class DashboardServer: # 注册蓝图 self._register_blueprints(app) - + return app - + def _register_blueprints(self, app): """注册所有蓝图""" # 在函数内部导入蓝图,避免循环导入 @@ -146,52 +142,52 @@ class DashboardServer: app.register_blueprint(stats_bp) app.register_blueprint(system_bp) app.register_blueprint(plugin_routes) - - self.logger.info("所有蓝图已注册") + + self.LOG.info("所有蓝图已注册") def run(self): """运行服务器""" from werkzeug.serving import make_server - self.logger.info(f"启动服务器: {self.host}:{self.port}") + self.LOG.info(f"启动服务器: {self.host}:{self.port}") try: # 使用线程安全的方式运行服务器 self._server = make_server(self.host, self.port, self.app) self._server.serve_forever() except Exception as e: - self.logger.error(f"服务器运行失败: {e}") + self.LOG.error(f"服务器运行失败: {e}") self._stop_event.set() def stop(self): """停止服务器""" - self.logger.info("正在停止服务器...") + self.LOG.info("正在停止服务器...") self._stop_event.set() # 使用werkzeug服务器的关闭方法 if self._server: self._server.shutdown() - self.logger.info("服务器已停止") + self.LOG.info("服务器已停止") def get_current_user_info(self): """获取当前登录的微信用户信息""" try: if not self.client: - self.logger.error("client实例不可用,无法获取当前用户信息") + self.LOG.error("client实例不可用,无法获取当前用户信息") return {"success": False, "message": "实例不可用"} - + # 获取当前登录的微信ID - resp = self.client.get_profile(self.app_id) - + resp = self.client.get_profile(self.client.wxid) + self.LOG.info(f"get_current_user_info:{resp}") if not resp or resp.get("ret") != 200: - self.logger.error(f"获取用户信息失败: {resp}") + self.LOG.error(f"获取用户信息失败: {resp}") return {"success": False, "message": "获取用户信息失败"} - + # 从新的resp格式中获取用户信息 user_data = resp.get("data", {}) if not user_data: return {"success": False, "message": "未获取到用户数据"} - + return { "success": True, "data": { @@ -203,5 +199,5 @@ class DashboardServer: } } except Exception as e: - self.logger.error(f"获取当前用户信息失败: {e}") + self.LOG.error(f"获取当前用户信息失败: {e}") return {"success": False, "message": f"获取用户信息出错: {str(e)}"} diff --git a/base/func_claude.py b/base/func_claude.py index aeb8fe6..e1e7b47 100644 --- a/base/func_claude.py +++ b/base/func_claude.py @@ -1,6 +1,6 @@ import requests import json -import logging +from loguru import logger from datetime import datetime @@ -11,7 +11,7 @@ class Claude(): self.api = conf.get("api") prompt = conf.get("prompt") self.model = conf.get("model") - self.LOG = logging.getLogger("Claude") + self.LOG = logger self.conversation_list = {} self.system_content_msg = {"role": "system", "content": prompt} diff --git a/base/func_deepseek.py b/base/func_deepseek.py index f9ae493..e21a8e8 100644 --- a/base/func_deepseek.py +++ b/base/func_deepseek.py @@ -1,6 +1,6 @@ import requests import json -import logging +from loguru import logger from datetime import datetime @@ -11,7 +11,7 @@ class DeepSeek(): self.api = conf.get("api") prompt = conf.get("prompt") self.model = conf.get("model") - self.LOG = logging.getLogger("deepseek") + self.LOG = logger("deepseek") self.conversation_list = {} self.system_content_msg = {"role": "system", "content": prompt} diff --git a/base/func_doubao.py b/base/func_doubao.py index 1f70ceb..8e6a73a 100644 --- a/base/func_doubao.py +++ b/base/func_doubao.py @@ -1,6 +1,6 @@ import requests import json -import logging +from loguru import logger from datetime import datetime @@ -11,7 +11,7 @@ class Doubao(): self.api = conf.get("api") prompt = conf.get("prompt") self.model = conf.get("model") - self.LOG = logging.getLogger("doubao") + self.LOG = logger self.conversation_list = {} self.system_content_msg = {"role": "system", "content": prompt} diff --git a/base/func_english_news.py b/base/func_english_news.py index fcf9595..9331d20 100644 --- a/base/func_english_news.py +++ b/base/func_english_news.py @@ -14,19 +14,9 @@ from utils.markdown_to_image import convert_md_str_to_image import requests from time import localtime, sleep from lxml import etree -import logging +from loguru import logger from datetime import datetime -# 配置日志 -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(levelname)s - %(message)s', - handlers=[ - logging.FileHandler(f'news_crawler_{datetime.now().strftime("%Y%m%d")}.log'), - logging.StreamHandler() - ] -) -logger = logging.getLogger(__name__) # 请求配置 HEADERS = { diff --git a/base/func_news.py b/base/func_news.py index 088141f..7ae4268 100644 --- a/base/func_news.py +++ b/base/func_news.py @@ -3,7 +3,7 @@ import json import re -import logging +from loguru import logger import time from datetime import datetime @@ -16,7 +16,7 @@ from utils.ai.dify_news_analyze import dify_news_title_analyze class News(object): def __init__(self) -> None: - self.LOG = logging.getLogger(__name__) + self.LOG = logger self.week = {0: "周一", 1: "周二", 2: "周三", 3: "周四", 4: "周五", 5: "周六", 6: "周日"} self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0"} diff --git a/db/base.py b/db/base.py index 9522ad5..cd4076e 100644 --- a/db/base.py +++ b/db/base.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import logging +from loguru import logger from typing import List, Dict, Any, Optional, Tuple, Union from db.connection import DBConnectionManager @@ -7,12 +7,13 @@ from db.connection import DBConnectionManager class BaseDBOperator: """基础数据库操作类""" - + def __init__(self, db_manager: DBConnectionManager): self.db_manager = db_manager - self.LOG = logging.getLogger(self.__class__.__name__) - - def execute_query(self, sql: str, params: Optional[tuple] = None, fetch_one: bool = False) -> Union[List[Dict], Dict, None]: + self.LOG = logger + + def execute_query(self, sql: str, params: Optional[tuple] = None, fetch_one: bool = False) -> Union[ + List[Dict], Dict, None]: """执行查询SQL""" conn = self.db_manager.get_mysql_connection() try: @@ -26,7 +27,7 @@ class BaseDBOperator: return None finally: conn.close() - + def execute_update(self, sql: str, params: Optional[tuple] = None) -> bool: """执行更新SQL""" conn = self.db_manager.get_mysql_connection() @@ -41,12 +42,12 @@ class BaseDBOperator: return False finally: conn.close() - + def execute_batch(self, sql: str, params_list: List[tuple]) -> bool: """批量执行SQL""" if not params_list: return True - + conn = self.db_manager.get_mysql_connection() try: with conn.cursor() as cursor: @@ -59,12 +60,12 @@ class BaseDBOperator: return False finally: conn.close() - + def execute_transaction(self, operations: List[Tuple[str, tuple]]) -> bool: """执行事务""" if not operations: return True - + conn = self.db_manager.get_mysql_connection() try: with conn.cursor() as cursor: @@ -77,4 +78,4 @@ class BaseDBOperator: conn.rollback() return False finally: - conn.close() \ No newline at end of file + conn.close() diff --git a/db/connection.py b/db/connection.py index 5908c90..413031d 100644 --- a/db/connection.py +++ b/db/connection.py @@ -1,4 +1,5 @@ -import logging + +from loguru import logger import mysql.connector import redis @@ -35,7 +36,7 @@ class DBConnectionManager: mysql_config: MySQL配置 redis_config: Redis配置 """ - self.logger = logging.getLogger("DBConnectionManager") + self.LOG = logger self.mysql_pool = None self.redis_pool = None @@ -55,7 +56,7 @@ class DBConnectionManager: """ try: if not config: - self.logger.warning("MySQL配置为空,跳过初始化") + self.LOG.warning("MySQL配置为空,跳过初始化") return # 准备连接池配置 @@ -74,9 +75,9 @@ class DBConnectionManager: # 创建连接池 self.mysql_pool = mysql.connector.pooling.MySQLConnectionPool(**pool_config) - self.logger.info("MySQL连接池初始化成功") + self.LOG.info("MySQL连接池初始化成功") except Exception as e: - self.logger.error(f"MySQL连接池初始化失败: {e}") + self.LOG.error(f"MySQL连接池初始化失败: {e}") self.mysql_pool = None def init_redis_pool(self, config): @@ -87,7 +88,7 @@ class DBConnectionManager: """ try: if not config: - self.logger.warning("Redis配置为空,跳过初始化") + self.LOG.warning("Redis配置为空,跳过初始化") return self.redis_pool = redis.ConnectionPool( @@ -98,9 +99,9 @@ class DBConnectionManager: decode_responses=config.get('decode_responses', True), max_connections=config.get('max_connections', 10) ) - self.logger.info("Redis连接池初始化成功") + self.LOG.info("Redis连接池初始化成功") except Exception as e: - self.logger.error(f"Redis连接池初始化失败: {e}") + self.LOG.error(f"Redis连接池初始化失败: {e}") self.redis_pool = None def get_mysql_connection(self): diff --git a/db/contacts_db.py b/db/contacts_db.py index 8297e4b..603de34 100644 --- a/db/contacts_db.py +++ b/db/contacts_db.py @@ -4,7 +4,7 @@ 用于管理微信联系人信息的存储和查询 """ -import logging +from loguru import logger import json from typing import List, Dict, Optional, Union, Any @@ -18,7 +18,7 @@ class ContactsDBOperator(BaseDBOperator): def __init__(self, db_manager: DBConnectionManager): super().__init__(db_manager) - self.logger = logging.getLogger(__name__) + self.LOG = logger def _ensure_table_exists(self): """确保联系人表存在""" @@ -106,9 +106,9 @@ class ContactsDBOperator(BaseDBOperator): UNIQUE KEY `idx_chatroom_id` (`chatroom_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信群信息表'; """) - self.logger.info("成功创建或确认微信群信息表存在") + self.LOG.info("成功创建或确认微信群信息表存在") except Exception as e: - self.logger.error(f"创建微信联系人表或群成员表失败: {e}") + self.LOG.error(f"创建微信联系人表或群成员表失败: {e}") raise def save_contacts(self, contacts_data: List[Dict], contact_type: str) -> bool: @@ -122,7 +122,7 @@ class ContactsDBOperator(BaseDBOperator): bool: 是否成功保存 """ if not contacts_data: - self.logger.warning(f"没有{contact_type}类型的联系人数据需要保存") + self.LOG.warning(f"没有{contact_type}类型的联系人数据需要保存") return True try: @@ -169,11 +169,11 @@ class ContactsDBOperator(BaseDBOperator): self.execute_update(sql, values) - self.logger.info(f"成功保存{len(contacts_data)}个{contact_type}类型的联系人") + self.LOG.info(f"成功保存{len(contacts_data)}个{contact_type}类型的联系人") return True except Exception as e: - self.logger.error(f"保存{contact_type}类型的联系人失败: {e}") + self.LOG.error(f"保存{contact_type}类型的联系人失败: {e}") return False def save_simple_contacts(self, contact_list: List[str], contact_type: str) -> bool: @@ -187,7 +187,7 @@ class ContactsDBOperator(BaseDBOperator): bool: 是否成功保存 """ if not contact_list: - self.logger.warning(f"没有{contact_type}类型的联系人数据需要保存") + self.LOG.warning(f"没有{contact_type}类型的联系人数据需要保存") return True try: @@ -201,11 +201,11 @@ class ContactsDBOperator(BaseDBOperator): self.execute_update(sql, (user_name, contact_type)) - self.logger.info(f"成功保存{len(contact_list)}个{contact_type}类型的简单联系人") + self.LOG.info(f"成功保存{len(contact_list)}个{contact_type}类型的简单联系人") return True except Exception as e: - self.logger.error(f"保存{contact_type}类型的简单联系人失败: {e}") + self.LOG.error(f"保存{contact_type}类型的简单联系人失败: {e}") return False def get_contacts_by_type(self, contact_type: str) -> List[Dict]: @@ -227,7 +227,7 @@ class ContactsDBOperator(BaseDBOperator): results = self.execute_query(sql, (contact_type,)) return results except Exception as e: - self.logger.error(f"获取{contact_type}类型的联系人失败: {e}") + self.LOG.error(f"获取{contact_type}类型的联系人失败: {e}") return [] def get_contact_by_user_name(self, user_name: str) -> Optional[Dict]: @@ -249,7 +249,7 @@ class ContactsDBOperator(BaseDBOperator): result = self.execute_query(sql, (user_name,), fetch_one=True) return result except Exception as e: - self.logger.error(f"获取联系人{user_name}失败: {e}") + self.LOG.error(f"获取联系人{user_name}失败: {e}") return None def get_display_name(self, user_name: str) -> str: @@ -294,10 +294,10 @@ class ContactsDBOperator(BaseDBOperator): display_name = result.get('remark') or result.get('nick_name') or user_name contacts_dict[user_name] = display_name - self.logger.info(f"从数据库获取了 {len(contacts_dict)} 个联系人信息") + self.LOG.info(f"从数据库获取了 {len(contacts_dict)} 个联系人信息") return contacts_dict except Exception as e: - self.logger.error(f"获取所有联系人信息失败: {e}") + self.LOG.error(f"获取所有联系人信息失败: {e}") return {} def get_all_contacts_name_map(self) -> Dict[str, str]: @@ -323,7 +323,7 @@ class ContactsDBOperator(BaseDBOperator): return name_map except Exception as e: - self.logger.error(f"获取所有联系人名称映射失败: {e}") + self.LOG.error(f"获取所有联系人名称映射失败: {e}") return {} def save_chatroom_member_simple(self, chatroom_id: str, member_details: List[Dict]) -> bool: """保存简化版的群成员信息到数据库 @@ -331,35 +331,79 @@ class ContactsDBOperator(BaseDBOperator): Args: chatroom_id: 群聊ID member_details: 群成员信息列表,格式为: - [{'wxid': str, 'nickName': str, 'inviterUserName': str, - 'memberFlag': int, 'displayName': str, - 'bigHeadImgUrl': str, 'smallHeadImgUrl': str}] - + [{'UserName': str, 'NickName': str, 'InviterUserName': str, + 'ChatroomMemberFlag': int, 'DisplayName': str}] + Returns: bool: 是否成功保存 """ if not member_details or not chatroom_id: - self.logger.warning(f"没有群聊{chatroom_id}的成员信息需要保存") + self.LOG.warning(f"没有群聊{chatroom_id}的成员信息需要保存") return False try: for member in member_details: - wxid = member.get('wxid', '') + # 处理新的数据结构 + wxid = "" + if "UserName" in member: + if isinstance(member["UserName"], dict): + wxid = member["UserName"].get("string", "") + else: + wxid = member.get("UserName", "") + elif "wxid" in member: + wxid = member.get("wxid", "") + if not wxid: continue + + # 提取昵称 + nick_name = "" + if "NickName" in member: + if isinstance(member["NickName"], dict): + nick_name = member["NickName"].get("string", "") + else: + nick_name = member.get("NickName", "") + elif "nickName" in member: + nick_name = member.get("nickName", "") + + # 提取邀请人 + inviter_user_name = "" + if "InviterUserName" in member: + inviter_user_name = member.get("InviterUserName", "") + elif "inviterUserName" in member: + inviter_user_name = member.get("inviterUserName", "") + + # 提取成员标志 + member_flag = 0 + if "ChatroomMemberFlag" in member: + member_flag = member.get("ChatroomMemberFlag", 0) + elif "memberFlag" in member: + member_flag = member.get("memberFlag", 0) + + # 判断是否为群主 + is_owner = 0 + if chatroom_id and wxid: + # 查询群信息,检查是否为群主 + chat_room_owner_sql = """ + SELECT chat_room_owner FROM t_chatrooms + WHERE chatroom_id = %s + """ + chat_room_owner_result = self.execute_query(chat_room_owner_sql, (chatroom_id,), fetch_one=True) + if chat_room_owner_result and chat_room_owner_result.get('chat_room_owner') == wxid: + is_owner = 1 # 构建数据 data = { 'chatroom_id': chatroom_id, 'wxid': wxid, - 'nick_name': member.get('nickName', ''), - 'display_name': member.get('displayName', ''), - 'inviter_user_name': member.get('inviterUserName', ''), - 'member_flag': member.get('memberFlag', 0), + 'nick_name': nick_name, + 'display_name': member.get('DisplayName', ''), + 'inviter_user_name': inviter_user_name, + 'member_flag': member_flag, 'big_head_img_url': member.get('bigHeadImgUrl', ''), 'small_head_img_url': member.get('smallHeadImgUrl', ''), - 'is_owner': 0, # 默认值 - 'is_admin': 0, # 默认值 + 'is_owner': is_owner, + 'is_admin': 1 if member_flag == 2049 else 0, # 根据memberFlag判断是否为管理员 # 其他字段使用默认值 'sex': 0, 'signature': '', @@ -387,11 +431,11 @@ class ContactsDBOperator(BaseDBOperator): self.execute_update(sql, values) - self.logger.info(f"成功保存群聊{chatroom_id}的{len(member_details)}个成员信息") + self.LOG.info(f"成功保存群聊{chatroom_id}的{len(member_details)}个成员信息") return True except Exception as e: - self.logger.error(f"保存群聊{chatroom_id}的成员信息失败: {e}") + self.LOG.error(f"保存群聊{chatroom_id}的成员信息失败: {e}") return False def save_chatroom_member_detail(self, chatroom_id: str, member_details: List[Dict]) -> bool: """保存群成员详细信息到数据库 @@ -404,7 +448,7 @@ class ContactsDBOperator(BaseDBOperator): bool: 是否成功保存 """ if not member_details or not chatroom_id: - self.logger.warning(f"没有群聊{chatroom_id}的成员详细信息需要保存") + self.LOG.warning(f"没有群聊{chatroom_id}的成员详细信息需要保存") return False try: @@ -473,11 +517,11 @@ class ContactsDBOperator(BaseDBOperator): self.execute_update(sql, values) - self.logger.info(f"成功保存群聊{chatroom_id}的{len(member_details)}个成员详细信息") + self.LOG.info(f"成功保存群聊{chatroom_id}的{len(member_details)}个成员详细信息") return True except Exception as e: - self.logger.error(f"保存群聊{chatroom_id}的成员详细信息失败: {e}") + self.LOG.error(f"保存群聊{chatroom_id}的成员详细信息失败: {e}") return False def process_chatroom_member_detail_response(self, chatroom_id: str, response: Dict) -> bool: @@ -492,51 +536,95 @@ class ContactsDBOperator(BaseDBOperator): """ try: if response.get('ret') != 200: - self.logger.error(f"获取群聊{chatroom_id}成员详情失败: {response.get('msg')}") + self.LOG.error(f"获取群聊{chatroom_id}成员详情失败: {response.get('msg')}") return False data = response.get('data', []) if not data: - self.logger.warning(f"群聊{chatroom_id}成员详情数据为空") + self.LOG.warning(f"群聊{chatroom_id}成员详情数据为空") return False return self.save_chatroom_member_detail(chatroom_id, data) except Exception as e: - self.logger.error(f"处理群聊{chatroom_id}成员详情数据失败: {e}") + self.LOG.error(f"处理群聊{chatroom_id}成员详情数据失败: {e}") return False def save_chatroom_info(self, chatroom_data: dict) -> bool: """保存群信息到数据库""" try: + # 处理新的数据结构 + user_name = "" + if isinstance(chatroom_data, dict): + if "UserName" in chatroom_data and isinstance(chatroom_data["UserName"], dict): + user_name = chatroom_data["UserName"].get("string", "") + elif "chatroomId" in chatroom_data: + user_name = chatroom_data.get("chatroomId", "") + + if not user_name: + self.LOG.warning("无法获取群聊ID,保存失败") + return False + + # 提取群聊名称 + nick_name = "" + if "NickName" in chatroom_data and isinstance(chatroom_data["NickName"], dict): + nick_name = chatroom_data["NickName"].get("string", "") + elif "chatroomName" in chatroom_data: + nick_name = chatroom_data.get("chatroomName", "") + + # 提取群主信息 + chat_room_owner = "" + if "ChatRoomOwner" in chatroom_data: + chat_room_owner = chatroom_data.get("ChatRoomOwner", "") + + # 提取群通知设置 + chat_room_notify = 0 + if "ChatRoomNotify" in chatroom_data: + chat_room_notify = chatroom_data.get("ChatRoomNotify", 0) + + # 提取群头像 + small_head_img_url = "" + if "SmallHeadImgUrl" in chatroom_data: + small_head_img_url = chatroom_data.get("SmallHeadImgUrl", "").strip() + + # 提取群成员列表 + member_list = [] + if "NewChatroomData" in chatroom_data and "ChatRoomMember" in chatroom_data["NewChatroomData"]: + member_list = chatroom_data["NewChatroomData"].get("ChatRoomMember", []) + elif "memberList" in chatroom_data: + member_list = chatroom_data.get("memberList", []) + data = { - 'chatroom_id': chatroom_data.get('chatroomId', ''), - 'nick_name': chatroom_data.get('nickName', ''), - 'py_initial': chatroom_data.get('pyInitial', ''), - 'quan_pin': chatroom_data.get('quanPin', ''), - 'sex': chatroom_data.get('sex', 0), - 'remark': chatroom_data.get('remark', ''), - 'remark_py_initial': chatroom_data.get('remarkPyInitial', ''), - 'remark_quan_pin': chatroom_data.get('remarkQuanPin', ''), - 'chat_room_notify': chatroom_data.get('chatRoomNotify', 0), - 'chat_room_owner': chatroom_data.get('chatRoomOwner', ''), - 'small_head_img_url': chatroom_data.get('smallHeadImgUrl', ''), - 'member_list': json.dumps(chatroom_data.get('memberList', [])) + 'chatroom_id': user_name, + 'nick_name': nick_name, + 'py_initial': chatroom_data.get('Pyinitial', {}).get('string', ''), + 'quan_pin': chatroom_data.get('QuanPin', {}).get('string', ''), + 'sex': chatroom_data.get('Sex', 0), + 'remark': chatroom_data.get('Remark', {}).get('string', ''), + 'remark_py_initial': chatroom_data.get('RemarkPyinitial', {}).get('string', ''), + 'remark_quan_pin': chatroom_data.get('RemarkQuanPin', {}).get('string', ''), + 'chat_room_notify': chat_room_notify, + 'chat_room_owner': chat_room_owner, + 'small_head_img_url': small_head_img_url, + 'member_list': json.dumps(member_list) } + fields = ', '.join(data.keys()) placeholders = ', '.join(['%s'] * len(data)) update_clause = ', '.join([f"{k}=VALUES({k})" for k in data.keys() if k != 'chatroom_id']) values = tuple(data.values()) + sql = f""" INSERT INTO t_chatrooms ({fields}) VALUES ({placeholders}) ON DUPLICATE KEY UPDATE {update_clause} """ + self.execute_update(sql, values) - self.logger.info(f"成功保存群聊 {data['chatroom_id']} 信息") + self.LOG.info(f"成功保存群聊 {data['chatroom_id']} 信息") return True except Exception as e: - self.logger.error(f"保存群聊信息失败: {e}") + self.LOG.error(f"保存群聊信息失败: {e}") return False def get_chatroom_info(self, chatroom_id: str) -> Optional[dict]: @@ -548,7 +636,7 @@ class ContactsDBOperator(BaseDBOperator): result['member_list'] = json.loads(result['member_list']) return result except Exception as e: - self.logger.error(f"获取群聊{chatroom_id}信息失败: {e}") + self.LOG.error(f"获取群聊{chatroom_id}信息失败: {e}") return None def update_chatroom_info(self, chatroom_id: str, update_data: dict) -> bool: @@ -559,10 +647,10 @@ class ContactsDBOperator(BaseDBOperator): values.append(chatroom_id) sql = f"UPDATE t_chatrooms SET {set_clause} WHERE chatroom_id = %s" self.execute_update(sql, tuple(values)) - self.logger.info(f"成功更新群聊 {chatroom_id} 信息") + self.LOG.info(f"成功更新群聊 {chatroom_id} 信息") return True except Exception as e: - self.logger.error(f"更新群聊{chatroom_id}信息失败: {e}") + self.LOG.error(f"更新群聊{chatroom_id}信息失败: {e}") return False def delete_chatroom_info(self, chatroom_id: str) -> bool: @@ -570,8 +658,8 @@ class ContactsDBOperator(BaseDBOperator): try: sql = "DELETE FROM t_chatrooms WHERE chatroom_id = %s" self.execute_update(sql, (chatroom_id,)) - self.logger.info(f"成功删除群聊 {chatroom_id} 信息") + self.LOG.info(f"成功删除群聊 {chatroom_id} 信息") return True except Exception as e: - self.logger.error(f"删除群聊{chatroom_id}信息失败: {e}") + self.LOG.error(f"删除群聊{chatroom_id}信息失败: {e}") return False diff --git a/db/group_virtual_redis.py b/db/group_virtual_redis.py index bc252e2..90551fd 100644 --- a/db/group_virtual_redis.py +++ b/db/group_virtual_redis.py @@ -1,5 +1,5 @@ import json -import logging +from loguru import logger from typing import Dict, Any, List, Optional from db.connection import DBConnectionManager @@ -11,7 +11,7 @@ class GroupVirtualRedisDB: def __init__(self, db_manager: DBConnectionManager): self.db_manager = db_manager self.redis_client = db_manager.get_redis_connection() - self.LOG = logging.getLogger("Plugin.GroupVirtual.Redis") + self.LOG = logger self.chat_groups_key = "group_virtual:chat_groups" def load_chat_groups(self) -> Dict[str, Any]: diff --git a/db/kid_photo_redis.py b/db/kid_photo_redis.py index a3f3bc4..9308bba 100644 --- a/db/kid_photo_redis.py +++ b/db/kid_photo_redis.py @@ -2,7 +2,7 @@ from datetime import datetime import json import os -import logging +from loguru import logger from typing import Dict, Optional, List, Any, Set from db.connection import DBConnectionManager @@ -14,14 +14,14 @@ class KidPhotoRedisDB: def __init__(self, db_manager: DBConnectionManager): self.db_manager = db_manager self.prefix = "group:kid_photo:" - logger = logging.getLogger("DB.KidPhotoRedis") + self.LOG = logger def get_redis_connection(self): """获取Redis连接""" try: return self.db_manager.get_redis_connection() except Exception as e: - self.logger.error(f"获取Redis连接失败: {e}") + self.LOG.error(f"获取Redis连接失败: {e}") return None def save_last_analysis_time(self, group_id: str) -> bool: @@ -34,7 +34,7 @@ class KidPhotoRedisDB: redis_client.set(f'{self.prefix}{group_id}:last_time', str(timestamp)) return True except Exception as e: - self.logger.error(f"保存最后分析时间失败: {e}") + self.LOG.error(f"保存最后分析时间失败: {e}") return False def get_last_analysis_time(self, group_id: str) -> Optional[int]: @@ -50,7 +50,7 @@ class KidPhotoRedisDB: return int(timestamp) return None except Exception as e: - self.logger.error(f"获取最后分析时间失败: {e}") + self.LOG.error(f"获取最后分析时间失败: {e}") return None def save_analysis_result(self, group_id: str, result: Dict) -> bool: @@ -62,7 +62,7 @@ class KidPhotoRedisDB: redis_client.set(f'{self.prefix}{group_id}:results', json.dumps(result, ensure_ascii=False)) return True except Exception as e: - self.logger.error(f"保存分析结果失败: {e}") + self.LOG.error(f"保存分析结果失败: {e}") return False def get_last_analysis_result(self, group_id: str) -> Optional[Dict]: @@ -78,10 +78,10 @@ class KidPhotoRedisDB: return json.loads(result) return None except json.JSONDecodeError as e: - self.logger.error(f"解析分析结果JSON失败: {e}") + self.LOG.error(f"解析分析结果JSON失败: {e}") return None except Exception as e: - self.logger.error(f"获取最后分析结果失败: {e}") + self.LOG.error(f"获取最后分析结果失败: {e}") return None def save_processed_photo(self, group_id: str, photo_path: str) -> bool: @@ -96,7 +96,7 @@ class KidPhotoRedisDB: redis_client.sadd(f'{self.prefix}{group_id}:processed_photos', photo_path) return True except Exception as e: - self.logger.error(f"保存已处理照片失败: {e}") + self.LOG.error(f"保存已处理照片失败: {e}") return False def save_processed_photos(self, group_id: str, photo_paths: List[str]) -> bool: @@ -128,7 +128,7 @@ class KidPhotoRedisDB: pipeline.execute() return True except Exception as e: - self.logger.error(f"批量保存已处理照片失败: {e}") + self.LOG.error(f"批量保存已处理照片失败: {e}") return False def get_processed_photos(self, group_id: str) -> Set[str]: @@ -146,7 +146,7 @@ class KidPhotoRedisDB: photos.add(path) return photos except Exception as e: - self.logger.error(f"获取已处理照片失败: {e}") + self.LOG.error(f"获取已处理照片失败: {e}") return set() def is_photo_processed(self, group_id: str, photo_path: str) -> bool: @@ -160,7 +160,7 @@ class KidPhotoRedisDB: return False return redis_client.sismember(f'{self.prefix}{group_id}:processed_photos', photo_path) except Exception as e: - self.logger.error(f"检查照片是否已处理失败: {e}") + self.LOG.error(f"检查照片是否已处理失败: {e}") return False def save_photo_mapping(self, group_id: str, kid_id: str, photo_path: str) -> bool: @@ -183,7 +183,7 @@ class KidPhotoRedisDB: pipeline.execute() return True except Exception as e: - self.logger.error(f"保存照片映射关系失败: {e}") + self.LOG.error(f"保存照片映射关系失败: {e}") return False def get_kid_photos(self, group_id: str, kid_id: str) -> List[str]: @@ -204,7 +204,7 @@ class KidPhotoRedisDB: photos.append(path) return photos except Exception as e: - self.logger.error(f"获取小朋友照片失败: {e}") + self.LOG.error(f"获取小朋友照片失败: {e}") return [] def get_photo_kid(self, group_id: str, photo_name: str) -> Optional[str]: @@ -222,7 +222,7 @@ class KidPhotoRedisDB: kid_id = kid_id.decode('utf-8') return kid_id except Exception as e: - self.logger.error(f"获取照片对应的小朋友ID失败: {e}") + self.LOG.error(f"获取照片对应的小朋友ID失败: {e}") return None def save_last_process_time(self, group_id: str) -> bool: @@ -235,7 +235,7 @@ class KidPhotoRedisDB: redis_client.set(f'{self.prefix}{group_id}:last_process_time', str(timestamp)) return True except Exception as e: - self.logger.error(f"保存最后处理时间失败: {e}") + self.LOG.error(f"保存最后处理时间失败: {e}") return False def get_last_process_time(self, group_id: str) -> Optional[int]: @@ -252,7 +252,7 @@ class KidPhotoRedisDB: return int(timestamp) return None except Exception as e: - self.logger.error(f"获取最后处理时间失败: {e}") + self.LOG.error(f"获取最后处理时间失败: {e}") return None def clear_processed_photos(self, group_id: str) -> bool: @@ -264,7 +264,7 @@ class KidPhotoRedisDB: redis_client.delete(f'{self.prefix}{group_id}:processed_photos') return True except Exception as e: - self.logger.error(f"清理已处理照片记录失败: {e}") + self.LOG.error(f"清理已处理照片记录失败: {e}") return False def clear_analysis_data(self, group_id: str) -> bool: @@ -301,5 +301,5 @@ class KidPhotoRedisDB: pipeline.execute() return True except Exception as e: - self.logger.error(f"清理分析数据失败: {e}") + self.LOG.error(f"清理分析数据失败: {e}") return False \ No newline at end of file diff --git a/db/message_storage.py b/db/message_storage.py index c611d29..c71e2e8 100644 --- a/db/message_storage.py +++ b/db/message_storage.py @@ -5,7 +5,7 @@ from typing import Dict, List, Optional from db.base import BaseDBOperator from db.connection import DBConnectionManager -from gewechat.call_back_message.message import WxMessage +from wechat_ipad.models.message import WxMessage class MessageStorageDB(BaseDBOperator): diff --git a/db/points_db.py b/db/points_db.py index 50246eb..1ed9385 100644 --- a/db/points_db.py +++ b/db/points_db.py @@ -2,7 +2,7 @@ """ 积分系统数据库操作类 """ -import logging +from loguru import logger from datetime import datetime, timedelta from enum import Enum from typing import Dict, List, Optional, Tuple, Any @@ -27,7 +27,7 @@ class PointsDBOperator(BaseDBOperator): def __init__(self, db_manager=None): """初始化积分数据库操作类""" super().__init__(db_manager or DBConnectionManager.get_instance()) - self.logger = logging.getLogger("PointsDBOperator") + self.LOG = logger # 确保数据库表存在,后续不需要处理了。 # self._ensure_tables_exist() @@ -93,9 +93,9 @@ class PointsDBOperator(BaseDBOperator): ) ENGINE=InnoDB CHARACTER SET utf8mb4; """) - self.logger.info("积分系统数据库表检查/创建完成") + self.LOG.info("积分系统数据库表检查/创建完成") except Exception as e: - self.logger.error(f"创建积分系统数据库表失败: {e}") + self.LOG.error(f"创建积分系统数据库表失败: {e}") raise def get_user_points(self, user_id: str, group_id: str) -> Dict: @@ -122,7 +122,7 @@ class PointsDBOperator(BaseDBOperator): # 如果新表没有数据,尝试从旧表迁移数据 return self._migrate_user_points(user_id, group_id) except Exception as e: - self.logger.error(f"获取用户积分失败: {e}") + self.LOG.error(f"获取用户积分失败: {e}") return { "user_id": user_id, "group_id": group_id, @@ -188,7 +188,7 @@ class PointsDBOperator(BaseDBOperator): WHERE user_id = %s AND group_id = %s """, (user_id, group_id), fetch_one=True) or result except Exception as e: - self.logger.error(f"迁移用户积分失败: {e}") + self.LOG.error(f"迁移用户积分失败: {e}") return result def add_points(self, user_id: str, group_id: str, points: int, @@ -261,7 +261,7 @@ class PointsDBOperator(BaseDBOperator): return True, updated_points except Exception as e: - self.logger.error(f"增加用户积分失败: {e}") + self.LOG.error(f"增加用户积分失败: {e}") return False, {"error": str(e)} def deduct_points(self, user_id: str, group_id: str, points: int, @@ -318,7 +318,7 @@ class PointsDBOperator(BaseDBOperator): return True, updated_points except Exception as e: - self.logger.error(f"扣除用户积分失败: {e}") + self.LOG.error(f"扣除用户积分失败: {e}") return False, {"error": str(e)} def transfer_points(self, from_user_id: str, to_user_id: str, group_id: str, @@ -368,7 +368,7 @@ class PointsDBOperator(BaseDBOperator): "to_user": to_result } except Exception as e: - self.logger.error(f"转移用户积分失败: {e}") + self.LOG.error(f"转移用户积分失败: {e}") return False, {"error": str(e)} def get_user_transactions(self, user_id: str, group_id: str, limit: int = 10) -> List[Dict]: @@ -391,7 +391,7 @@ class PointsDBOperator(BaseDBOperator): LIMIT %s """, (user_id, group_id, limit)) except Exception as e: - self.logger.error(f"获取用户交易记录失败: {e}") + self.LOG.error(f"获取用户交易记录失败: {e}") return [] def get_points_ranking(self, group_id: str, limit: int = 10) -> List[Dict]: @@ -414,7 +414,7 @@ class PointsDBOperator(BaseDBOperator): LIMIT %s """, (group_id, limit)) except Exception as e: - self.logger.error(f"获取积分排行榜失败: {e}") + self.LOG.error(f"获取积分排行榜失败: {e}") return [] def get_plugin_config(self, plugin_name: str) -> Optional[Dict]: @@ -433,7 +433,7 @@ class PointsDBOperator(BaseDBOperator): WHERE plugin_name = %s """, (plugin_name,), fetch_one=True) except Exception as e: - self.logger.error(f"获取插件积分配置失败: {e}") + self.LOG.error(f"获取插件积分配置失败: {e}") return None def set_plugin_config(self, plugin_name: str, points_required: int, @@ -462,7 +462,7 @@ class PointsDBOperator(BaseDBOperator): """, (plugin_name, points_required, is_enabled, description)) return True except Exception as e: - self.logger.error(f"设置插件积分配置失败: {e}") + self.LOG.error(f"设置插件积分配置失败: {e}") return False def get_all_plugin_configs(self) -> List[Dict]: @@ -475,7 +475,7 @@ class PointsDBOperator(BaseDBOperator): try: return self.execute_query("SELECT * FROM t_plugin_point_config") except Exception as e: - self.logger.error(f"获取所有插件积分配置失败: {e}") + self.LOG.error(f"获取所有插件积分配置失败: {e}") return [] def check_plugin_points(self, user_id: str, group_id: str, plugin_name: str) -> Tuple[bool, Dict]: @@ -515,7 +515,7 @@ class PointsDBOperator(BaseDBOperator): "required_points": plugin_config["points_required"] } except Exception as e: - self.logger.error(f"检查插件积分失败: {e}") + self.LOG.error(f"检查插件积分失败: {e}") return True, {"error": str(e)} # 出错时默认允许使用 def use_plugin(self, user_id: str, group_id: str, plugin_name: str) -> Tuple[bool, Dict]: @@ -547,7 +547,7 @@ class PointsDBOperator(BaseDBOperator): PointSource.PLUGIN, f"使用插件: {plugin_name}" ) except Exception as e: - self.logger.error(f"使用插件扣除积分失败: {e}") + self.LOG.error(f"使用插件扣除积分失败: {e}") return False, {"error": str(e)} def get_user_points_stats(self, group_id: str) -> Dict[str, Any]: @@ -591,7 +591,7 @@ class PointsDBOperator(BaseDBOperator): return stats except Exception as e: - self.logger.error(f"获取群组积分统计信息失败: {e}") + self.LOG.error(f"获取群组积分统计信息失败: {e}") return stats def imprison_user(self, user_id: str, group_id: str, hours: int = 24, reason: str = None) -> bool: @@ -612,7 +612,7 @@ class PointsDBOperator(BaseDBOperator): """, (user_id, group_id, end_time, reason, end_time, reason)) return True except Exception as e: - self.logger.error(f"关押用户失败: {e}") + self.LOG.error(f"关押用户失败: {e}") return False def check_prison_status(self, user_id: str, group_id: str) -> Optional[Dict]: @@ -630,7 +630,7 @@ class PointsDBOperator(BaseDBOperator): """, (user_id, group_id)) return records[0] if records else None except Exception as e: - self.logger.error(f"检查用户在押状态失败: {e}") + self.LOG.error(f"检查用户在押状态失败: {e}") return None def bailout_user(self, prisoner_id: str, bailout_user_id: str, group_id: str) -> Tuple[bool, str]: @@ -660,5 +660,5 @@ class PointsDBOperator(BaseDBOperator): return True, "保释成功" except Exception as e: - self.logger.error(f"保释用户失败: {e}") + self.LOG.error(f"保释用户失败: {e}") return False, f"保释失败: {str(e)}" \ No newline at end of file diff --git a/event_system/event_manager.py b/event_system/event_manager.py index bfd1cac..791c1ae 100644 --- a/event_system/event_manager.py +++ b/event_system/event_manager.py @@ -1,4 +1,4 @@ -import logging +from loguru import logger from typing import Dict, List, Type, Callable, Any from threading import Lock @@ -30,7 +30,7 @@ class EventManager: raise RuntimeError("EventManager 是单例类,请使用 get_instance() 方法获取实例") self.handlers: Dict[Type[Event], List[Callable]] = {} - self.logger = logging.getLogger("EventManager") + self.LOG = logger def register(self, event_type: Type[Event], handler: Callable) -> None: """注册事件处理器""" @@ -39,13 +39,13 @@ class EventManager: if handler not in self.handlers[event_type]: self.handlers[event_type].append(handler) - self.logger.debug(f"注册事件处理器: {event_type.__name__} -> {handler.__name__}") + self.LOG.debug(f"注册事件处理器: {event_type.__name__} -> {handler.__name__}") def unregister(self, event_type: Type[Event], handler: Callable) -> None: """取消注册事件处理器""" if event_type in self.handlers and handler in self.handlers[event_type]: self.handlers[event_type].remove(handler) - self.logger.debug(f"取消注册事件处理器: {event_type.__name__} -> {handler.__name__}") + self.LOG.debug(f"取消注册事件处理器: {event_type.__name__} -> {handler.__name__}") def publish(self, event_type: Type[Event], event_data: Dict[str, Any] = None) -> None: """发布事件""" @@ -59,4 +59,4 @@ class EventManager: try: handler(event) except Exception as e: - self.logger.error(f"事件处理器 {handler.__name__} 处理 {event_type.__name__} 事件出错: {e}") + self.LOG.error(f"事件处理器 {handler.__name__} 处理 {event_type.__name__} 事件出错: {e}") diff --git a/gewechat.zip b/gewechat.zip new file mode 100644 index 0000000000000000000000000000000000000000..9d0e1ceaf052d50597636b669c67be2df96bf8cc GIT binary patch literal 175086 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\\n\\t\\n\\t\\t \\n\\t\\t \\n\\t\\t\\troomaccessapplycheck_approve\\n\\t\\t\\t \\n\\t\\t\\t \\n\\t\\t\\t \\n\\t\\t\\t \\n\\t\\t\\t\\n\\t\\t\\t\\t1\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t \\n\\t\\t\\t\\t\\t \\n\\t\\t\\t\\t\\t \\n\\t\\t\\t\\t\\t \\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t \\n\\t\\n\",\n \"newMsgId\": \"8866462780395237368\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"群聊开启邀请确认后,有人申请进群时群主和管理员会收到进群申请,本接口用于确认进群申请","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":126,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495312725"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]},{"name":"消息模块","id":38391007,"auth":{},"securityScheme":{},"parentId":38391003,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"inherit","bodyType":"","fields":[]}},"shareSettings":{},"visibility":"INHERITED","preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"下载","id":38391015,"auth":{},"securityScheme":{},"parentId":38391007,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"inherit","bodyType":"","fields":[]}},"shareSettings":{},"visibility":"INHERITED","preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"下载图片","api":{"id":"196794561","method":"post","path":"/message/downloadImage","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313347","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"fileUrl":{"type":"string","description":"图片链接地址,7天有效"}},"required":["fileUrl"],"x-apifox-orders":["fileUrl"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"fileUrl\": \"/download/20240720/wx_BTVoJ_o_r6DpxNCNiycFE/0ca5b675-8e2c-4dc1-b288-3c44a40086ec4\"\n }\n}","responseId":495313347,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"xml":{"type":"string","description":"回调消息中的XML"},"type":{"type":"integer","description":"下载的图片类型 1:高清图片 2:常规图片 3:缩略图","default":2}},"x-apifox-orders":["appId","xml","type"],"required":["appId","type","xml"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"type\": 2,\n \"xml\": \"\\n\\n\\t\\n\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\n\\n\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"**注意** 如果下载图片失败,可尝试下载另外两种图片类型,并非所有图片都会有高清、常规图片","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":0,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313347"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]},{"name":"发送文字消息","api":{"id":"196794540","method":"post","path":"/message/postText","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495312726","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1703841160,\n \"msgId\": 0,\n \"newMsgId\": 3768973957878705021,\n \"type\": 1\n }\n}","responseId":495312726,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"content":{"type":"string","description":"消息内容"},"ats":{"type":"string","description":"@的好友,多个英文逗号分隔。群主或管理员@全部的人,则填写'notify@all'"}},"x-apifox-orders":["appId","toWxid","content","ats"],"required":["appId","toWxid","content"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"wxid_tdkou97nquqz22\",\n \"ats\": \"wxid_phyyedw9xap22\",\n \"content\": \"@猿猴 我在测试艾特内容\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"#### 注意\n在群内发送消息@某人时,content中需包含@xxx","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":0,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495312726"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送文件消息","api":{"id":"196794541","method":"post","path":"/message/postFile","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495312727","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1703841225,\n \"msgId\": 769523509,\n \"newMsgId\": 4399037329770755951,\n \"type\": 6\n }\n}","responseId":495312727,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"fileUrl":{"type":"string","description":"文件链接"},"fileName":{"type":"string","description":"文件名"}},"x-apifox-orders":["appId","toWxid","fileUrl","fileName"],"required":["appId","toWxid","fileName","fileUrl"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"fileName\": \"a909.xls\",\n \"fileUrl\": \"https://scrm-1308498490.cos.ap-shanghai.myqcloud.com/pkg/a909-99066ce80e03.xls?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1703841209;1703848409&q-key-time=1703841209;1703848409&q-header-list=&q-url-param-list=&q-signature=2a60b0f8d9169550cd83c4a3ca9cd18138b4bb88\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":6,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495312727"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送图片消息","api":{"id":"196794542","method":"post","path":"/message/postImage","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495312728","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"null","description":"消息类型"},"aesKey":{"type":"string","description":"cdn相关的aeskey"},"fileId":{"type":"string","description":"cdn相关的fileid"},"length":{"type":"integer","description":"图片文件大小"},"width":{"type":"integer","description":"图片宽度"},"height":{"type":"integer","description":"图片高度"},"md5":{"type":"string","description":"图片md5"}},"required":["toWxid","createTime","msgId","newMsgId","type","aesKey","fileId","length","width","height","md5"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type","aesKey","fileId","length","width","height","md5"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 0,\n \"msgId\": 640355969,\n \"newMsgId\": 8992614056172360013,\n \"type\": null,\n \"aesKey\": \"7678796e6d70626e6b626c6f7375616b\",\n \"fileId\": \"3052020100044b30490201000204e49785f102033d11fd0204136166b4020465966eea042437646265323234362d653662662d343464392d393363362d3139313661363863646266390204052418020201000400\",\n \"length\": 1096,\n \"width\": 400,\n \"height\": 400,\n \"md5\": \"e6355eab0393facbd6a2cde3f990ef60\"\n }\n}","responseId":495312728,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"imgUrl":{"type":"string","description":"图片链接"}},"x-apifox-orders":["appId","toWxid","imgUrl"],"required":["appId","toWxid","imgUrl"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"imgUrl\": \"http://dummyimage.com/400x400\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"#### 注意\n发送图片接口会返回cdn相关的信息,如有需求同一张图片发送多次,第二次及以后发送时可使用接口返回的cdn信息拼装xml调用[转发图片接口](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794551),这样可以缩短发送时间","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":12,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495312728"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送语音消息","api":{"id":"196794543","method":"post","path":"/message/postVoice","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495312729","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1704357563,\n \"msgId\": 640355967,\n \"newMsgId\": 2321462558768366474,\n \"type\": null\n }\n}","responseId":495312729,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"voiceUrl":{"type":"string","description":"语音文件的链接,仅支持silk格式"},"voiceDuration":{"type":"integer","description":"语音时长,单位毫秒"}},"x-apifox-orders":["appId","toWxid","voiceUrl","voiceDuration"],"required":["appId","toWxid","voiceUrl","voiceDuration"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"voiceUrl\": \"https://scrm-1308498490.cos.ap-shanghai.myqcloud.com/pkg/response.silk?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1703841529;1703848729&q-key-time=1703841529;1703848729&q-header-list=&q-url-param-list=&q-signature=781831fe71ad4bbb582715bf197a9cf86ec80c97\",\n \"voiceDuration\": 2000\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":18,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495312729"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送视频消息","api":{"id":"196794544","method":"post","path":"/message/postVideo","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495312730","code":200,"name":"成功","headers":[],"jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"null","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"null","description":"消息类型"},"aesKey":{"type":"string","description":"cdn相关的aeskey"},"fileId":{"type":"string","description":"cdn相关的fileid"},"length":{"type":"integer","description":"视频文件大小"}},"required":["toWxid","createTime","msgId","newMsgId","type","aesKey","fileId","length"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type","aesKey","fileId","length"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"description":"","contentType":"json","mediaType":""}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": null,\n \"msgId\": 769523567,\n \"newMsgId\": 945590746179451464,\n \"type\": null,\n \"aesKey\": \"687a636f627579667a756a7168717968\",\n \"fileId\": \"3052020100044b304902010002043904752002033d11ff02045dd79b240204658e9072042466633131376136662d366566632d343638662d613633662d3536316139616133383362350204012400040201000400\",\n \"length\": 1315979\n }\n}","responseId":495312730,"ordering":1,"description":"","oasKey":"","oasExtensions":""}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"videoUrl":{"type":"string","description":"视频的链接"},"thumbUrl":{"type":"string","description":"缩略图的链接"},"videoDuration":{"type":"integer","description":"视频的播放时长,单位秒"}},"x-apifox-orders":["appId","toWxid","videoUrl","thumbUrl","videoDuration"],"required":["appId","toWxid","videoUrl","thumbUrl","videoDuration"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"{{toWxid}}\",\n \"videoUrl\": \"https://scrm-1308498490.cos.ap-shanghai.myqcloud.com/1/41734f00f3803ca1cd8f5ad6d5f8d559.mp4?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1724227372;2588140972&q-key-time=1724227372;2588140972&q-header-list=&q-url-param-list=&q-signature=4e18eb97ab165f27afe0444516e54204f506c7e1\",\n \"thumbUrl\": \"https://scrm-1308498490.cos.ap-shanghai.myqcloud.com/1/logo.jpg?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1724227462;2588141062&q-key-time=1724227462;2588141062&q-header-list=&q-url-param-list=&q-signature=0bc8b973567d2672e5eaada1b5d466e23ce6b750\",\n \"videoDuration\": 10\n}","mediaType":"application/json"}],"oasExtensions":""},"description":"#### 注意\n发送视频接口会返回cdn相关的信息,如有需求同一个视频发送多次,第二次及以后发送时可使用接口返回的cdn信息拼装xml调用[转发视频接口](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794552),这样可以缩短发送时间","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":24,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495312730"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送链接消息","api":{"id":"196794545","method":"post","path":"/message/postLink","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495312731","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1703841982,\n \"msgId\": 769523572,\n \"newMsgId\": 3358797740318930852,\n \"type\": 5\n }\n}","responseId":495312731,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"title":{"type":"string","description":"链接标题"},"desc":{"type":"string","description":"链接描述"},"linkUrl":{"type":"string","description":"链接地址"},"thumbUrl":{"type":"string","description":"链接缩略图地址"}},"x-apifox-orders":["appId","toWxid","title","desc","linkUrl","thumbUrl"],"required":["appId","toWxid","title","desc","linkUrl","thumbUrl"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"title\": \"澳门这一夜\",\n \"desc\": \"39岁郭碧婷用珠圆玉润的身材,狠狠打脸了白幼瘦女星\",\n \"linkUrl\": \"https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_8864265500294006781%22%7D&n_type=-1&p_from=-1\",\n \"thumbUrl\": \"https://pics3.baidu.com/feed/0824ab18972bd407a9403f336648d15c0db30943.jpeg@f_auto?token=d26f7f142871542956aaa13799ba1946\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":30,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495312731"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送名片消息","api":{"id":"196794546","method":"post","path":"/message/postNameCard","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313332","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1703842036,\n \"msgId\": 0,\n \"newMsgId\": 3285058507819179744,\n \"type\": 42\n }\n}","responseId":495313332,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"nickName":{"type":"string","description":"名片的昵称"},"nameCardWxid":{"type":"string","description":"名片的wxid"}},"x-apifox-orders":["appId","toWxid","nickName","nameCardWxid"],"required":["appId","toWxid","nickName","nameCardWxid"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"nickName\": \"谭艳\",\n \"nameCardWxid\": \"wxid_0xsqb3o0tsvz22\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":36,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313332"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送emoji消息","api":{"id":"196794547","method":"post","path":"/message/postEmoji","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313333","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": null,\n \"msgId\": 769523643,\n \"newMsgId\": 891398861855787000,\n \"type\": null\n }\n}","responseId":495313333,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"emojiMd5":{"type":"string","description":"emoji图片的md5"},"emojiSize":{"type":"integer","description":"emoji的文件大小"}},"x-apifox-orders":["appId","toWxid","emojiMd5","emojiSize"],"required":["appId","toWxid","emojiMd5","emojiSize"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"emojiMd5\": \"4cc7540a85b5b6cf4ba14e9f4ae08b7c\",\n \"emojiSize\": 102357\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":42,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313333"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送appmsg消息","api":{"id":"196794548","method":"post","path":"/message/postAppMsg","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313334","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1703842453,\n \"msgId\": 769523712,\n \"newMsgId\": 3090682956820882425,\n \"type\": 0\n }\n}","responseId":495313334,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"appmsg":{"type":"string","description":"回调消息中的appmsg节点内容"}},"x-apifox-orders":["appId","toWxid","appmsg"],"required":["appId","toWxid","appmsg"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"appmsg\": \"\\n\\t\\t一审宣判!蔡鄂生被判死缓\\n\\t\\t\\n\\t\\t\\n\\t\\t5\\n\\t\\t0\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\thttp://mp.weixin.qq.com/s?__biz=MjM5MjAxNDM4MA==&mid=2666774093&idx=1&sn=aa405094dd00034d004f6e8287f86e9b&chksm=bcc9d903635a9c284591edda1f027c467245d922d7d66c32d3cd2c6af1c969a7ea0896aa7639&scene=0&xtrack=1#rd\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t3057020100044b304902010002048399cc8402032f57ed02041388e6720204658e922d042462666538346165322d303035382d343262322d616538322d3337306231346630323534360204051408030201000405004c53d900\\n\\t\\t\\tea3d5e8d4059cb4db0a3c39c789f2d6f\\n\\t\\t\\t93065\\n\\t\\t\\t1080\\n\\t\\t\\t459\\n\\t\\t\\t849df42ab37c8cadb324fe94ba46d76e\\n\\t\\t\\t849df42ab37c8cadb324fe94ba46d76e\\n\\t\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\tgh_363b924965e9\\n\\t\\t人民日报\\n\\t\\thttps://mmbiz.qpic.cn/sz_mmbiz_jpg/xrFYciaHL08DCJtwQefqrH8JcohbOHhTpyCPab8IgDibkTv3Pspicjw8TRHnoic2tmiafBtUHg7ObZznpWocwkCib6Tw/640?wxtype=jpeg&wxfrom=0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\n\\t\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"#### 注意\n本接口可用于发送所有包含节点的消息,例如:音乐分享、视频号、引用消息等等","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":48,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313334"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"发送小程序消息","api":{"id":"196794549","method":"post","path":"/message/postMiniApp","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313335","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1704162674,\n \"msgId\": 769533691,\n \"newMsgId\": 3190424380344821399,\n \"type\": 33\n }\n}","responseId":495313335,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"miniAppId":{"type":"string","description":"小程序ID"},"displayName":{"type":"string","description":"小程序名称"},"pagePath":{"type":"string","description":"小程序打开的地址"},"coverImgUrl":{"type":"string","description":"小程序封面图链接"},"title":{"type":"string","description":"小程序标题"},"userName":{"type":"string","description":"归属的用户ID"}},"x-apifox-orders":["appId","toWxid","miniAppId","displayName","pagePath","coverImgUrl","title","userName"],"required":["appId","toWxid","miniAppId","userName","title","coverImgUrl","pagePath","displayName"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"miniAppId\": \"wx1f9ea355b47256dd\",\n \"userName\": \"gh_690acf47ea05@app\",\n \"title\": \"最快29分钟 好吃水果送到家\",\n \"coverImgUrl\": \"https://che-static.vzhimeng.com/img/2023/10/30/67d55942-e43c-4fdb-8396-506794ddbdbc.jpg\",\n \"pagePath\": \"pages/homeDelivery/index.html\",\n \"displayName\": \"百果园+\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":54,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313335"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"转发文件","api":{"id":"196794550","method":"post","path":"/message/forwardFile","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313336","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1704162866,\n \"msgId\": 769533740,\n \"newMsgId\": 6455486805605396889,\n \"type\": 6\n }\n}","responseId":495313336,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"xml":{"type":"string","description":"文件消息的xml"}},"x-apifox-orders":["appId","toWxid","xml"],"required":["appId","toWxid","xml"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"xml\": \"\\n\\n\\t\\n\\t\\tinfo.json\\n\\t\\t\\n\\t\\t\\n\\t\\t6\\n\\t\\t0\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t63\\n\\t\\t\\t@cdn_3057020100044b304902010002043904752002032f7d6d02046bb5bade02046593760c042433653765306131612d646138622d346662322d383239362d3964343665623766323061370204051400050201000405004c53d900_f46be643aa0dc009ae5fb63bbc73335d_1\\n\\t\\t\\t\\n\\t\\t\\tjson\\n\\t\\t\\t3057020100044b304902010002043904752002032f7d6d02046bb5bade02046593760c042433653765306131612d646138622d346662322d383239362d3964343665623766323061370204051400050201000405004c53d900\\n\\t\\t\\tf46be643aa0dc009ae5fb63bbc73335d\\n\\t\\t\\t0\\n\\t\\t\\t594239960546299206\\n\\t\\t\\tv1_0bgfyCkUmoZYYyvXys0cCiJdd2R/pKPdD2TNi9IY6FOt+Tvlhp3ijUoupZHzyB2Lp7xYgdVFaUGL4iu3Pm9/YACCt20egPGpT+DKe+VymOzD7tJfsS8YW7JObTbN8eVoFEetU5HSRWTgS/48VVsPZMoDF6Gz1XJDLN/dWRxvzrbOzVGGNvmY4lpXb0kRwXkSxwL+dO4=\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\td16070253eee7173e467dd7237d76f60\\n\\t\\t\\n\\t\\n\\tzhangchuan2288\\n\\t0\\n\\t\\n\\t\\t1\\n\\t\\t\\n\\t\\n\\t\\n\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":60,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313336"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"转发图片","api":{"id":"196794551","method":"post","path":"/message/forwardImage","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313337","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"null","description":"消息类型"},"aesKey":{"type":"string","description":"cdn相关的aeskey"},"fileId":{"type":"string","description":"cdn相关的fileid"},"length":{"type":"integer","description":"图片文件大小"},"width":{"type":"integer","description":"图片宽度"},"height":{"type":"integer","description":"图片高度"},"md5":{"type":"string","description":"图片md5"}},"required":["toWxid","createTime","msgId","newMsgId","type","aesKey","fileId","length","width","height","md5"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type","aesKey","fileId","length","width","height","md5"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 0,\n \"msgId\": 769533749,\n \"newMsgId\": 7003061792458480517,\n \"type\": null,\n \"aesKey\": \"294774c8ac2ca8f8114e4d58d2ba78a5\",\n \"fileId\": \"3057020100044b304902010002043904752002032f7d6d02046bb5bade020465937656042436626431373937632d613430642d346137662d626230352d3832613335353935333130630204051818020201000405004c543d00\",\n \"length\": null,\n \"width\": null,\n \"height\": null,\n \"md5\": null\n }\n}","responseId":495313337,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"xml":{"type":"string","description":"文件消息的xml"}},"x-apifox-orders":["appId","toWxid","xml"],"required":["appId","toWxid","xml"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"xml\": \"\\n\\n\\t\\n\\t\\n\\t\\n\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"#### 注意\n若通过发送图片消息获取cdn信息后可替换xml中的aeskey、cdnthumbaeskey、cdnthumburl、cdnmidimgurl、length、md5等参数来进行转发","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":66,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313337"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"转发视频","api":{"id":"196794552","method":"post","path":"/message/forwardVideo","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313338","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"null","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"null","description":"消息类型"},"aesKey":{"type":"string","description":"cdn相关的aeskey"},"fileId":{"type":"string","description":"cdn相关的fileid"},"length":{"type":"integer","description":"视频文件大小"}},"required":["toWxid","createTime","msgId","newMsgId","type","aesKey","fileId","length"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type","aesKey","fileId","length"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": null,\n \"msgId\": 769533762,\n \"newMsgId\": 2099537549112929261,\n \"type\": null,\n \"aesKey\": \"5c5163d06757faae44eacc2146ba0575\",\n \"fileId\": null,\n \"length\": 490566\n }\n}","responseId":495313338,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"xml":{"type":"string","description":"文件消息的xml"}},"x-apifox-orders":["appId","toWxid","xml"],"required":["appId","toWxid","xml"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"xml\": \"\\n\\n\\t\\n\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"#### 注意\n若通过发送视频消息获取cdn信息后可替换xml中的aeskey、cdnthumbaeskey、cdnvideourl、cdnthumburl、length等参数来进行转发","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":72,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313338"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"转发链接","api":{"id":"196794553","method":"post","path":"/message/forwardUrl","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313339","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1704163083,\n \"msgId\": 769533781,\n \"newMsgId\": 1947412320722133720,\n \"type\": 5\n }\n}","responseId":495313339,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"xml":{"type":"string","description":"文件消息的xml"}},"x-apifox-orders":["appId","toWxid","xml"],"required":["appId","toWxid","xml"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"xml\": \"\\n\\n\\t\\n\\t\\t“李在明遇袭,颈部出血”\\n\\t\\t\\n\\t\\t\\n\\t\\t5\\n\\t\\t0\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\thttp://mp.weixin.qq.com/s?__biz=MjM5MzI5NTU3MQ==&mid=2652294920&idx=1&sn=ad415f5d83e1471b845b2cb3fca7c3ce&chksm=bce58367ee6ae84b711255705422d1554ee96b92d75648751316639d4aa09289d7827ff1cc85&scene=0&xtrack=1#rd\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t3057020100044b304902010002048399cc8402032f7d6d020468b5bade0204659376ec042463663234636366642d323736612d343533342d623734342d3864623065633235636135390204051808030201000405004c56f900\\n\\t\\t\\t8e32cafa882f9b4f7c51fb568c0c4f8e\\n\\t\\t\\t38637\\n\\t\\t\\t658\\n\\t\\t\\t280\\n\\t\\t\\taccc71cbe8ff795a94583fc514d198a8\\n\\t\\t\\taccc71cbe8ff795a94583fc514d198a8\\n\\t\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\tgh_d29e0d22a6f9\\n\\t\\t澎湃新闻\\n\\t\\thttps://mmbiz.qpic.cn/mmbiz_jpg/yl6JkZAE3SibWvw5icQJpv87X084SRJOVeS3k7KMscRzov1nwicjMYzicyBIpRdJchWKTGPf4eN2H07Jicl11zMK2Pw/640?wxtype=jpeg&wxfrom=0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\n\\t\\n\\tzhangchuan2288\\n\\t0\\n\\t\\n\\t\\t1\\n\\t\\t\\n\\t\\n\\t\\n\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":78,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313339"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"转发小程序","api":{"id":"196794554","method":"post","path":"/message/forwardMiniApp","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313340","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"toWxid":{"type":"string","description":"接收人的wxid"},"createTime":{"type":"integer","description":"发送时间"},"msgId":{"type":"integer","description":"消息ID"},"newMsgId":{"type":"integer","description":"消息ID"},"type":{"type":"integer","description":"消息类型"}},"required":["toWxid","createTime","msgId","newMsgId","type"],"x-apifox-orders":["toWxid","createTime","msgId","newMsgId","type"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"toWxid\": \"34757816141@chatroom\",\n \"createTime\": 1704163145,\n \"msgId\": 769533801,\n \"newMsgId\": 5271007655758710001,\n \"type\": 33\n }\n}","responseId":495313340,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"xml":{"type":"string","description":"文件消息的xml"},"coverImgUrl":{"type":"string","description":"小程序封面图链接"}},"x-apifox-orders":["appId","toWxid","xml","coverImgUrl"],"required":["appId","toWxid","xml","coverImgUrl"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"xml\": \"\\n\\n\\t\\n\\t\\t👇晒出新年第一杯,点赞赢饮茶月卡\\n\\t\\t\\n\\t\\t\\n\\t\\t33\\n\\t\\t0\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\thttps://mp.weixin.qq.com/mp/waerrpage?appid=wxafec6f8422cb357b&type=upgrade&upgradetype=3#wechat_redirect\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t3057020100044b30490201000204573515c902032f7d6d020416b7bade020465922a53042437383139393934652d323662652d346430662d396466362d3466303137346139616362390204051408030201000405004c53d900\\n\\t\\t\\t33cf0a1101e7f8cd3057cd417a691f0b\\n\\t\\t\\t96673\\n\\t\\t\\t600\\n\\t\\t\\t500\\n\\t\\t\\t6f3098f2ee8b351b6cc9b1818d580356\\n\\t\\t\\t6f3098f2ee8b351b6cc9b1818d580356\\n\\t\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\tgh_e9d25e745aae@app\\n\\t\\t霸王茶姬\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t2\\n\\t\\t\\t193\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t0\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\n\\t\\n\\tzhangchuan2288\\n\\t0\\n\\t\\n\\t\\t1\\n\\t\\t\\n\\t\\n\\t\\n\",\n \"coverImgUrl\": \"http://dummyimage.com/400x400\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":84,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313340"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"撤回消息","api":{"id":"196794555","method":"post","path":"/message/revokeMsg","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313341","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313341,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"toWxid":{"type":"string","description":"好友/群的ID"},"msgId":{"type":"string","description":"发送类接口返回的msgId"},"newMsgId":{"type":"string","description":"发送类接口返回的newMsgId"},"createTime":{"type":"string","description":"发送类接口返回的createTime"}},"x-apifox-orders":["appId","toWxid","msgId","newMsgId","createTime"],"required":["appId","toWxid","msgId","newMsgId","createTime"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"toWxid\": \"34757816141@chatroom\",\n \"msgId\": \"769533801\",\n \"newMsgId\": \"5271007655758710001\",\n \"createTime\": \"1704163145\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":90,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313341"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]},{"name":"标签模块","id":38391009,"auth":{},"securityScheme":{},"parentId":38391003,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"inherit","bodyType":"","fields":[]}},"shareSettings":{},"visibility":"INHERITED","preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"添加标签","api":{"id":"196794583","method":"post","path":"/label/add","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313369","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"labelName":{"type":"string","description":"标签名称"},"labelId":{"type":"integer","description":"标签ID"}},"required":["labelName","labelId"],"x-apifox-orders":["labelName","labelId"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"labelName\": \"testtest\",\n \"labelId\": 31\n }\n}","responseId":495313369,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"labelName":{"type":"string","description":"标签名称"}},"x-apifox-orders":["appId","labelName"],"required":["appId","labelName"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"labelName\": \"testtest\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"#### 注意\n标签名称不存在则是添加标签,如果标签名称已经存在,此接口会直接返回标签名及ID","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":0,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313369"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"删除标签","api":{"id":"196794584","method":"post","path":"/label/delete","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313370","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313370,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"labelIds":{"type":"string","description":"标签ID,多个逗号分隔"}},"x-apifox-orders":["appId","labelIds"],"required":["appId","labelIds"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"labelIds\": \"31\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":6,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313370"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"标签列表","api":{"id":"196794585","method":"post","path":"/label/list","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313371","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"labelList":{"type":"array","items":{"type":"object","properties":{"labelName":{"type":"string","description":"标签名称"},"labelId":{"type":"integer","description":"标签ID"}},"x-apifox-orders":["labelName","labelId"]}}},"required":["labelList"],"x-apifox-orders":["labelList"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"labelList\": [\n {\n \"labelName\": \"朋友\",\n \"labelId\": 1\n }\n ]\n }\n}","responseId":495313371,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false}},"x-apifox-orders":["appId"],"required":["appId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":12,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313371"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"修改好友标签","api":{"id":"196794586","method":"post","path":"/label/modifyMemberList","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313372","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313372,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"labelIds":{"type":"string","description":"标签ID,多个逗号分隔"},"wxIds":{"type":"array","items":{"type":"string"},"description":"修改的好友wxid"}},"x-apifox-orders":["appId","labelIds","wxIds"],"required":["appId","wxIds","labelIds"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"labelIds\": \"15\",\n \"wxIds\": [\n \"zhangchuan2288\"\n ]\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"#### 注意\n由于好友标签信息存储在用户客户端,因此每次在修改时都需要进行全量修改。举例来说,考虑好友A(wxid_asdfaihp123),该好友已经被标记为标签ID为1和2。\n\n在添加标签ID为3时,传递的参数如下:labelIds:1,2,3,wxIds:[wxid_asdfaihp123]。这表示要给好友A添加标签ID为3,同时保留已有的标签ID 1和2。\n\n而在删除标签ID为1时,传递的参数如下:labelIds:2,3 ,wxIds:[wxid_asdfaihp123]。这表示要将好友A的标签ID 1删除,而保留标签ID 2。","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":18,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313372"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]},{"name":"个人模块","id":38391010,"auth":{},"securityScheme":{},"parentId":38391003,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"inherit","bodyType":"","fields":[]}},"shareSettings":{},"visibility":"INHERITED","preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"获取个人资料","api":{"id":"196794587","method":"post","path":"/personal/getProfile","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313373","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"alias":{"type":"string","description":"微信号"},"wxid":{"type":"string","description":"微信ID"},"nickName":{"type":"string","description":"昵称"},"mobile":{"type":"string","description":"绑定的手机号"},"uin":{"type":"integer","description":"uin"},"sex":{"type":"integer","description":"性别"},"province":{"type":"string","description":"省份"},"city":{"type":"string","description":"城市"},"signature":{"type":"string","description":"签名"},"country":{"type":"string","description":"国家"},"bigHeadImgUrl":{"type":"string","description":"大尺寸头像"},"smallHeadImgUrl":{"type":"string","description":"小尺寸头像"},"regCountry":{"type":"string","description":"注册国家"},"snsBgImg":{"type":"string","description":"朋友圈背景图"}},"required":["alias","wxid","nickName","mobile","uin","sex","province","city","signature","country","bigHeadImgUrl","smallHeadImgUrl","regCountry","snsBgImg"],"x-apifox-orders":["alias","wxid","nickName","mobile","uin","sex","province","city","signature","country","bigHeadImgUrl","smallHeadImgUrl","regCountry","snsBgImg"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"alias\": null,\n \"wxid\": \"zhangchuan2288\",\n \"nickName\": \"朝夕。\",\n \"mobile\": \"18761670817\",\n \"uin\": 1042679712,\n \"sex\": 1,\n \"province\": \"Jiangsu\",\n \"city\": \"Xuzhou\",\n \"signature\": \".......\",\n \"country\": \"CN\",\n \"bigHeadImgUrl\": \"https://wx.qlogo.cn/mmhead/ver_1/REoLX7KfdibFAgDbtoeXGNjE6sGa8NCib8UaiazlekKjuLneCvicM4xQpuEbZWjjQooSicsKEbKdhqCOCpTHWtnBqdJicJ0I3CgZumwJ6SxR3ibuNs/0\",\n \"smallHeadImgUrl\": \"https://wx.qlogo.cn/mmhead/ver_1/REoLX7KfdibFAgDbtoeXGNjE6sGa8NCib8UaiazlekKjuLneCvicM4xQpuEbZWjjQooSicsKEbKdhqCOCpTHWtnBqdJicJ0I3CgZumwJ6SxR3ibuNs/132\",\n \"regCountry\": \"CN\",\n \"snsBgImg\": \"http://shmmsns.qpic.cn/mmsns/FzeKA69P5uIdqPfQxp59LvOohoE2iaiaj86IBH1jl0F76aGvg8AlU7giaMtBhQ3bPibunbhVLb3aEq4/0\"\n }\n}","responseId":495313373,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false}},"x-apifox-orders":["appId"],"required":["appId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"proxyIp\": \"\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":0,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313373"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"获取自己的二维码","api":{"id":"196794588","method":"post","path":"/personal/getQrCode","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313374","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"qrCode":{"type":"string","description":"二维码图片的base64"}},"required":["qrCode"],"x-apifox-orders":["qrCode"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"qrCode\": \"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAIAAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5kooor8XP6jCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK1tP03biWUc9lPb61+7FfUYXIaten7SpLlv0tf9UfAZhxdQwlZ0aFP2lt3eyv5aO5+CNFfvdRXZ/q5/wBPv/Jf+CeZ/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/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\"\n }\n}","responseId":495313374,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false}},"x-apifox-orders":["appId"],"required":["appId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"proxyIp\": \"\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":6,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313374"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"获取设备记录","api":{"id":"196794589","method":"post","path":"/personal/getSafetyInfo","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313375","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"list":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","description":"设备ID"},"deviceName":{"type":"string","description":"设备名称"},"deviceType":{"type":"string","description":"设备类型"},"lastTime":{"type":"integer","description":"最后操作时间"}},"required":["uuid","deviceName","deviceType","lastTime"],"x-apifox-orders":["uuid","deviceName","deviceType","lastTime"]},"description":"设备记录"}},"required":["list"],"x-apifox-orders":["list"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"list\": [\n {\n \"uuid\": \"087b139951b776e0416b5015d0b98109\",\n \"deviceName\": \"iPhone 13 Pro\",\n \"deviceType\": \"iPhone iOS17.2\",\n \"lastTime\": 1703218815\n },\n {\n \"uuid\": \"f7e4bda161f7a6a7361ca62141cded23\",\n \"deviceName\": \"张传的MacBook Pro\",\n \"deviceType\": \"iMac MacBookPro17,1 OSX OSX 13.3.1 build(22E261)\",\n \"lastTime\": 1703206819\n },\n {\n \"uuid\": \"80d6218be93f570a971d8c605fa542c3\",\n \"deviceName\": \"iPad\",\n \"deviceType\": \"iPad iOS14.5.1\",\n \"lastTime\": 1703065642\n },\n {\n \"uuid\": \"197e97585d02c9cd6e6de68c74c81780\",\n \"deviceName\": \"iPad\",\n \"deviceType\": \"iPad iOS14.5.1\",\n \"lastTime\": 1701300706\n },\n {\n \"uuid\": \"bf5eb4d8498f4affac1cbfb8aa936d2a\",\n \"deviceName\": \"iPad\",\n \"deviceType\": \"iPad iPadOS14.3\",\n \"lastTime\": 1696729849\n },\n {\n \"uuid\": \"33ac7f39ed3d7115d9c15f07981a264a\",\n \"deviceName\": \"iPad\",\n \"deviceType\": \"iPad iPadOS14.5.1\",\n \"lastTime\": 1695050733\n }\n ]\n }\n}","responseId":495313375,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false}},"x-apifox-orders":["appId"],"required":["appId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"proxyIp\": \"\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":12,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313375"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"隐私设置","api":{"id":"196794590","method":"post","path":"/personal/privacySettings","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313376","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313376,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"option":{"type":"integer","description":"隐私设置的选项\n 4: 加我为朋友时需要验证\n 7: 向我推荐通讯录朋友\n 8: 添加我的方式 手机号\n 25: 添加我的方式 微信号\n 38: 添加我的方式 群聊\n 39: 添加我的方式 我的二维码\n 40: 添加我的方式 名片"},"open":{"type":"boolean","description":"开关"}},"x-apifox-orders":["appId","option","open"],"required":["appId","open"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"open\": true,\n \"option\": 4\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"**option 说明**\n- 4: 加我为朋友时需要验证\n- 7: 向我推荐通讯录朋友\n- 8: 添加我的方式 手机号\n- 25: 添加我的方式 微信号\n- 38: 添加我的方式 群聊\n- 39: 添加我的方式 我的二维码\n- 40: 添加我的方式 名片","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":18,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313376"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"修改个人信息","api":{"id":"196794591","method":"post","path":"/personal/updateProfile","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313377","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313377,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"city":{"type":"string","description":"城市"},"country":{"type":"string","description":"国家","mock":{"mock":"@county"}},"nickName":{"type":"string","description":"昵称"},"province":{"type":"string","description":"省份"},"sex":{"type":"string","description":"性别 1:男 2:女"},"signature":{"type":"string","description":"签名"}},"x-apifox-orders":["appId","city","country","nickName","province","sex","signature"],"required":["appId","country","nickName","signature","sex","province"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"city\": \"\",\n \"country\": \"\",\n \"nickName\": \"\",\n \"province\": \"\",\n \"sex\": 1,\n \"signature\": \"......\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"**注意** 修改个人信息需要单独设置每一项\n比如修改昵称则参数仅传appId和nickName\n修改地区则参数可传appId、country、province、city\n","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":24,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313377"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"修改头像","api":{"id":"196794592","method":"post","path":"/personal/updateHeadImg","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313378","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313378,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"headImgUrl":{"type":"string","description":"头像的图片地址","mock":{"mock":"@image"}}},"x-apifox-orders":["appId","headImgUrl"],"required":["appId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"headImgUrl\": \"https://wx.qlogo.cn/mmhead/ver_1/REoLX7KfdibFAgDbtoeXGNjE6sGa8NCib8UaiazlekKjuLneCvicM4xQpuEbZWjjQooSicsKEbKdhqCOCpTHWtnBqdJicJ0I3CgZumwJ6SxR3ibuNs/0\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"**注意** 修改头像后需要将手机的微信进程关掉,然后重启查看最新头像","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":30,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313378"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]},{"name":"收藏夹模块","id":38391011,"auth":{},"securityScheme":{},"parentId":38391003,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"inherit","bodyType":"","fields":[]}},"shareSettings":{},"visibility":"INHERITED","preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"同步收藏夹","api":{"id":"196794593","method":"post","path":"/favor/sync","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313379","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"syncKey":{"type":"string","description":"翻页key"},"list":{"type":"array","items":{"type":"object","properties":{"favId":{"type":"integer","description":"收藏夹ID"},"type":{"type":"integer","description":"收藏内容类型"},"flag":{"type":"integer","description":"收藏夹标识"},"updateTime":{"type":"integer","description":"收藏时间"}},"required":["favId","type","flag","updateTime"],"x-apifox-orders":["favId","type","flag","updateTime"]}}},"required":["syncKey","list"],"x-apifox-orders":["syncKey","list"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"syncKey\": \"CAESCAgBEJyi9e4C\",\n \"list\": [\n {\n \"favId\": 2,\n \"type\": 1,\n \"flag\": 1,\n \"updateTime\": 1448465918\n },\n {\n \"favId\": 1,\n \"type\": 2,\n \"flag\": 1,\n \"updateTime\": 1448465922\n }\n ]\n }\n}","responseId":495313379,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"syncKey":{"type":"string","description":"翻页key,首次传空,获取下一页传接口返回的syncKey"}},"x-apifox-orders":["appId","syncKey"],"required":["appId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"syncKey\": \"\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"#### 注意:\n响应结果中会包含已删除的的收藏夹记录,通过flag=1来判断已删除\n","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":0,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313379"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"获取收藏夹内容","api":{"id":"196794594","method":"post","path":"/favor/getContent","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313380","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"object","properties":{"favId":{"type":"integer","description":"收藏夹ID"},"status":{"type":"integer","description":"状态"},"flag":{"type":"integer","description":"收藏夹标识"},"updateTime":{"type":"integer","description":"更新时间"},"content":{"type":"string","description":"收藏的内容"}},"required":["favId","status","flag","updateTime","content"],"x-apifox-orders":["favId","status","flag","updateTime","content"]}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"favId\": 179,\n \"status\": 0,\n \"flag\": 0,\n \"updateTime\": 1703235210,\n \"content\": \"没说呢1703217521wxid_cy6buf12nf6921zhangchuan22881838546569535807562127\"\n }\n}","responseId":495313380,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"favId":{"type":"integer","description":"收藏夹ID"}},"x-apifox-orders":["appId","favId"],"required":["appId","favId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"favId\": 179\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":6,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313380"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"删除收藏夹","api":{"id":"196794595","method":"post","path":"/favor/delete","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313383","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313383,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false},"favId":{"type":"integer","description":"收藏夹ID"}},"x-apifox-orders":["appId","favId"],"required":["appId","favId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\",\n \"favId\": 179\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":12,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313383"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]},{"name":"账号管理","id":38391013,"auth":{},"securityScheme":{},"parentId":38391003,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"inherit","bodyType":"","fields":[]}},"shareSettings":{},"visibility":"INHERITED","preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"断线重连","api":{"id":"196794628","method":"post","path":"/login/reconnection","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"SGfUmgXqCS","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","schema":{"type":"string"},"enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313418","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"扫码但未点确认时的响应","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313418,"ordering":1},{"name":"登录成功","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": {\n \"uuid\": \"4YHmGvoXvgmS1MqWVtQ2\",\n \"headImgUrl\": \"http://wx.qlogo.cn/mmhead/ver_1/ZYUmcl1UNzyB2onM08Ij901TaUOLIjHj2UicK3XGDsjEWl4XgQN5IjodunHicBVsZiaZc1iaGCRfluAxkzyibbiau3WBfFj2nprzKp2KryicMjGIvDbWOQGmibwVK648a3o4A8hD/0\",\n \"nickName\": \"G\",\n \"expiredTime\": 230,\n \"status\": 2,\n \"loginInfo\": {\n \"uin\": 4077276085,\n \"wxid\": \"wxid_0xsqb3o0tsvz22\",\n \"nickName\": \"G\",\n \"mobile\": \"17114312382\",\n \"alias\": null\n }\n }\n}","responseId":495313418,"ordering":2}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false}},"required":["appId"],"x-apifox-orders":["appId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"- 当系统返回账号已离线,但是手机顶部还显示ipad在线,可用此接口尝试重连,若返回错误/失败则必须重新调用[步骤一登录](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794502)\n- 本接口非常用接口,可忽略","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":0,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{}},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313418"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"退出","api":{"id":"196794630","method":"post","path":"/login/logout","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313420","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"}},"required":["ret","msg"],"x-apifox-orders":["ret","msg"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\"\n}","responseId":495313420,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false}},"x-apifox-orders":["appId"],"required":["appId"]},"examples":[{"value":"{\n \"appId\": \"\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":12,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313420"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"检查是否在线","api":{"id":"196794631","method":"post","path":"/login/checkOnline","parameters":{"query":[],"path":[],"cookie":[],"header":[{"id":"ntFeMCw9GJ","name":"X-GEWE-TOKEN","required":true,"description":"","example":"{{gewe-token}}","type":"string","enable":true}]},"auth":{},"securityScheme":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"495313421","code":200,"name":"成功","jsonSchema":{"type":"object","properties":{"ret":{"type":"integer"},"msg":{"type":"string"},"data":{"type":"boolean"}},"required":["ret","msg","data"],"x-apifox-orders":["ret","msg","data"]},"contentType":"json"}],"responseExamples":[{"name":"成功示例","data":"{\n \"ret\": 200,\n \"msg\": \"操作成功\",\n \"data\": true\n}","responseId":495313421,"ordering":1}],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","properties":{"appId":{"type":"string","description":"设备ID","additionalProperties":false}},"x-apifox-orders":["appId"],"required":["appId"]},"examples":[{"value":"{\n \"appId\": \"{{appid}}\"\n}","mediaType":"application/json","description":""}],"oasExtensions":""},"description":"响应结果的data=true则是在线,反之为离线","tags":[],"status":"released","serverId":"","operationId":"","sourceUrl":"","ordering":18,"cases":[],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":1},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.495313421"],"visibility":"INHERITED","oasExtensions":null,"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]}]}]}],"docCollection":[{"name":"根目录","children":[{"name":"基础API","children":[{"name":"消息模块","children":[],"items":[{"id":4801171,"name":"回调消息详解","sidebarTitle":"","content":"### 回调消息常见问题\n\nQ. **微信在线为什么没有消息推送?**\n```\n当回调消息未能通过 HTTP POST/JSON 方式成功推送至接收方时,请考虑使用 Apifox 向接收地址发送一条测试消息。如果仍然未能接收到消息,请检查接收地址的可用性。反之,若能成功接收测试消息,请联系客服,我们将协助您进行进一步的问题排查。\n```\n\nQ. **如何判断是否是自己发送的消息?**\n```\n可通过消息发送人($.Data.FromUserName.string)与所属微信($.Wxid)是否一致进行判断。\n```\n\nQ. **为什么同一条消息会重复回调?**\n```\n因服务重启、同步历史消息、失败重试等原因,同一条消息可能会重复推送,接收方需根据$.Appid+$.Data.NewMsgId字段做消息排重,以防消息重复处理。\n```\n\n---\n\n#### 文本消息\n```json\n {\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356095, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 1, 消息类型 1是文本消息\n \"Content\":\n {\n \"string\": \"123\" # 消息内容\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705043418, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t1\\n\\t\\n\\tv1_volHXhv4\\n\\t\\n\\t\\t\\n\\t\\n\\n\", \n \"PushContent\": \"朝夕。 : 123\", 消息通知内容 \n \"NewMsgId\": 7773749793478223190, 消息ID\n \"MsgSeq\": 640356095\n }\n }\n```\n\n\n#### 图片消息\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356099, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 3, 消息类型 3是图片消息\n \"Content\":\n {\n \"string\": \"\\n\\n\\t\\n\\t\\n\\t\\n\\n\" 图片的cdn信息,可用此字段做转发图片\n },\n \"Status\": 3,\n \"ImgStatus\": 2,\n \"ImgBuf\":\n {\n \"iLen\": 2146,\n \"buffer\": \"/9j/4AAQSkZJRgABAQAASABIAAD/4QBM...\" # 缩略图的base64\n },\n \"CreateTime\": 1705043678, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t2\\n\\t\\n\\t\\n\\t\\t5b04ea0181f86c7f3d126e9a7fe5038b_\\n\\t\\n\\tv1_5WGxwSEj\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [图片]\", 消息通知内容\n \"NewMsgId\": 6906713067183447582, 消息ID\n \"MsgSeq\": 640356099\n }\n}\n```\n\n#### 语音消息\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356100, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 34, 消息类型,34是语音消息\n \"Content\":\n {\n \"string\": \"\" 语音消息的下载信息,可用于下载语音文件\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 3600,\n \"buffer\": \"AiMhU0lMS19WMxMApzi9JA+qToPB...\" 语音文件的base64,并非所有语音消息都有本字段\n },\n \"CreateTime\": 1705043782, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_j+rf/Jnp\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [语音]\", 消息通知内容\n \"NewMsgId\": 1428830975092239121, 消息ID\n \"MsgSeq\": 640356100\n }\n}\n```\n\n#### 视频消息\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356101, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 43, 消息类型,43是视频消息\n \"Content\":\n {\n \"string\": \"\\n\\n\\t\\n\\n\" 视频消息的cdn信息,可用此字段做转发视频\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705043879, 消息发送时间\n \"MsgSource\": \"\\n\\t0\\n\\t\\n\\t\\tce3ebc6d2893c7a2669ac5d2eaa4aadf_\\n\\t\\n\\tv1_kk/psF9W\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [视频]\", 消息通知内容\n \"NewMsgId\": 6628526085342711793, 消息ID\n \"MsgSeq\": 640356101\n }\n}\n```\n\n#### emoji表情\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356102, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 47, 消息类型,47是emoji消息\n \"Content\":\n {\n \"string\": \" \" 可解析xml中的md5用与发送emoji消息\n },\n \"Status\": 3,\n \"ImgStatus\": 2,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705043947, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_vy/xC7WS\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [动画表情]\", 消息通知内容\n \"NewMsgId\": 6674256223577965652, 消息ID\n \"MsgSeq\": 640356102\n }\n}\n```\n\n#### 公众号链接\n- 判断链接消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.type=5,按此逻辑会匹配到两种消息,链接消息及邀请进群的通知,可依据xml msg.appmsg.title做区分\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356105, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n }, \n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49,\n \"Content\":\n {\n \"string\": \"\\n\\n\\t\\n\\t\\t尔滨,又有好消息!\\n\\t\\t\\n\\t\\t\\n\\t\\t5\\n\\t\\t0\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\thttp://mp.weixin.qq.com/s?__biz=MzA4NDI3NjcyNA==&mid=2650011300&idx=1&sn=52739c3d39c030394da972e3d83efc98&chksm=86ed931f730a3e19a5edc840896d9bf1ad1f8b60cdccafea6a9e7a38a0a33f261877d334622b&scene=0&xtrack=1#rd\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t3057020100044b304902010002048399cc8402032f7e350204a810d83a020465a0e829042462343663343435612d333737392d346230612d616434622d6263383038633562643562340204051408030201000405004c53d900\\n\\t\\t\\tadd1b4bcf9cc50c6a8f14ff334bc3d5c\\n\\t\\t\\t83741\\n\\t\\t\\t1000\\n\\t\\t\\t426\\n\\t\\t\\t37889a1e22c1e58ebd4e6589b999f63e\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\tgh_6651e07e4b2d\\n\\t\\t新华社\\n\\t\\thttps://mmbiz.qpic.cn/mmbiz_jpg/azXQmS1HA7mOP6LHArYqZ5ypK4iajvBdfhNxzyANcQ1eW7ec6yZVj7tv8Lt6tWftSNckDz3j4FqkP04TxARG8dQ/640?wxtype=jpeg&wxfrom=0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\n\\t\\n\\twxid_phyyedw9xap22\\n\\t0\\n\\t\\n\\t\\t1\\n\\t\\t\\n\\t\\n\\t\\n\\n\" 可用此字段做转发链接\n },\n \"Status\": 3,\n \"ImgStatus\": 2,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705044033, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t\\n\\t\\n\\t\\n\\t\\t4\\n\\t\\n\\t\\n\\t\\tba15c632e8fa89ed84bd027f09495591_\\n\\t\\n\\tv1_ptaEL1bv\\n\\n\",\n \"PushContent\": \"朝夕。 : [链接]尔滨,又有好消息!\", 消息通知内容\n \"NewMsgId\": 1623411326098221490, 消息ID\n \"MsgSeq\": 640356105\n }\n}\n```\n\n#### 文件消息(发送文件的通知)\n- **注意**:收到本条消息仅代表对方在向你发送文件,并不可以用本条做转发及下载\n- 判断此类消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.type=74\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356106, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49,\n \"Content\":\n {\n \"string\": \"\\n \\n <![CDATA[hhh.xlsx]]>\\n 74\\n 0\\n \\n 8939\\n \\n v1_paVQtd+CWGr2I3eOg71E6KBpQf0yY9RFQkqDPwT4yMnnbawqveao1vAE0qCOhWcIPkMGZavimUTDFcImr+SaManD8pKVQbBPTUvSmA6UsXgZWqQDOT00VLx7U/hoP3/CwveN2Lk56nxcef/XJiGKrOpAHKHcZvccaGk9/68wsBCOyanya/9xgdHTYxyQp4IadiSe\\n 0\\n \\n \\n \\n \\n wxid_phyyedw9xap22\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705044119, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_WyLyIcy+\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [文件]hhh.xlsx\", 消息通知内容\n \"NewMsgId\": 1789783684714859663, 消息ID\n \"MsgSeq\": 640356106\n }\n}\n```\n\n#### 文件消息(文件发送完成)\n- **注意**:收到本条消息表示对方给你的文件发送完成,可用本条消息做转发及下载\n- 判断此类消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.type=6\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356107, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49,\n \"Content\":\n {\n \"string\": \"\\n\\n\\t\\n\\t\\thhh.xlsx\\n\\t\\t\\n\\t\\t\\n\\t\\t6\\n\\t\\t0\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t8939\\n\\t\\t\\t@cdn_3057020100044b304902010002043904752002032f7e350204aa0dd83a020465a0e897042430373538386564322d353866642d343234342d386563652d6236353536306438623936610204011800050201000405004c56f900_3f28b0cbd65a86c3a980f3e22808c0fe_1\\n\\t\\t\\t\\n\\t\\t\\txlsx\\n\\t\\t\\t3057020100044b304902010002043904752002032f7e350204aa0dd83a020465a0e897042430373538386564322d353866642d343234342d386563652d6236353536306438623936610204011800050201000405004c56f900\\n\\t\\t\\t3f28b0cbd65a86c3a980f3e22808c0fe\\n\\t\\t\\t0\\n\\t\\t\\t1789783684714859663\\n\\t\\t\\tv1_paVQtd+CWGr2I3eOg71E6KBpQf0yY9RFQkqDPwT4yMnnbawqveao1vAE0qCOhWcIPkMGZavimUTDFcImr+SaManD8pKVQbBPTUvSmA6UsXgZWqQDOT00VLx7U/hoP3/CwveN2Lk56nxcef/XJiGKrOpAHKHcZvccaGk9/68wsBCOyanya/9xgdHTYxyQp4IadiSe\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t84c6737fe9549270c9b3ca4f6fc88f6f\\n\\t\\t\\n\\t\\n\\twxid_phyyedw9xap22\\n\\t0\\n\\t\\n\\t\\t1\\n\\t\\t\\n\\t\\n\\t\\n\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705044119, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t3\\n\\t\\n\\t\\n\\t\\t896374a2b5979141804d509256c22f0b_\\n\\t\\n\\tv1_n7kZ01bp\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [文件]hhh.xlsx\", 消息通知内容\n \"NewMsgId\": 3617029648443513152, 消息ID\n \"MsgSeq\": 640356107\n }\n}\n```\n\n#### 名片消息\n```json\n {\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356108, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 42, 消息类型,42是名片消息\n \"Content\":\n {\n \"string\": \"\\n\\n\" 名片中微信号的基本信息,可用于添加好友\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705044829, 消息发送时间\n \"MsgSource\": \"\\n\\t0\\n\\t\\n\\t\\t2\\n\\t\\n\\tv1_bawbB33Z\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [名片]Ashley\", 消息通知内容\n \"NewMsgId\": 766322251431765776, 消息ID\n \"MsgSeq\": 640356108\n }\n }\n```\n\n#### 好友添加请求通知\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356166, 消息ID\n \"FromUserName\":\n {\n \"string\": \"fmessage\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 37, 消息类型,37是好友添加请求通知\n \"Content\":\n {\n \"string\": \"\" 请求添加好友微信号的基本信息,可用于添加好友\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045979, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_GOrHWRNL\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 1109510141823131559, 消息ID\n \"MsgSeq\": 640356166\n }\n}\n```\n\n#### 好友通过验证及好友资料变更的通知消息\n```json\n{\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\",\n \"TypeName\": \"ModContacts\",\n \"Data\":\n {\n \"UserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\"\n },\n \"NickName\":\n {\n \"string\": \"chaoxi。\"\n },\n \"PyInitial\":\n {\n \"string\": \"CX\"\n },\n \"QuanPin\":\n {\n \"string\": \"chaoxi\"\n },\n \"Sex\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"BitMask\": 4294967295,\n \"BitVal\": 3,\n \"ImgFlag\": 1,\n \"Remark\":\n {},\n \"RemarkPyinitial\":\n {},\n \"RemarkQuanPin\":\n {},\n \"ContactType\": 0,\n \"RoomInfoCount\": 0,\n \"DomainList\": [\n {}],\n \"ChatRoomNotify\": 0,\n \"AddContactScene\": 0,\n \"Province\": \"Jiangsu\",\n \"City\": \"Nanjing\",\n \"Signature\": \"......\",\n \"PersonalCard\": 0,\n \"HasWeiXinHdHeadImg\": 1,\n \"VerifyFlag\": 0,\n \"Level\": 6,\n \"Source\": 14,\n \"WeiboFlag\": 0,\n \"AlbumStyle\": 0,\n \"AlbumFlag\": 3,\n \"SnsUserInfo\":\n {\n \"SnsFlag\": 1,\n \"SnsBgimgId\": \"http://shmmsns.qpic.cn/mmsns/FzeKA69P5uIdqPfQxp59LvOohoE2iaiaj86IBH1jl0F76aGvg8AlU7giaMtBhQ3bPibunbhVLb3aEq4/0\",\n \"SnsBgobjectId\": 14216284872728580667,\n \"SnsFlagEx\": 7297\n },\n \"Country\": \"CN\",\n \"BigHeadImgUrl\": \"https://wx.qlogo.cn/mmhead/ver_1/qqncCu2avRYruPcQbav3PrwaGSS31QgN6dqW8q1XuDKjgiaAuwoFPw3kN8Cj3zIBL36M93R2Xwib0IddUK3gqbFeezEiaA8K2mMdibT5VUDDrbn7F7M1Mxicmows9cdYNOicjI/0\",\n \"SmallHeadImgUrl\": \"https://wx.qlogo.cn/mmhead/ver_1/qqncCu2avRYruPcQbav3PrwaGSS31QgN6dqW8q1XuDKjgiaAuwoFPw3kN8Cj3zIBL36M93R2Xwib0IddUK3gqbFeezEiaA8K2mMdibT5VUDDrbn7F7M1Mxicmows9cdYNOicjI/132\",\n \"CustomizedInfo\":\n {\n \"BrandFlag\": 0\n },\n \"EncryptUserName\": \"v3_020b3826fd03010000000000feba078fc1e760000000501ea9a3dba12f95f6b60a0536a1adb6f6352c38d0916c9c74045d85aa602efa2d81b84adde05d285124e8a54b9fcd039f725d6ac0d3bd651c7c74503a@stranger\",\n \"AdditionalContactList\":\n {\n \"LinkedinContactItem\":\n {}\n },\n \"ChatroomMaxCount\": 0,\n \"DeleteFlag\": 0,\n \"Description\": \"\\b\\u0000\\u0018\\u0000\\\"\\u0000(\\u00008\\u0000\",\n \"ChatroomStatus\": 0,\n \"Extflag\": 0,\n \"ChatRoomBusinessType\": 0\n }\n}\n```\n\n\n#### 小程序消息\n- 判断此类消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.type=33/36\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356109, 消息ID\n \"FromUserName\":\n { \n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49,\n \"Content\":\n {\n \"string\": \"\\n\\n\\t\\n\\t\\t腾讯云助手\\n\\t\\t腾讯云助手\\n\\t\\t33\\n\\t\\thttps://mp.weixin.qq.com/mp/waerrpage?appid=wxe2039b83454e49ed&type=upgrade&upgradetype=3#wechat_redirect\\n\\t\\t\\n\\t\\t\\t3057020100044b304902010002048399cc8402032df731020414e461b4020465a0eb8f042463626430353633382d376263632d346161642d396234372d3435613131336339326231640204051808030201000405004c550500\\n\\t\\t\\te1284d4ae13ebd9bb2cde5251cdd05e4\\n\\t\\t\\t52357\\n\\t\\t\\t720\\n\\t\\t\\t576\\n\\t\\t\\td4142726bc730088f0fa44c9161a0992\\n\\t\\t\\td4142726bc730088f0fa44c9161a0992\\n\\t\\t\\t0\\n\\t\\t\\twxid_0xsqb3o0tsvz22_38_1705044879\\n\\t\\t\\n\\t\\tgh_44fc2ced7f87@app\\n\\t\\t腾讯云助手\\n\\t\\te1284d4ae13ebd9bb2cde5251cdd05e4\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t2\\n\\t\\t\\t594\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\t0\\n\\t\\t\\t538\\n\\t\\t\\t0\\n\\t\\t\\t0\\n\\t\\t\\t0\\n\\t\\t\\t0\\n\\t\\t\\n\\t\\n\\twxid_phyyedw9xap22\\n\\t0\\n\\t\\n\\t\\t1\\n\\t\\t\\n\\t\\n\\t\\n\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 2,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705044879, 消息发送时间\n \"MsgSource\": \"\\n\\t0\\n\\t\\n\\t\\t2\\n\\t\\n\\t\\n\\t\\tdb46d46fe0a926c4b571dfe9d8096bfa_\\n\\t\\n\\tv1_DkelOoZN\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [小程序]腾讯云助手\", 消息通知内容\n \"NewMsgId\": 572974861799389774, 消息ID\n \"MsgSeq\": 640356109\n }\n}\n```\n\n#### 引用消息\n- 判断此类消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.type=57\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356110, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49,\n \"Content\":\n {\n \"string\": \"\\n\\n\\t\\n\\t\\t看看这个\\n\\t\\t\\n\\t\\t\\n\\t\\t57\\n\\t\\t0\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t49\\n\\t\\t\\t3617029648443513152\\n\\t\\t\\twxid_phyyedw9xap22\\n\\t\\t\\twxid_phyyedw9xap22\\n\\t\\t\\t朝夕。\\n\\t\\t\\t<msg><appmsg appid=\\\"\\\" sdkver=\\\"0\\\"><title>hhh.xlsx</title><des></des><action></action><type>6</type><showtype>0</showtype><soundtype>0</soundtype><mediatagname></mediatagname><messageext></messageext><messageaction></messageaction><content></content><contentattr>0</contentattr><url></url><lowurl></lowurl><dataurl></dataurl><lowdataurl></lowdataurl><appattach><totallen>8939</totallen><attachid>@cdn_3057020100044b304902010002043904752002032f7e350204aa0dd83a020465a0e897042430373538386564322d353866642d343234342d386563652d6236353536306438623936610204011800050201000405004c56f900_3f28b0cbd65a86c3a980f3e22808c0fe_1</attachid><emoticonmd5></emoticonmd5><fileext>xlsx</fileext><cdnattachurl>3057020100044b304902010002043904752002032f7e350204aa0dd83a020465a0e897042430373538386564322d353866642d343234342d386563652d6236353536306438623936610204011800050201000405004c56f900</cdnattachurl><aeskey>3f28b0cbd65a86c3a980f3e22808c0fe</aeskey><encryver>0</encryver><overwrite_newmsgid>1789783684714859663</overwrite_newmsgid><fileuploadtoken>v1_paVQtd+CWGr2I3eOg71E6KBpQf0yY9RFQkqDPwT4yMnnbawqveao1vAE0qCOhWcIPkMGZavimUTDFcImr+SaManD8pKVQbBPTUvSmA6UsXgZWqQDOT00VLx7U/hoP3/CwveN2Lk56nxcef/XJiGKrOpAHKHcZvccaGk9/68wsBCOyanya/9xgdHTYxyQp4IadiSe</fileuploadtoken></appattach><extinfo></extinfo><sourceusername></sourceusername><sourcedisplayname></sourcedisplayname><thumburl></thumburl><md5>84c6737fe9549270c9b3ca4f6fc88f6f</md5><statextstr></statextstr></appmsg><fromusername></fromusername><appinfo><version>0</version><appname></appname><isforceupdate>1</isforceupdate></appinfo></msg>\\n\\t\\t\\t<msgsource>\\n\\t<alnode>\\n\\t\\t<cf>3</cf>\\n\\t</alnode>\\n\\t<sec_msg_node>\\n\\t\\t<uuid>896374a2b5979141804d509256c22f0b_</uuid>\\n\\t</sec_msg_node>\\n</msgsource>\\n\\n\\t\\t\\n\\t\\n\\twxid_phyyedw9xap22\\n\\t0\\n\\t\\n\\t\\t1\\n\\t\\t\\n\\t\\n\\t\\n\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705044946, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\tea25ade83dc4b9ec91060ca3e1a0f5a2_\\n\\t\\n\\tv1_oTWRYdd1\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"看看这个\", 消息通知内容\n \"NewMsgId\": 4334300109515885085, 消息ID\n \"MsgSeq\": 640356110\n }\n}\n```\n\n#### 转账消息\n- 判断此类消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.type=2000\n```json\n {\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356112, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49,\n \"Content\":\n {\n \"string\": \"\\n\\n<![CDATA[微信转账]]>\\n\\n\\n2000\\n\\n\\n\\n\\n\\n\\n\\n1\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705044984, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_eDcIna+F\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [转账]\", 消息通知内容\n \"NewMsgId\": 7290406378327063279, 消息ID\n \"MsgSeq\": 640356112\n }\n }\n```\n\n#### 红包消息\n- 判断此类消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.type=2001\n```json\n {\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356113, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49,\n \"Content\":\n {\n \"string\": \"\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t<![CDATA[微信红包]]>\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t微信红包\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\n\\t\\n\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045011, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\n\\tv1_Js6wJde/\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。 : [红包]恭喜发财,大吉大利\", 消息通知内容\n \"NewMsgId\": 5517720959405775296, 消息ID\n \"MsgSeq\": 640356113\n }\n }\n```\n\n#### 视频号消息\n- 判断此类消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.type=51\n```json\n {\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356115, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49,\n \"Content\":\n {\n \"string\": \"\\n\\n\\t\\n\\t\\t当前微信版本不支持展示该内容,请升级至最新版本。\\n\\t\\t\\n\\t\\t\\n\\t\\t51\\n\\t\\t0\\n\\t\\t0\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t0\\n\\t\\thttps://support.weixin.qq.com/update/\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t14264358459626428566\\n\\t\\t\\t4\\n\\t\\t\\t国风锦鲤\\n\\t\\t\\thttps://wx.qlogo.cn/finderhead/ver_1/x2LxetmLmgoo9jp69R3wcrtZ0LBLdjVv9vrK9HmPNGEdD1iawdrPffPvMmFUez8pWqRIfs7DtgPiaV5C7DZpibH8b3y0jG178aIict6uPf0Vht4/0\\n\\t\\t\\t还招人么?我不要工资#逆水寒cos\\n\\t\\t\\t1\\n\\t\\t\\t8046877030770906689_0_0_0_0_0\\n\\t\\t\\t0\\n\\t\\t\\tv2_060000231003b20faec8cae08b19c7d2c702e834b077fb74f482543ff67f0cc66363057a5443@finder\\n\\t\\t\\t\\n\\t\\t\\t0\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t4\\n\\t\\t\\t\\t\\thttp://wxapp.tc.qq.com/251/20302/stodownload?encfilekey=Cvvj5Ix3eez3Y79SxtvVL0L7CkPM6dFibFeI6caGYwFFDAZJzcvicKz3jic4UfNeiaWTwH9gTlYiafAxVkMZRXicBUBk2Ms7lauAj6SArUu0P9ddKiaa8IWZzYaaKLf1WddH4G8T0KicxQV3hQPH3pQgEMTscw&a=1&bizid=1023&dotrans=0&hy=SH&idx=1&m=4c4c7f3ed03a14a6b99d0d19176c12ac&upid=290110\\n\\t\\t\\t\\t\\thttp://wxapp.tc.qq.com/251/20304/stodownload?encfilekey=oibeqyX228riaCwo9STVsGLPj9UYCicgttvO59vjtcQ7Jviaia0q4bnpVP2ia7ibqzacPo0z4nIRtWom80ZXwL64icZO2q6ibVBQLZQftMwU3SHj5uplsIFroHeF0QNcCkXX3RtibaWCHJQjfqZUk&bizid=1023&dotrans=0&hy=SH&idx=1&m=7522250b4d15e5df866bf23da9f117d6&token=oA9SZ4icv8IssuhLtacX13nAzXiaf8y52juKW4ibUDN7a2vn71bbrCR0LZiabddvTsLLMvnELnuAwNxViclRT7wT9IyibzFw1pq9wdichRYaEmb6Js&ctsc=2-20\\n\\t\\t\\t\\t\\t1080\\n\\t\\t\\t\\t\\t1920\\n\\t\\t\\t\\t\\thttp://wxapp.tc.qq.com/251/20304/stodownload?encfilekey=oibeqyX228riaCwo9STVsGLPj9UYCicgttvO59vjtcQ7Jviaia0q4bnpVP2ia7ibqzacPo0z4nIRtWom80ZXwL64icZO2q6ibVBQLZQftMwU3SHj5uplsIFroHeF0QNcCkXX3RtibaWCHJQjfqZUk&bizid=1023&dotrans=0&hy=SH&idx=1&m=7522250b4d15e5df866bf23da9f117d6&token=oA9SZ4icv8IssuhLtacX13nAzXiaf8y52juKW4ibUDN7a2vn71bbrCR0LZiabddvTsLLMvnELnuAwNxViclRT7wT9IyibzFw1pq9wdichRYaEmb6Js&ctsc=2-20\\n\\t\\t\\t\\t\\thttp://wxapp.tc.qq.com/251/20350/stodownload?encfilekey=oibeqyX228riaCwo9STVsGLPj9UYCicgttv1FCQXwResqN75zI4n65zY5tkAficEPWbbClq2VcicqMYaSLK7nrAVMasrIhvsCXJib5cOLib98JgWPr4SP92W6YEkVN5Uv0TKAdyRryQ3Qxk7jU&bizid=1023&dotrans=0&hy=SH&idx=1&m=731b89683dd3cb866cdf96dab70ac183&token=KkOFht0mCXlnmicFbJnvymIJOEfZgzia8PY0ZzOdaIYTJXwfblvK4U1ibntribm1beupHwictGWs9hpMiclyhfSb6766Lnb3ib0j14bENm6u1tHpeo&ctsc=3-20\\n\\t\\t\\t\\t\\t10>>\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\n\\twxid_phyyedw9xap22\\n\\t0\\n\\t\\n\\t\\t1\\n\\t\\t\\n\\t\\n\\t\\n\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045057, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t\\n\\t\\n\\t\\n\\t\\t4\\n\\t\\n\\t\\n\\t\\tbb2cbd9d3290e7a3d35f183eaade2213_\\n\\t\\n\\tv1_+Tfo41HS\\n\\n\",\n \"PushContent\": \"你收到了一条消息\", 消息通知内容\n \"NewMsgId\": 5576224237104747184, 消息ID\n \"MsgSeq\": 640356115\n }\n }\n```\n\n#### 撤回消息\n- 判断此类消息的逻辑:\\$.Data.MsgType=10002 并且 解析\\$.Data.Content.string中的xml sysmsg.type=revokemsg\n```json\n {\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356116, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 10002,\n \"Content\":\n {\n \"string\": \"wxid_phyyedw9xap2210403561155576224237104747184\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045083, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 1968256046, 消息ID\n \"MsgSeq\": 640356116\n }\n }\n```\n\n#### 拍一拍消息\n- 判断此类消息的逻辑:\\$.Data.MsgType=10002 并且 解析\\$.Data.Content.string中的xml sysmsg.type=pat\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356117, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 10002,\n \"Content\":\n {\n \"string\": \"\\n\\n wxid_phyyedw9xap22\\n wxid_0xsqb3o0tsvz22\\n wxid_0xsqb3o0tsvz22\\n \\n 0\\n\\n\\n\\n\\n \\n\\n\\n\\n\\n\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045115, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 5709690173850254331, 消息ID\n \"MsgSeq\": 640356117\n }\n}\n```\n\n#### 地理位置\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356118, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 48, 消息类型,48是地理位置消息\n \"Content\":\n {\n \"string\": \"\\n\\n\\t\\n\\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045153, 消息发送时间\n \"MsgSource\": \"\\n\\t0\\n\\tv1_KgQA8C+H\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"PushContent\": \"朝夕。分享了一个地理位置\", 消息通知内容\n \"NewMsgId\": 2112726776406556053, 消息ID\n \"MsgSeq\": 640356118\n }\n}\n```\n\n#### 群聊邀请\n- 判断此类消息的逻辑:\\$.Data.MsgType=49 并且 解析\\$.Data.Content.string中的xml msg.appmsg.title=邀请你加入群聊(根据手机设置的系统语言title会有调整,不同语言关键字不同)\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356119, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 消息发送人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 49, \n \"Content\": \n {\n \"string\": \"<![CDATA[邀请你加入群聊]]>view500\"\n },\n \"Status\": 3,\n \"ImgStatus\": 0,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045206, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_uHiWbihr\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 2331390497668538400, 消息ID\n \"MsgSeq\": 640356119\n }\n}\n```\n\n#### 被移除群聊通知\n- 判断此类消息的逻辑:\\$.Data.MsgType=10000 并且 \\$.Data.Content.string内容为移除群聊的通知内容\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356153, 消息ID\n \"FromUserName\":\n {\n \"string\": \"39238473509@chatroom\" 所在群聊的ID\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 10000,\n \"Content\":\n {\n \"string\": \"你被\\\"朝夕。\\\"移出群聊\"\n },\n \"Status\": 4,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045790, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_f7Xny9H/\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 5759605552965664254, 消息ID\n \"MsgSeq\": 640356153\n }\n}\n```\n\n#### 踢出群聊通知\n- 判断此类消息的逻辑:\\$.Data.MsgType=10002 并且 解析\\$.Data.Content.string中的xml sysmsg.type=sysmsgtemplate 并且 template中的内容为“你将xxx移出了群聊”(根据手机设置的系统语言template会有调整,不同语言关键字不同)\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356143, 消息ID\n \"FromUserName\":\n {\n \"string\": \"34757816141@chatroom\" 所在群聊的ID\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 10002,\n \"Content\":\n {\n \"string\": \"34757816141@chatroom:\\n\\n\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\n\\n\"\n },\n \"Status\": 4,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045666, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 7100572668516374210, 消息ID\n \"MsgSeq\": 640356143\n }\n}\n```\n\n#### 解散群聊通知\n- 判断此类消息的逻辑:\\$.Data.MsgType=10002 并且 解析\\$.Data.Content.string中的xml sysmsg.type=sysmsgtemplate 并且 template中的内容为“群主xxx已解散该群聊”(根据手机设置的系统语言template会有调整,不同语言关键字不同)\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356158, 消息ID\n \"FromUserName\":\n {\n \"string\": \"39238473509@chatroom\" 所在群聊的ID\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 10002,\n \"Content\":\n {\n \"string\": \"39238473509@chatroom:\\n\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\"\n },\n \"Status\": 4,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045834, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 6869316888754169027, 消息ID\n \"MsgSeq\": 640356158\n }\n}\n```\n\n#### 修改群名称\n- 判断此类消息的逻辑:\\$.Data.MsgType=10000 并且 \\$.Data.Content.string为修改群名的通知内容\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356129, 消息ID\n \"FromUserName\":\n {\n \"string\": \"34757816141@chatroom\" 所在群聊的ID\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 10000,\n \"Content\":\n {\n \"string\": \"你修改群名为“GeWe test1”\"\n },\n \"Status\": 4,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045517, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_3uPmlxJG\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 6984814725261047392, 消息ID\n \"MsgSeq\": 640356129\n }\n}\n```\n\n#### 更换群主通知\n- 判断此类消息的逻辑:\\$.Data.MsgType=10000 并且 \\$.Data.Content.string为更换群主的通知内容\n```json\n {\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356125, 消息ID\n \"FromUserName\":\n {\n \"string\": \"34757816141@chatroom\" 所在群聊的ID\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 消息接收人的wxid\n },\n \"MsgType\": 10000,\n \"Content\":\n {\n \"string\": \"你已成为新群主\"\n },\n \"Status\": 4,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045441, 消息发送时间\n \"MsgSource\": \"\\n\\tv1_iqIx6JkV\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 7268255507978211143, 消息ID\n \"MsgSeq\": 640356125\n }\n }\n```\n\n#### 群信息变更通知\n```json\n{\n \"TypeName\": \"ModContacts\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"UserName\":\n {\n \"string\": \"34757816141@chatroom\" 所在群聊的ID\n },\n \"NickName\":\n {\n \"string\": \"GeWe test\"\n },\n \"PyInitial\":\n {\n \"string\": \"GEWETEST\"\n },\n \"QuanPin\":\n {\n \"string\": \"GeWetest\"\n },\n \"Sex\": 0,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"BitMask\": 4294967295,\n \"BitVal\": 2,\n \"ImgFlag\": 1,\n \"Remark\":\n {},\n \"RemarkPyinitial\":\n {},\n \"RemarkQuanPin\":\n {},\n \"ContactType\": 0,\n \"RoomInfoCount\": 0,\n \"DomainList\": [\n {}],\n \"ChatRoomNotify\": 1,\n \"AddContactScene\": 0,\n \"PersonalCard\": 0,\n \"HasWeiXinHdHeadImg\": 0,\n \"VerifyFlag\": 0,\n \"Level\": 0,\n \"Source\": 0,\n \"ChatRoomOwner\": \"wxid_0xsqb3o0tsvz22\",\n \"WeiboFlag\": 0,\n \"AlbumStyle\": 0,\n \"AlbumFlag\": 0,\n \"SnsUserInfo\":\n {\n \"SnsFlag\": 0,\n \"SnsBgobjectId\": 0,\n \"SnsFlagEx\": 0\n },\n \"CustomizedInfo\":\n {\n \"BrandFlag\": 0\n },\n \"AdditionalContactList\":\n {\n \"LinkedinContactItem\":\n {}\n },\n \"ChatroomMaxCount\": 700000019,\n \"DeleteFlag\": 2,\n \"Description\": \"\\b\\u0004\\u0012\\u0017\\n\\u000Ewxid_phyyedw9xap220\\u0001@\\u0000�\\u0001\\u0000\\u0012\\u001B\\n\\u0012wxid_phyyedw9xap220\\u0001@\\u0000�\\u0001\\u0000\\u0012\\u001C\\n\\u0013wxid_0xsqb3o0tsvz220\\u0001@\\u0000�\\u0001\\u0000\\u0012\\u001D\\n\\u0013wxid_8pvka4jg6qzt220�\\u0010@\\u0000�\\u0001\\u0000\\u0018\\u0001\\\"\\u0000(\\u00008\\u0000\",\n \"ChatroomStatus\": 27,\n \"Extflag\": 0,\n \"ChatRoomBusinessType\": 0\n }\n}\n``` \n\n#### 发布群公告\n- 判断此类消息的逻辑:\\$.Data.MsgType=10002 并且 解析\\$.Data.Content.string中的xml sysmsg.type=mmchatroombarannouncememt\n```json\n{\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356133, 消息ID\n \"FromUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\" 发布人的wxid\n },\n \"ToUserName\":\n {\n \"string\": \"34757816141@chatroom\" 所在群聊的ID\n },\n \"MsgType\": 10002,\n \"Content\":\n {\n \"string\": \"\\n \\n \\n \\n\\t1705045558\\n\\t127\\n\\t1\\n\\t\\n\\t\\twxid_0xsqb3o0tsvz22\\n\\t\\t34757816141@chatroom\\n\\t\\t7c79fed82a0037648954bba6d5ca2025\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\t.htm\\n\\t\\t\\thttp://wxapp.tc.qq.com/264/20303/stodownload?m=145a874d4eb1bb0b85af928331a168aa&filekey=3033020101041f301d02020108040253480410145a874d4eb1bb0b85af928331a168aa020120040d00000004627466730000000132&hy=SH&storeid=265a0ee36000a9c94f3064bb50000010800004f4f534825960b01e676a0b3b&bizid=1023\\n\\t\\t\\t24808ae91ac7d636c99a1b340a1f9253\\n\\t\\t\\t8fac8374ded0d5e8d5038b1ec2b77a62\\n\\t\\t\\tef033738f28bb3c80cd5e7290fdbfdcf\\n\\t\\t\\tef033738f28bb3c80cd5e7290fdbfdcf\\n\\t\\t\\t20\\n\\t\\t\\n\\t\\t\\n\\t\\t\\t群公告哈1\\n\\t\\t\\t\\n\\t\\t\\n\\t\\n\\t\\n\\t\\t\\n\\t\\t\\t-1\\n\\t\\t\\n\\t\\n\\twxid_0xsqb3o0tsvz22_34757816141@chatroom_1705045558_2028281562\\n\\n]]>\\n \\n \\n\"\n },\n \"Status\": 3,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045559, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 8056409355261218186, 消息ID\n \"MsgSeq\": 640356133\n }\n}\n```\n\n#### 群待办\n- 判断此类消息的逻辑:\\$.Data.MsgType=10002 并且 解析\\$.Data.Content.string中的xml sysmsg.type=roomtoolstips\n```json\n {\n \"TypeName\": \"AddMsg\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"MsgId\": 1040356135, 消息ID\n \"FromUserName\":\n {\n \"string\": \"34757816141@chatroom\" 所在群聊的ID\n },\n \"ToUserName\":\n {\n \"string\": \"wxid_0xsqb3o0tsvz22\"\n },\n \"MsgType\": 10002,\n \"Content\":\n {\n \"string\": \"34757816141@chatroom:\\n\\n\\n 0\\n\\n \\n \\n \\n \\n \\n <![CDATA[群公告]]>\\n \\n \\n \\n 0\\n \\n \\n \\n \\n\\n\\n \\n\\n\\n \\n \\n \\n \\n \\n \\n \\n\\n \\n\\n \\n\\n\\n\"\n },\n \"Status\": 4,\n \"ImgStatus\": 1,\n \"ImgBuf\":\n {\n \"iLen\": 0\n },\n \"CreateTime\": 1705045591, 消息发送时间\n \"MsgSource\": \"\\n\\t\\n\\t\\t\\n\\t\\n\\n\",\n \"NewMsgId\": 1765700414095721113, 消息ID\n \"MsgSeq\": 640356135\n }\n }\n```\n\n#### 删除好友通知\n```json\n{\n \"TypeName\": \"DelContacts\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"UserName\":\n {\n \"string\": \"wxid_phyyedw9xap22\" 删除的好友wxid\n },\n \"DeleteContactScen\": 0\n }\n}\n```\n\n#### 退出群聊\n```json\n{\n \"TypeName\": \"DelContacts\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\", 所属微信的wxid\n \"Data\":\n {\n \"UserName\":\n {\n \"string\": \"34559815390@chatroom\" 退出的群聊ID\n },\n \"DeleteContactScen\": 0\n }\n}\n```\n\n#### 掉线通知\n```json\n{\n \"TypeName\": \"Offline\", 消息类型\n \"Appid\": \"wx_wR_U4zPj2M_OTS3BCyoE4\", 设备ID\n \"Wxid\": \"wxid_phyyedw9xap22\" 掉线号的wxid\n}\n```\n","folderId":38391007,"type":"","tags":[],"visibility":"INHERITED"}]}],"items":[]}],"items":[]}],"webSocketCollection":[],"socketIOCollection":[],"responseCollection":[],"schemaCollection":[],"securitySchemeCollection":[],"requestCollection":[{"name":"根目录","children":[],"ordering":["requestFolder.3591746","requestFolder.5085392"],"items":[]}],"environments":[],"globalVariables":[],"commonParameters":null,"customFunctions":[],"projectAssociations":[]} \ No newline at end of file diff --git a/gewechat/call_back_message/Gewechat.md b/gewechat/call_back_message/Gewechat.md deleted file mode 100644 index 99ab43b..0000000 --- a/gewechat/call_back_message/Gewechat.md +++ /dev/null @@ -1,4616 +0,0 @@ ---- -title: Gewechat -language_tabs: - - shell: Shell - - http: HTTP - - javascript: JavaScript - - ruby: Ruby - - python: Python - - php: PHP - - java: Java - - go: Go -toc_footers: [] -includes: [] -search: true -code_clipboard: true -highlight_theme: darkula -headingLevel: 2 -generator: "@tarslib/widdershins v4.0.30" - ---- - -# Gewechat - -Base URLs: - -# Authentication - -# 基础API/登录模块 - -## POST 获取登录二维码(步骤2) - -POST /login/getLoginQrCode - -- appId参数为设备ID,首次登录传空,会自动触发创建设备,掉线后重新登录则必须传接口返回的appId,注意**同一个号避免重复创建设备**,以免触发官方风控 -- **取码时传的appId需要与上次登录扫码的微信一致,否则会导致登录失败** -- 响应结果中的qrImgBase64为微信二维码图片的base64,前端需要**将二维码图片展示给用户并进行手机扫码操作**(PS: **扫码后调用步骤2,手机上才显示登录**)。(或使用响应结果中的qrData生成二维码) - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID,首次登录传空,之后传接口返回的appId| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "appId": "wx_wR_U4zPj2M_OTS3BCyoE4", - "qrData": "http://weixin.qq.com/x/4dmHZZMtoLbHoLZwd1wE", - "qrImgBase64": "data:image/jpg;base64,XXX", - "uuid": "4dmHZZMtoLbHoLZwd1wE" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||响应数据| -|»» qrData|string|true|none||二维码内包含的信息(可用二维码生成工具结合值生成可扫描的微信二维码)| -|»» appId|string|true|none||设备ID| -|»» qrImgBase64|string|true|none||二维码图片base64| -|»» uuid|string|true|none||二维码的uuid| - -## POST 获取Token(步骤1) - -POST /tools/getTokenId - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": "" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|string|true|none||token| - -## POST 执行登录(步骤3) - -POST /login/checkLogin - -- 获取到登录二维码后需每间隔5s调用本接口来判断是否登录成功 -- 新设备登录平台,次日凌晨会掉线一次,重新登录时需调用[获取二维码且传appId取码](/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794502),登录成功后则可以长期在线 -- 登录成功后请保存appId与wxid的对应关系,后续接口中会用到 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "uuid": "IZDexGAEu9_6JkDX0pX-" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» uuid|body|string| 是 |取码返回的uuid| -|» captchCode|body|string| 是 |扫码后手机提示输入的验证码| - -> 返回示例 - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "uuid": "AZ0yN8d1wJmiNfQBKFgu", - "headImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/ZYUmcl1UNzyB2onM08Ij901TaUOLIjHj2UicK3XGDsjEWl4XgQN5IjodunHicBVsZiaZc1iaGCRfluAxkzyibbiau3WBfFj2nprzKp2KryicMjGIvDbWOQGmibwVK648a3o4A8hD/0", - "nickName": "G", - "expiredTime": 225, - "status": 1, - "loginInfo": null - } -} -``` - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "uuid": "4YHmGvoXvgmS1MqWVtQ2", - "headImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/ZYUmcl1UNzyB2onM08Ij901TaUOLIjHj2UicK3XGDsjEWl4XgQN5IjodunHicBVsZiaZc1iaGCRfluAxkzyibbiau3WBfFj2nprzKp2KryicMjGIvDbWOQGmibwVK648a3o4A8hD/0", - "nickName": "G", - "expiredTime": 230, - "status": 2, - "loginInfo": { - "uin": 4077276085, - "wxid": "wxid_0xsqb3o0tsvz22", - "nickName": "G", - "mobile": "17114312382", - "alias": null - } - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||响应数据| -|»» uuid|string|true|none||二维码的uuid| -|»» headImgUrl|string|true|none||头像地址| -|»» nickName|string|true|none||昵称| -|»» expiredTime|integer|true|none||二维码超时时间| -|»» status|integer|true|none||状态| -|»» loginInfo|object|true|none||登录成功信息| -|»»» uin|integer|true|none||uin| -|»»» wxid|string|true|none||微信ID,返回此值则是登录成功| -|»»» nickName|string|true|none||昵称| -|»»» mobile|string|true|none||绑定的手机号| -|»»» alias|string|true|none||微信号| - -## POST 设置消息回调地址 - -POST /tools/setCallback - -> Body 请求参数 - -```json -{ - "token": "{{gewe-token}}", - "callbackUrl": "http://www.baidu.com" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» token|body|string| 是 |token| -|» callbackUrl|body|string| 是 |回调接收地址| - -> 返回示例 - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "uuid": "4YHmGvoXvgmS1MqWVtQ2", - "headImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/ZYUmcl1UNzyB2onM08Ij901TaUOLIjHj2UicK3XGDsjEWl4XgQN5IjodunHicBVsZiaZc1iaGCRfluAxkzyibbiau3WBfFj2nprzKp2KryicMjGIvDbWOQGmibwVK648a3o4A8hD/0", - "nickName": "G", - "expiredTime": 230, - "status": 2, - "loginInfo": { - "uin": 4077276085, - "wxid": "wxid_0xsqb3o0tsvz22", - "nickName": "G", - "mobile": "17114312382", - "alias": null - } - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 查看设备列表 - -POST /login/deviceList - -> Body 请求参数 - -```json -{} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| - -> 返回示例 - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": [ - "wx_YQFamjNEfV1LFFl9TRYVb" - ] -} -``` - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "uuid": "4YHmGvoXvgmS1MqWVtQ2", - "headImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/ZYUmcl1UNzyB2onM08Ij901TaUOLIjHj2UicK3XGDsjEWl4XgQN5IjodunHicBVsZiaZc1iaGCRfluAxkzyibbiau3WBfFj2nprzKp2KryicMjGIvDbWOQGmibwVK648a3o4A8hD/0", - "nickName": "G", - "expiredTime": 230, - "status": 2, - "loginInfo": { - "uin": 4077276085, - "wxid": "wxid_0xsqb3o0tsvz22", - "nickName": "G", - "mobile": "17114312382", - "alias": null - } - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|[string]|true|none||none| - -# 基础API/联系人模块 - -## POST 获取通讯录列表 - -POST /contacts/fetchContactsList - -- 本接口为长耗时接口,耗时时间根据好友数量递增,若接口返回超时可通过[获取通讯录列表缓存接口](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794505)获取响应结果 -- 本接口返回的群聊仅为[保存到通讯录中的群聊](https://zhidao.baidu.com/question/144774265918920605/answer/4326874247.html),若想获取会话列表中的所有群聊,需要通过[消息订阅](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196884570)做二次处理。原因:当未获取的群有成员在群内发消息的话会有消息回调, 开发者此刻调用[获取群详情接口](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794513)查询群信息入库保存即可,比如说手机上三年前不说话的群,侧滑删除了,用户手机上也不会看到被删除的群聊的 ,但是有群成员说了话他会显示,原理就是各个终端(Android、IOS、桌面版微信)取得了消息回调,又去获取群详情信息,本地数据库缓存了下来,显示的手机群聊,让用户感知的。 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "friends": [ - "tmessage", - "medianote", - "qmessage", - "qqmail", - "wxid_910acevfm2nb21", - "qqsafe", - "wxid_9299552988412", - "weixin", - "exmail_tool", - "wxid_mp05xmje0ctn22", - "wxid_09oq4f4j4wg912", - "wxid_6bfguz79h8n122", - "wxid_lyuq4hr4lrjq22", - "wxid_a1zqyljsrsdu12", - "wxid_lv3pb3zhna3522", - "wxid_k2biq6fuinsr22", - "wxid_ujredjhxz9y712", - "wxid_uwb7989u0jea12", - "wxid_in46ey732vxu12", - "wxid_3rvervwohj6921", - "wxid_4wkls7tu62ua12", - "wxid_g0bdknnotx2f12", - "wxid_ce5fgp0icb3y21", - "wxid_1482424825211", - "wxid_vw3p4f6jy7bm12", - "wxid_o2m8xm71c23522", - "wxid_bclqpc2ho6o412", - "wxid_98pjjzpiisi721", - "wxid_noq2wsn5c8h222" - ], - "chatrooms": [ - "2180313478@chatroom", - "14358945067@chatroom", - "17362526147@chatroom", - "11685224357@chatroom", - "17522822550@chatroom" - ], - "ghs": [ - "gh_7aac992b0363", - "gh_d7293b5f14f4", - "gh_f51ce3ef83a4", - "gh_7d20df86e26b", - "gh_69bfb92a3e43" - ] - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» friends|[string]|true|none||好友的wxid| -|»» chatrooms|[string]|true|none||保存到通讯录中群聊的ID| -|»» ghs|[string]|true|none||关注的公众号ID| - -## POST 获取通讯录列表缓存 - -POST /contacts/fetchContactsListCache - -通讯录列表数据缓存10分钟,超时则需要重新调用[获取通讯录列表接口](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794504) - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 搜索好友 - -POST /contacts/search - -搜索的联系人信息若已经是好友,响应结果的v3则为好友的wxid -本接口返回的数据可通过[添加联系人接口](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794507)发送添加好友请求 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "contactsInfo": "zhangch" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» contactsInfo|body|string| 是 |搜索的联系人信息,微信号、手机号...| - -> 返回示例 - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "v3": "v3_020b3826fd030100000000006c20217514f7f2000000501ea9a3dba12f95f6b60a0536a1adb690dcccc9bf58cc80765e6eb16bc2678a36a0ed264e1b22596f787de6acc71a4beb20b69ab88bfd6d71aa1858b3@stranger", - "nickName": "zhang", - "sex": 1, - "signature": "学习、成长、锻炼", - "bigHeadImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/yoYJGtDmGicz9QGOFRb71Ns6onQO63bnfJibicBwEmO73m18N7BicrGzeYsdxOrUf5qwJq9mMaQbDwEBA92uPOuibZg/0", - "smallHeadImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/yoYJGtDmGicz9QGOFRb71Ns6onQO63bnfJibicBwEmO73m18N7BicrGzeYsdxOrUf5qwJq9mMaQbDwEBA92uPOuibZg/132", - "v4": "v4_000b708f0b04000001000000000056d3690365e0eefe00ef467a8e651000000050ded0b020927e3c97896a09d47e6e9ec65e1f9d32b06f86df4790587a6308149b3c8a90185e824efccd5b41bd75f6240ab020f9dd4b5915a083c6784a5cfcb806f53ca340b4c95b24f474d6e3fc0661301b3b3b741aac3eb5@stranger" - } -} -``` - -```json -{ - "ret": 500, - "msg": "搜索联系人失败", - "data": { - "code": "-4", - "msg": "用户不存在" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» v3|string|true|none||搜索好友的v3,添加好友时使用| -|»» nickName|string|true|none||搜索好友的昵称| -|»» sex|integer|true|none||搜索好友的性别| -|»» signature|null|true|none||搜索好友的签名| -|»» bigHeadImgUrl|string|true|none||搜索好友的大尺寸头像| -|»» smallHeadImgUrl|string|true|none||搜索好友的小尺寸头像| -|»» v4|string|true|none||搜索好友的v4,添加好友时使用| - -## POST 添加联系人/同意添加好友 - -POST /contacts/addContacts - -本接口建议在线3天后再进行调用。 -好友添加成功后,会通过回调消息推送一条包含v3的消息,可用于判断好友是否添加成功。 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "scene": 3, - "content": "hallo", - "v4": "v4_000b708f0b04000001000000000054a9e826263634356493c57b8e651000000050ded0b020927e3c97896a09d47e6e9e455d674c2544e251e77c7cba08cc6cef8f7df9e52d2bd4a3cef771c8661331fa1939fbe54f4e479d6d9d4522d70aeba057ffd0dd82398730da44ee57332a7bdea4862304d4799758ba@stranger", - "v3": "v3_020b3826fd030100000000003a070e7757675c000000501ea9a3dba12f95f6b60a0536a1adb690dcccc9bf58cc80765e6eb16bffa5996420bb1b2577634516ff82090419d8bdcd5689df8dfb21d40af93d286f72c3a0e8cfa6dcb68afed39226f008c6@stranger", - "option": 2 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» scene|body|integer| 是 |添加来源,同意添加好友时传回调消息xml中的scene值。| -|» option|body|integer| 是 |操作类型,2添加好友 3同意好友 4拒绝好友| -|» v3|body|string| 是 |通过搜索或回调消息获取到的v3| -|» v4|body|string| 是 |通过搜索或回调消息获取到的v4| -|» content|body|string| 是 |添加好友时的招呼语| - -#### 详细说明 - -**» scene**: 添加来源,同意添加好友时传回调消息xml中的scene值。 -添加好友时的枚举值如下: -3 :微信号搜索 -4 :QQ好友 -8 :来自群聊 -15:手机号 - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 删除好友 - -POST /contacts/deleteFriend - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "wxid": "wxid_phyyedw9xap22" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» wxid|body|string| 是 |删除好友的wxid| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 上传手机通讯录 - -POST /contacts/uploadPhoneAddressList - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "phones": [ - "18616561632", - "18134173174" - ], - "opType": 1 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» phones|body|[string]| 是 |需要上传的手机号| -|» opType|body|integer| 是 |操作类型,1:上传 2:删除| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 获取群/好友简要信息 - -POST /contacts/getBriefInfo - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "wxids": [ - "wxid_phyyedw9xap22" - ] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» wxids|body|[string]| 是 |好友的wxid| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "获取联系人信息成功", - "data": [ - { - "userName": "wxid_phyyedw9xap22", - "nickName": "Ashley", - "pyInitial": "ASHLEY", - "quanPin": "Ashley", - "sex": 2, - "remark": "", - "remarkPyInitial": "", - "remarkQuanPin": "", - "signature": null, - "alias": "zero-one_200906", - "snsBgImg": null, - "country": "AD", - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/buiaXybHTBK3BuGr1edN72zBDermWVFJ7YC8Jib2RcCSdiauAtZcPgUQpdhE9KY5NsumDAWD16fsg3A6OKuhdEr97VAHdTGgk6R1Eibuj7ZNwJ4/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/buiaXybHTBK3BuGr1edN72zBDermWVFJ7YC8Jib2RcCSdiauAtZcPgUQpdhE9KY5NsumDAWD16fsg3A6OKuhdEr97VAHdTGgk6R1Eibuj7ZNwJ4/132", - "description": null, - "cardImgUrl": null, - "labelList": "", - "province": "", - "city": "", - "phoneNumList": null - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|[object]|true|none||none| -|»» userName|string|false|none||none| -|»» nickName|string|false|none||none| -|»» pyInitial|string|false|none||none| -|»» quanPin|string|false|none||none| -|»» sex|integer|false|none||none| -|»» remark|string|false|none||none| -|»» remarkPyInitial|string|false|none||none| -|»» remarkQuanPin|string|false|none||none| -|»» signature|null|false|none||none| -|»» alias|string|false|none||none| -|»» snsBgImg|null|false|none||none| -|»» country|string|false|none||none| -|»» bigHeadImgUrl|string|false|none||none| -|»» smallHeadImgUrl|string|false|none||none| -|»» description|null|false|none||none| -|»» cardImgUrl|null|false|none||none| -|»» labelList|string|false|none||none| -|»» province|string|false|none||none| -|»» city|string|false|none||none| -|»» phoneNumList|null|false|none||none| - -## POST 获取群/好友详细信息 - -POST /contacts/getDetailInfo - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "wxids": [ - "yc-081726" - ] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» wxids|body|[string]| 是 |好友的wxid| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "获取联系人信息成功", - "data": [ - { - "userName": "wxid_phyyedw9xap22", - "nickName": "Ashley", - "pyInitial": null, - "quanPin": "Ashley", - "sex": 2, - "remark": null, - "remarkPyInitial": null, - "remarkQuanPin": null, - "signature": "山林不向四季起誓 枯荣随缘。", - "alias": "zero-one_200906", - "snsBgImg": "http://shmmsns.qpic.cn/mmsns/UaAfqYic92wm7ZCrsEwlQMXSmBLs8dpwBzrXnrOyyP3B8bDibCCFInJ9PicC9LPYY17uWH1yIOmBYQ/0", - "country": "AD", - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/buiaXybHTBK3BuGr1edN72zBDermWVFJ7YC8Jib2RcCSdiauAtZcPgUQpdhE9KY5NsumDAWD16fsg3A6OKuhdEr97VAHdTGgk6R1Eibuj7ZNwJ4/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/buiaXybHTBK3BuGr1edN72zBDermWVFJ7YC8Jib2RcCSdiauAtZcPgUQpdhE9KY5NsumDAWD16fsg3A6OKuhdEr97VAHdTGgk6R1Eibuj7ZNwJ4/132", - "description": null, - "cardImgUrl": null, - "labelList": null, - "province": null, - "city": null, - "phoneNumList": null - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|[object]|true|none||none| -|»» userName|string|false|none||好友的wxid| -|»» nickName|string|false|none||好友的昵称| -|»» pyInitial|null|false|none||好友昵称的拼音首字母| -|»» quanPin|string|false|none||好友昵称的全拼| -|»» sex|integer|false|none||好友的性别| -|»» remark|null|false|none||好友备注| -|»» remarkPyInitial|null|false|none||好友备注的拼音首字母| -|»» remarkQuanPin|null|false|none||好友备注的全拼| -|»» signature|string|false|none||好友的签名| -|»» alias|string|false|none||好友的微信号| -|»» snsBgImg|string|false|none||朋友圈背景图链接| -|»» country|string|false|none||国家| -|»» bigHeadImgUrl|string|false|none||大尺寸头像链接| -|»» smallHeadImgUrl|string|false|none||小尺寸头像链接| -|»» description|null|false|none||好友的描述| -|»» cardImgUrl|null|false|none||好友描述的图片链接| -|»» labelList|null|false|none||好友的标签ID| -|»» province|null|false|none||省份| -|»» city|null|false|none||城市| -|»» phoneNumList|null|false|none||好友的手机号码| - -## POST 设置好友仅聊天 - -POST /contacts/setFriendPermissions - -设置完好友仅聊天后若发现手机展示不是设置的结果,可能是手机缓存未刷新,重新进入页面刷新查看 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "wxid": "wxid_phyyedw9xap22", - "onlyChat": true -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» wxid|body|string| 是 |好友的wxid| -|» onlyChat|body|boolean| 是 |设置好友是否仅聊天| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "设置好友权限成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 设置好友备注 - -POST /contacts/setFriendRemark - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "wxid": "wxid_phyyedw9xap22", - "remark": "备注" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» wxid|body|string| 是 |好友的wxid| -|» remark|body|string| 是 |备注的备注| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "设置好友权限成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 获取手机通讯录 - -POST /contacts/getPhoneAddressList - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "phones": [] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» phones|body|[string]| 否 |获取哪些手机号的好友详情,不传获取所有| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "获取手机通讯录成功", - "data": [ - { - "userName": "wxid_ddgsghdfafaphh22", - "v4": null, - "nickName": null, - "sex": 1, - "phoneMd5": "d36f4cc1c8bca1ef41b93d2215133cdb", - "signature": "......", - "alias": null, - "country": "CN", - "bigHeadImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/vwGdLRK5jtpXagA7dfXlUiaU9VayWNSqia1c2Wib7icJNhPd6WHhqMIVuYuNDfEqPRC2TnmlRSkfYrib9fHyYONwdccv17gibCls7ia8elaunvgMmYicAw22wUJQ3CDw0Cm5ibrOT/0", - "smallHeadImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/vwGdLRK5jtpXagA7dfXlUiaU9VayWNSqia1c2Wib7icJNhPd6WHhqMIVuYuNDfEqPRC2TnmlRSkfYrib9fHyYONwdccv17gibCls7ia8elaunvgMmYicAw22wUJQ3CDw0Cm5ibrOT/132", - "province": "Jiangsu", - "city": "Xuzhou", - "personalCard": 0 - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|[object]|true|none||none| -|»» userName|string|false|none||none| -|»» v4|null|false|none||none| -|»» nickName|null|false|none||none| -|»» sex|integer|false|none||none| -|»» phoneMd5|string|false|none||none| -|»» signature|string|false|none||none| -|»» alias|null|false|none||none| -|»» country|string|false|none||none| -|»» bigHeadImgUrl|string|false|none||none| -|»» smallHeadImgUrl|string|false|none||none| -|»» province|string|false|none||none| -|»» city|string|false|none||none| -|»» personalCard|integer|false|none||none| - -# 基础API/群模块 - -## POST 创建微信群 - -POST /group/createChatroom - -创建微信群时最少要选择两位微信好友 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "wxids": [ - "wxid_0xsqb3o0tsvz22", - "wxid_phyyedw9xap22" - ] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» wxids|body|[string]| 是 |好友的wxid列表| - -> 返回示例 - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "headImgBase64": "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", - "chatroomId": "34757816141@chatroom" - } -} -``` - -```json -{ - "ret": 500, - "msg": "创建群聊失败", - "data": { - "code": "0", - "msg": "MemberList are wrong" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» headImgBase64|string|true|none||群头像的base64图片| -|»» chatroomId|string|true|none||群ID| - -## POST 修改群名称 - -POST /group/modifyChatroomName - -修改完群名称后若发现手机未展示修改后的名称,可能是手机缓存未刷新,手机聊天框多切换几次会刷新。 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomName": "GeWe test", - "chatroomId": "34757816141@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomName|body|string| 是 |群名称| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 修改群备注 - -POST /group/modifyChatroomRemark - -群备注仅自己可见 -修改完群备注后若发现手机未展示修改后的备注,可能是手机缓存未刷新,手机聊天框多切换几次会刷新。 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomRemark": "GeWe test private", - "chatroomId": "34757816141@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomRemark|body|string| 是 |群备注| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 修改我在群内的昵称 - -POST /group/modifyChatroomNickNameForSelf - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "nickName": "廖静", - "chatroomId": "34757816141@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» nickName|body|string| 是 |群昵称| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 邀请/添加 进群 - -POST /group/inviteMember - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "wxids": "wxid_8pvka4jg6qzt22", - "chatroomId": "34757816141@chatroom", - "reason": "" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» wxids|body|string| 是 |邀请进群的好友wxid,多个英文逗号分隔| -|» chatroomId|body|string| 是 |群ID| -|» reason|body|string| 是 |邀请进群的说明| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 删除群成员 - -POST /group/removeMember - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "wxids": "wxid_8pvka4jg6qzt22", - "chatroomId": "34757816141@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» wxids|body|string| 是 |删除的群成员wxid,多个英文逗号分隔| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 退出群聊 - -POST /group/quitChatroom - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "21425161836@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 解散群聊 - -POST /group/disbandChatroom - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "21425161836@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 获取群信息 - -POST /group/getChatroomInfo - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "chatroomId": "34757816141@chatroom", - "nickName": "GeWe test", - "pyInitial": "GEWETEST", - "quanPin": "GeWetest", - "sex": 0, - "remark": "GeWe test private", - "remarkPyInitial": "GEWETESTPRIVATE", - "remarkQuanPin": "GeWetestprivate", - "chatRoomNotify": 1, - "chatRoomOwner": "zhangchuan2288", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmcrhead/PiajxSqBRaEJEIII6n6NUHudK1r5a29cMDlW0Ef7b1ibzksfrwIcRkTicPRoWm7Km3ZQIpq8xp65nD6yUm8BHxzqhV1ic1jQvvnv/0", - "memberList": [ - { - "wxid": "zhangchuan2288", - "nickName": "朝夕。", - "inviterUserName": null, - "memberFlag": 1, - "displayName": null, - "bigHeadImgUrl": null, - "smallHeadImgUrl": null - }, - { - "wxid": "wxid_phyyedw9xap22", - "nickName": "Ashley", - "inviterUserName": "zhangchuan2288", - "memberFlag": 1, - "displayName": null, - "bigHeadImgUrl": null, - "smallHeadImgUrl": null - }, - { - "wxid": "wxid_0xsqb3o0tsvz22", - "nickName": "G", - "inviterUserName": "zhangchuan2288", - "memberFlag": 1, - "displayName": null, - "bigHeadImgUrl": null, - "smallHeadImgUrl": null - } - ] - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» chatroomId|string|true|none||群ID| -|»» nickName|string|true|none||群名称| -|»» pyInitial|string|true|none||群名称的拼音首字母| -|»» quanPin|string|true|none||群名称的全拼| -|»» sex|integer|true|none||none| -|»» remark|string|true|none||群备注,仅自己可见| -|»» remarkPyInitial|string|true|none||群备注的拼音首字母| -|»» remarkQuanPin|string|true|none||群备注的全拼| -|»» chatRoomNotify|integer|true|none||群消息是否提醒| -|»» chatRoomOwner|string|true|none||群主的wxid| -|»» smallHeadImgUrl|string|true|none||群头像链接| -|»» memberList|[object]|true|none||群成员列表| -|»»» wxid|string|true|none||群成员的wxid| -|»»» nickName|string|true|none||群成员的昵称| -|»»» inviterUserName|string¦null|true|none||邀请人的wxid| -|»»» memberFlag|integer|true|none||标识| -|»»» displayName|null|true|none||在本群内的昵称| -|»»» bigHeadImgUrl|null|true|none||大尺寸头像| -|»»» smallHeadImgUrl|null|true|none||小尺寸头像| - -## POST 获取群成员列表 - -POST /group/getChatroomMemberList - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "memberList": [ - { - "wxid": "zhangchuan2288", - "nickName": "朝夕。", - "inviterUserName": null, - "memberFlag": 1, - "displayName": null, - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/T0MtLBu618rUlZqaAiaWfucmVibiawiciaSibPfz11siaLZr0qSxQTAR9lu7YicDwYAHNia1je79icxul6bzQ4LLZopiaM9EdYAEublPCLV29QKLv26ictBHjWsWnE0lvYGjibB9DkE6q/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/T0MtLBu618rUlZqaAiaWfucmVibiawiciaSibPfz11siaLZr0qSxQTAR9lu7YicDwYAHNia1je79icxul6bzQ4LLZopiaM9EdYAEublPCLV29QKLv26ictBHjWsWnE0lvYGjibB9DkE6q/132" - }, - { - "wxid": "wxid_phyyedw9xap22", - "nickName": "Ashley", - "inviterUserName": "zhangchuan2288", - "memberFlag": 1, - "displayName": null, - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/5ibSibfNKwpv0TLLuSFv2hibEBqShib4BKsaxHZ2v10y9F93ibO5lK4bwib47qtuwsLZD8HY7fVicibWlWvehCLDCdicy38NaIbVupuMZMDwiaXozjUhk/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/5ibSibfNKwpv0TLLuSFv2hibEBqShib4BKsaxHZ2v10y9F93ibO5lK4bwib47qtuwsLZD8HY7fVicibWlWvehCLDCdicy38NaIbVupuMZMDwiaXozjUhk/132" - }, - { - "wxid": "wxid_0xsqb3o0tsvz22", - "nickName": "G", - "inviterUserName": "zhangchuan2288", - "memberFlag": 2049, - "displayName": "G1", - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/FMkteDauMN35F3lhfavibDYpGibfHqrsMICtqBbWDfwfQOnIYfgHBpOJLLbac0Wf3odowXcePFHMzj954EeFOiaKcsgIaMedw5KWZhBpaLsFfSK5HNAE7AQODQ1FfrPiaTCh/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/FMkteDauMN35F3lhfavibDYpGibfHqrsMICtqBbWDfwfQOnIYfgHBpOJLLbac0Wf3odowXcePFHMzj954EeFOiaKcsgIaMedw5KWZhBpaLsFfSK5HNAE7AQODQ1FfrPiaTCh/132" - }, - { - "wxid": "wxid_8pvka4jg6qzt22", - "nickName": "白开水加糖", - "inviterUserName": "wxid_phyyedw9xap22", - "memberFlag": 2049, - "displayName": null, - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/3d34Q9DWL6pHiaASIBMIG3J9deRhwz4yKpZxGibDqiaRGmF6XckV0VSeRTGHSTq55bSwK1qF4Sy1JVXIkB7tYHpR4qPh3ECcodpkqRQjSwKUa4/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/3d34Q9DWL6pHiaASIBMIG3J9deRhwz4yKpZxGibDqiaRGmF6XckV0VSeRTGHSTq55bSwK1qF4Sy1JVXIkB7tYHpR4qPh3ECcodpkqRQjSwKUa4/132" - } - ], - "chatroomOwner": "zhangchuan2288", - "adminWxid": [ - "wxid_8pvka4jg6qzt22" - ] - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» memberList|[object]|true|none||群成员列表| -|»»» wxid|string|true|none||群成员的wxid| -|»»» nickName|string|true|none||群成员昵称| -|»»» inviterUserName|string¦null|true|none||邀请人的wxid| -|»»» memberFlag|integer|true|none||标识| -|»»» displayName|string¦null|true|none||在本群内的昵称| -|»»» bigHeadImgUrl|string|true|none||大尺寸头像| -|»»» smallHeadImgUrl|string|true|none||小尺寸头像| -|»» chatroomOwner|null|true|none||群主的wxid| -|»» adminWxid|null|true|none||管理的wxid| - -## POST 获取群成员详情 - -POST /group/getChatroomMemberDetail - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom", - "memberWxids": [ - "wxid_0xsqb3o0tsvz22", - "wxid_phyyedw9xap22" - ] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| -|» memberWxids|body|[string]| 是 |none| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": [ - { - "userName": "wxid_0xsqb3o0tsvz22", - "nickName": "G", - "pyInitial": "G", - "quanPin": "G", - "sex": 0, - "remark": null, - "remarkPyInitial": null, - "remarkQuanPin": null, - "chatRoomNotify": 0, - "signature": null, - "alias": null, - "snsBgImg": "http://shmmsns.qpic.cn/mmsns/s5BUfupeMYsJx3WHf6RyTxAqLUpGZPsgD9l68D5iaf7qibkcjz08RwNwDxj9ToFvnaicFD2X8CtPe4/0", - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/tmlG7SpZJMJEh0dA14icl4CWnliaI8pKvVicEMaowRywgVpljBK3nmBib0jHG4eVo5hiaqS7Gg0p7GwCuHopGYqdNBu9WVtxMB8icSFGUjibCDPoGXicPic1r3gx3PQ4YMf3GPfXj/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/tmlG7SpZJMJEh0dA14icl4CWnliaI8pKvVicEMaowRywgVpljBK3nmBib0jHG4eVo5hiaqS7Gg0p7GwCuHopGYqdNBu9WVtxMB8icSFGUjibCDPoGXicPic1r3gx3PQ4YMf3GPfXj/132", - "description": null, - "cardImgUrl": null, - "labelList": null, - "country": "CN", - "province": "Guangdong", - "city": "Foshan", - "phoneNumList": null, - "friendUserName": "wxid_0xsqb3o0tsvz22", - "inviterUserName": "zhangchuan2288", - "memberFlag": 0 - }, - { - "userName": "wxid_phyyedw9xap22", - "nickName": "Ashley", - "pyInitial": "ASHLEY", - "quanPin": "Ashley", - "sex": 2, - "remark": "小号", - "remarkPyInitial": "XH", - "remarkQuanPin": "xiaohao", - "chatRoomNotify": 0, - "signature": "山林不向四季起誓 枯荣随缘。", - "alias": "zero-one_200906", - "snsBgImg": "http://shmmsns.qpic.cn/mmsns/UaAfqYic92wm7ZCrsEwlQMXSmBLs8dpwBzrXnrOyyP3B8bDibCCFInJ9PicC9LPYY17uWH1yIOmBYQ/0", - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/buiaXybHTBK3BuGr1edN72zBDermWVFJ7YC8Jib2RcCSdiauAtZcPgUQpdhE9KY5NsumDAWD16fsg3A6OKuhdEr97VAHdTGgk6R1Eibuj7ZNwJ4/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/buiaXybHTBK3BuGr1edN72zBDermWVFJ7YC8Jib2RcCSdiauAtZcPgUQpdhE9KY5NsumDAWD16fsg3A6OKuhdEr97VAHdTGgk6R1Eibuj7ZNwJ4/132", - "description": null, - "cardImgUrl": null, - "labelList": "27", - "country": "AD", - "province": null, - "city": null, - "phoneNumList": [ - "\n\u000b14752126220" - ], - "friendUserName": "wxid_phyyedw9xap22", - "inviterUserName": null, - "memberFlag": null - } - ] -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|[object]|true|none||none| -|»» userName|string|true|none||群成员的wxid| -|»» nickName|string|true|none||群成员的昵称| -|»» pyInitial|string|true|none||群成员昵称的拼音首字母| -|»» quanPin|string|true|none||群成员昵称的全拼| -|»» sex|integer|true|none||性别| -|»» remark|string¦null|true|none||备注| -|»» remarkPyInitial|string¦null|true|none||备注的拼音首字母| -|»» remarkQuanPin|string¦null|true|none||备注的全拼| -|»» chatRoomNotify|integer|true|none||消息通知| -|»» signature|string¦null|true|none||签名| -|»» alias|string¦null|true|none||微信号| -|»» snsBgImg|string|true|none||朋友圈背景图链接| -|»» bigHeadImgUrl|string|true|none||大尺寸头像| -|»» smallHeadImgUrl|string|true|none||小尺寸头像| -|»» description|null|true|none||描述| -|»» cardImgUrl|null|true|none||描述的图片链接| -|»» labelList|string¦null|true|none||标签列表,多个英文逗号分隔| -|»» country|string|true|none||国家| -|»» province|string¦null|true|none||省份| -|»» city|string¦null|true|none||城市| -|»» phoneNumList|[string]|true|none||手机号码| -|»» friendUserName|string|true|none||好友的wxid| -|»» inviterUserName|string¦null|true|none||邀请人的wxid| -|»» memberFlag|integer¦null|true|none||标识| - -## POST 获取群公告 - -POST /group/getChatroomAnnouncement - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "announcement": "群公告哈", - "announcementEditor": "zhangchuan2288", - "publishTime": 1703839509 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» announcement|string|true|none||群公告内容| -|»» announcementEditor|string|true|none||群公告作者的wxid| -|»» publishTime|integer|true|none||群公告发布时间| - -## POST 设置群公告 - -POST /group/setChatroomAnnouncement - -仅群主或管理员可以发布群公告 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom", - "content": "群公告哈" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| -|» content|body|string| 是 |公告内容| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 同意进群 - -POST /group/agreeJoinRoom - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "url": "https://support.weixin.qq.com/cgi-bin/mmsupport-bin/addchatroombyinvite?ticket=A%2FtYjg2L%2FGB%2FHYqOwzWNMQ%3D%3D" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» url|body|string| 是 |邀请进群回调消息中的url| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "chatroomId": "19189253160@chatroom" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» chatroomId|string|true|none||群ID| - -## POST 添加群成员为好友 - -POST /group/addGroupMemberAsFriend - -添加群成员为好友,若对方关闭从群聊添加的权限则添加失败 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom", - "content": "hallo", - "memberWxid": "wxid_phyyedw9xap22" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| -|» memberWxid|body|string| 是 |群成员的wxid| -|» content|body|string| 是 |加好友的招呼语| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "v3": "v3_020b3826fd030100000000003a070e7757675c000000501ea9a3dba12f95f6b60a0536a1adb690dcccc9bf58cc80765e6eb16bffa5996420bb1b2577634516ff82090419d8bdcd5689df8dfb21d40af93d286f72c3a0e8cfa6dcb68afed39226f008c6@stranger" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» v3|string|true|none||添加群成员的v3,通过好友后会通过回调消息返回此值| - -## POST 获取群二维码 - -POST /group/getChatroomQrCode - -### 注意 -- 在新设备登录后的1-3天内,无法使用本功能。在此期间,如果尝试进行获取,您将收到来自微信团队的提醒。请注意遵守相关规定。 -- 生成的群二维码图片7天有效 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "qrBase64": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAG4AbgBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AP1Tooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooor+Veiiiiiiv6qK/lXr+qiiiv5V6/qor+Vev6qKKKKK/lXoooooor+qiiiv5V6KK/qoor+Veiv6qKKK/lXr+qiv5V6KKKKKK/qoooooor+Vev6qKKKKK/lXr+qiiiv5V6KKKKKK/qor+Veiiiv6qKK/lXor+qiiv5V6K/qoor+Veiv6qKK/lXr+qiv5V6KK/qor+Vev6qKKKKK/lXr+qiiiiiiv5V6/qor+Veiiv6qK/lXr+qiiv5V6K/qoor+Veiiv6qK/lXor+qiv5V6/qoor+Veiv6qK/lXor+qiiv5V6/qor+Veiv6qKKKKK/lXor+qiv5V6/qor+Veiiv6qK/lXr+qiiiiiiv5V6/qor+Veiiv6qK/lXr+qiiv5V6K/qor+Veiiiv6qKK/lXor+qiiv5V6/qor+Veiiiv6qKK/lXr+qiiiiv5V6KK/qor+Vev6qKK/lXr+qiv5V6KK/qor+Vev6qKKKKKK/lXr+qiv5V6KK/qor+Vev6qK/lXr+qiiv5V6K/qooor+Veiiiv6qKK/lXoooor+qiv5V6KK/qor+Vev6qKK/lXoor+qiiiiv5V6/qor+Veiiv6qK/lXr+qiiiiiiv5V6/qooooor+Vev6qK/lXr+qiv5V6K/qoor+Vev6qK/lXr+qiiv5V6/qoor+Vev6qKKK/lXoor+qiv5V6KK/qoor+Veiv6qK/lXr+qiiiv5V6/qooooor+Vev6qKKKKKK/lXoooooor+qiv5V6/qor+Vev6qK/lXr+qiv5V6/qor+Vev6qK/lXr+qiv5V6/qor+Vev6qK/lXr+qiv5V6/qor+Vev6qK/lXr+qiv5V6/qor+Vev6qK/lXr+qiv5V6/qor+Vev6qK/lXoooooor+qiiiiiiiiiiiiiiiiiiiv5V6/qor+Veiiiv6qKKK/lXr+qiiiv5V6/qor+Veiv6qK/lXr+qiv5V6/qor+Veiv6qK/lXor+qiiiiiiiiiiiiiiiiv5V6KKKKKK/qor+Veiiv6qK/lXooooooor+qiv5V6KKKK/qoooooor+Veiv6qK/lXor+qiv5V6/qooor+Veiv6qKKK/lXr+qiiiiiiv5V6KKK/qor+Vev6qK/lXr+qiiv5V6/qor+Vev6qK/lXoor+qiv5V6K/qor+Veiiv6qKKK/lXr+qiv5V6KK/qooor+Veiiv6qKKK/lXor+qiiv5V6/qooooooooor+Vev6qK/lXoor+qiv5V6/qor+Veiiv6qKKK/lXoor+qiiiv5V6KKK/qor+Veiiv6qKK/lXr+qiiv5V6/qoor+Veiv6qKK/lXor+qiv5V6/qor+Veiiiv6qKKKKKKK/lXoor+qiv5V6/qooor+Vev6qKKKK/lXoor+qiiv5V6/qooooor+Vev6qKK/lXr+qiiv5V6/qoor+Veiiv6qKKK/lXooor+qiiiv5V6/qooooooor+Vev6qK/lXr+qiiv5V6K/qor+Vev6qK/lXoor+qiv5V6K/qor+Vev6qKKKK/lXr+qiiv5V6K/qor+Vev6qK/lXor+qiiv5V6KKK/qor+Veiv6qK/lXor+qiiiiv5V6/qoooooor+Vev6qK/lXoor+qiiiv5V6K/qor+Vev6qKKKK/lXor+qiiiiv5V6KKK/qooor+Veiv6qKKKKK/lXor+qiv5V6/qoor+Vev6qKKK/lXr+qiiiiiiiiv5V6K/qor+Vev6qK/lXoor+qiv5V6K/qor+Vev6qKKK/lXr+qiiv5V6/qor+Veiv6qK/lXoor+qiv5V6/qooooor+Veiiv6qKK/lXoor+qiiv5V6KKKK/qooooooor+Veiiv6qK/lXr+qiv5V6/qoooor+Veiv6qK/lXoor+qiv5V6K/qoor+Vev6qKKK/lXr+qiv5V6/qoooor+Veiiiiiiv6qK/lXr+qiv5V6/qor+Veiiv6qKKKKKK/lXr+qiv5V6/qoor+Veiiiv6qK/lXoooor+qiiv5V6K/qor+Veiiv6qK/lXor+qiiv5V6/qoor+Vev6qK/lXooor+qiv5V6/qoor+Veiv6qKK/lXr+qiiiiiiiiiv5V6/qooor+Vev6qKK/lXr+qiiiiv5V6K/qoor+Vev6qKKKKKK/lXr+qiiiiiv5V6/qoor+Vev6qK/lXr+qiv5V6KKK/qoor+Veiv6qK/lXor+qiiiiiiiiiv5V6/qor+Vev6qK/lXoor+qiiiv5V6K/qooooor+Veiiiiv6qK/lXor+qiiv5V6/qor+Vev6qKK/lXr+qiiiiiiiv5V6KKKK/qor+Veiv6qKKKKKKK/lXr+qiiv5V6/qooor+Vev6qK/lXr+qiv5V6/qor+Veiiiv6qK/lXoor+qiiv5V6K/qoor+Veiv6qK/lXoooor+qiv5V6KK/qoor+Veiiv6qKKKKKKKKKKKKKKK/lXoor+qiv5V6/qor+Vev6qKKKKKK/lXor+qiiv5V6K/qor+Vev6qKK/lXr+qiiv5V6/qoooor+Veiiiiv6qK/lXor+qiiv5V6K/qooooooooor+Vev6qK/lXor+qiiv5V6/qoor+Veiiv6qK/lXoor+qiv5V6KKK/qooor+Veiiiiv6qK/lXr+qiiv5V6K/qoooor+Veiv6qKK/lXr+qiiiiiiiiiv5V6KK/qor+Veiiiiiv6qKK/lXor+qiv5V6KKKK/qor+Veiiiiiv6qKK/lXr+qiv5V6/qoor+Vev6qKKK/lXr+qiv5V6KKKK/qor+Veiiv6qKKKKKKKK/lXoor+qiiiv5V6/qoor+Vev6qK/lXor+qiiiv5V6/qor+Vev6qK/lXr+qiiiv5V6/qooor+Vev6qKK/lXr+qiiv5V6/qoor+Veiv6qKKK/lXr+qiiiv5V6/qoooooooooor+Vev6qK/lXr+qiv5V6K/qoor+Veiv6qK/lXr+qiiv5V6/qoor+Veiv6qK/lXr+qiv5V6K/qor+Veiiv6qKKK/lXoor+qiiv5V6/qor+Vev6qK/lXoor+qiiiiiiiiiiiiv5V6/qooor+Veiiiv6qKKK/lXr+qiiv5V6KKKK/qooor+Vev6qKK/lXor+qiv5V6/qoor+Veiiv6qKK/lXr+qiiiv5V6KKKK/qooooooor+Veiiiiiiiiiv6qKK/lXr+qiv5V6/qor+Vev6qK/lXr+qiv5V6KKKKKK/qoor+Vev6qK/lXor+qiiiv5V6/qoor+Veiiiiiiv6qK/lXr+qiiiiiiv5V6/qooor+Veiv6qK/lXoor+qiv5V6/qor+Veiv6qKK/lXoor+qiv5V6/qor+Vev6qK/lXoor+qiiiiv5V6K/qooor+Veiv6qK/lXor+qiv5V6/qor+Vev6qK/lXor+qiiiiiiv5V6K/qor+Veiiiiv6qK/lXor+qiiiiv5V6K/qoor+Veiiiv6qK/lXor+qiiv5V6KKK/qor+Vev6qK/lXoor+qiv5V6KK/qoooor+Vev6qK/lXr+qiiiiiiv5V6KK/qoooor+Veiiv6qKK/lXoor+qiv5V6KKK/qooor+Vev6qKK/lXooooor+qiv5V6/qor+Vev6qK/lXr+qiiiv5V6/qor+Veiiv6qK/lXr+qiiiiiiiiiiiv5V6KKK/qor+Vev6qKKK/lXr+qiiv5V6/qooooor+Vev6qKK/lXor+qiv5V6K/qoor+Vev6qK/lXoooooooor+qiv5V6KK/qor+Vev6qKKKKKK/lXr+qiv5V6/qor+Veiv6qKKK/lXor+qiv5V6/qor+Veiv6qKK/lXr+qiv5V6KK/qoor+Veiiv6qK/lXr+qiiiiv5V6/qor+Vev6qKK/lXor+qiiv5V6K/qooooooooooooor+Vev6qK/lXor+qiiiiv5V6K/qor+Veiv6qKKK/lXr+qiiv5V6K/qoor+Vev6qK/lXooooooor+qiv5V6/qor+Veiiiiiiiiv6qKKKKKKKK/lXr+qiiiv5V6/qor+Veiiv6qK/lXr+qiv5V6/qoor+Vev6qKK/lXr+qiv5V6K/qor+Vev6qKK/lXooor+qiv5V6/qoooor+Vev6qKK/lXr+qiiv5V6/qooor+Vev6qKKKKKKKK/lXoor+qiv5V6KKKK/qor+Vev6qK/lXr+qiiiiiiv5V6KK/qooooor+Vev6qKK/lXoooor+qiiiiiv5V6K/qor+Veiv6qKK/lXr+qiiiiiiiv5V6KKK/qooooor+Vev6qK/lXr+qiv5V6KK/qooooor+Veiv6qK/lXr+qiv5V6/qor+Vev6qK/lXor+qiiiv5V6K/qooooor+Veiv6qKKKKKKKKKK/lXor+qiv5V6K/qor+Vev6qK/lXr+qiiiv5V6K/qor+Vev6qKKK/lXor+qiv5V6/qor+Vev6qKK/lXr+qiv5V6KK/qooor+Veiv6qK/lXoor+qiiv5V6/qor+Veiiv6qKKKKKKKKK/lXr+qiv5V6K/qor+Vev6qK/lXr+qiiiv5V6/qoooor+Veiv6qKK/lXr+qiiv5V6K/qoor+Veiv6qK/lXr+qiiv5V6KK/qoor+Vev6qKK/lXr+qiv5V6/qor+Vev6qKKKKKKKK/lXr+qiiiv5V6KK/qor+Vev6qK/lXoooor+qiiiiiv5V6K/qooor+Veiiv6qKK/lXr+qiiiiv5V6KKKKKKKK/qooor+Vev6qKKKKKKK/lXoor+qiiiv5V6KK/qooor+Vev6qKKK/lXoor+qiiiiiv5V6KKK/qor+Veiiiv6qK/lXr+qiiiiiv5V6/qor+Vev6qK/lXr+qiv5V6K/qoooooor+Veiiv6qKKK/lXor+qiv5V6K/qor+Vev6qKK/lXooor+qiiv5V6KKKKK/qoor+Veiv6qKKKK/lXoor+qiv5V6KKKKK/qooor+Vev6qKKKKKKKKKKKKKK/lXor+qiv5V6/qoor+Veiiiv6qKK/lXoor+qiiiv5V6K/qoor+Veiiiv6qK/lXor+qiiiv5V6/qooor+Vev6qKKKKKKKKKK/lXoooooor+qiv5V6/qoor+Vev6qK/lXor+qiiv5V6KKKKK/qor+Vev6qK/lXoooor+qiv5V6/qoor+Vev6qK/lXr+qiiv5V6/qor+Vev6qK/lXor+qiiv5V6/qoooooor+Vev6qKKKKK/lXr+qiv5V6/qooor+Vev6qKK/lXor+qiv5V6/qooor+Vev6qKKK/lXor+qiiv5V6/qor+Veiiiiiiiiv6qKKK/lXr+qiiv5V6K/qoooooor+Vev6qK/lXoor+qiv5V6/qor+Vev6qK/lXooor+qiv5V6/qor+Veiv6qKKK/lXoooor+qiiv5V6KK/qor+Vev6qK/lXooooooooor+qiv5V6/qor+Vev6qKKKKKK/lXr+qiv5V6KK/qor+Vev6qK/lXor+qiv5V6/qoooooor+Veiv6qK/lXor+qiiiiiv5V6KK/qor+Vev6qKK/lXr+qiv5V6/qor+Vev6qK/lXor+qiv5V6/qor+Veiiv6qKKKKKK/lXr+qiv5V6KK/qor+Vev6qK/lXr+qiv5V6KKKKKKK/qoor+Veiv6qK/lXor+qiv5V6K/qor+Vev6qKKK/lXor+qiv5V6KK/qor+Veiv6qK/lXr+qiiv5V6KK/qoooooor+Vev6qKKKKK/lXr+qiv5V6K/qoor+Vev6qKK/lXoor+qiv5V6K/qor+Vev6qKKKK/lXr+qiv5V6/qoor+Veiv6qK/lXor+qiiv5V6K/qor+Vev6qK/lXr+qiiiv5V6/qoooooor+Veiiiiiiv6qKK/lXr+qiiv5V6KK/qooor+Vev6qKK/lXoor+qiv5V6K/qoooor+Vev6qKKK/lXoor+qiiv5V6/qoooor+Veiiiv6qKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK//2Q==", - "qrTips": "该二维码7天内(1月5日前)有效,重新进入将更新" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» qrBase64|string|true|none||群二维码图片的base64| -|»» qrTips|string|true|none||群二维码的提示| - -## POST 群保存到通讯录 - -POST /group/saveContractList - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom", - "operType": 3 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| -|» operType|body|integer| 是 |操作类型 3保存到通讯录 2从通讯录移除| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 管理员操作 - -POST /group/adminOperate - -添加、删除群管理员,转让群主 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom", - "operType": 1, - "wxids": [ - "wxid_0xsqb3o0tsvz22" - ] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| -|» operType|body|integer| 是 |操作类型 1:添加群管理(可添加多个微信号) 2:删除群管理(可删除多个) 3:转让(只能转让一个微信号)| -|» wxids|body|[string]| 是 |none| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 聊天置顶 - -POST /group/pinChat - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom", - "top": true -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| -|» top|body|boolean| 是 |是否置顶| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 设置消息免打扰 - -POST /group/setMsgSilence - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom", - "silence": true -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| -|» silence|body|boolean| 是 |是否免打扰| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 扫码进群 - -POST /group/joinRoomUsingQRCode - -qrUrl是通过解析群二维码图片获得的内容 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "qrUrl": "https://weixin.qq.com/g/AwYAALLELoeKLg-qWAtkYtBdyTg_i2TG22w1GS-cL1GFO9J4AemIyZAw7RSuIpZw" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» qrUrl|body|string| 是 |二维码的链接| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "chatroomName": "GeWe-test-room(2)", - "html": null, - "chatroomId": "34559815390@chatroom" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» chatroomName|string|true|none||群名称| -|»» html|null|true|none||none| -|»» chatroomId|string|true|none||群ID| - -## POST 确认进群申请 - -POST /group/roomAccessApplyCheckApprove - -群聊开启邀请确认后,有人申请进群时群主和管理员会收到进群申请,本接口用于确认进群申请 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "chatroomId": "34757816141@chatroom", - "msgContent": "\n\t\n\t\t \n\t\t \n\t\t\troomaccessapplycheck_approve\n\t\t\t \n\t\t\t \n\t\t\t \n\t\t\t \n\t\t\t\n\t\t\t\t1\n\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\t \n\t\t\t\t\n\t\t\t\n\t\t\n\t\t \n\t\n", - "newMsgId": "8866462780395237368" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» chatroomId|body|string| 是 |群ID| -|» newMsgId|body|string| 是 |消息ID| -|» msgContent|body|string| 是 |消息内容| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -# 基础API/消息模块 - -## POST 发送文字消息 - -POST /message/postText - -#### 注意 -在群内发送消息@某人时,content中需包含@xxx - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "wxid_tdkou97nquqz22", - "ats": "wxid_phyyedw9xap22", - "content": "@猿猴 我在测试艾特内容" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» content|body|string| 是 |消息内容| -|» ats|body|string| 否 |@的好友,多个英文逗号分隔。群主或管理员@全部的人,则填写'notify@all'| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1703841160, - "msgId": 0, - "newMsgId": 3768973957878705000, - "type": 1 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 发送文件消息 - -POST /message/postFile - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "fileName": "a909.xls", - "fileUrl": "https://scrm-1308498490.cos.ap-shanghai.myqcloud.com/pkg/a909-99066ce80e03.xls?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1703841209;1703848409&q-key-time=1703841209;1703848409&q-header-list=&q-url-param-list=&q-signature=2a60b0f8d9169550cd83c4a3ca9cd18138b4bb88" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» fileUrl|body|string| 是 |文件链接| -|» fileName|body|string| 是 |文件名| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1703841225, - "msgId": 769523509, - "newMsgId": 4399037329770756000, - "type": 6 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 发送图片消息 - -POST /message/postImage - -#### 注意 -发送图片接口会返回cdn相关的信息,如有需求同一张图片发送多次,第二次及以后发送时可使用接口返回的cdn信息拼装xml调用[转发图片接口](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794551),这样可以缩短发送时间 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "imgUrl": "http://dummyimage.com/400x400" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» imgUrl|body|string| 是 |图片链接| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 0, - "msgId": 640355969, - "newMsgId": 8992614056172360000, - "type": null, - "aesKey": "7678796e6d70626e6b626c6f7375616b", - "fileId": "3052020100044b30490201000204e49785f102033d11fd0204136166b4020465966eea042437646265323234362d653662662d343464392d393363362d3139313661363863646266390204052418020201000400", - "length": 1096, - "width": 400, - "height": 400, - "md5": "e6355eab0393facbd6a2cde3f990ef60" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|null|true|none||消息类型| -|»» aesKey|string|true|none||cdn相关的aeskey| -|»» fileId|string|true|none||cdn相关的fileid| -|»» length|integer|true|none||图片文件大小| -|»» width|integer|true|none||图片宽度| -|»» height|integer|true|none||图片高度| -|»» md5|string|true|none||图片md5| - -## POST 发送语音消息 - -POST /message/postVoice - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "voiceUrl": "https://scrm-1308498490.cos.ap-shanghai.myqcloud.com/pkg/response.silk?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1703841529;1703848729&q-key-time=1703841529;1703848729&q-header-list=&q-url-param-list=&q-signature=781831fe71ad4bbb582715bf197a9cf86ec80c97", - "voiceDuration": 2000 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» voiceUrl|body|string| 是 |语音文件的链接,仅支持silk格式| -|» voiceDuration|body|integer| 是 |语音时长,单位毫秒| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1704357563, - "msgId": 640355967, - "newMsgId": 2321462558768366600, - "type": null - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 发送视频消息 - -POST /message/postVideo - -#### 注意 -发送视频接口会返回cdn相关的信息,如有需求同一个视频发送多次,第二次及以后发送时可使用接口返回的cdn信息拼装xml调用[转发视频接口](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794552),这样可以缩短发送时间 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "{{toWxid}}", - "videoUrl": "https://scrm-1308498490.cos.ap-shanghai.myqcloud.com/1/41734f00f3803ca1cd8f5ad6d5f8d559.mp4?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1724227372;2588140972&q-key-time=1724227372;2588140972&q-header-list=&q-url-param-list=&q-signature=4e18eb97ab165f27afe0444516e54204f506c7e1", - "thumbUrl": "https://scrm-1308498490.cos.ap-shanghai.myqcloud.com/1/logo.jpg?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1724227462;2588141062&q-key-time=1724227462;2588141062&q-header-list=&q-url-param-list=&q-signature=0bc8b973567d2672e5eaada1b5d466e23ce6b750", - "videoDuration": 10 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» videoUrl|body|string| 是 |视频的链接| -|» thumbUrl|body|string| 是 |缩略图的链接| -|» videoDuration|body|integer| 是 |视频的播放时长,单位秒| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": null, - "msgId": 769523567, - "newMsgId": 945590746179451500, - "type": null, - "aesKey": "687a636f627579667a756a7168717968", - "fileId": "3052020100044b304902010002043904752002033d11ff02045dd79b240204658e9072042466633131376136662d366566632d343638662d613633662d3536316139616133383362350204012400040201000400", - "length": 1315979 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|null|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|null|true|none||消息类型| -|»» aesKey|string|true|none||cdn相关的aeskey| -|»» fileId|string|true|none||cdn相关的fileid| -|»» length|integer|true|none||视频文件大小| - -## POST 发送链接消息 - -POST /message/postLink - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "title": "澳门这一夜", - "desc": "39岁郭碧婷用珠圆玉润的身材,狠狠打脸了白幼瘦女星", - "linkUrl": "https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_8864265500294006781%22%7D&n_type=-1&p_from=-1", - "thumbUrl": "https://pics3.baidu.com/feed/0824ab18972bd407a9403f336648d15c0db30943.jpeg@f_auto?token=d26f7f142871542956aaa13799ba1946" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» title|body|string| 是 |链接标题| -|» desc|body|string| 是 |链接描述| -|» linkUrl|body|string| 是 |链接地址| -|» thumbUrl|body|string| 是 |链接缩略图地址| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1703841982, - "msgId": 769523572, - "newMsgId": 3358797740318931000, - "type": 5 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 发送名片消息 - -POST /message/postNameCard - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "nickName": "谭艳", - "nameCardWxid": "wxid_0xsqb3o0tsvz22" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» nickName|body|string| 是 |名片的昵称| -|» nameCardWxid|body|string| 是 |名片的wxid| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1703842036, - "msgId": 0, - "newMsgId": 3285058507819179500, - "type": 42 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 发送emoji消息 - -POST /message/postEmoji - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "emojiMd5": "4cc7540a85b5b6cf4ba14e9f4ae08b7c", - "emojiSize": 102357 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» emojiMd5|body|string| 是 |emoji图片的md5| -|» emojiSize|body|integer| 是 |emoji的文件大小| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": null, - "msgId": 769523643, - "newMsgId": 891398861855787000, - "type": null - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 发送appmsg消息 - -POST /message/postAppMsg - -#### 注意 -本接口可用于发送所有包含节点的消息,例如:音乐分享、视频号、引用消息等等 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "appmsg": "\n\t\t一审宣判!蔡鄂生被判死缓\n\t\t\n\t\t\n\t\t5\n\t\t0\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t0\n\t\thttp://mp.weixin.qq.com/s?__biz=MjM5MjAxNDM4MA==&mid=2666774093&idx=1&sn=aa405094dd00034d004f6e8287f86e9b&chksm=bcc9d903635a9c284591edda1f027c467245d922d7d66c32d3cd2c6af1c969a7ea0896aa7639&scene=0&xtrack=1#rd\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t3057020100044b304902010002048399cc8402032f57ed02041388e6720204658e922d042462666538346165322d303035382d343262322d616538322d3337306231346630323534360204051408030201000405004c53d900\n\t\t\tea3d5e8d4059cb4db0a3c39c789f2d6f\n\t\t\t93065\n\t\t\t1080\n\t\t\t459\n\t\t\t849df42ab37c8cadb324fe94ba46d76e\n\t\t\t849df42ab37c8cadb324fe94ba46d76e\n\t\t\t0\n\t\t\n\t\t\n\t\tgh_363b924965e9\n\t\t人民日报\n\t\thttps://mmbiz.qpic.cn/sz_mmbiz_jpg/xrFYciaHL08DCJtwQefqrH8JcohbOHhTpyCPab8IgDibkTv3Pspicjw8TRHnoic2tmiafBtUHg7ObZznpWocwkCib6Tw/640?wxtype=jpeg&wxfrom=0\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\n\t" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» appmsg|body|string| 是 |回调消息中的appmsg节点内容| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1703842453, - "msgId": 769523712, - "newMsgId": 3090682956820882400, - "type": 0 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 发送小程序消息 - -POST /message/postMiniApp - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "miniAppId": "wx1f9ea355b47256dd", - "userName": "gh_690acf47ea05@app", - "title": "最快29分钟 好吃水果送到家", - "coverImgUrl": "https://che-static.vzhimeng.com/img/2023/10/30/67d55942-e43c-4fdb-8396-506794ddbdbc.jpg", - "pagePath": "pages/homeDelivery/index.html", - "displayName": "百果园+" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» miniAppId|body|string| 是 |小程序ID| -|» displayName|body|string| 是 |小程序名称| -|» pagePath|body|string| 是 |小程序打开的地址| -|» coverImgUrl|body|string| 是 |小程序封面图链接| -|» title|body|string| 是 |小程序标题| -|» userName|body|string| 是 |归属的用户ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1704162674, - "msgId": 769533691, - "newMsgId": 3190424380344821000, - "type": 33 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 转发文件 - -POST /message/forwardFile - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "xml": "\n\n\t\n\t\tinfo.json\n\t\t\n\t\t\n\t\t6\n\t\t0\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t63\n\t\t\t@cdn_3057020100044b304902010002043904752002032f7d6d02046bb5bade02046593760c042433653765306131612d646138622d346662322d383239362d3964343665623766323061370204051400050201000405004c53d900_f46be643aa0dc009ae5fb63bbc73335d_1\n\t\t\t\n\t\t\tjson\n\t\t\t3057020100044b304902010002043904752002032f7d6d02046bb5bade02046593760c042433653765306131612d646138622d346662322d383239362d3964343665623766323061370204051400050201000405004c53d900\n\t\t\tf46be643aa0dc009ae5fb63bbc73335d\n\t\t\t0\n\t\t\t594239960546299206\n\t\t\tv1_0bgfyCkUmoZYYyvXys0cCiJdd2R/pKPdD2TNi9IY6FOt+Tvlhp3ijUoupZHzyB2Lp7xYgdVFaUGL4iu3Pm9/YACCt20egPGpT+DKe+VymOzD7tJfsS8YW7JObTbN8eVoFEetU5HSRWTgS/48VVsPZMoDF6Gz1XJDLN/dWRxvzrbOzVGGNvmY4lpXb0kRwXkSxwL+dO4=\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\td16070253eee7173e467dd7237d76f60\n\t\t\n\t\n\tzhangchuan2288\n\t0\n\t\n\t\t1\n\t\t\n\t\n\t\n" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» xml|body|string| 是 |文件消息的xml| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1704162866, - "msgId": 769533740, - "newMsgId": 6455486805605396000, - "type": 6 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 转发图片 - -POST /message/forwardImage - -#### 注意 -若通过发送图片消息获取cdn信息后可替换xml中的aeskey、cdnthumbaeskey、cdnthumburl、cdnmidimgurl、length、md5等参数来进行转发 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "xml": "\n\n\t\n\t\n\t\n" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» xml|body|string| 是 |文件消息的xml| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 0, - "msgId": 769533749, - "newMsgId": 7003061792458481000, - "type": null, - "aesKey": "294774c8ac2ca8f8114e4d58d2ba78a5", - "fileId": "3057020100044b304902010002043904752002032f7d6d02046bb5bade020465937656042436626431373937632d613430642d346137662d626230352d3832613335353935333130630204051818020201000405004c543d00", - "length": null, - "width": null, - "height": null, - "md5": null - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|null|true|none||消息类型| -|»» aesKey|string|true|none||cdn相关的aeskey| -|»» fileId|string|true|none||cdn相关的fileid| -|»» length|integer|true|none||图片文件大小| -|»» width|integer|true|none||图片宽度| -|»» height|integer|true|none||图片高度| -|»» md5|string|true|none||图片md5| - -## POST 转发视频 - -POST /message/forwardVideo - -#### 注意 -若通过发送视频消息获取cdn信息后可替换xml中的aeskey、cdnthumbaeskey、cdnvideourl、cdnthumburl、length等参数来进行转发 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "xml": "\n\n\t\n" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» xml|body|string| 是 |文件消息的xml| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": null, - "msgId": 769533762, - "newMsgId": 2099537549112929300, - "type": null, - "aesKey": "5c5163d06757faae44eacc2146ba0575", - "fileId": null, - "length": 490566 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|null|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|null|true|none||消息类型| -|»» aesKey|string|true|none||cdn相关的aeskey| -|»» fileId|string|true|none||cdn相关的fileid| -|»» length|integer|true|none||视频文件大小| - -## POST 转发链接 - -POST /message/forwardUrl - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "xml": "\n\n\t\n\t\t“李在明遇袭,颈部出血”\n\t\t\n\t\t\n\t\t5\n\t\t0\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t0\n\t\thttp://mp.weixin.qq.com/s?__biz=MjM5MzI5NTU3MQ==&mid=2652294920&idx=1&sn=ad415f5d83e1471b845b2cb3fca7c3ce&chksm=bce58367ee6ae84b711255705422d1554ee96b92d75648751316639d4aa09289d7827ff1cc85&scene=0&xtrack=1#rd\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t3057020100044b304902010002048399cc8402032f7d6d020468b5bade0204659376ec042463663234636366642d323736612d343533342d623734342d3864623065633235636135390204051808030201000405004c56f900\n\t\t\t8e32cafa882f9b4f7c51fb568c0c4f8e\n\t\t\t38637\n\t\t\t658\n\t\t\t280\n\t\t\taccc71cbe8ff795a94583fc514d198a8\n\t\t\taccc71cbe8ff795a94583fc514d198a8\n\t\t\t0\n\t\t\n\t\t\n\t\tgh_d29e0d22a6f9\n\t\t澎湃新闻\n\t\thttps://mmbiz.qpic.cn/mmbiz_jpg/yl6JkZAE3SibWvw5icQJpv87X084SRJOVeS3k7KMscRzov1nwicjMYzicyBIpRdJchWKTGPf4eN2H07Jicl11zMK2Pw/640?wxtype=jpeg&wxfrom=0\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\n\t\n\tzhangchuan2288\n\t0\n\t\n\t\t1\n\t\t\n\t\n\t\n" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» xml|body|string| 是 |文件消息的xml| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1704163083, - "msgId": 769533781, - "newMsgId": 1947412320722133800, - "type": 5 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 转发小程序 - -POST /message/forwardMiniApp - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "xml": "\n\n\t\n\t\t👇晒出新年第一杯,点赞赢饮茶月卡\n\t\t\n\t\t\n\t\t33\n\t\t0\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t0\n\t\thttps://mp.weixin.qq.com/mp/waerrpage?appid=wxafec6f8422cb357b&type=upgrade&upgradetype=3#wechat_redirect\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t3057020100044b30490201000204573515c902032f7d6d020416b7bade020465922a53042437383139393934652d323662652d346430662d396466362d3466303137346139616362390204051408030201000405004c53d900\n\t\t\t33cf0a1101e7f8cd3057cd417a691f0b\n\t\t\t96673\n\t\t\t600\n\t\t\t500\n\t\t\t6f3098f2ee8b351b6cc9b1818d580356\n\t\t\t6f3098f2ee8b351b6cc9b1818d580356\n\t\t\t0\n\t\t\n\t\t\n\t\tgh_e9d25e745aae@app\n\t\t霸王茶姬\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t2\n\t\t\t193\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t0\n\t\t\t\t\n\t\t\t\n\t\t\t0\n\t\t\n\t\n\tzhangchuan2288\n\t0\n\t\n\t\t1\n\t\t\n\t\n\t\n", - "coverImgUrl": "http://dummyimage.com/400x400" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» xml|body|string| 是 |文件消息的xml| -|» coverImgUrl|body|string| 是 |小程序封面图链接| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "toWxid": "34757816141@chatroom", - "createTime": 1704163145, - "msgId": 769533801, - "newMsgId": 5271007655758710000, - "type": 33 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» toWxid|string|true|none||接收人的wxid| -|»» createTime|integer|true|none||发送时间| -|»» msgId|integer|true|none||消息ID| -|»» newMsgId|integer|true|none||消息ID| -|»» type|integer|true|none||消息类型| - -## POST 撤回消息 - -POST /message/revokeMsg - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "toWxid": "34757816141@chatroom", - "msgId": "769533801", - "newMsgId": "5271007655758710001", - "createTime": "1704163145" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» toWxid|body|string| 是 |好友/群的ID| -|» msgId|body|string| 是 |发送类接口返回的msgId| -|» newMsgId|body|string| 是 |发送类接口返回的newMsgId| -|» createTime|body|string| 是 |发送类接口返回的createTime| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -# 基础API/消息模块/下载 - -## POST 下载图片 - -POST /message/downloadImage - -**注意** 如果下载图片失败,可尝试下载另外两种图片类型,并非所有图片都会有高清、常规图片 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "type": 2, - "xml": "\n\n\t\n\t\n\t\n\t\n\t\t\n\t\t0\n\t\n\n" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» xml|body|string| 是 |回调消息中的XML| -|» type|body|integer| 是 |下载的图片类型 1:高清图片 2:常规图片 3:缩略图| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "fileUrl": "/download/20240720/wx_BTVoJ_o_r6DpxNCNiycFE/0ca5b675-8e2c-4dc1-b288-3c44a40086ec4" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» fileUrl|string|true|none||图片链接地址,7天有效| - -# 基础API/标签模块 - -## POST 添加标签 - -POST /label/add - -#### 注意 -标签名称不存在则是添加标签,如果标签名称已经存在,此接口会直接返回标签名及ID - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "labelName": "testtest" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» labelName|body|string| 是 |标签名称| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "labelName": "testtest", - "labelId": 31 - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» labelName|string|true|none||标签名称| -|»» labelId|integer|true|none||标签ID| - -## POST 删除标签 - -POST /label/delete - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "labelIds": "31" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» labelIds|body|string| 是 |标签ID,多个逗号分隔| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 标签列表 - -POST /label/list - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "labelList": [ - { - "labelName": "朋友", - "labelId": 1 - } - ] - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» labelList|[object]|true|none||none| -|»»» labelName|string|false|none||标签名称| -|»»» labelId|integer|false|none||标签ID| - -## POST 修改好友标签 - -POST /label/modifyMemberList - -#### 注意 -由于好友标签信息存储在用户客户端,因此每次在修改时都需要进行全量修改。举例来说,考虑好友A(wxid_asdfaihp123),该好友已经被标记为标签ID为1和2。 - -在添加标签ID为3时,传递的参数如下:labelIds:1,2,3,wxIds:[wxid_asdfaihp123]。这表示要给好友A添加标签ID为3,同时保留已有的标签ID 1和2。 - -而在删除标签ID为1时,传递的参数如下:labelIds:2,3 ,wxIds:[wxid_asdfaihp123]。这表示要将好友A的标签ID 1删除,而保留标签ID 2。 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "labelIds": "15", - "wxIds": [ - "zhangchuan2288" - ] -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» labelIds|body|string| 是 |标签ID,多个逗号分隔| -|» wxIds|body|[string]| 是 |修改的好友wxid| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -# 基础API/个人模块 - -## POST 获取个人资料 - -POST /personal/getProfile - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "proxyIp": "" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "alias": null, - "wxid": "zhangchuan2288", - "nickName": "朝夕。", - "mobile": "18761670817", - "uin": 1042679712, - "sex": 1, - "province": "Jiangsu", - "city": "Xuzhou", - "signature": ".......", - "country": "CN", - "bigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/REoLX7KfdibFAgDbtoeXGNjE6sGa8NCib8UaiazlekKjuLneCvicM4xQpuEbZWjjQooSicsKEbKdhqCOCpTHWtnBqdJicJ0I3CgZumwJ6SxR3ibuNs/0", - "smallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/REoLX7KfdibFAgDbtoeXGNjE6sGa8NCib8UaiazlekKjuLneCvicM4xQpuEbZWjjQooSicsKEbKdhqCOCpTHWtnBqdJicJ0I3CgZumwJ6SxR3ibuNs/132", - "regCountry": "CN", - "snsBgImg": "http://shmmsns.qpic.cn/mmsns/FzeKA69P5uIdqPfQxp59LvOohoE2iaiaj86IBH1jl0F76aGvg8AlU7giaMtBhQ3bPibunbhVLb3aEq4/0" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» alias|string|true|none||微信号| -|»» wxid|string|true|none||微信ID| -|»» nickName|string|true|none||昵称| -|»» mobile|string|true|none||绑定的手机号| -|»» uin|integer|true|none||uin| -|»» sex|integer|true|none||性别| -|»» province|string|true|none||省份| -|»» city|string|true|none||城市| -|»» signature|string|true|none||签名| -|»» country|string|true|none||国家| -|»» bigHeadImgUrl|string|true|none||大尺寸头像| -|»» smallHeadImgUrl|string|true|none||小尺寸头像| -|»» regCountry|string|true|none||注册国家| -|»» snsBgImg|string|true|none||朋友圈背景图| - -## POST 获取自己的二维码 - -POST /personal/getQrCode - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "proxyIp": "" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "qrCode": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAIAAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5kooor8XP6jCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK1tP03biWUc9lPb61+7FfUYXIaten7SpLlv0tf9UfAZhxdQwlZ0aFP2lt3eyv5aO5+CNFfvdRXZ/q5/wBPv/Jf+CeZ/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/AIIf67/9Q3/k/wD9qfgjRX73UUf6uf8AT7/yX/gh/rv/ANQ3/k//ANqfgjRX73UUf6uf9Pv/ACX/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" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» qrCode|string|true|none||二维码图片的base64| - -## POST 获取设备记录 - -POST /personal/getSafetyInfo - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "proxyIp": "" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "list": [ - { - "uuid": "087b139951b776e0416b5015d0b98109", - "deviceName": "iPhone 13 Pro", - "deviceType": "iPhone iOS17.2", - "lastTime": 1703218815 - }, - { - "uuid": "f7e4bda161f7a6a7361ca62141cded23", - "deviceName": "张传的MacBook Pro", - "deviceType": "iMac MacBookPro17,1 OSX OSX 13.3.1 build(22E261)", - "lastTime": 1703206819 - }, - { - "uuid": "80d6218be93f570a971d8c605fa542c3", - "deviceName": "iPad", - "deviceType": "iPad iOS14.5.1", - "lastTime": 1703065642 - }, - { - "uuid": "197e97585d02c9cd6e6de68c74c81780", - "deviceName": "iPad", - "deviceType": "iPad iOS14.5.1", - "lastTime": 1701300706 - }, - { - "uuid": "bf5eb4d8498f4affac1cbfb8aa936d2a", - "deviceName": "iPad", - "deviceType": "iPad iPadOS14.3", - "lastTime": 1696729849 - }, - { - "uuid": "33ac7f39ed3d7115d9c15f07981a264a", - "deviceName": "iPad", - "deviceType": "iPad iPadOS14.5.1", - "lastTime": 1695050733 - } - ] - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» list|[object]|true|none||设备记录| -|»»» uuid|string|true|none||设备ID| -|»»» deviceName|string|true|none||设备名称| -|»»» deviceType|string|true|none||设备类型| -|»»» lastTime|integer|true|none||最后操作时间| - -## POST 隐私设置 - -POST /personal/privacySettings - -**option 说明** -- 4: 加我为朋友时需要验证 -- 7: 向我推荐通讯录朋友 -- 8: 添加我的方式 手机号 -- 25: 添加我的方式 微信号 -- 38: 添加我的方式 群聊 -- 39: 添加我的方式 我的二维码 -- 40: 添加我的方式 名片 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "open": true, - "option": 4 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» option|body|integer| 否 |隐私设置的选项| -|» open|body|boolean| 是 |开关| - -#### 详细说明 - -**» option**: 隐私设置的选项 - 4: 加我为朋友时需要验证 - 7: 向我推荐通讯录朋友 - 8: 添加我的方式 手机号 - 25: 添加我的方式 微信号 - 38: 添加我的方式 群聊 - 39: 添加我的方式 我的二维码 - 40: 添加我的方式 名片 - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 修改个人信息 - -POST /personal/updateProfile - -**注意** 修改个人信息需要单独设置每一项 -比如修改昵称则参数仅传appId和nickName -修改地区则参数可传appId、country、province、city - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "city": "", - "country": "", - "nickName": "", - "province": "", - "sex": 1, - "signature": "......" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» city|body|string| 否 |城市| -|» country|body|string| 是 |国家| -|» nickName|body|string| 是 |昵称| -|» province|body|string| 是 |省份| -|» sex|body|string| 是 |性别 1:男 2:女| -|» signature|body|string| 是 |签名| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 修改头像 - -POST /personal/updateHeadImg - -**注意** 修改头像后需要将手机的微信进程关掉,然后重启查看最新头像 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "headImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/REoLX7KfdibFAgDbtoeXGNjE6sGa8NCib8UaiazlekKjuLneCvicM4xQpuEbZWjjQooSicsKEbKdhqCOCpTHWtnBqdJicJ0I3CgZumwJ6SxR3ibuNs/0" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» headImgUrl|body|string| 否 |头像的图片地址| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -# 基础API/收藏夹模块 - -## POST 同步收藏夹 - -POST /favor/sync - -#### 注意: -响应结果中会包含已删除的的收藏夹记录,通过flag=1来判断已删除 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "syncKey": "" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» syncKey|body|string| 否 |翻页key,首次传空,获取下一页传接口返回的syncKey| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "syncKey": "CAESCAgBEJyi9e4C", - "list": [ - { - "favId": 2, - "type": 1, - "flag": 1, - "updateTime": 1448465918 - }, - { - "favId": 1, - "type": 2, - "flag": 1, - "updateTime": 1448465922 - } - ] - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» syncKey|string|true|none||翻页key| -|»» list|[object]|true|none||none| -|»»» favId|integer|true|none||收藏夹ID| -|»»» type|integer|true|none||收藏内容类型| -|»»» flag|integer|true|none||收藏夹标识| -|»»» updateTime|integer|true|none||收藏时间| - -## POST 获取收藏夹内容 - -POST /favor/getContent - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "favId": 179 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» favId|body|integer| 是 |收藏夹ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "favId": 179, - "status": 0, - "flag": 0, - "updateTime": 1703235210, - "content": "没说呢1703217521wxid_cy6buf12nf6921zhangchuan22881838546569535807562127" - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|object|true|none||none| -|»» favId|integer|true|none||收藏夹ID| -|»» status|integer|true|none||状态| -|»» flag|integer|true|none||收藏夹标识| -|»» updateTime|integer|true|none||更新时间| -|»» content|string|true|none||收藏的内容| - -## POST 删除收藏夹 - -POST /favor/delete - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}", - "favId": 179 -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| -|» favId|body|integer| 是 |收藏夹ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -# 基础API/账号管理 - -## POST 断线重连 - -POST /login/reconnection - -- 当系统返回账号已离线,但是手机顶部还显示ipad在线,可用此接口尝试重连,若返回错误/失败则必须重新调用[步骤一登录](https://apifox.com/apidoc/shared-69ba62ca-cb7d-437e-85e4-6f3d3df271b1/api-196794502) -- 本接口非常用接口,可忽略 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": { - "uuid": "4YHmGvoXvgmS1MqWVtQ2", - "headImgUrl": "http://wx.qlogo.cn/mmhead/ver_1/ZYUmcl1UNzyB2onM08Ij901TaUOLIjHj2UicK3XGDsjEWl4XgQN5IjodunHicBVsZiaZc1iaGCRfluAxkzyibbiau3WBfFj2nprzKp2KryicMjGIvDbWOQGmibwVK648a3o4A8hD/0", - "nickName": "G", - "expiredTime": 230, - "status": 2, - "loginInfo": { - "uin": 4077276085, - "wxid": "wxid_0xsqb3o0tsvz22", - "nickName": "G", - "mobile": "17114312382", - "alias": null - } - } -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 退出 - -POST /login/logout - -> Body 请求参数 - -```json -{ - "appId": "" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功" -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| - -## POST 检查是否在线 - -POST /login/checkOnline - -响应结果的data=true则是在线,反之为离线 - -> Body 请求参数 - -```json -{ - "appId": "{{appid}}" -} -``` - -### 请求参数 - -|名称|位置|类型|必选|说明| -|---|---|---|---|---| -|X-GEWE-TOKEN|header|string| 是 |none| -|body|body|object| 否 |none| -|» appId|body|string| 是 |设备ID| - -> 返回示例 - -> 200 Response - -```json -{ - "ret": 200, - "msg": "操作成功", - "data": true -} -``` - -### 返回结果 - -|状态码|状态码含义|说明|数据模型| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline| - -### 返回数据结构 - -状态码 **200** - -|名称|类型|必选|约束|中文名|说明| -|---|---|---|---|---|---| -|» ret|integer|true|none||none| -|» msg|string|true|none||none| -|» data|boolean|true|none||none| - -# 数据模型 - diff --git a/gewechat/call_back_message/model.md b/gewechat/call_back_message/model.md deleted file mode 100644 index 2bf724a..0000000 --- a/gewechat/call_back_message/model.md +++ /dev/null @@ -1,1200 +0,0 @@ -# 回调消息详解 - -### 回调消息常见问题 - -Q. **微信在线为什么没有消息推送?** -``` -当回调消息未能通过 HTTP POST/JSON 方式成功推送至接收方时,请考虑使用 Apifox 向接收地址发送一条测试消息。如果仍然未能接收到消息,请检查接收地址的可用性。反之,若能成功接收测试消息,请联系客服,我们将协助您进行进一步的问题排查。 -``` - -Q. **如何判断是否是自己发送的消息?** -``` -可通过消息发送人($.Data.FromUserName.string)与所属微信($.Wxid)是否一致进行判断。 -``` - -Q. **为什么同一条消息会重复回调?** -``` -因服务重启、同步历史消息、失败重试等原因,同一条消息可能会重复推送,接收方需根据$.Appid+$.Data.NewMsgId字段做消息排重,以防消息重复处理。 -``` - ---- - -#### 文本消息 -```json - { - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356095, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 1, 消息类型 1是文本消息 - "Content": - { - "string": "123" # 消息内容 - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705043418, 消息发送时间 - "MsgSource": "\n\t\n\t\t1\n\t\n\tv1_volHXhv4\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : 123", 消息通知内容 - "NewMsgId": 7773749793478223190, 消息ID - "MsgSeq": 640356095 - } - } -``` - - -#### 图片消息 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356099, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 3, 消息类型 3是图片消息 - "Content": - { - "string": "\n\n\t\n\t\n\t\n\n" 图片的cdn信息,可用此字段做转发图片 - }, - "Status": 3, - "ImgStatus": 2, - "ImgBuf": - { - "iLen": 2146, - "buffer": "/9j/4AAQSkZJRgABAQAASABIAAD/4QBM..." # 缩略图的base64 - }, - "CreateTime": 1705043678, 消息发送时间 - "MsgSource": "\n\t\n\t\t2\n\t\n\t\n\t\t5b04ea0181f86c7f3d126e9a7fe5038b_\n\t\n\tv1_5WGxwSEj\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [图片]", 消息通知内容 - "NewMsgId": 6906713067183447582, 消息ID - "MsgSeq": 640356099 - } -} -``` - -#### 语音消息 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356100, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 34, 消息类型,34是语音消息 - "Content": - { - "string": "" 语音消息的下载信息,可用于下载语音文件 - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 3600, - "buffer": "AiMhU0lMS19WMxMApzi9JA+qToPB..." 语音文件的base64,并非所有语音消息都有本字段 - }, - "CreateTime": 1705043782, 消息发送时间 - "MsgSource": "\n\tv1_j+rf/Jnp\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [语音]", 消息通知内容 - "NewMsgId": 1428830975092239121, 消息ID - "MsgSeq": 640356100 - } -} -``` - -#### 视频消息 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356101, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 43, 消息类型,43是视频消息 - "Content": - { - "string": "\n\n\t\n\n" 视频消息的cdn信息,可用此字段做转发视频 - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705043879, 消息发送时间 - "MsgSource": "\n\t0\n\t\n\t\tce3ebc6d2893c7a2669ac5d2eaa4aadf_\n\t\n\tv1_kk/psF9W\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [视频]", 消息通知内容 - "NewMsgId": 6628526085342711793, 消息ID - "MsgSeq": 640356101 - } -} -``` - -#### emoji表情 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356102, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 47, 消息类型,47是emoji消息 - "Content": - { - "string": " " 可解析xml中的md5用与发送emoji消息 - }, - "Status": 3, - "ImgStatus": 2, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705043947, 消息发送时间 - "MsgSource": "\n\tv1_vy/xC7WS\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [动画表情]", 消息通知内容 - "NewMsgId": 6674256223577965652, 消息ID - "MsgSeq": 640356102 - } -} -``` - -#### 公众号链接 -- 判断链接消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.type=5,按此逻辑会匹配到两种消息,链接消息及邀请进群的通知,可依据xml msg.appmsg.title做区分 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356105, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "\n\n\t\n\t\t尔滨,又有好消息!\n\t\t\n\t\t\n\t\t5\n\t\t0\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t0\n\t\thttp://mp.weixin.qq.com/s?__biz=MzA4NDI3NjcyNA==&mid=2650011300&idx=1&sn=52739c3d39c030394da972e3d83efc98&chksm=86ed931f730a3e19a5edc840896d9bf1ad1f8b60cdccafea6a9e7a38a0a33f261877d334622b&scene=0&xtrack=1#rd\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t3057020100044b304902010002048399cc8402032f7e350204a810d83a020465a0e829042462343663343435612d333737392d346230612d616434622d6263383038633562643562340204051408030201000405004c53d900\n\t\t\tadd1b4bcf9cc50c6a8f14ff334bc3d5c\n\t\t\t83741\n\t\t\t1000\n\t\t\t426\n\t\t\t37889a1e22c1e58ebd4e6589b999f63e\n\t\t\t\n\t\t\n\t\t\n\t\tgh_6651e07e4b2d\n\t\t新华社\n\t\thttps://mmbiz.qpic.cn/mmbiz_jpg/azXQmS1HA7mOP6LHArYqZ5ypK4iajvBdfhNxzyANcQ1eW7ec6yZVj7tv8Lt6tWftSNckDz3j4FqkP04TxARG8dQ/640?wxtype=jpeg&wxfrom=0\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\n\t\n\twxid_phyyedw9xap22\n\t0\n\t\n\t\t1\n\t\t\n\t\n\t\n\n" 可用此字段做转发链接 - }, - "Status": 3, - "ImgStatus": 2, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705044033, 消息发送时间 - "MsgSource": "\n\t\n\t\t\n\t\n\t\n\t\t4\n\t\n\t\n\t\tba15c632e8fa89ed84bd027f09495591_\n\t\n\tv1_ptaEL1bv\n\n", - "PushContent": "朝夕。 : [链接]尔滨,又有好消息!", 消息通知内容 - "NewMsgId": 1623411326098221490, 消息ID - "MsgSeq": 640356105 - } -} -``` - -#### 文件消息(发送文件的通知) -- **注意**:收到本条消息仅代表对方在向你发送文件,并不可以用本条做转发及下载 -- 判断此类消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.type=74 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356106, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "\n \n <![CDATA[hhh.xlsx]]>\n 74\n 0\n \n 8939\n \n v1_paVQtd+CWGr2I3eOg71E6KBpQf0yY9RFQkqDPwT4yMnnbawqveao1vAE0qCOhWcIPkMGZavimUTDFcImr+SaManD8pKVQbBPTUvSmA6UsXgZWqQDOT00VLx7U/hoP3/CwveN2Lk56nxcef/XJiGKrOpAHKHcZvccaGk9/68wsBCOyanya/9xgdHTYxyQp4IadiSe\n 0\n \n \n \n \n wxid_phyyedw9xap22\n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705044119, 消息发送时间 - "MsgSource": "\n\tv1_WyLyIcy+\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [文件]hhh.xlsx", 消息通知内容 - "NewMsgId": 1789783684714859663, 消息ID - "MsgSeq": 640356106 - } -} -``` - -#### 文件消息(文件发送完成) -- **注意**:收到本条消息表示对方给你的文件发送完成,可用本条消息做转发及下载 -- 判断此类消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.type=6 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356107, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "\n\n\t\n\t\thhh.xlsx\n\t\t\n\t\t\n\t\t6\n\t\t0\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t8939\n\t\t\t@cdn_3057020100044b304902010002043904752002032f7e350204aa0dd83a020465a0e897042430373538386564322d353866642d343234342d386563652d6236353536306438623936610204011800050201000405004c56f900_3f28b0cbd65a86c3a980f3e22808c0fe_1\n\t\t\t\n\t\t\txlsx\n\t\t\t3057020100044b304902010002043904752002032f7e350204aa0dd83a020465a0e897042430373538386564322d353866642d343234342d386563652d6236353536306438623936610204011800050201000405004c56f900\n\t\t\t3f28b0cbd65a86c3a980f3e22808c0fe\n\t\t\t0\n\t\t\t1789783684714859663\n\t\t\tv1_paVQtd+CWGr2I3eOg71E6KBpQf0yY9RFQkqDPwT4yMnnbawqveao1vAE0qCOhWcIPkMGZavimUTDFcImr+SaManD8pKVQbBPTUvSmA6UsXgZWqQDOT00VLx7U/hoP3/CwveN2Lk56nxcef/XJiGKrOpAHKHcZvccaGk9/68wsBCOyanya/9xgdHTYxyQp4IadiSe\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t84c6737fe9549270c9b3ca4f6fc88f6f\n\t\t\n\t\n\twxid_phyyedw9xap22\n\t0\n\t\n\t\t1\n\t\t\n\t\n\t\n\n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705044119, 消息发送时间 - "MsgSource": "\n\t\n\t\t3\n\t\n\t\n\t\t896374a2b5979141804d509256c22f0b_\n\t\n\tv1_n7kZ01bp\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [文件]hhh.xlsx", 消息通知内容 - "NewMsgId": 3617029648443513152, 消息ID - "MsgSeq": 640356107 - } -} -``` - -#### 名片消息 -```json - { - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356108, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 42, 消息类型,42是名片消息 - "Content": - { - "string": "\n\n" 名片中微信号的基本信息,可用于添加好友 - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705044829, 消息发送时间 - "MsgSource": "\n\t0\n\t\n\t\t2\n\t\n\tv1_bawbB33Z\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [名片]Ashley", 消息通知内容 - "NewMsgId": 766322251431765776, 消息ID - "MsgSeq": 640356108 - } - } -``` - -#### 好友添加请求通知 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356166, 消息ID - "FromUserName": - { - "string": "fmessage" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 37, 消息类型,37是好友添加请求通知 - "Content": - { - "string": "" 请求添加好友微信号的基本信息,可用于添加好友 - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045979, 消息发送时间 - "MsgSource": "\n\tv1_GOrHWRNL\n\t\n\t\t\n\t\n\n", - "NewMsgId": 1109510141823131559, 消息ID - "MsgSeq": 640356166 - } -} -``` - -#### 好友通过验证及好友资料变更的通知消息 -```json -{ - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", - "TypeName": "ModContacts", - "Data": - { - "UserName": - { - "string": "wxid_0xsqb3o0tsvz22" - }, - "NickName": - { - "string": "chaoxi。" - }, - "PyInitial": - { - "string": "CX" - }, - "QuanPin": - { - "string": "chaoxi" - }, - "Sex": 1, - "ImgBuf": - { - "iLen": 0 - }, - "BitMask": 4294967295, - "BitVal": 3, - "ImgFlag": 1, - "Remark": - {}, - "RemarkPyinitial": - {}, - "RemarkQuanPin": - {}, - "ContactType": 0, - "RoomInfoCount": 0, - "DomainList": [ - {}], - "ChatRoomNotify": 0, - "AddContactScene": 0, - "Province": "Jiangsu", - "City": "Nanjing", - "Signature": "......", - "PersonalCard": 0, - "HasWeiXinHdHeadImg": 1, - "VerifyFlag": 0, - "Level": 6, - "Source": 14, - "WeiboFlag": 0, - "AlbumStyle": 0, - "AlbumFlag": 3, - "SnsUserInfo": - { - "SnsFlag": 1, - "SnsBgimgId": "http://shmmsns.qpic.cn/mmsns/FzeKA69P5uIdqPfQxp59LvOohoE2iaiaj86IBH1jl0F76aGvg8AlU7giaMtBhQ3bPibunbhVLb3aEq4/0", - "SnsBgobjectId": 14216284872728580667, - "SnsFlagEx": 7297 - }, - "Country": "CN", - "BigHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/qqncCu2avRYruPcQbav3PrwaGSS31QgN6dqW8q1XuDKjgiaAuwoFPw3kN8Cj3zIBL36M93R2Xwib0IddUK3gqbFeezEiaA8K2mMdibT5VUDDrbn7F7M1Mxicmows9cdYNOicjI/0", - "SmallHeadImgUrl": "https://wx.qlogo.cn/mmhead/ver_1/qqncCu2avRYruPcQbav3PrwaGSS31QgN6dqW8q1XuDKjgiaAuwoFPw3kN8Cj3zIBL36M93R2Xwib0IddUK3gqbFeezEiaA8K2mMdibT5VUDDrbn7F7M1Mxicmows9cdYNOicjI/132", - "CustomizedInfo": - { - "BrandFlag": 0 - }, - "EncryptUserName": "v3_020b3826fd03010000000000feba078fc1e760000000501ea9a3dba12f95f6b60a0536a1adb6f6352c38d0916c9c74045d85aa602efa2d81b84adde05d285124e8a54b9fcd039f725d6ac0d3bd651c7c74503a@stranger", - "AdditionalContactList": - { - "LinkedinContactItem": - {} - }, - "ChatroomMaxCount": 0, - "DeleteFlag": 0, - "Description": "\b\u0000\u0018\u0000\"\u0000(\u00008\u0000", - "ChatroomStatus": 0, - "Extflag": 0, - "ChatRoomBusinessType": 0 - } -} -``` - - -#### 小程序消息 -- 判断此类消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.type=33/36 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356109, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "\n\n\t\n\t\t腾讯云助手\n\t\t腾讯云助手\n\t\t33\n\t\thttps://mp.weixin.qq.com/mp/waerrpage?appid=wxe2039b83454e49ed&type=upgrade&upgradetype=3#wechat_redirect\n\t\t\n\t\t\t3057020100044b304902010002048399cc8402032df731020414e461b4020465a0eb8f042463626430353633382d376263632d346161642d396234372d3435613131336339326231640204051808030201000405004c550500\n\t\t\te1284d4ae13ebd9bb2cde5251cdd05e4\n\t\t\t52357\n\t\t\t720\n\t\t\t576\n\t\t\td4142726bc730088f0fa44c9161a0992\n\t\t\td4142726bc730088f0fa44c9161a0992\n\t\t\t0\n\t\t\twxid_0xsqb3o0tsvz22_38_1705044879\n\t\t\n\t\tgh_44fc2ced7f87@app\n\t\t腾讯云助手\n\t\te1284d4ae13ebd9bb2cde5251cdd05e4\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t2\n\t\t\t594\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t0\n\t\t\t0\n\t\t\t538\n\t\t\t0\n\t\t\t0\n\t\t\t0\n\t\t\t0\n\t\t\n\t\n\twxid_phyyedw9xap22\n\t0\n\t\n\t\t1\n\t\t\n\t\n\t\n\n" - }, - "Status": 3, - "ImgStatus": 2, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705044879, 消息发送时间 - "MsgSource": "\n\t0\n\t\n\t\t2\n\t\n\t\n\t\tdb46d46fe0a926c4b571dfe9d8096bfa_\n\t\n\tv1_DkelOoZN\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [小程序]腾讯云助手", 消息通知内容 - "NewMsgId": 572974861799389774, 消息ID - "MsgSeq": 640356109 - } -} -``` - -#### 引用消息 -- 判断此类消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.type=57 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356110, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "\n\n\t\n\t\t看看这个\n\t\t\n\t\t\n\t\t57\n\t\t0\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t49\n\t\t\t3617029648443513152\n\t\t\twxid_phyyedw9xap22\n\t\t\twxid_phyyedw9xap22\n\t\t\t朝夕。\n\t\t\t<msg><appmsg appid=\"\" sdkver=\"0\"><title>hhh.xlsx</title><des></des><action></action><type>6</type><showtype>0</showtype><soundtype>0</soundtype><mediatagname></mediatagname><messageext></messageext><messageaction></messageaction><content></content><contentattr>0</contentattr><url></url><lowurl></lowurl><dataurl></dataurl><lowdataurl></lowdataurl><appattach><totallen>8939</totallen><attachid>@cdn_3057020100044b304902010002043904752002032f7e350204aa0dd83a020465a0e897042430373538386564322d353866642d343234342d386563652d6236353536306438623936610204011800050201000405004c56f900_3f28b0cbd65a86c3a980f3e22808c0fe_1</attachid><emoticonmd5></emoticonmd5><fileext>xlsx</fileext><cdnattachurl>3057020100044b304902010002043904752002032f7e350204aa0dd83a020465a0e897042430373538386564322d353866642d343234342d386563652d6236353536306438623936610204011800050201000405004c56f900</cdnattachurl><aeskey>3f28b0cbd65a86c3a980f3e22808c0fe</aeskey><encryver>0</encryver><overwrite_newmsgid>1789783684714859663</overwrite_newmsgid><fileuploadtoken>v1_paVQtd+CWGr2I3eOg71E6KBpQf0yY9RFQkqDPwT4yMnnbawqveao1vAE0qCOhWcIPkMGZavimUTDFcImr+SaManD8pKVQbBPTUvSmA6UsXgZWqQDOT00VLx7U/hoP3/CwveN2Lk56nxcef/XJiGKrOpAHKHcZvccaGk9/68wsBCOyanya/9xgdHTYxyQp4IadiSe</fileuploadtoken></appattach><extinfo></extinfo><sourceusername></sourceusername><sourcedisplayname></sourcedisplayname><thumburl></thumburl><md5>84c6737fe9549270c9b3ca4f6fc88f6f</md5><statextstr></statextstr></appmsg><fromusername></fromusername><appinfo><version>0</version><appname></appname><isforceupdate>1</isforceupdate></appinfo></msg>\n\t\t\t<msgsource>\n\t<alnode>\n\t\t<cf>3</cf>\n\t</alnode>\n\t<sec_msg_node>\n\t\t<uuid>896374a2b5979141804d509256c22f0b_</uuid>\n\t</sec_msg_node>\n</msgsource>\n\n\t\t\n\t\n\twxid_phyyedw9xap22\n\t0\n\t\n\t\t1\n\t\t\n\t\n\t\n\n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705044946, 消息发送时间 - "MsgSource": "\n\t\n\t\tea25ade83dc4b9ec91060ca3e1a0f5a2_\n\t\n\tv1_oTWRYdd1\n\t\n\t\t\n\t\n\n", - "PushContent": "看看这个", 消息通知内容 - "NewMsgId": 4334300109515885085, 消息ID - "MsgSeq": 640356110 - } -} -``` - -#### 转账消息 -- 判断此类消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.type=2000 -```json - { - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356112, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "\n\n<![CDATA[微信转账]]>\n\n\n2000\n\n\n\n\n\n\n\n1\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705044984, 消息发送时间 - "MsgSource": "\n\tv1_eDcIna+F\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [转账]", 消息通知内容 - "NewMsgId": 7290406378327063279, 消息ID - "MsgSeq": 640356112 - } - } -``` - -#### 红包消息 -- 判断此类消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.type=2001 -```json - { - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356113, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t<![CDATA[微信红包]]>\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t微信红包\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045011, 消息发送时间 - "MsgSource": "\n\t\n\t\n\tv1_Js6wJde/\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。 : [红包]恭喜发财,大吉大利", 消息通知内容 - "NewMsgId": 5517720959405775296, 消息ID - "MsgSeq": 640356113 - } - } -``` - -#### 视频号消息 -- 判断此类消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.type=51 -```json - { - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356115, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "\n\n\t\n\t\t当前微信版本不支持展示该内容,请升级至最新版本。\n\t\t\n\t\t\n\t\t51\n\t\t0\n\t\t0\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t0\n\t\thttps://support.weixin.qq.com/update/\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t0\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t14264358459626428566\n\t\t\t4\n\t\t\t国风锦鲤\n\t\t\thttps://wx.qlogo.cn/finderhead/ver_1/x2LxetmLmgoo9jp69R3wcrtZ0LBLdjVv9vrK9HmPNGEdD1iawdrPffPvMmFUez8pWqRIfs7DtgPiaV5C7DZpibH8b3y0jG178aIict6uPf0Vht4/0\n\t\t\t还招人么?我不要工资#逆水寒cos\n\t\t\t1\n\t\t\t8046877030770906689_0_0_0_0_0\n\t\t\t0\n\t\t\tv2_060000231003b20faec8cae08b19c7d2c702e834b077fb74f482543ff67f0cc66363057a5443@finder\n\t\t\t\n\t\t\t0\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t4\n\t\t\t\t\thttp://wxapp.tc.qq.com/251/20302/stodownload?encfilekey=Cvvj5Ix3eez3Y79SxtvVL0L7CkPM6dFibFeI6caGYwFFDAZJzcvicKz3jic4UfNeiaWTwH9gTlYiafAxVkMZRXicBUBk2Ms7lauAj6SArUu0P9ddKiaa8IWZzYaaKLf1WddH4G8T0KicxQV3hQPH3pQgEMTscw&a=1&bizid=1023&dotrans=0&hy=SH&idx=1&m=4c4c7f3ed03a14a6b99d0d19176c12ac&upid=290110\n\t\t\t\t\thttp://wxapp.tc.qq.com/251/20304/stodownload?encfilekey=oibeqyX228riaCwo9STVsGLPj9UYCicgttvO59vjtcQ7Jviaia0q4bnpVP2ia7ibqzacPo0z4nIRtWom80ZXwL64icZO2q6ibVBQLZQftMwU3SHj5uplsIFroHeF0QNcCkXX3RtibaWCHJQjfqZUk&bizid=1023&dotrans=0&hy=SH&idx=1&m=7522250b4d15e5df866bf23da9f117d6&token=oA9SZ4icv8IssuhLtacX13nAzXiaf8y52juKW4ibUDN7a2vn71bbrCR0LZiabddvTsLLMvnELnuAwNxViclRT7wT9IyibzFw1pq9wdichRYaEmb6Js&ctsc=2-20\n\t\t\t\t\t1080\n\t\t\t\t\t1920\n\t\t\t\t\thttp://wxapp.tc.qq.com/251/20304/stodownload?encfilekey=oibeqyX228riaCwo9STVsGLPj9UYCicgttvO59vjtcQ7Jviaia0q4bnpVP2ia7ibqzacPo0z4nIRtWom80ZXwL64icZO2q6ibVBQLZQftMwU3SHj5uplsIFroHeF0QNcCkXX3RtibaWCHJQjfqZUk&bizid=1023&dotrans=0&hy=SH&idx=1&m=7522250b4d15e5df866bf23da9f117d6&token=oA9SZ4icv8IssuhLtacX13nAzXiaf8y52juKW4ibUDN7a2vn71bbrCR0LZiabddvTsLLMvnELnuAwNxViclRT7wT9IyibzFw1pq9wdichRYaEmb6Js&ctsc=2-20\n\t\t\t\t\thttp://wxapp.tc.qq.com/251/20350/stodownload?encfilekey=oibeqyX228riaCwo9STVsGLPj9UYCicgttv1FCQXwResqN75zI4n65zY5tkAficEPWbbClq2VcicqMYaSLK7nrAVMasrIhvsCXJib5cOLib98JgWPr4SP92W6YEkVN5Uv0TKAdyRryQ3Qxk7jU&bizid=1023&dotrans=0&hy=SH&idx=1&m=731b89683dd3cb866cdf96dab70ac183&token=KkOFht0mCXlnmicFbJnvymIJOEfZgzia8PY0ZzOdaIYTJXwfblvK4U1ibntribm1beupHwictGWs9hpMiclyhfSb6766Lnb3ib0j14bENm6u1tHpeo&ctsc=3-20\n\t\t\t\t\t10>>\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\twxid_phyyedw9xap22\n\t0\n\t\n\t\t1\n\t\t\n\t\n\t\n\n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045057, 消息发送时间 - "MsgSource": "\n\t\n\t\t\n\t\n\t\n\t\t4\n\t\n\t\n\t\tbb2cbd9d3290e7a3d35f183eaade2213_\n\t\n\tv1_+Tfo41HS\n\n", - "PushContent": "你收到了一条消息", 消息通知内容 - "NewMsgId": 5576224237104747184, 消息ID - "MsgSeq": 640356115 - } - } -``` - -#### 撤回消息 -- 判断此类消息的逻辑:\$.Data.MsgType=10002 并且 解析\$.Data.Content.string中的xml sysmsg.type=revokemsg -```json - { - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356116, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 10002, - "Content": - { - "string": "wxid_phyyedw9xap2210403561155576224237104747184" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045083, 消息发送时间 - "MsgSource": "\n\t\n\t\t\n\t\n\n", - "NewMsgId": 1968256046, 消息ID - "MsgSeq": 640356116 - } - } -``` - -#### 拍一拍消息 -- 判断此类消息的逻辑:\$.Data.MsgType=10002 并且 解析\$.Data.Content.string中的xml sysmsg.type=pat -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356117, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 10002, - "Content": - { - "string": "\n\n wxid_phyyedw9xap22\n wxid_0xsqb3o0tsvz22\n wxid_0xsqb3o0tsvz22\n \n 0\n\n\n\n\n \n\n\n\n\n\n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045115, 消息发送时间 - "MsgSource": "\n\t\n\t\t\n\t\n\n", - "NewMsgId": 5709690173850254331, 消息ID - "MsgSeq": 640356117 - } -} -``` - -#### 地理位置 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356118, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 48, 消息类型,48是地理位置消息 - "Content": - { - "string": "\n\n\t\n\n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045153, 消息发送时间 - "MsgSource": "\n\t0\n\tv1_KgQA8C+H\n\t\n\t\t\n\t\n\n", - "PushContent": "朝夕。分享了一个地理位置", 消息通知内容 - "NewMsgId": 2112726776406556053, 消息ID - "MsgSeq": 640356118 - } -} -``` - -#### 群聊邀请 -- 判断此类消息的逻辑:\$.Data.MsgType=49 并且 解析\$.Data.Content.string中的xml msg.appmsg.title=邀请你加入群聊(根据手机设置的系统语言title会有调整,不同语言关键字不同) -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356119, 消息ID - "FromUserName": - { - "string": "wxid_phyyedw9xap22" 消息发送人的wxid - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 49, - "Content": - { - "string": "<![CDATA[邀请你加入群聊]]>view500" - }, - "Status": 3, - "ImgStatus": 0, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045206, 消息发送时间 - "MsgSource": "\n\tv1_uHiWbihr\n\t\n\t\t\n\t\n\n", - "NewMsgId": 2331390497668538400, 消息ID - "MsgSeq": 640356119 - } -} -``` - -#### 被移除群聊通知 -- 判断此类消息的逻辑:\$.Data.MsgType=10000 并且 \$.Data.Content.string内容为移除群聊的通知内容 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356153, 消息ID - "FromUserName": - { - "string": "39238473509@chatroom" 所在群聊的ID - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 10000, - "Content": - { - "string": "你被\"朝夕。\"移出群聊" - }, - "Status": 4, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045790, 消息发送时间 - "MsgSource": "\n\tv1_f7Xny9H/\n\t\n\t\t\n\t\n\n", - "NewMsgId": 5759605552965664254, 消息ID - "MsgSeq": 640356153 - } -} -``` - -#### 踢出群聊通知 -- 判断此类消息的逻辑:\$.Data.MsgType=10002 并且 解析\$.Data.Content.string中的xml sysmsg.type=sysmsgtemplate 并且 template中的内容为“你将xxx移出了群聊”(根据手机设置的系统语言template会有调整,不同语言关键字不同) -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356143, 消息ID - "FromUserName": - { - "string": "34757816141@chatroom" 所在群聊的ID - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 10002, - "Content": - { - "string": "34757816141@chatroom:\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n\n" - }, - "Status": 4, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045666, 消息发送时间 - "MsgSource": "\n\t\n\t\t\n\t\n\n", - "NewMsgId": 7100572668516374210, 消息ID - "MsgSeq": 640356143 - } -} -``` - -#### 解散群聊通知 -- 判断此类消息的逻辑:\$.Data.MsgType=10002 并且 解析\$.Data.Content.string中的xml sysmsg.type=sysmsgtemplate 并且 template中的内容为“群主xxx已解散该群聊”(根据手机设置的系统语言template会有调整,不同语言关键字不同) -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356158, 消息ID - "FromUserName": - { - "string": "39238473509@chatroom" 所在群聊的ID - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 10002, - "Content": - { - "string": "39238473509@chatroom:\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n" - }, - "Status": 4, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045834, 消息发送时间 - "MsgSource": "\n\t\n\t\t\n\t\n\n", - "NewMsgId": 6869316888754169027, 消息ID - "MsgSeq": 640356158 - } -} -``` - -#### 修改群名称 -- 判断此类消息的逻辑:\$.Data.MsgType=10000 并且 \$.Data.Content.string为修改群名的通知内容 -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356129, 消息ID - "FromUserName": - { - "string": "34757816141@chatroom" 所在群聊的ID - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 10000, - "Content": - { - "string": "你修改群名为“GeWe test1”" - }, - "Status": 4, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045517, 消息发送时间 - "MsgSource": "\n\tv1_3uPmlxJG\n\t\n\t\t\n\t\n\n", - "NewMsgId": 6984814725261047392, 消息ID - "MsgSeq": 640356129 - } -} -``` - -#### 更换群主通知 -- 判断此类消息的逻辑:\$.Data.MsgType=10000 并且 \$.Data.Content.string为更换群主的通知内容 -```json - { - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356125, 消息ID - "FromUserName": - { - "string": "34757816141@chatroom" 所在群聊的ID - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 消息接收人的wxid - }, - "MsgType": 10000, - "Content": - { - "string": "你已成为新群主" - }, - "Status": 4, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045441, 消息发送时间 - "MsgSource": "\n\tv1_iqIx6JkV\n\t\n\t\t\n\t\n\n", - "NewMsgId": 7268255507978211143, 消息ID - "MsgSeq": 640356125 - } - } -``` - -#### 群信息变更通知 -```json -{ - "TypeName": "ModContacts", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "UserName": - { - "string": "34757816141@chatroom" 所在群聊的ID - }, - "NickName": - { - "string": "GeWe test" - }, - "PyInitial": - { - "string": "GEWETEST" - }, - "QuanPin": - { - "string": "GeWetest" - }, - "Sex": 0, - "ImgBuf": - { - "iLen": 0 - }, - "BitMask": 4294967295, - "BitVal": 2, - "ImgFlag": 1, - "Remark": - {}, - "RemarkPyinitial": - {}, - "RemarkQuanPin": - {}, - "ContactType": 0, - "RoomInfoCount": 0, - "DomainList": [ - {}], - "ChatRoomNotify": 1, - "AddContactScene": 0, - "PersonalCard": 0, - "HasWeiXinHdHeadImg": 0, - "VerifyFlag": 0, - "Level": 0, - "Source": 0, - "ChatRoomOwner": "wxid_0xsqb3o0tsvz22", - "WeiboFlag": 0, - "AlbumStyle": 0, - "AlbumFlag": 0, - "SnsUserInfo": - { - "SnsFlag": 0, - "SnsBgobjectId": 0, - "SnsFlagEx": 0 - }, - "CustomizedInfo": - { - "BrandFlag": 0 - }, - "AdditionalContactList": - { - "LinkedinContactItem": - {} - }, - "ChatroomMaxCount": 700000019, - "DeleteFlag": 2, - "Description": "\b\u0004\u0012\u0017\n\u000Ewxid_phyyedw9xap220\u0001@\u0000�\u0001\u0000\u0012\u001B\n\u0012wxid_phyyedw9xap220\u0001@\u0000�\u0001\u0000\u0012\u001C\n\u0013wxid_0xsqb3o0tsvz220\u0001@\u0000�\u0001\u0000\u0012\u001D\n\u0013wxid_8pvka4jg6qzt220�\u0010@\u0000�\u0001\u0000\u0018\u0001\"\u0000(\u00008\u0000", - "ChatroomStatus": 27, - "Extflag": 0, - "ChatRoomBusinessType": 0 - } -} -``` - -#### 发布群公告 -- 判断此类消息的逻辑:\$.Data.MsgType=10002 并且 解析\$.Data.Content.string中的xml sysmsg.type=mmchatroombarannouncememt -```json -{ - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356133, 消息ID - "FromUserName": - { - "string": "wxid_0xsqb3o0tsvz22" 发布人的wxid - }, - "ToUserName": - { - "string": "34757816141@chatroom" 所在群聊的ID - }, - "MsgType": 10002, - "Content": - { - "string": "\n \n \n \n\t1705045558\n\t127\n\t1\n\t\n\t\twxid_0xsqb3o0tsvz22\n\t\t34757816141@chatroom\n\t\t7c79fed82a0037648954bba6d5ca2025\n\t\n\t\n\t\t\n\t\t\t.htm\n\t\t\thttp://wxapp.tc.qq.com/264/20303/stodownload?m=145a874d4eb1bb0b85af928331a168aa&filekey=3033020101041f301d02020108040253480410145a874d4eb1bb0b85af928331a168aa020120040d00000004627466730000000132&hy=SH&storeid=265a0ee36000a9c94f3064bb50000010800004f4f534825960b01e676a0b3b&bizid=1023\n\t\t\t24808ae91ac7d636c99a1b340a1f9253\n\t\t\t8fac8374ded0d5e8d5038b1ec2b77a62\n\t\t\tef033738f28bb3c80cd5e7290fdbfdcf\n\t\t\tef033738f28bb3c80cd5e7290fdbfdcf\n\t\t\t20\n\t\t\n\t\t\n\t\t\t群公告哈1\n\t\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t-1\n\t\t\n\t\n\twxid_0xsqb3o0tsvz22_34757816141@chatroom_1705045558_2028281562\n\n]]>\n \n \n" - }, - "Status": 3, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045559, 消息发送时间 - "MsgSource": "\n\t\n\t\t\n\t\n\n", - "NewMsgId": 8056409355261218186, 消息ID - "MsgSeq": 640356133 - } -} -``` - -#### 群待办 -- 判断此类消息的逻辑:\$.Data.MsgType=10002 并且 解析\$.Data.Content.string中的xml sysmsg.type=roomtoolstips -```json - { - "TypeName": "AddMsg", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "MsgId": 1040356135, 消息ID - "FromUserName": - { - "string": "34757816141@chatroom" 所在群聊的ID - }, - "ToUserName": - { - "string": "wxid_0xsqb3o0tsvz22" - }, - "MsgType": 10002, - "Content": - { - "string": "34757816141@chatroom:\n\n\n 0\n\n \n \n \n \n \n <![CDATA[群公告]]>\n \n \n \n 0\n \n \n \n \n\n\n \n\n\n \n \n \n \n \n \n \n\n \n\n \n\n\n" - }, - "Status": 4, - "ImgStatus": 1, - "ImgBuf": - { - "iLen": 0 - }, - "CreateTime": 1705045591, 消息发送时间 - "MsgSource": "\n\t\n\t\t\n\t\n\n", - "NewMsgId": 1765700414095721113, 消息ID - "MsgSeq": 640356135 - } - } -``` - -#### 删除好友通知 -```json -{ - "TypeName": "DelContacts", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "UserName": - { - "string": "wxid_phyyedw9xap22" 删除的好友wxid - }, - "DeleteContactScen": 0 - } -} -``` - -#### 退出群聊 -```json -{ - "TypeName": "DelContacts", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22", 所属微信的wxid - "Data": - { - "UserName": - { - "string": "34559815390@chatroom" 退出的群聊ID - }, - "DeleteContactScen": 0 - } -} -``` - -#### 掉线通知 -```json -{ - "TypeName": "Offline", 消息类型 - "Appid": "wx_wR_U4zPj2M_OTS3BCyoE4", 设备ID - "Wxid": "wxid_phyyedw9xap22" 掉线号的wxid -} -``` diff --git a/gewechat/client.py b/gewechat/client.py deleted file mode 100644 index 1c25e7c..0000000 --- a/gewechat/client.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -import toml -import time -import logging - -# 假设 gewechat_client 已经安装,并且 GewechatClient 可直接导入 -from gewechat_client import GewechatClient - -logger = logging.getLogger(__name__) - -class Client: - def __init__(self, config_path=None): - # 默认配置文件路径 - if config_path is None: - config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.toml") - self.config_path = config_path - config = toml.load(config_path) - gewechat_cfg = config.get("Gewechat", {}) - self.base_url = gewechat_cfg.get("base_url", "") - self.gewechat_token = gewechat_cfg.get("gewechat_token", "") - self.app_id = gewechat_cfg.get("app_id", "") - self.callback_url = gewechat_cfg.get("callback_url", "") - # 初始化 GewechatClient - self.client = GewechatClient( - base_url=self.base_url, - token=self.gewechat_token - ) - app_id, error_msg = self.client.login(app_id=self.app_id) - if error_msg: - logger.error("登录失败") - return - - # 如果启动时,配置文件中的app_id为空,那么将app_id写入配置文件 - if not self.app_id and app_id: - config["Gewechat"]["app_id"] = app_id - with open(self.config_path, "w", encoding="utf-8") as f: - toml.dump(config, f) - logger.info(f"已将新的APP_ID: {app_id} 写入配置文件") - self.app_id = app_id - - def client_set_callback(self): - """在server启动后调用此方法设置回调""" - resp = self.client.set_callback(self.app_id, self.callback_url) - print(f"set_callback 成功: {resp}") - - -# 项目全局唯一 client 实例 -gewe_client = Client() \ No newline at end of file diff --git a/gewechat/client/fetchContactsList.py b/gewechat/client/fetchContactsList.py deleted file mode 100644 index 5030c6c..0000000 --- a/gewechat/client/fetchContactsList.py +++ /dev/null @@ -1,20 +0,0 @@ -import requests -import json - -url = "/login/deviceList" - -base_url="http://192.168.2.240:2531/v2/api" -payload = json.dumps({ - -}) - -headers = { - 'X-GEWE-TOKEN': 'cb43f52db27e4a56bb6ec7da54373582', - 'Content-Type': 'application/json' -} - -response = requests.request("POST", base_url+url, headers=headers, data=payload) - -print(response.text) - - diff --git a/gewechat/client/get_chatroom_members.py b/gewechat/client/get_chatroom_members.py deleted file mode 100644 index 5f3b3c1..0000000 --- a/gewechat/client/get_chatroom_members.py +++ /dev/null @@ -1,120 +0,0 @@ -import requests -import json - -base_url = "http://192.168.2.240:2531/v2/api" - -headers = { - 'X-GEWE-TOKEN': 'cb43f52db27e4a56bb6ec7da54373582', - 'Content-Type': 'application/json' -} -app_id = "wx_3BC6eSHGE5xEm_hH3__7c" - - -def get_chatroom_members(): - url = "/group/getChatroomMemberList" - - payload = json.dumps({ - "appId": app_id, - "chatroomId": "52418238895@chatroom" - - }) - - response = requests.request("POST", base_url + url, headers=headers, data=payload) - - print(response.text) - - -def revoke_msg(): - url = "/message/revokeMsg" - - payload = json.dumps({ - "appId": app_id, - "toWxid": "34757816141@chatroom", - "msgId": "769533801", - "newMsgId": "5271007655758710001", - "createTime": "1704163145" - }) - - response = requests.request("POST", base_url + url, headers=headers, data=payload) - - print(response.text) - -def set_call_back(): - - url = "/tools/setCallback" - - payload = json.dumps({ - "token": "cb43f52db27e4a56bb6ec7da54373582", - "callbackUrl": "http://192.168.2.212:8999/gewechat/message/callback" - }) - headers = { - 'X-GEWE-TOKEN': 'cb43f52db27e4a56bb6ec7da54373582', - 'Content-Type': 'application/json' - } - - response = requests.request("POST",base_url+ url, headers=headers, data=payload) - - print(response.text) - -def send_file(): - - url = "/message/postFile" - - payload = json.dumps({ - "appId": app_id, - "toWxid": "52418238895@chatroom", - "fileName": "favicon.ico", - "fileUrl": "http://192.168.2.210:8888/static/favicon.ico" - }) - headers = { - 'X-GEWE-TOKEN': 'cb43f52db27e4a56bb6ec7da54373582', - 'Content-Type': 'application/json' - } - - response = requests.request("POST", base_url+url, headers=headers, data=payload) - - print(response.text) - - -def download_file(): - - url = "/message/downloadImage" - xml =""" - - - - - 0 - 0 - - - 0 - - - 0 - - - - - - - 0 - - - """ - payload = json.dumps({ - "appId": app_id, - "type": 2, - "xml": xml - }) - headers = { - 'X-GEWE-TOKEN': 'cb43f52db27e4a56bb6ec7da54373582', - 'Content-Type': 'application/json' - } - - response = requests.request("POST", base_url+url, headers=headers, data=payload) - - print(response.text) - -if __name__ == '__main__': - download_file() diff --git a/gewechat/client/get_token.py b/gewechat/client/get_token.py deleted file mode 100644 index 47f9482..0000000 --- a/gewechat/client/get_token.py +++ /dev/null @@ -1,30 +0,0 @@ -# import requests -# -# url = "/tools/getTokenId" -# -# payload={} -# headers = {} -# base_url="http://192.168.2.240:2531/v2/api" -# response = requests.request("POST", base_url+url, headers=headers, data=payload) -# -# print(response.text) -# -# - -import requests -import json - -# url = "/login/logout" -url ="/login/reconnection" -base_url="http://192.168.2.240:2531/v2/api" -payload = json.dumps({ - "appId": "wx_3BC6eSHGE5xEm_hH3__7c" -}) -headers = { - 'X-GEWE-TOKEN': 'cb43f52db27e4a56bb6ec7da54373582', - 'Content-Type': 'application/json' -} - -response = requests.request("POST", base_url+url, headers=headers, data=payload) - -print(response.text) \ No newline at end of file diff --git a/gewechat/client/login.py b/gewechat/client/login.py deleted file mode 100644 index 0f41096..0000000 --- a/gewechat/client/login.py +++ /dev/null @@ -1,12 +0,0 @@ - -import requests -def login(): - - url = "/tools/getTokenId" - - payload = {} - headers = {} - base_url = "http://192.168.2.240:2531/v2/api" - response = requests.request("POST", base_url + url, headers=headers, data=payload) - - print(response.text) \ No newline at end of file diff --git a/gewechat/client/set_call_back.py b/gewechat/client/set_call_back.py deleted file mode 100644 index 9573869..0000000 --- a/gewechat/client/set_call_back.py +++ /dev/null @@ -1,17 +0,0 @@ -import requests -import json - -url = "/tools/setCallback" - -payload = json.dumps({ - "token": "{{gewe-token}}", - "callbackUrl": "http://www.baidu.com" -}) -headers = { - 'X-GEWE-TOKEN': '{{gewe-token}}', - 'Content-Type': 'application/json' -} - -response = requests.request("POST", url, headers=headers, data=payload) - -print(response.text) \ No newline at end of file diff --git a/gewechat/config.toml b/gewechat/config.toml deleted file mode 100644 index e01583f..0000000 --- a/gewechat/config.toml +++ /dev/null @@ -1,5 +0,0 @@ -[Gewechat] -base_url= "http://192.168.2.240:2531/v2/api" -gewechat_token= "cb43f52db27e4a56bb6ec7da54373582" -app_id="wx_3BC6eSHGE5xEm_hH3__7c" -callback_url="http://192.168.2.212:8999/gewechat/message/callback" diff --git a/gewechat/response/__init__.py b/gewechat/response/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/gewechat/response/gewe_resp.py b/gewechat/response/gewe_resp.py deleted file mode 100644 index 6303d1b..0000000 --- a/gewechat/response/gewe_resp.py +++ /dev/null @@ -1,56 +0,0 @@ -import typing - - -class GeweResponse: - """ - 通用的 Gewechat 响应处理类 - """ - - def __init__(self, resp: dict): - """ - :param resp: gewechat接口返回的原始字典 - """ - self.raw = resp - self.ret = resp.get("ret") - self.msg = resp.get("msg") - self.data = resp.get("data") - - def is_success(self) -> bool: - """ - 判断请求是否成功 - :return: True/False - """ - return self.ret == 200 - - def get_msg(self) -> str: - """ - 获取返回消息 - :return: 消息字符串 - """ - return self.msg or "" - - def get_data(self) -> typing.Any: - """ - 获取返回的数据对象,类型可能为dict、list、str等 - :return: data字段内容 - """ - return self.data - - def get_data_as_list(self) -> list: - """ - 获取data字段为list类型(若不是则返回空列表) - """ - if isinstance(self.data, list): - return self.data - return [] - - def get_data_as_dict(self) -> dict: - """ - 获取data字段为dict类型(若不是则返回空字典) - """ - if isinstance(self.data, dict): - return self.data - return {} - - def __repr__(self): - return f"" diff --git a/gewechat/response/model/__init__.py b/gewechat/response/model/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/gewechat/response/model/contacts/__init__.py b/gewechat/response/model/contacts/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/gewechat/response/model/contacts/brief_info.py b/gewechat/response/model/contacts/brief_info.py deleted file mode 100644 index 9d0031c..0000000 --- a/gewechat/response/model/contacts/brief_info.py +++ /dev/null @@ -1,31 +0,0 @@ -from dataclasses import dataclass -from typing import Optional, List - -@dataclass -class Datum: - alias: Optional[str] = None - big_head_img_url: Optional[str] = None - card_img_url: Optional[str] = None - city: Optional[str] = None - country: Optional[str] = None - description: Optional[str] = None - label_list: Optional[str] = None - nick_name: Optional[str] = None - phone_num_list: Optional[List[str]] = None - province: Optional[str] = None - py_initial: Optional[str] = None - quan_pin: Optional[str] = None - remark: Optional[str] = None - remark_py_initial: Optional[str] = None - remark_quan_pin: Optional[str] = None - sex: Optional[int] = None - signature: Optional[str] = None - small_head_img_url: Optional[str] = None - sns_bg_img: Optional[str] = None - user_name: Optional[str] = None - -@dataclass -class BriefInfo: - data: List[Datum] - msg: str - ret: int diff --git a/gewechat/response/model/contacts/contacts_list.py b/gewechat/response/model/contacts/contacts_list.py deleted file mode 100644 index 87e2990..0000000 --- a/gewechat/response/model/contacts/contacts_list.py +++ /dev/null @@ -1,19 +0,0 @@ -from dataclasses import dataclass -from typing import List - - -@dataclass -class Data: - """保存到通讯录中群聊的ID""" - chatrooms: List[str] - """好友的wxid""" - friends: List[str] - """关注的公众号ID""" - ghs: List[str] - - -@dataclass -class ContactsList: - data: Data - msg: str - ret: int \ No newline at end of file diff --git a/gewechat/response/model/contacts/detail_info.py b/gewechat/response/model/contacts/detail_info.py deleted file mode 100644 index c2bfa24..0000000 --- a/gewechat/response/model/contacts/detail_info.py +++ /dev/null @@ -1,53 +0,0 @@ -from dataclasses import dataclass -from typing import Optional, List - - -@dataclass -class Datum: - """好友的微信号""" - alias: str - """大尺寸头像链接""" - big_head_img_url: str - """好友描述的图片链接""" - card_img_url: None - """城市""" - city: None - """国家""" - country: str - """好友的描述""" - description: None - """好友的标签ID""" - label_list: None - """好友的昵称""" - nick_name: str - """好友的手机号码""" - phone_num_list: None - """省份""" - province: None - """好友昵称的拼音首字母""" - py_initial: None - """好友昵称的全拼""" - quan_pin: str - """好友备注""" - remark: None - """好友备注的拼音首字母""" - remark_py_initial: None - """好友备注的全拼""" - remark_quan_pin: None - """好友的性别""" - sex: Optional[int] = None - """好友的签名""" - signature: Optional[str] = None - """小尺寸头像链接""" - small_head_img_url: Optional[str] = None - """朋友圈背景图链接""" - sns_bg_img: Optional[str] = None - """好友的wxid""" - user_name: Optional[str] = None - - -@dataclass -class ContactsDetailInfo: - data: List[Datum] - msg: str - ret: int \ No newline at end of file diff --git a/gewechat/response/model/group/__init__.py b/gewechat/response/model/group/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/gewechat/response/model/group/chatroom_info.py b/gewechat/response/model/group/chatroom_info.py deleted file mode 100644 index e49b4ab..0000000 --- a/gewechat/response/model/group/chatroom_info.py +++ /dev/null @@ -1,54 +0,0 @@ -from dataclasses import dataclass -from typing import Optional, List - - -@dataclass -class MemberList: - """大尺寸头像""" - big_head_img_url: None - """在本群内的昵称""" - display_name: None - """标识""" - member_flag: int - """群成员的昵称""" - nick_name: str - """小尺寸头像""" - small_head_img_url: None - """群成员的wxid""" - wxid: str - """邀请人的wxid""" - inviter_user_name: Optional[str] = None - - -@dataclass -class Data: - """群ID""" - chatroom_id: str - """群消息是否提醒""" - chat_room_notify: int - """群主的wxid""" - chat_room_owner: str - """群成员列表""" - member_list: List[MemberList] - """群名称""" - nick_name: str - """群名称的拼音首字母""" - py_initial: str - """群名称的全拼""" - quan_pin: str - """群备注,仅自己可见""" - remark: str - """群备注的拼音首字母""" - remark_py_initial: str - """群备注的全拼""" - remark_quan_pin: str - sex: int - """群头像链接""" - small_head_img_url: str - - -@dataclass -class ChatroomInfo: - data: Data - msg: str - ret: int \ No newline at end of file diff --git a/gewechat/response/model/group/chatroom_member_detail.py b/gewechat/response/model/group/chatroom_member_detail.py deleted file mode 100644 index a444dce..0000000 --- a/gewechat/response/model/group/chatroom_member_detail.py +++ /dev/null @@ -1,61 +0,0 @@ -from dataclasses import dataclass -from typing import List, Optional - - -@dataclass -class Datum: - """大尺寸头像""" - big_head_img_url: str - """描述的图片链接""" - card_img_url: None - """消息通知""" - chat_room_notify: int - """国家""" - country: str - """描述""" - description: None - """好友的wxid""" - friend_user_name: str - """群成员的昵称""" - nick_name: str - """手机号码""" - phone_num_list: List[str] - """群成员昵称的拼音首字母""" - py_initial: str - """群成员昵称的全拼""" - quan_pin: str - """性别""" - sex: int - """小尺寸头像""" - small_head_img_url: str - """朋友圈背景图链接""" - sns_bg_img: str - """群成员的wxid""" - user_name: str - """微信号""" - alias: Optional[str] = None - """城市""" - city: Optional[str] = None - """邀请人的wxid""" - inviter_user_name: Optional[str] = None - """标签列表,多个英文逗号分隔""" - label_list: Optional[str] = None - """标识""" - member_flag: Optional[int] = None - """省份""" - province: Optional[str] = None - """备注""" - remark: Optional[str] = None - """备注的拼音首字母""" - remark_py_initial: Optional[str] = None - """备注的全拼""" - remark_quan_pin: Optional[str] = None - """签名""" - signature: Optional[str] = None - - -@dataclass -class ChatroomMemberDetail: - data: List[Datum] - msg: str - ret: int diff --git a/gewechat/response/model/group/chatroom_member_list.py b/gewechat/response/model/group/chatroom_member_list.py deleted file mode 100644 index 0ab6229..0000000 --- a/gewechat/response/model/group/chatroom_member_list.py +++ /dev/null @@ -1,37 +0,0 @@ -from dataclasses import dataclass -from typing import Optional, List - - -@dataclass -class MemberList: - """大尺寸头像""" - big_head_img_url: str - """标识""" - member_flag: int - """群成员昵称""" - nick_name: str - """小尺寸头像""" - small_head_img_url: str - """群成员的wxid""" - wxid: str - """在本群内的昵称""" - display_name: Optional[str] = None - """邀请人的wxid""" - inviter_user_name: Optional[str] = None - - -@dataclass -class Data: - """管理的wxid""" - admin_wxid: None - """群主的wxid""" - chatroom_owner: None - """群成员列表""" - member_list: List[MemberList] - - -@dataclass -class ChatroomMemberList: - data: Data - msg: str - ret: int diff --git a/gewechat/response/model/personal/__init__.py b/gewechat/response/model/personal/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/gewechat/response/model/personal/profile.py b/gewechat/response/model/personal/profile.py deleted file mode 100644 index 0fdfae3..0000000 --- a/gewechat/response/model/personal/profile.py +++ /dev/null @@ -1,41 +0,0 @@ -from dataclasses import dataclass -from typing import Optional - - -@dataclass -class Data: - """微信号""" - alias: Optional[str] = None - """大尺寸头像""" - big_head_img_url: Optional[str] = None - """城市""" - city: Optional[str] = None - """国家""" - country: Optional[str] = None - """绑定的手机号""" - mobile: Optional[str] = None - """昵称""" - nick_name: Optional[str] = None - """省份""" - province: Optional[str] = None - """注册国家""" - reg_country: Optional[str] = None - """性别""" - sex: Optional[int] = None - """签名""" - signature: Optional[str] = None - """小尺寸头像""" - small_head_img_url: Optional[str] = None - """朋友圈背景图""" - sns_bg_img: Optional[str] = None - """uin""" - uin: Optional[int] = None - """微信ID""" - wxid: Optional[str] = None - - -@dataclass -class Profile: - data: Optional[Data] = None - msg: Optional[str] = None - ret: Optional[int] = None \ No newline at end of file diff --git a/main.py b/main.py index 26262d2..b906285 100644 --- a/main.py +++ b/main.py @@ -1,58 +1,46 @@ #! /usr/bin/env python3 # -*- coding: utf-8 -*- -import logging import threading from argparse import ArgumentParser from configuration import Config from constants import ChatType -from gewechat.api.start_server import start_fastapi_server -from gewechat.client import gewe_client from robot import Robot -# 配置日志 -logger = logging.getLogger(__name__) +from loguru import logger + +# INFO 日志(包含 INFO、DEBUG,但不包含 WARNING、ERROR) +logger.add( + f"wx_info.log", + level="INFO", + filter=lambda record: record["level"].name in ["INFO", "DEBUG"], + rotation="10 MB", + retention="7 days", + encoding="utf-8" +) + +# ERROR 日志(仅 ERROR 及以上) +logger.add( + f"wx_error.log", + level="ERROR", + rotation="10 MB", + retention="7 days", + encoding="utf-8" +) def main(chat_type: int): config = Config() - send_msg_wxid = "filehelper" # 要发送消息的好友昵称 - - start_fastapi_server(host="0.0.0.0", port=8999) # 创建机器人实例 robot = Robot(config) - robot.LOG.info(f"WeChatRobot gewechat 成功启动···") + robot.LOG.info(f"WeChatRobot 正在启动...") - # # 注册Robot实例到callback模块 - from gewechat.api.callback import register_robot - register_robot(gewe_client.app_id, robot) - - # 机器人启动发送测试消息 - gewe_client.client.post_text(gewe_client.app_id, send_msg_wxid, "client 启动成功!") - # - # # 每天 8:30 发送新闻 - # robot.onEveryTime("08:30", robot.news_baidu_report_auto) - # - # # epic - # robot.onEveryTime("10:30", robot.send_epic_free_games) - # - # # message report 1:数据自动从redis 转到sqllite - # robot.onEveryTime("02:30", robot.message_count_to_db) - # # 从db中提取并发送给相关群 - # robot.onEveryTime("09:30", robot.generate_and_send_ranking) - # - # # sehuatang - # robot.onEveryTime("15:30", robot.generate_sehuatang_pdf) - # - # # 秀人网每天自动下载帖子 - # robot.onEveryTime("01:30", robot.xiu_ren_download_task) - # - # # 秀人网每天自动发pdf - # robot.onEveryTime("17:30", robot.xiu_ren_pdf_send) - # time.sleep(5) - # # 启动之后,填入callback - # gewe_client.client_set_callback() - # # 返回启动的端口,以便调用者知道实际使用的端口 + # 初始化并启动wechat_ipad客户端 + if robot.init_wechat_ipad(): + robot.LOG.info("wechat_ipad客户端启动成功") + else: + robot.LOG.error("wechat_ipad客户端启动失败") + # 启动Dashboard服务器 dashboard_server = None try: @@ -74,5 +62,5 @@ def main(chat_type: int): if __name__ == "__main__": parser = ArgumentParser() parser.add_argument('-c', type=int, default=0, help=f'选择模型参数序号: {ChatType.help_hint()}') - args = parser.parse_args().c - main(args) + args = parser.parse_args() + main(args.c) diff --git a/message_util.py b/message_util.py index 06f65a3..caf35d9 100644 --- a/message_util.py +++ b/message_util.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- -import logging +from loguru import logger import os.path import random import time +from typing import Any, Tuple, Coroutine - -from gewechat.client import gewe_client from utils.wechat.contact_manager import ContactManager +from wechat_ipad import WechatAPIClient class MessageUtil: @@ -15,11 +15,10 @@ class MessageUtil: """ # 修改 MessageUtil 类的初始化方法,接受联系人管理器而不是联系人字典 - def __init__(self): - self.app_id = gewe_client.app_id - self.client = gewe_client.client + def __init__(self, client: WechatAPIClient = None): + self.client = client self.contact_manager = ContactManager.get_instance() - self.LOG = logging.getLogger("MessageUtil") + self.LOG = logger def send_text(self, msg: str, receiver: str, at_list: str = "") -> None: """ @@ -39,15 +38,15 @@ class MessageUtil: else: wxids = at_list.split(",") if len(wxids) > 0: - ats += self.get_user_chatroom_nickname(receiver, wxids) + ats += self.client.get_nickname(receiver) # {msg}{ats} 表示要发送的消息内容后面紧跟@,例如 北京天气情况为:xxx @张三 if ats == "": self.LOG.info(f"To {receiver}: {msg}") - self.client.post_text(self.app_id, receiver, "{msg}", "") + self.client.send_text_message(receiver, "{msg}", "") else: self.LOG.info(f"To {receiver}: {ats}\r{msg}") - self.client.post_text(self.app_id, receiver, f"{ats}\n{msg}", at_list) + self.client.send_text_message(receiver, f"{ats}\n{msg}", at_list) def send_file(self, file_path: str, receiver: str) -> str: """ @@ -64,7 +63,7 @@ class MessageUtil: self.LOG.info(f"Sending file to {path}: {filename}") return self.client.post_file(self.app_id, receiver, file_path, filename) - def send_image(self, image_path: str, receiver: str) -> str: + def send_image(self, image_path: str, receiver: str) -> Coroutine[Any, Any, tuple[int, int, int]]: """ 发送文件消息 @@ -75,7 +74,7 @@ class MessageUtil: time.sleep(random.uniform(0.5, 1.5)) self.LOG.info(f"Sending file to {receiver}: {image_path}") - return self.client.post_image(self.app_id, receiver, image_path) + return self.client.send_image_message(receiver, image_path) def send_rich_text(self, name: str, account: str, title: str, digest: str, url: str, thumburl: str, receiver: str) -> int: @@ -105,18 +104,12 @@ class MessageUtil: time.sleep(random.uniform(0.5, 1.5)) self.LOG.info(f"Sending rich text to {receiver}: {title}") - return self.client.post_link(self.app_id, receiver, title, digest, url, thumburl) - - def get_user_chatroom_nickname(self, chatroom_id: str, member_wxids: list[str]) -> str: - data = self.client.get_chatroom_member_detail(self.app_id, chatroom_id, member_wxids) - nicknames_with_at = [" @" + member["nickName"] for member in data["data"] if member.get("nickName")] - return " ".join(nicknames_with_at) + return self.client.send_link_message(self.app_id, receiver, title, digest, url, thumburl) def invite_member(self, group_id, sender): - return self.client.invite_member(self.app_id, sender, group_id, "自动加群邀请") + return self.client.invite_chatroom_member( sender, group_id) def get_chatroom_members(self, group_id) -> dict: data = self.client.get_chatroom_member_list(self.app_id, group_id) members = {member["wxid"]: member["nickName"] for member in data["data"]["memberList"]} return members - diff --git a/plugin_common/message_plugin_interface.py b/plugin_common/message_plugin_interface.py index 1a5e2a5..ded63c5 100644 --- a/plugin_common/message_plugin_interface.py +++ b/plugin_common/message_plugin_interface.py @@ -1,19 +1,20 @@ from typing import Dict, Any, Tuple, Optional, List from plugin_common.plugin_interface import PluginInterface + class MessagePluginInterface(PluginInterface): """消息处理插件接口""" - + @property def command_prefix(self) -> Optional[str]: """命令前缀,如 '/'""" return None - + @property def commands(self) -> List[str]: """支持的命令列表""" return [] - + def can_process(self, message: Dict[str, Any]) -> bool: """ 检查插件是否可以处理该消息 @@ -31,7 +32,7 @@ class MessagePluginInterface(PluginInterface): command = content[len(self.command_prefix):].split()[0] return command in self.commands return False - + def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """ 处理消息 @@ -44,4 +45,4 @@ class MessagePluginInterface(PluginInterface): Returns: (是否已处理, 处理结果) """ - raise NotImplementedError("子类必须实现此方法") \ No newline at end of file + raise NotImplementedError("子类必须实现此方法") diff --git a/plugin_common/plugin_interface.py b/plugin_common/plugin_interface.py index 06e781a..9d3da5f 100644 --- a/plugin_common/plugin_interface.py +++ b/plugin_common/plugin_interface.py @@ -1,7 +1,7 @@ import os import toml from abc import ABC, abstractmethod -import logging +from loguru import logger from enum import Enum from typing import Dict, Any, List, Optional, Tuple @@ -63,7 +63,7 @@ class PluginInterface(ABC): self._config = {} self._plugin_path = "" # 初始化日志记录器 - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger def load_config(self) -> bool: """ @@ -187,7 +187,7 @@ class PluginInterface(ABC): """ return False - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """ 处理消息 diff --git a/plugin_common/plugin_manager.py b/plugin_common/plugin_manager.py index e04caaa..4260c10 100644 --- a/plugin_common/plugin_manager.py +++ b/plugin_common/plugin_manager.py @@ -1,10 +1,11 @@ import importlib import inspect -import logging import os import sys from typing import Dict, List, Any, Optional, Type, Tuple +from loguru import logger + from plugin_common.plugin_interface import PluginInterface, PluginStatus from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.scheduled_plugin_interface import ScheduledPluginInterface @@ -53,7 +54,7 @@ class PluginManager: self.module_to_display = {} # 模块名到显示名的映射 self.system_context = {} # 系统上下文 - self.LOG = logging.getLogger(__name__) + self.LOG = logger # 确保插件目录存在 if not os.path.exists(self.plugin_dir): os.makedirs(self.plugin_dir) diff --git a/plugins/beautyleg/main.py b/plugins/beautyleg/main.py index 40ab45c..1f20fad 100644 --- a/plugins/beautyleg/main.py +++ b/plugins/beautyleg/main.py @@ -1,9 +1,7 @@ -import logging import os import random from typing import Dict, Any, List, Optional, Tuple - from message_util import MessageUtil from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus @@ -47,7 +45,6 @@ class BeautyLegPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 diff --git a/plugins/dify/main.py b/plugins/dify/main.py index 52beb36..5a9447f 100644 --- a/plugins/dify/main.py +++ b/plugins/dify/main.py @@ -6,6 +6,7 @@ import time import re # 添加re模块导入 from typing import Dict, Any, List, Optional, Tuple +from loguru import logger from message_util import MessageUtil from plugin_common.message_plugin_interface import MessagePluginInterface @@ -15,6 +16,7 @@ from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotMan from utils.decorator.points_decorator import plugin_points_cost from utils.media_downloader import MediaDownloader from utils.string_utils import remove_trailing_content +from wechat_ipad import WechatAPIClient class DifyPlugin(MessagePluginInterface): @@ -58,7 +60,6 @@ class DifyPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 @@ -114,7 +115,7 @@ class DifyPlugin(MessagePluginInterface): @plugin_stats_decorator(plugin_name="Dify聊天") @plugin_points_cost(2, "AI聊天消耗积分", Feature.AI_CAPABILITY) - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() self.LOG.info(f"插件执行: {self.name}:{content}") @@ -122,6 +123,7 @@ class DifyPlugin(MessagePluginInterface): roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") + bot: WechatAPIClient = message.get("bot") # 处理被@的消息 if message.get("is_at", False) and roomid: # 检查权限 @@ -132,14 +134,14 @@ class DifyPlugin(MessagePluginInterface): query = re.sub(r"@.*?[\u2005|\s]", "", content).strip() if not query: - self.message_util.send_text("请在@我的同时提供问题内容", roomid, sender) + await bot.send_text_message(roomid, "请在@我的同时提供问题内容", sender) return False, "没有提供问题内容" # self.message_util.send_text_msg("⏳AI 正在加油,请稍候… 😊", roomid, sender) try: # 调用Dify API获取回复 - response = self._chat_with_dify(roomid, sender, query) + response = self._chat_with_dify((roomid if roomid else sender), sender, query) # 去除广告内容 response = remove_trailing_content(response) @@ -151,15 +153,15 @@ class DifyPlugin(MessagePluginInterface): self.message_util.send_file(response, roomid) else: # 如果是普通文本,使用发送文本方法 - self.message_util.send_text(response, roomid, sender) + await bot.send_text_message((roomid if roomid else sender), response, sender) return True, "发送成功" else: - self.message_util.send_text("❌未能获取到回复,请稍后再试", roomid, sender) + await bot.send_text_message((roomid if roomid else sender), "❌未能获取到回复,请稍后再试", sender) return False, "未获取到回复" except Exception as e: self.LOG.error(f"处理Dify聊天请求出错: {e}") - self.message_util.send_text(f"❌请求出错:{str(e)}", roomid, sender) + await bot.send_text_message((roomid if roomid else sender), "❌未能获取到回复,请稍后再试", sender) return False, f"处理出错: {e}" # 原有的命令处理逻辑 @@ -168,8 +170,7 @@ class DifyPlugin(MessagePluginInterface): # 检查命令格式 if len(parts) < 2 or not parts[1].strip(): - self.message_util.send_text(f"{self.command_format}", - (roomid if roomid else sender), sender) + await bot.send_text_message((roomid if roomid else sender), f"{self.command_format}", sender) return False, "命令格式错误" # 检查权限 @@ -199,16 +200,17 @@ class DifyPlugin(MessagePluginInterface): self.message_util.send_file(response, (roomid if roomid else sender)) else: # 如果是普通文本,使用发送文本方法 - self.message_util.send_text(response, (roomid if roomid else sender), sender if roomid else "") + await bot.send_text_message((roomid if roomid else sender), response, + sender if roomid else "") return True, "发送成功" else: - self.message_util.send_text("❌未能获取到回复,请稍后再试", (roomid if roomid else sender), + await bot.send_text_message((roomid if roomid else sender), "❌未能获取到回复,请稍后再试", sender if roomid else "") return False, "未获取到回复" except Exception as e: self.LOG.error(f"处理Dify聊天请求出错: {e}") - self.message_util.send_text(f"❌请求出错:{str(e)}", (roomid if roomid else sender), + await bot.send_text_message((roomid if roomid else sender), f"❌请求出错:{str(e)}", sender if roomid else "") return False, f"处理出错: {e}" diff --git a/plugins/douyin_parser/main.py b/plugins/douyin_parser/main.py index c3790ef..8ba55bc 100644 --- a/plugins/douyin_parser/main.py +++ b/plugins/douyin_parser/main.py @@ -1,4 +1,3 @@ -import logging import os import re import time @@ -6,6 +5,8 @@ import traceback import requests from typing import Dict, Any, List, Optional, Tuple +from loguru import logger + from message_util import MessageUtil from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus @@ -47,6 +48,7 @@ class DouyinParserPlugin(MessagePluginInterface): def __init__(self): super().__init__() + self.LOG = logger self.url_pattern = re.compile(r'https?://v\.douyin\.com/\w+/?') # 修改为使用插件目录下的down_load_dir文件夹 self.download_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "down_load_dir") @@ -56,7 +58,6 @@ class DouyinParserPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 diff --git a/plugins/game_task/main.py b/plugins/game_task/main.py index 1836b3f..a829cc2 100644 --- a/plugins/game_task/main.py +++ b/plugins/game_task/main.py @@ -1,8 +1,9 @@ import random -import logging from datetime import datetime from typing import Dict, Any, List, Optional, Tuple +from loguru import logger + from message_util import MessageUtil from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus @@ -12,6 +13,7 @@ from utils.decorator.points_decorator import points_reward_decorator from utils.ai.game_chatgpt_qa import game_question_json, game_answer_json from db.connection import DBConnectionManager from db.encyclopedia import EncyclopediaDB +from wechat_ipad import WechatAPIClient class GameTaskPlugin(MessagePluginInterface): @@ -43,10 +45,11 @@ class GameTaskPlugin(MessagePluginInterface): def __init__(self): super().__init__() + self.LOG = logger + self.bot: WechatAPIClient = None def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 @@ -70,7 +73,6 @@ class GameTaskPlugin(MessagePluginInterface): # 初始化数据库连接 self.db_manager = DBConnectionManager.get_instance() self.encyclopedia_db = EncyclopediaDB(self.db_manager) - self.LOG.info(f"[{self.name}] 插件初始化完成,指令:{self._commands}") return True @@ -106,7 +108,7 @@ class GameTaskPlugin(MessagePluginInterface): return 0 @plugin_stats_decorator(plugin_name="百科问答") - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() command = content.split(" ")[0].lower() @@ -115,6 +117,7 @@ class GameTaskPlugin(MessagePluginInterface): gbm: GroupBotManager = message.get("gbm") all_contacts = message.get("all_contacts", {}) + self.bot = message.get("bot") self.LOG.info(f"插件执行: {self.name}:{content}") # 检查权限 @@ -126,22 +129,22 @@ class GameTaskPlugin(MessagePluginInterface): wx_nick_name = all_contacts.get(sender, sender) if command == "/s": - self._handle_join_game(sender, roomid, wx_nick_name) + await self._handle_join_game(sender, roomid, wx_nick_name) return True, "加入游戏成功" elif command == "/t": - self._handle_get_task(sender, roomid) + await self._handle_get_task(sender, roomid) return True, "获取任务成功" elif command == "/a": # 这里传递整个消息对象给处理方法 - return self._handle_submit_answer(message) + return await self._handle_submit_answer(message) elif command == "/r": - self._handle_show_rank(sender, roomid) + await self._handle_show_rank(sender, roomid) return True, "显示排行榜成功" elif command == "/l": - self._handle_show_active_tasks(sender, roomid) + await self._handle_show_active_tasks(sender, roomid) return True, "显示活跃任务成功" elif command == "/h": - self._handle_list_uncompleted_tasks(sender, roomid) + await self._handle_list_uncompleted_tasks(sender, roomid) return True, "列举未完成任务成功" else: self.message_util.send_text(f"❌未知命令!\n{self.command_format}", @@ -152,15 +155,15 @@ class GameTaskPlugin(MessagePluginInterface): self.LOG.error(f"处理消息出错: {e}") return False, f"处理出错: {e}" - def _handle_join_game(self, sender: str, roomid: str, wx_nick_name: str) -> None: + async def _handle_join_game(self, sender: str, roomid: str, wx_nick_name: str) -> None: """处理加入游戏请求""" try: # 检查并添加群聊 if not self.encyclopedia_db.check_group_exists(roomid): self.encyclopedia_db.add_group(roomid) - self.message_util.send_text( - f"🎉 群 {roomid} 已就位,准备开燥!", + await self.bot.send_text_message( (roomid if roomid else sender), + f"🎉 群 {roomid} 已就位,准备开燥!", sender ) @@ -168,22 +171,22 @@ class GameTaskPlugin(MessagePluginInterface): player = self.encyclopedia_db.get_player(sender, roomid) if not player: self.encyclopedia_db.add_player(sender, roomid, wx_nick_name) - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"🎉 哇塞,{wx_nick_name} 你来啦!\n" f"🌟 群 {roomid} 瞬间燃爆!\n" f"🎈 快来接任务,秀翻全场!指令: /t", - (roomid if roomid else sender), sender ) except Exception as e: self.LOG.error(f"加入游戏出错: {e}") - self.message_util.send_text( - f"😔 加入游戏出错,请稍后再试!", + await self.bot.send_text_message( (roomid if roomid else sender), + f"😔 加入游戏出错,请稍后再试!", sender ) - def _handle_get_task(self, sender: str, roomid: str) -> None: + async def _handle_get_task(self, sender: str, roomid: str) -> None: """处理获取任务请求""" try: # 获取群内所有玩家 @@ -194,35 +197,35 @@ class GameTaskPlugin(MessagePluginInterface): # 检查并添加群聊 if not self.encyclopedia_db.check_group_exists(roomid): self.encyclopedia_db.add_group(roomid) - self.message_util.send_text( - f"🎉 群 {roomid} 已就位,准备开燥!", + await self.bot.send_text_message( (roomid if roomid else sender), + f"🎉 群 {roomid} 已就位,准备开燥!", sender ) - + # 获取用户昵称 (从all_contacts中获取可能不可行,因为这里没有all_contacts参数) # 使用sender作为临时昵称 wx_nick_name = sender - + # 添加当前用户为玩家 self.encyclopedia_db.add_player(sender, roomid, wx_nick_name) - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"🎉 哇塞,{wx_nick_name} 你是第一个玩家!\n" f"🌟 已自动为你加入游戏!\n" f"🎈 现在就为你准备题目...", - (roomid if roomid else sender), sender ) - + # 更新玩家列表 players = self.encyclopedia_db.get_all_players_in_group(roomid) - + player_dict = {p['player_id']: p['player_name'] for p in players} if sender not in player_dict: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😅 嘿,你谁啊?\n" f"🌟 先用 /s 报名,不然没法玩哦!", - (roomid if roomid else sender), sender ) return @@ -241,32 +244,32 @@ class GameTaskPlugin(MessagePluginInterface): ) if not active_task_id: - self.message_util.send_text( - f"😔 任务创建失败,请稍后再试!", + await self.bot.send_text_message( (roomid if roomid else sender), + f"😔 任务创建失败,请稍后再试!", sender ) return - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"🎁 {player_dict[sender]},你的专属任务闪亮登场!\n" f"🎀 任务ID: {active_task_id}\n" f"🎈 问题:[{category}]{question}\n" f"🌼 积分:{score}\n" f"🌈 快上答案:/a {active_task_id} 答案", - (roomid if roomid else sender), sender ) except Exception as e: self.LOG.error(f"获取任务出错: {e}") - self.message_util.send_text( - f"😔 获取任务出错,请稍后再试!", + await self.bot.send_text_message( (roomid if roomid else sender), + f"😔 获取任务出错,请稍后再试!", sender ) @points_reward_decorator(calculate_game_points, "game", "百科答题奖励", Feature.TASK_GAME) - def _handle_submit_answer(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def _handle_submit_answer(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理提交答案请求""" try: content = str(message.get("content", "")).strip() @@ -274,11 +277,11 @@ class GameTaskPlugin(MessagePluginInterface): roomid = message.get("roomid", "") parts = content.split(" ", 2) if len(parts) < 3: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😅 喂,格式不对啊!\n" f"🌟 正确姿势:/a [任务ID] [答案]\n" f"🎈 比如:/a 1 钒", - (roomid if roomid else sender), sender ) return False, "0" @@ -289,10 +292,10 @@ class GameTaskPlugin(MessagePluginInterface): # 获取玩家信息 player = self.encyclopedia_db.get_player(sender, roomid) if not player: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😅 嘿,你是路人甲吗?\n" f"🌟 用 /s 先加入群 {roomid} 吧!", - (roomid if roomid else sender), sender ) return False, "0" @@ -300,11 +303,11 @@ class GameTaskPlugin(MessagePluginInterface): player_name = player['player_name'] if not task_id.isdigit(): - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😅 喂,任务ID得是数字好吗?\n" f"🌟 比如:1\n" f"🎈 别瞎搞,重新来!", - (roomid if roomid else sender), sender ) return False, "0" @@ -315,20 +318,20 @@ class GameTaskPlugin(MessagePluginInterface): task_data = self.encyclopedia_db.get_task_by_id(roomid, active_task_id) if not task_data: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😔 哎哟,任务 task_{active_task_id} 不翼而飞啦!\n" f"🌼 可能被别人抢先一步咯!", - (roomid if roomid else sender), sender ) return False, "0" if task_data['status'] == 'completed': - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😄 哈哈,你慢了一步!\n" f"🌟 任务 task_{active_task_id} 已经完结\n" f"🎈 快去抢新任务吧!", - (roomid if roomid else sender), sender ) return False, "0" @@ -358,30 +361,31 @@ class GameTaskPlugin(MessagePluginInterface): self.encyclopedia_db.complete_task(active_task_id) if sender == holder_id: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"🎉 {player_name} 你是天才吗?\n" f"🌟 任务:{question}\n" f"🎈 答对啦,简直无敌!\n" f"🌈 奖励:{points} 分\n" f"🎀 彩蛋:{description}", - (roomid if roomid else sender), sender ) else: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"🎉 {player_name} 抢答王上线!\n" f"🌟 任务:{question}\n" f"🎈 原主:{holder_name} 被你截胡啦!\n" f"🌈 狂揽 {points} 分,太骚了!\n" f"🎀 彩蛋:{description}", - (roomid if roomid else sender), sender ) else: # 扣除积分 self.encyclopedia_db.update_player_points(sender, roomid, -1) points = -1 - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😅 {player_name} 你这是要笑死我吗?\n" f"🌼 任务:{question}\n" f"🎈 你答:{answer}\n" @@ -389,7 +393,6 @@ class GameTaskPlugin(MessagePluginInterface): f"🌈 扣 1 分,别哭哦!\n" f"🎀 提示:{description}\n" f"🌟 任务ID: {active_task_id} 还能抢救一下!", - (roomid if roomid else sender), sender ) @@ -398,17 +401,17 @@ class GameTaskPlugin(MessagePluginInterface): self.LOG.error(f"提交答案出错: {e}") return False, "0" - def _handle_show_rank(self, sender: str, roomid: str) -> None: + async def _handle_show_rank(self, sender: str, roomid: str) -> None: """处理显示排行榜请求""" try: # 获取排行榜 ranks = self.encyclopedia_db.get_player_ranking(roomid, 10) if not ranks: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😔 群 {roomid} 冷冷清清\n" f"🌟 快来一起燥起来吧!", - (roomid if roomid else sender), sender ) return @@ -424,23 +427,23 @@ class GameTaskPlugin(MessagePluginInterface): ) except Exception as e: self.LOG.error(f"显示排行榜出错: {e}") - self.message_util.send_text( - f"😔 获取排行榜出错,请稍后再试!", + await self.bot.send_text_message( (roomid if roomid else sender), + f"😔 获取排行榜出错,请稍后再试!", sender ) - def _handle_show_active_tasks(self, sender: str, roomid: str) -> None: + async def _handle_show_active_tasks(self, sender: str, roomid: str) -> None: """处理显示活跃任务请求""" try: # 获取活跃任务 tasks = self.encyclopedia_db.get_active_tasks_in_group(roomid) if not tasks: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😄 群 {roomid} 现在一片祥和\n" f"🌟 没任务?快用 /t 搞一个!", - (roomid if roomid else sender), sender ) return @@ -453,30 +456,30 @@ class GameTaskPlugin(MessagePluginInterface): f"🌼 大佬:{task['player_name']}\n" ) - self.message_util.send_text( - task_text, + await self.bot.send_text_message( (roomid if roomid else sender), + task_text, sender ) except Exception as e: self.LOG.error(f"显示活跃任务出错: {e}") - self.message_util.send_text( - f"😔 获取活跃任务出错,请稍后再试!", + await self.bot.send_text_message( (roomid if roomid else sender), + f"😔 获取活跃任务出错,请稍后再试!", sender ) - def _handle_list_uncompleted_tasks(self, sender: str, roomid: str) -> None: + async def _handle_list_uncompleted_tasks(self, sender: str, roomid: str) -> None: """处理列举未完成任务请求""" try: # 获取未完成任务 tasks = self.encyclopedia_db.get_active_tasks_in_group(roomid) if not tasks: - self.message_util.send_text( + await self.bot.send_text_message( + (roomid if roomid else sender), f"😄 群 {roomid} 全员开挂?\n" f"🌟 没未完成任务,快用 /t 再战!", - (roomid if roomid else sender), sender ) return @@ -489,20 +492,20 @@ class GameTaskPlugin(MessagePluginInterface): f"🌼 主人:{task['player_name']}\n" ) - self.message_util.send_text( - task_text, + await self.bot.send_text_message( (roomid if roomid else sender), + task_text, sender ) except Exception as e: self.LOG.error(f"列举未完成任务出错: {e}") - self.message_util.send_text( - f"😔 获取未完成任务出错,请稍后再试!", + await self.bot.send_text_message( (roomid if roomid else sender), + f"😔 获取未完成任务出错,请稍后再试!", sender ) - def run_random_task_assignment(self) -> None: + async def run_random_task_assignment(self) -> None: """定时任务:整点触发,排除23:00-08:00""" current_hour = datetime.now().hour if current_hour >= 23 or current_hour < 9: @@ -538,14 +541,14 @@ class GameTaskPlugin(MessagePluginInterface): ) if active_task_id: - self.message_util.send_text( + await self.bot.send_text_message( + group_id, f"🎁 新任务来袭,够不够刺激?\n" f"🎀 任务ID: {active_task_id}\n" f"🌟 幸运鹅:{holder_name}\n" f"🎈 问题:[{category}]{question}\n" f"🌼 积分:{score}\n" - f"🌈 抢答格式:/a {active_task_id} 答案", - group_id + f"🌈 抢答格式:/a {active_task_id} 答案" ) except Exception as e: self.LOG.error(f"定时任务出错: {e}") diff --git a/plugins/global_news/main.py b/plugins/global_news/main.py index ec45a59..9312c43 100644 --- a/plugins/global_news/main.py +++ b/plugins/global_news/main.py @@ -1,4 +1,3 @@ -import logging import asyncio import threading import time # 添加这一行 @@ -12,6 +11,7 @@ from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotMan from utils.decorator.points_decorator import plugin_points_cost from utils.ai.dify_news_analyze import dify_news_title_analyze from utils.markdown_to_image import convert_md_str_to_image +from wechat_ipad import WechatAPIClient # 导入新闻抓取函数 from .news_crawler import nbc, cnn, abc, fox, bbc @@ -46,11 +46,12 @@ class GlobalNewsPlugin(MessagePluginInterface): def __init__(self): super().__init__() + + self.bot: WechatAPIClient = None self._news_tasks = {} # 存储正在进行的新闻抓取任务 def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 @@ -90,13 +91,14 @@ class GlobalNewsPlugin(MessagePluginInterface): @plugin_stats_decorator(plugin_name="全球政治经济新闻") @plugin_points_cost(5, "全球新闻消耗积分", Feature.NEWS) - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() self.LOG.info(f"插件执行: {self.name}:{content}") sender = message.get("sender") roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") + self.bot: WechatAPIClient = message.get("bot") # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.NEWS) == PermissionStatus.DISABLED: @@ -106,8 +108,8 @@ class GlobalNewsPlugin(MessagePluginInterface): task_id = f"{sender}_{roomid}_{int(time.time())}" # 发送等待消息 - self.message_util.send_text("🌍正在获取全球新闻,请稍候...", - (roomid if roomid else sender), sender) + await self.bot.send_text_message( + (roomid if roomid else sender), "🌍正在获取全球新闻,请稍候...", sender) # 启动异步任务 self._start_news_task(task_id, sender, roomid) @@ -125,7 +127,7 @@ class GlobalNewsPlugin(MessagePluginInterface): self._news_tasks[task_id] = thread self.LOG.info(f"启动新闻获取任务: {task_id}") - def _fetch_news_thread(self, task_id: str, sender: str, roomid: str): + async def _fetch_news_thread(self, task_id: str, sender: str, roomid: str): """在单独的线程中运行异步新闻获取任务""" try: loop = asyncio.new_event_loop() @@ -137,15 +139,15 @@ class GlobalNewsPlugin(MessagePluginInterface): if news_result: # 发送新闻图片 receiver = roomid if roomid else sender - self.message_util.send_image(news_result, receiver) - self.message_util.send_text("🌍全球新闻获取完成!", receiver, sender) + await self.bot.send_image_message(receiver, news_result) + await self.bot.send_text_message("🌍全球新闻获取完成!", receiver, sender) else: - self.message_util.send_text("❌获取新闻失败,请稍后再试", - (roomid if roomid else sender), sender) + await self.bot.send_text_message( + (roomid if roomid else sender), "❌获取新闻失败,请稍后再试", sender) except Exception as e: self.LOG.error(f"新闻获取任务出错: {e}") - self.message_util.send_text(f"❌获取新闻出错: {str(e)}", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), f"❌获取新闻出错: {str(e)}", + sender) finally: # 清理任务 if task_id in self._news_tasks: diff --git a/plugins/global_news/news_crawler.py b/plugins/global_news/news_crawler.py index 2e1486c..543d2e8 100644 --- a/plugins/global_news/news_crawler.py +++ b/plugins/global_news/news_crawler.py @@ -7,20 +7,10 @@ Created Date: 2024-05-01 import requests from time import localtime, sleep from lxml import etree -import logging +from loguru import logger from datetime import datetime import time -# 配置日志 -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(levelname)s - %(message)s', - handlers=[ - logging.FileHandler(f'global_news_{datetime.now().strftime("%Y%m%d")}.log'), - logging.StreamHandler() - ] -) -logger = logging.getLogger(__name__) # 请求配置 HEADERS = { diff --git a/plugins/group_auto_invite/main.py b/plugins/group_auto_invite/main.py index ece3a9d..31b8bfc 100644 --- a/plugins/group_auto_invite/main.py +++ b/plugins/group_auto_invite/main.py @@ -1,16 +1,14 @@ -import logging +from loguru import logger import redis import re from typing import Dict, Any, List, Optional, Tuple -from gewechat_client import GewechatClient - -from message_util import MessageUtil from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus from utils.decorator.plugin_decorators import plugin_stats_decorator from utils.robot_cmd.robot_command import GroupBotManager from utils.wechat.contact_manager import ContactManager +from wechat_ipad import WechatAPIClient class GroupAutoInvitePlugin(MessagePluginInterface): @@ -45,10 +43,10 @@ class GroupAutoInvitePlugin(MessagePluginInterface): # Redis 中存储群组映射的前缀 self.mapping_prefix = "group:group_mapping:" self._commands = [] + self.bot: WechatAPIClient = None def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") self.LOG.info(f"正在初始化 {self.name} 插件...") # 获取群管理器 @@ -56,8 +54,6 @@ class GroupAutoInvitePlugin(MessagePluginInterface): # 获取Redis连接池 self.redis_pool = context.get("redis_pool") - self.clent:GewechatClient = context.get("clent") - self.message_util: MessageUtil = context.get("message_util") # 从配置中获取命令和启用状态 plugin_config = self._config.get("GroupAutoInvite", {}) self._commands = plugin_config.get("command", ["#加群配置"]) @@ -105,7 +101,7 @@ class GroupAutoInvitePlugin(MessagePluginInterface): return False @plugin_stats_decorator(plugin_name="自动加群功能") - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() self.LOG.info(f"插件执行: {self.name}:{content}") @@ -114,25 +110,26 @@ class GroupAutoInvitePlugin(MessagePluginInterface): roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") + self.bot: WechatAPIClient = message.get("bot") # 处理加群配置命令 if content.startswith("#加群配置|"): - return self._handle_config_command(content, sender, roomid, gbm) + return await self._handle_config_command(content, sender, roomid, gbm) # 处理加群请求 match = re.search(r"^#加群\s+(\w+)$", content) if match: - return self._handle_join_request(match.group(1), sender, roomid, gbm) + return await self._handle_join_request(match.group(1), sender, roomid, gbm) return False, "无法处理的消息" - def _handle_config_command(self, content: str, sender: str, roomid: str, gbm: GroupBotManager) -> Tuple[ + async def _handle_config_command(self, content: str, sender: str, roomid: str, gbm: GroupBotManager) -> Tuple[ bool, Optional[str]]: """处理配置命令""" # 检查是否为管理员 admin_list = self.gbm.get_admin_list() if sender not in admin_list: - self.message_util.send_text("⚠️ 权限不足,只有管理员才能配置群邀请功能", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), "⚠️ 权限不足,只有管理员才能配置群邀请功能", + sender) return True, "权限不足" # 解析命令 @@ -140,10 +137,10 @@ class GroupAutoInvitePlugin(MessagePluginInterface): result = self.process_command(command) # 发送结果 - self.message_util.send_text(result, (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), result, sender) return True, "配置命令处理成功" - def _handle_join_request(self, key: str, sender: str, roomid: str, gbm: GroupBotManager) -> Tuple[ + async def _handle_join_request(self, key: str, sender: str, roomid: str, gbm: GroupBotManager) -> Tuple[ bool, Optional[str]]: """处理加群请求""" try: @@ -152,29 +149,29 @@ class GroupAutoInvitePlugin(MessagePluginInterface): # 检查是否找到群ID if isinstance(group_id, str) and "没有关联的群ID" in group_id: - self.message_util.send_text(f"⚠️ 未找到关键词 '{key}' 对应的群聊", sender) + await self.bot.send_text_message(sender, f"⚠️ 未找到关键词 '{key}' 对应的群聊") return True, "未找到群聊" # 判断是否在群里面,如果在,则不添加 con = ContactManager.get_instance() members = con.get_group_members(group_id) # 如果在群里面,则不添加 if sender in members: - self.message_util.send_text(f"⚠️ 你已经在群聊中了,无需重复添加", sender) + await self.bot.send_text_message(sender, f"⚠️ 你已经在群聊中了,无需重复添加") return True, "你已经在群聊中了" # 发送邀请 self.LOG.info(f"邀请用户 {sender} 加入群 {group_id}") - result = self.message_util.invite_member(group_id, sender) + result = await self.bot.invite_chatroom_member(sender, group_id) if result: - self.message_util.send_text(f"✅ 已发送邀请,请查看群聊邀请通知", sender) + await self.bot.send_text_message(sender, f"✅ 已发送邀请,请查看群聊邀请通知") return True, "邀请发送成功" else: - self.message_util.send_text(f"❌ 邀请发送失败,请稍后再试", sender) + await self.bot.send_text_message(sender, f"❌ 邀请发送失败,请稍后再试") return False, "邀请发送失败" except Exception as e: self.LOG.error(f"处理加群请求出错: {e}") - self.message_util.send_text(f"❌ 处理加群请求出错: {e}", sender) + await self.bot.send_text_message(sender, f"❌ 处理加群请求出错: {e}") return False, f"处理出错: {e}" def add_mapping(self, key, group_id): diff --git a/plugins/group_member_change/main.py b/plugins/group_member_change/main.py index c40fb24..50a1f72 100644 --- a/plugins/group_member_change/main.py +++ b/plugins/group_member_change/main.py @@ -1,4 +1,3 @@ -import logging from datetime import datetime from typing import Dict, Any, List, Optional, Tuple @@ -6,16 +5,16 @@ import xml.etree.ElementTree as ET import dacite -from gewechat.client import gewe_client -from gewechat.response.model.group.chatroom_member_detail import ChatroomMemberDetail from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager from message_util import MessageUtil # 导入消息工具类 +from wechat_ipad import WechatAPIClient class GroupMemberChangePlugin(MessagePluginInterface): """群成员变更监控插件""" + @property def name(self) -> str: return "群成员变更监控" @@ -46,7 +45,6 @@ class GroupMemberChangePlugin(MessagePluginInterface): def __init__(self): super().__init__() - self.LOG = logging.getLogger(f"Plugin.{self.name}") def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" @@ -58,7 +56,11 @@ class GroupMemberChangePlugin(MessagePluginInterface): self.LOG.info(f"{self.name} 插件初始化完成") return True - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + def can_process(self, message: Dict[str, Any]) -> bool: + """检查是否可以处理该消息""" + return True + + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理接收到的消息""" content = str(message.get("content", "")).strip() @@ -67,6 +69,7 @@ class GroupMemberChangePlugin(MessagePluginInterface): roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") + bot: WechatAPIClient = message.get("bot") # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.GROUP_MEMBER_CHANGE) == PermissionStatus.DISABLED: return False, "没有权限" @@ -114,18 +117,18 @@ class GroupMemberChangePlugin(MessagePluginInterface): wxid = member["wxid"] nickname = member["nickname"] - now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + # now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") member_wxids = [wxid] - profile: ChatroomMemberDetail = dacite.from_dict(ChatroomMemberDetail, - gewe_client.client.get_chatroom_member_detail( - gewe_client.client.app_id, - member_wxids)) - if profile.ret == 200: - gewe_client.client.post_link(gewe_client.client.app_id, sender, - title=f"👏欢迎 {nickname} 加入群聊!🎉", - description=f"⌚时间:{now}\n", - url="https://hot.imsyy.top/#/", - thumb_url=profile.data[0].big_head_img_url) + + await bot.send_at_message(roomid, f"👏欢迎 {nickname} 加入群聊!🎉", member_wxids) + # members = await bot.get_contract_detail(member_wxids, roomid) + + # if members: + # gewe_client.client.post_link(gewe_client.client.app_id, sender, + # title=f"👏欢迎 {nickname} 加入群聊!🎉", + # description=f"⌚时间:{now}\n", + # url="https://hot.imsyy.top/#/", + # thumb_url=profile.data[0].big_head_img_url) return True, "已发送进群欢迎语" return False, "无需执行" diff --git a/plugins/group_virtual/main.py b/plugins/group_virtual/main.py index fd83314..d7c5bf9 100644 --- a/plugins/group_virtual/main.py +++ b/plugins/group_virtual/main.py @@ -1,7 +1,5 @@ -import logging from typing import Dict, Any, List, Optional, Tuple -from gewechat.call_back_message.message import WxMessage from message_util import MessageUtil from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus @@ -9,6 +7,7 @@ from utils.decorator.plugin_decorators import plugin_stats_decorator from utils.wechat.contact_manager import ContactManager from db.connection import DBConnectionManager from db.group_virtual_redis import GroupVirtualRedisDB +from wechat_ipad.models.message import WxMessage class GroupVirtualPlugin(MessagePluginInterface): @@ -46,7 +45,6 @@ class GroupVirtualPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 @@ -97,7 +95,7 @@ class GroupVirtualPlugin(MessagePluginInterface): """处理消息""" roomid = message.get("roomid", "") sender = message.get("sender", "") - full_wx_msg: WxMessage = message.get("full_wx_msg", "") + full_wx_msg: WxMessage = message.get("full_wx_msg") # 检查是否是机器人自己发送的消息 if full_wx_msg.from_self(): return False, "不转发自己的消息" diff --git a/plugins/message_recall/main.py b/plugins/message_recall/main.py index 9ad9e07..2a4abaf 100644 --- a/plugins/message_recall/main.py +++ b/plugins/message_recall/main.py @@ -1,4 +1,4 @@ -import logging +from loguru import logger from typing import Dict, Any, List, Tuple, Optional from message_util import MessageUtil @@ -40,7 +40,7 @@ class MessageRecallPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") self.event_system = context.get("event_system") diff --git a/plugins/message_sign/main.py b/plugins/message_sign/main.py index e8031f0..c503f8a 100644 --- a/plugins/message_sign/main.py +++ b/plugins/message_sign/main.py @@ -1,11 +1,9 @@ from datetime import datetime, timedelta -import logging +from loguru import logger import pytz from typing import Dict, Any, List, Optional, Tuple - from db.connection import DBConnectionManager -from message_util import MessageUtil from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus from utils.decorator.plugin_decorators import plugin_stats_decorator @@ -16,6 +14,7 @@ import random import os from utils.decorator.points_decorator import points_reward_decorator +from wechat_ipad import WechatAPIClient class MessageSignPlugin(MessagePluginInterface): @@ -56,15 +55,15 @@ class MessageSignPlugin(MessagePluginInterface): self.vocab_file_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "resource", "6 托福-乱序.txt") self.vocab_list = [] + self.bot: WechatAPIClient = None def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 self.event_system = context.get("event_system") - self.message_util: MessageUtil = context.get("message_util") self.gbm = context.get("gbm") self.all_contacts = context.get("all_contacts", {}) @@ -178,15 +177,15 @@ class MessageSignPlugin(MessagePluginInterface): # 使用数据库中已更新的连签天数 streak = user_record.get('signin_streak', 1) # 如果今天刚签到,连签天数已经+1,所以这里不需要再加1 - + # 计算积分 points = self.calculate_points(streak) - + return points # 修改 process_message 方法,作为路由分发 @plugin_stats_decorator(plugin_name="签到系统") - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() self.LOG.info(f"插件执行: {self.name}:{content}") @@ -194,6 +193,7 @@ class MessageSignPlugin(MessagePluginInterface): sender = message.get("sender") roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") + self.bot = message.get("bot") # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.SIGNIN) == PermissionStatus.DISABLED: @@ -201,17 +201,17 @@ class MessageSignPlugin(MessagePluginInterface): # 处理补签命令 if command in self._makeup_commands: - return self._handle_makeup_sign(message) + return await self._handle_makeup_sign(message) # 处理正常签到命令 if command in self._commands: - return self._handle_sign_in(message) + return await self._handle_sign_in(message) return False, "不支持的命令" # 添加签到处理方法,应用积分奖励装饰器 @points_reward_decorator(calculate_sign_in_points, "checkin", "每日签到奖励", Feature.SIGNIN) - def _handle_sign_in(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def _handle_sign_in(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理签到请求""" sender = message.get("sender") roomid = message.get("roomid", "") @@ -237,8 +237,8 @@ class MessageSignPlugin(MessagePluginInterface): # 如果 sign_stat 已经大于或等于今天的零点,则认为用户已经签到过了 if sign_stat >= today_start: - self.message_util.send_text(f"您今天已经签到过了!", - (roomid if roomid else sender), sender) + await self.bot.send_text_message( + (roomid if roomid else sender), f"您今天已经签到过了!", sender) return False, "已签到" # 在_handle_sign_in方法中,修改断签处理逻辑 @@ -313,13 +313,13 @@ class MessageSignPlugin(MessagePluginInterface): daily_vocab = self.get_random_vocabulary() output += f"\n今日词汇:{daily_vocab}" - self.message_util.send_text(output, (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), output, sender) return True, "签到成功" except Exception as e: self.LOG.error(f"处理签到请求出错: {e}") - self.message_util.send_text(f"签到出错:{e}", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), f"签到出错:{e}", + sender) return False, f"处理出错: {e}" def reset_today_count_if_needed(self): @@ -350,7 +350,7 @@ class MessageSignPlugin(MessagePluginInterface): # 修改_handle_makeup_sign方法,实现连签恢复功能 - def _handle_makeup_sign(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def _handle_makeup_sign(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理补签请求""" sender = message.get("sender") roomid = message.get("roomid", "") @@ -370,9 +370,9 @@ class MessageSignPlugin(MessagePluginInterface): # 检查用户是否有签到记录 if not user_record: - self.message_util.send_text( - "❌ 您还没有签到记录,请先进行签到!", - (roomid if roomid else sender), sender + await self.bot.send_text_message( + (roomid if roomid else sender), + "❌ 您还没有签到记录,请先进行签到!", sender ) return True, "无签到记录" @@ -403,27 +403,26 @@ class MessageSignPlugin(MessagePluginInterface): else: # 昨天已经签到了或者断签超过一天,不需要补签 self.LOG.info(f"不符合补签条件,last_sign_date: {last_sign_date}, sign_stat: {sign_stat}") - self.message_util.send_text( - "❌ 您昨天已经签到过了或断签超过一天,不符合补签条件!", - (roomid if roomid else sender), sender + await self.bot.send_text_message( + (roomid if roomid else sender), "❌ 您昨天已经签到过了或断签超过一天,不符合补签条件!", sender ) return True, "不符合补签条件" else: # 今天未签到,检查是否符合补签条件(只能补签昨天) if not last_sign_date or last_sign_date < day_before_yesterday: self.LOG.info(f"断签超过一天,last_sign_date: {last_sign_date}") - self.message_util.send_text( - "❌ 只能补签断签一天的情况!您已断签超过一天或没有签到记录。", - (roomid if roomid else sender), sender - ) + await self.bot.send_text_message((roomid if roomid else sender), + "❌ 只能补签断签一天的情况!您已断签超过一天或没有签到记录。", + sender + ) return True, "不符合补签条件" if last_sign_date >= yesterday: self.LOG.info(f"昨天已签到,last_sign_date: {last_sign_date}") - self.message_util.send_text( - "❌ 您昨天已经签到过了,不需要补签!", - (roomid if roomid else sender), sender - ) + await self.bot.send_text_message((roomid if roomid else sender), + "❌ 您昨天已经签到过了,不需要补签!", + sender + ) return True, "无需补签" # 检查用户积分是否足够 @@ -432,10 +431,10 @@ class MessageSignPlugin(MessagePluginInterface): user_points = points_db.get_user_points(sender, roomid) if not user_points or user_points["total_points"] < self.makeup_cost: - self.message_util.send_text( - f"❌ 积分不足!补签需要 {self.makeup_cost} 积分,您当前只有 {user_points.get('total_points', 0)} 积分。", - (roomid if roomid else sender), sender - ) + await self.bot.send_text_message((roomid if roomid else sender), + f"❌ 积分不足!补签需要 {self.makeup_cost} 积分,您当前只有 {user_points.get('total_points', 0)} 积分。", + sender + ) return True, "积分不足" # 扣除积分 @@ -445,10 +444,10 @@ class MessageSignPlugin(MessagePluginInterface): ) if not deduct_success: - self.message_util.send_text( - f"❌ 扣除积分失败:{deduct_result.get('error', '未知错误')}", - (roomid if roomid else sender), sender - ) + await self.bot.send_text_message((roomid if roomid else sender), + f"❌ 扣除积分失败:{deduct_result.get('error', '未知错误')}", + sender + ) return True, "扣除积分失败" # 在_handle_makeup_sign方法中,修改计算新连签天数的逻辑 @@ -504,17 +503,17 @@ class MessageSignPlugin(MessagePluginInterface): success_message += f"💰 当前积分:{user_points['total_points'] - self.makeup_cost}" - self.message_util.send_text( - success_message, - (roomid if roomid else sender), sender + await self.bot.send_text_message( + (roomid if roomid else sender), + success_message, sender ) return True, "补签成功" except Exception as e: self.LOG.error(f"处理补签请求出错: {e}") - self.message_util.send_text( - f"❌ 补签出错:{e}", - (roomid if roomid else sender), sender + await self.bot.send_text_message( + (roomid if roomid else sender), + f"❌ 补签出错:{e}", sender ) return False, f"处理出错: {e}" diff --git a/plugins/music/main.py b/plugins/music/main.py index 7d14385..e443889 100644 --- a/plugins/music/main.py +++ b/plugins/music/main.py @@ -1,14 +1,13 @@ -import logging +from loguru import logger import requests from typing import Dict, Any, List, Optional, Tuple -from gewechat.client import gewe_client -from gewechat.response.gewe_resp import GeweResponse from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus from utils.decorator.plugin_decorators import plugin_stats_decorator from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager from utils.decorator.points_decorator import plugin_points_cost +from wechat_ipad import WechatAPIClient class MusicPlugin(MessagePluginInterface): @@ -43,7 +42,7 @@ class MusicPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 @@ -81,7 +80,7 @@ class MusicPlugin(MessagePluginInterface): @plugin_stats_decorator(plugin_name="音乐点播") @plugin_points_cost(2, "音乐点播消耗积分", Feature.MUSIC) - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() self.LOG.info(f"插件执行: {self.name}:{content}") @@ -89,11 +88,12 @@ class MusicPlugin(MessagePluginInterface): sender = message.get("sender") roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") + bot: WechatAPIClient = message.get("bot") # 检查命令格式 if len(content.split(" ")) == 1: - self.message_util.send_text(f"❌命令格式错误!\n{self.command_format}", - (roomid if roomid else sender), sender) + await bot.send_text_message((roomid if roomid else sender), f"❌命令格式错误!\n{self.command_format}" + , sender) return False, "命令格式错误" # 检查权限 @@ -107,12 +107,11 @@ class MusicPlugin(MessagePluginInterface): # 搜索歌曲 song_info = self._search_song(user_song_name) if not song_info or not song_info.get("play_url"): - self.message_util.send_text(f"❌未找到歌曲:{user_song_name}", - (roomid if roomid else sender), sender) + await bot.send_text_message((roomid if roomid else sender), f"❌未找到歌曲:{user_song_name}", sender) return False, "未找到歌曲" # 发送音乐 - self._send_music_message(song_info, roomid or sender) + await self._send_music_message(bot, song_info, roomid or sender) return True, "发送成功" except Exception as e: @@ -143,7 +142,7 @@ class MusicPlugin(MessagePluginInterface): self.LOG.error(f"搜索歌曲出错: {e}") return {} - def _send_music_message(self, song_info: Dict[str, Any], receiver: str) -> bool: + async def _send_music_message(self, bot: WechatAPIClient, song_info: Dict[str, Any], receiver: str) -> bool: """发送音乐消息""" try: song_name = song_info.get("song_name", "") @@ -201,11 +200,11 @@ class MusicPlugin(MessagePluginInterface): """ - resp = gewe_client.client.post_app_msg(gewe_client.client.app_id, receiver, xml_message) - data = GeweResponse(resp) - self.LOG.info(f"发送音乐消息:{data}") - if data.is_success: - return True + + self.LOG.info(f"发送音乐消息:{xml_message}") + res = await bot.send_app_message(wxid=receiver, xml=xml_message, type=0) + self.LOG.info(f"发送音乐消息 res:{res}") + return True except Exception as e: self.LOG.error(f"发送音乐消息出错: {e}") diff --git a/plugins/plugin_manager/main.py b/plugins/plugin_manager/main.py index 40e8c23..9bfe0f3 100644 --- a/plugins/plugin_manager/main.py +++ b/plugins/plugin_manager/main.py @@ -1,4 +1,4 @@ -import logging +from loguru import logger import os from typing import Dict, Any, List, Optional, Tuple @@ -53,7 +53,7 @@ class PluginManagerPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 diff --git a/plugins/point_trade/main.py b/plugins/point_trade/main.py index e97354a..ffc8280 100644 --- a/plugins/point_trade/main.py +++ b/plugins/point_trade/main.py @@ -1,10 +1,9 @@ -import logging +from loguru import logger import re from datetime import datetime from typing import Dict, Any, List, Optional, Tuple import xml.etree.ElementTree as ET - from db.connection import DBConnectionManager from db.points_db import PointsDBOperator, PointSource from message_util import MessageUtil @@ -15,6 +14,8 @@ from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotMan import mysql.connector.pooling +from wechat_ipad import WechatAPIClient + class PointTradePlugin(MessagePluginInterface): """积分交易插件""" @@ -46,15 +47,15 @@ class PointTradePlugin(MessagePluginInterface): def __init__(self): super().__init__() self.db_pool = None + self.bot: WechatAPIClient = None def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 self.event_system = context.get("event_system") - self.message_util: MessageUtil = context.get("message_util") self.gbm = context.get("gbm") self.db_manager = DBConnectionManager.get_instance() @@ -120,7 +121,7 @@ class PointTradePlugin(MessagePluginInterface): return command in self._commands @plugin_stats_decorator(plugin_name="积分交易") - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() self.LOG.info(f"插件执行: {self.name}:{content}") @@ -129,6 +130,7 @@ class PointTradePlugin(MessagePluginInterface): roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") xml = message.get("xml", "") + self.bot: WechatAPIClient = message.get("bot") # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.POINT_TRADE) == PermissionStatus.DISABLED: @@ -136,21 +138,21 @@ class PointTradePlugin(MessagePluginInterface): # 处理不同的命令 if command[0] == "我的积分": - return self._handle_my_points(message) + return await self._handle_my_points(message) elif command[0] == "积分排行": - return self._handle_points_ranking(message) + return await self._handle_points_ranking(message) elif command[0] == "打劫": - return self._handle_rob_points(message) + return await self._handle_rob_points(message) elif command[0] == "保释": - return self._handle_bailout(message) + return await self._handle_bailout(message) elif command[0] in self._commands: - return self._handle_transfer_points(message) + return await self._handle_transfer_points(message) else: - self.message_util.send_text(f"❌未知命令!{self.command_format}", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), f"❌未知命令!{self.command_format}", + sender) return True, "未知命令" - def _handle_transfer_points(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def _handle_transfer_points(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理积分转账命令""" content = str(message.get("content", "")).strip() command = content.split(" ") @@ -160,21 +162,23 @@ class PointTradePlugin(MessagePluginInterface): # 检查命令格式 if len(command) < 3: - self.message_util.send_text(f"❌命令格式错误!积分转账 积分数 @用户", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), f"❌命令格式错误!积分转账 积分数 @用户", + sender) return True, "命令格式错误" # 检查积分数是否为正整数 if not command[1].isdigit(): - self.message_util.send_text(f"🈚️转账积分无效(必须为正整数!) \n积分转账 积分数 @用户", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), + f"🈚️转账积分无效(必须为正整数!) \n积分转账 积分数 @用户", + sender) return True, "积分无效" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - self.message_util.send_text(f"转账失败❌\n🈚️转账人无效! \n积分转账 积分数 @用户", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), + f"转账失败❌\n🈚️转账人无效! \n积分转账 积分数 @用户", + sender) return True, "转账人无效" reward_points = int(command[1]) @@ -193,13 +197,13 @@ class PointTradePlugin(MessagePluginInterface): error_msg = result.get("error", "未知错误") if "积分不足" in error_msg: current_points = result.get("current_points", 0) - self.message_util.send_text( - f"❌转账失败!\n你的积分不足以进行转账!当前积分:{current_points},你需要 {reward_points} 积分。", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), + f"❌转账失败!\n你的积分不足以进行转账!当前积分:{current_points},你需要 {reward_points} 积分。", + sender) else: - self.message_util.send_text( - f"❌转账失败!\n{error_msg}", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), + f"❌转账失败!\n{error_msg}", + sender) return True, f"转账失败: {error_msg}" # 获取转账后的积分信息 @@ -220,16 +224,16 @@ class PointTradePlugin(MessagePluginInterface): f"👤{to_user_name} 当前积分: {to_user.get('total_points', 0)}" ) - self.message_util.send_text(output, (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), output, sender) return True, "转账成功" except Exception as e: self.LOG.error(f"积分交易出错: {e}") - self.message_util.send_text(f"❌积分交易失败!请稍后重试。错误: {str(e)}", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), f"❌积分交易失败!请稍后重试。错误: {str(e)}", + sender) return True, f"处理出错: {str(e)}" - def _handle_my_points(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def _handle_my_points(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理查询个人积分命令""" sender = message.get("sender") roomid = message.get("roomid", "") @@ -239,8 +243,9 @@ class PointTradePlugin(MessagePluginInterface): user_points = self.points_db.get_user_points(sender, roomid) if not user_points: - self.message_util.send_text(f"❌未找到你的积分记录!请先参与积分活动[签到,答题/t]。", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), + f"❌未找到你的积分记录!请先参与积分活动[签到,答题/t]。", + sender) return False, "未找到积分记录" # 获取用户昵称 @@ -295,22 +300,22 @@ class PointTradePlugin(MessagePluginInterface): f"{recent_txs}" ) - self.message_util.send_text(output, (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), output, sender) return True, "查询积分成功" except Exception as e: self.LOG.error(f"查询积分出错: {e}") - self.message_util.send_text(f"❌查询积分失败!请稍后重试。错误: {str(e)}", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), f"❌查询积分失败!请稍后重试。错误: {str(e)}", + sender) return True, f"处理出错: {str(e)}" - def _handle_points_ranking(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def _handle_points_ranking(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理积分排行榜命令""" sender = message.get("sender") roomid = message.get("roomid", "") if not roomid: - self.message_util.send_text("❌积分排行榜仅在群聊中可用!", sender, "") + await self.bot.send_text_message(sender, "❌积分排行榜仅在群聊中可用!", "") return True, "非群聊环境" try: @@ -318,7 +323,7 @@ class PointTradePlugin(MessagePluginInterface): ranking = self.points_db.get_points_ranking(roomid, 10) if not ranking: - self.message_util.send_text("❌暂无积分排行数据!请先参与积分活动。", roomid, sender) + await self.bot.send_text_message(roomid, "❌暂无积分排行数据!请先参与积分活动。", sender) return True, "无排行数据" # 构建排行榜消息 @@ -343,12 +348,12 @@ class PointTradePlugin(MessagePluginInterface): f"更新时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" ) - self.message_util.send_text(output, roomid, sender) + await self.bot.send_text_message(roomid, output, sender) return True, "查询排行榜成功" except Exception as e: self.LOG.error(f"查询积分排行榜出错: {e}") - self.message_util.send_text(f"❌查询积分排行榜失败!请稍后重试。错误: {str(e)}", roomid, sender) + await self.bot.send_text_message(roomid, f"❌查询积分排行榜失败!请稍后重试。错误: {str(e)}", sender) return True, f"处理出错: {str(e)}" def at_list(self, xml): @@ -438,7 +443,7 @@ class PointTradePlugin(MessagePluginInterface): self.LOG.error(f"更新用户积分失败: {e}") raise - def _handle_rob_points(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def _handle_rob_points(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理打劫积分命令""" import random import time @@ -451,13 +456,13 @@ class PointTradePlugin(MessagePluginInterface): # 检查是否在群聊中 if not roomid: - self.message_util.send_text("❌打劫功能仅在群聊中可用!", sender, "") + await self.bot.send_text_message(sender, "❌打劫功能仅在群聊中可用!", "") return True, "非群聊环境" # 检查时间限制 - 只允许在18:00-21:00之间打劫 current_hour = datetime.now().hour if current_hour < 18 or current_hour >= 21: - self.message_util.send_text("❌打劫功能仅在晚上18:00-21:00之间开放!请在开放时间再来。", roomid, sender) + await self.bot.send_text_message(roomid, "❌打劫功能仅在晚上18:00-21:00之间开放!请在开放时间再来。", sender) return True, "时间限制" # 检查是否在押 @@ -466,8 +471,10 @@ class PointTradePlugin(MessagePluginInterface): remaining_time = prison_status['end_time'] - datetime.now() hours = int(remaining_time.total_seconds() / 3600) minutes = int((remaining_time.total_seconds() % 3600) / 60) - self.message_util.send_text(f"❌你正在服刑!\n剩余时间: {hours}小时{minutes}分钟\n可请求他人花费30积分保释。", roomid, - sender) + await self.bot.send_text_message( + f"❌你正在服刑!\n剩余时间: {hours}小时{minutes}分钟\n可请求他人花费30积分保释。", + roomid, + sender) return True, "在押状态" # 检查冷却时间 @@ -478,15 +485,16 @@ class PointTradePlugin(MessagePluginInterface): if time_passed < self.rob_cooldown: remaining_time = int(self.rob_cooldown - time_passed) minutes, seconds = divmod(remaining_time, 60) - self.message_util.send_text(f"❌你最近已经打劫过了,需要冷却 {minutes}分{seconds}秒 后才能再次打劫!", - roomid, sender) + await self.bot.send_text_message(roomid, + f"❌你最近已经打劫过了,需要冷却 {minutes}分{seconds}秒 后才能再次打劫!", + sender) return True, "冷却中" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - self.message_util.send_text(f"打劫失败❌\n请指定一个打劫目标!\n打劫 @用户", - roomid, sender) + await self.bot.send_text_message(roomid, f"打劫失败❌\n请指定一个打劫目标!\n打劫 @用户", + sender) return True, "目标无效" target_wxid = next(iter(at_users)) @@ -494,7 +502,7 @@ class PointTradePlugin(MessagePluginInterface): # 不能打劫自己 if target_wxid == robber_wxid: - self.message_util.send_text("❌你不能打劫自己!", roomid, sender) + await self.bot.send_text_message(roomid, "❌你不能打劫自己!", sender) return True, "不能打劫自己" try: @@ -503,11 +511,11 @@ class PointTradePlugin(MessagePluginInterface): target_points = self.points_db.get_user_points(target_wxid, roomid) if not robber_points: - self.message_util.send_text("❌你没有积分记录,无法进行打劫!请先参与积分活动。", roomid, sender) + await self.bot.send_text_message(roomid, "❌你没有积分记录,无法进行打劫!请先参与积分活动。", sender) return True, "打劫者无积分" if not target_points: - self.message_util.send_text("❌目标没有积分记录,无法进行打劫!", roomid, sender) + await self.bot.send_text_message(roomid, "❌目标没有积分记录,无法进行打劫!", sender) return True, "目标无积分" robber_total = robber_points.get('total_points', 0) @@ -515,11 +523,12 @@ class PointTradePlugin(MessagePluginInterface): # 检查最低积分要求 if robber_total < self.rob_min_points: - self.message_util.send_text(f"❌你的积分不足 {self.rob_min_points} 点,无法进行打劫!", roomid, sender) + await self.bot.send_text_message(roomid, f"❌你的积分不足 {self.rob_min_points} 点,无法进行打劫!", + sender) return True, "打劫者积分不足" if target_total < self.rob_min_points: - self.message_util.send_text(f"❌目标积分不足 {self.rob_min_points} 点,不值得打劫!", roomid, sender) + await self.bot.send_text_message(roomid, f"❌目标积分不足 {self.rob_min_points} 点,不值得打劫!", sender) return True, "目标积分不足" # 获取用户昵称 @@ -575,10 +584,11 @@ class PointTradePlugin(MessagePluginInterface): f"👤{target_name} 当前积分: {from_user.get('total_points', 0)}" ) - self.message_util.send_text(output, roomid, sender) + await self.bot.send_text_message(output, roomid, sender) return True, "打劫成功" else: - self.message_util.send_text(f"❌打劫过程中出现问题:{result.get('error', '未知错误')}", roomid, sender) + await self.bot.send_text_message(roomid, f"❌打劫过程中出现问题:{result.get('error', '未知错误')}", + sender) return True, "打劫失败" else: @@ -612,18 +622,20 @@ class PointTradePlugin(MessagePluginInterface): f"👤{robber_name} 当前积分: {from_user.get('total_points', 0)}" ) - self.message_util.send_text(output, roomid, sender) + await self.bot.send_text_message(roomid, output, sender) return True, "打劫失败" else: - self.message_util.send_text(f"❌处理打劫惩罚时出现问题:{result.get('error', '未知错误')}", roomid, sender) + await self.bot.send_text_message(roomid, + f"❌处理打劫惩罚时出现问题:{result.get('error', '未知错误')}", + sender) return True, "处理惩罚失败" except Exception as e: self.LOG.error(f"处理打劫请求出错: {e}") - self.message_util.send_text(f"❌打劫过程中出现意外:{str(e)}", roomid, sender) + await self.bot.send_text_message(roomid, f"❌打劫过程中出现意外:{str(e)}", sender) return True, f"处理出错: {str(e)}" - def _handle_bailout(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def _handle_bailout(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理保释命令""" sender = message.get("sender") roomid = message.get("roomid", "") @@ -631,14 +643,14 @@ class PointTradePlugin(MessagePluginInterface): # 检查是否在群聊中 if not roomid: - self.message_util.send_text("❌保释功能仅在群聊中可用!", sender, "") + await self.bot.send_text_message(sender, "❌保释功能仅在群聊中可用!", "") return True, "非群聊环境" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - self.message_util.send_text(f"保释失败❌\n请指定一个保释目标!\n保释 @用户", - roomid, sender) + await self.bot.send_text_message(roomid, f"保释失败❌\n请指定一个保释目标!\n保释 @用户", + sender) return True, "目标无效" prisoner_wxid = next(iter(at_users)) @@ -646,7 +658,7 @@ class PointTradePlugin(MessagePluginInterface): # 不能保释自己 if prisoner_wxid == bailout_wxid: - self.message_util.send_text("❌你不能保释自己!", roomid, sender) + await self.bot.send_text_message(roomid, "❌你不能保释自己!", sender) return True, "不能保释自己" try: @@ -665,13 +677,13 @@ class PointTradePlugin(MessagePluginInterface): f"✅ 保释成功!\n" f"👤{bailout_name} 花费30积分保释了 👤{prisoner_name}" ) - self.message_util.send_text(output, roomid, sender) + await self.bot.send_text_message(roomid, output, sender) return True, "保释成功" else: - self.message_util.send_text(f"❌保释失败: {message}", roomid, sender) + await self.bot.send_text_message(roomid, f"❌保释失败: {message}", sender) return True, "保释失败" except Exception as e: self.LOG.error(f"处理保释请求出错: {e}") - self.message_util.send_text(f"❌保释过程中出现意外:{str(e)}", roomid, sender) + await self.bot.send_text_message(roomid, f"❌保释过程中出现意外:{str(e)}", sender) return True, f"处理出错: {str(e)}" diff --git a/plugins/stats_collector/main.py b/plugins/stats_collector/main.py index a995cd2..133f9c1 100644 --- a/plugins/stats_collector/main.py +++ b/plugins/stats_collector/main.py @@ -1,4 +1,4 @@ -import logging +from loguru import logger import time from typing import Dict, Any, Tuple, Optional, List from datetime import datetime @@ -42,7 +42,7 @@ class StatsCollectorPlugin(PluginInterface): def __init__(self): super().__init__() - self.logger = logging.getLogger("StatsCollector") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 默认配置 @@ -62,7 +62,7 @@ class StatsCollectorPlugin(PluginInterface): self.config.update(config) if not self.config["enable"]: - self.logger.info("统计收集插件已禁用") + self.LOG.info("统计收集插件已禁用") return False # 注册事件处理器 @@ -79,7 +79,7 @@ class StatsCollectorPlugin(PluginInterface): return # 记录开始时间和相关信息 - self.logger.debug(f"记录插件调用开始: {event.plugin_name} - {event.command}") + self.LOG.debug(f"记录插件调用开始: {event.plugin_name} - {event.command}") def handle_plugin_call_end(self, event: PluginCallEndEvent) -> None: """处理插件调用结束事件""" @@ -98,10 +98,10 @@ class StatsCollectorPlugin(PluginInterface): success=event.process_result, process_time_ms=event.process_time ) - self.logger.debug( + self.LOG.debug( f"记录插件调用结束: {event.plugin_name} - {event.command} - 成功: {event.process_result} - 处理时间: {event.process_time}ms") except Exception as e: - self.logger.error(f"记录插件调用统计数据出错: {e}") + self.LOG.error(f"记录插件调用统计数据出错: {e}") def handle_plugin_error(self, event: PluginCallErrorEvent) -> None: """处理插件调用错误事件""" @@ -119,9 +119,9 @@ class StatsCollectorPlugin(PluginInterface): error_message=event.error_message, stack_trace=event.stack_trace ) - self.logger.debug(f"记录插件调用错误: {event.plugin_name} - {event.command} - {event.error_message}") + self.LOG.debug(f"记录插件调用错误: {event.plugin_name} - {event.command} - {event.error_message}") except Exception as e: - self.logger.error(f"记录插件错误信息出错: {e}") + self.LOG.error(f"记录插件错误信息出错: {e}") def _should_record_plugin(self, plugin_name: str) -> bool: """检查是否应该记录该插件的调用""" @@ -154,7 +154,7 @@ class StatsCollectorPlugin(PluginInterface): self.event_manager.unregister(PluginCallEndEvent, self.handle_plugin_call_end) self.event_manager.unregister(PluginCallErrorEvent, self.handle_plugin_error) - self.logger.info("统计收集插件已关闭") + self.LOG.info("统计收集插件已关闭") def start(self) -> bool: """启动插件""" diff --git a/plugins/system_updater/main.py b/plugins/system_updater/main.py index a292509..3dde61e 100644 --- a/plugins/system_updater/main.py +++ b/plugins/system_updater/main.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import logging +from loguru import logger from typing import Dict, Any, List, Optional, Tuple from plugin_common.message_plugin_interface import MessagePluginInterface @@ -42,7 +42,7 @@ class SystemUpdaterPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 diff --git a/plugins/video/main.py b/plugins/video/main.py index 9df3bc6..36b100e 100644 --- a/plugins/video/main.py +++ b/plugins/video/main.py @@ -1,14 +1,14 @@ -import logging +from loguru import logger import os import requests from typing import Dict, Any, List, Optional, Tuple - from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus from utils.decorator.plugin_decorators import plugin_stats_decorator from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager from utils.decorator.points_decorator import plugin_points_cost +from wechat_ipad import WechatAPIClient class VideoPlugin(MessagePluginInterface): @@ -40,12 +40,13 @@ class VideoPlugin(MessagePluginInterface): def __init__(self): super().__init__() + self.bot: WechatAPIClient = None # 修改为使用插件目录下的down_load_dir文件夹 self.download_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "down_load_dir") def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 @@ -56,7 +57,7 @@ class VideoPlugin(MessagePluginInterface): self._commands = self._config.get("Video", {}).get("command", ["黑丝视频", "黑丝", "来个黑丝", "搞个黑丝"]) self.command_format = self._config.get("Video", {}).get("command-format", "黑丝") self.enable = self._config.get("Video", {}).get("enable", True) - + # 确保下载目录存在 if not os.path.exists(self.download_dir): os.makedirs(self.download_dir, exist_ok=True) @@ -88,13 +89,14 @@ class VideoPlugin(MessagePluginInterface): @plugin_stats_decorator(plugin_name="视频插件") @plugin_points_cost(2, "视频插件消耗积分", Feature.VIDEO) - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() self.LOG.info(f"插件执行: {self.name}:{content}") sender = message.get("sender") roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") + self.bot: WechatAPIClient = message.get("bot") # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.VIDEO) == PermissionStatus.DISABLED: @@ -104,21 +106,21 @@ class VideoPlugin(MessagePluginInterface): # 下载视频 save_path = os.path.join(self.download_dir, "video.mp4") file_abspath = self._download_stream("https://api.guiguiya.com/api/hook/heisis", save_path) - + if not file_abspath or not file_abspath.endswith("mp4"): - self.message_util.send_text(f"\n❌视频下载失败,请稍后再试", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), f"\n❌视频下载失败,请稍后再试", + sender) return False, "视频下载失败" # 发送视频 - result = self.message_util.send_file(file_abspath, (roomid if roomid else sender)) + result = await self.bot.send_video_message((roomid if roomid else sender), file_abspath) self.LOG.info(f"发送视频结果: {result}") return True, "发送成功" except Exception as e: self.LOG.error(f"处理视频请求出错: {e}") - self.message_util.send_text(f"\n❌请求出错:{e}", - (roomid if roomid else sender), sender) + await self.bot.send_text_message((roomid if roomid else sender), f"\n❌请求出错:{e}", + sender) return False, f"处理出错: {e}" def _download_stream(self, url, save_path): @@ -157,4 +159,4 @@ class VideoPlugin(MessagePluginInterface): self.LOG.error(f"文件写入失败: {e}") except Exception as e: self.LOG.error(f"发生未知错误: {e}") - return None \ No newline at end of file + return None diff --git a/plugins/video_man/main.py b/plugins/video_man/main.py index f4ef08d..b87b871 100644 --- a/plugins/video_man/main.py +++ b/plugins/video_man/main.py @@ -1,4 +1,4 @@ -import logging +from loguru import logger import os import requests from typing import Dict, Any, List, Optional, Tuple @@ -45,7 +45,7 @@ class VideoManPlugin(MessagePluginInterface): def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 diff --git a/plugins/xiuren_image/main.py b/plugins/xiuren_image/main.py index a9cbe68..64dbcfe 100644 --- a/plugins/xiuren_image/main.py +++ b/plugins/xiuren_image/main.py @@ -1,4 +1,6 @@ -import logging +from pathlib import Path + +from loguru import logger import os import random from typing import Dict, Any, List, Optional, Tuple @@ -8,6 +10,7 @@ from plugin_common.plugin_interface import PluginStatus from utils.decorator.plugin_decorators import plugin_stats_decorator from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager from utils.decorator.points_decorator import plugin_points_cost +from wechat_ipad import WechatAPIClient class XiurenImagePlugin(MessagePluginInterface): @@ -39,11 +42,12 @@ class XiurenImagePlugin(MessagePluginInterface): def __init__(self): super().__init__() - self.image_folder = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "xiuren") + self.image_folder = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "xiuren") def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" - self.LOG = logging.getLogger(f"Plugin.{self.name}") + self.LOG = logger self.LOG.info(f"正在初始化 {self.name} 插件...") # 保存上下文对象 @@ -86,13 +90,14 @@ class XiurenImagePlugin(MessagePluginInterface): @plugin_stats_decorator(plugin_name="秀人图片") @plugin_points_cost(2, "秀人图片消耗积分", Feature.PIC) - def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: + async def process_message(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: """处理消息""" content = str(message.get("content", "")).strip() self.LOG.info(f"插件执行: {self.name}:{content}") sender = message.get("sender") roomid = message.get("roomid", "") gbm: GroupBotManager = message.get("gbm") + bot: WechatAPIClient = message.get("bot") # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.PIC) == PermissionStatus.DISABLED: @@ -102,12 +107,13 @@ class XiurenImagePlugin(MessagePluginInterface): # 获取随机图片 pic_path = self._get_random_pic() if not pic_path: - self.message_util.send_text(f"❌未找到图片资源", - (roomid if roomid else sender), sender) + await bot.send_text_message((roomid if roomid else sender), f"❌未找到图片资源", + sender) return False, "未找到图片资源" # 发送图片 - result = self.message_util.send_file(pic_path, (roomid if roomid else sender)) + + result = await bot.send_image_message((roomid if roomid else sender), Path(pic_path)) self.LOG.info(f"发送图片结果: {result}") return True, "发送成功" diff --git a/robot.py b/robot.py index f9f6160..4b79c69 100644 --- a/robot.py +++ b/robot.py @@ -1,39 +1,30 @@ # -*- coding: utf-8 -*- -import logging import re import time +import asyncio +import threading +import tomllib +import toml -import dacite +import wechat_ipad +from loguru import logger -from base.func_epic import is_friday, get_free - -from base.func_news import News from configuration import Config -from gewechat.call_back_message.message import WxMessage, MessageType -from gewechat.client import gewe_client -from gewechat.response.model.group.chatroom_info import ChatroomInfo -from gewechat.response.model.personal.profile import Profile -from utils.json_converter import json_to_object -from utils.wechat.message_to_db import MessageStorage +from job_mgmt import Job from plugin_common.event_system import EventType, EventSystem from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus from plugin_common.plugin_manager import PluginManager from plugin_common.plugin_registry import PluginRegistry -from utils.robot_cmd.robot_command import GroupBotManager -from job_mgmt import Job -from utils.robot_cmd.robot_command import Feature -from utils.robot_cmd.robot_command import PermissionStatus - -from sehuatang.shehuatang import pdf_file_path -from utils.wechat.contact_manager import ContactManager -from xiuren.meitu_dl import meitu_dowload_pub_pic -from xiuren.xiuren_pdf import generate_pdf_from_images +from utils.robot_cmd.robot_command import GroupBotManager, Feature, PermissionStatus from db.connection import DBConnectionManager from message_util import MessageUtil - from db.contacts_db import ContactsDBOperator +from utils.wechat.contact_manager import ContactManager +from utils.wechat.message_to_db import MessageStorage +from wechat_ipad import WechatAPIClient +from wechat_ipad.models.message import WxMessage, MessageType class Robot(Job): @@ -41,13 +32,20 @@ class Robot(Job): """ def __init__(self, config: Config) -> None: - self.client = gewe_client.client - if not self.client: - logging.getLogger("Robot").error("gewe_client.client 不存在,Robot 初始化失败,程序退出。") - return + super().__init__() self.config = config - self.app_id = gewe_client.app_id - self.LOG = logging.getLogger("Robot") + self.LOG = logger + + # wechat_ipad 相关属性 + self.ipad_bot: WechatAPIClient + self.ipad_config = None + self.ipad_running = False + self.ipad_thread = None + self.ipad_loop = None + self.wxid = None + self.nickname = None + self.alias = None + self.phone = None self.LOG.info(f"DB+REDIS 连接池开始初始化") # 使用单例模式获取实例 @@ -58,45 +56,30 @@ class Robot(Job): self.LOG.info(f"数据库连接管理器初始化完成") # 为了兼容现有代码,保留原有的连接池 - self.db_pool = self.db_manager .mysql_pool + self.db_pool = self.db_manager.mysql_pool self.redis_pool = self.db_manager.redis_pool self.contacts_db = ContactsDBOperator(self.db_manager) - # 初始化联系人管理器并设置联系人 + # 初始化联系人管理器 self.contact_manager = ContactManager.get_instance() - self.allContacts = self.get_all_contacts() - self.contact_manager.set_contacts(self.allContacts) + self.allContacts = {} # 将在登录后填充 - # 获取个人信息 - profile_dict = self.client.get_profile(self.app_id) - try: - profile: Profile = dacite.from_dict(Profile, profile_dict) - except Exception as e: - self.LOG.info(f"Profile dict 转换失败: {e}") - return - if profile.data.wxid is None: - self.LOG.info(f"获取个人信息失败,退出程序!") - return - self.wxid = profile.data.wxid - - # 初始化消息工具类 - 使用联系人管理器 - self.message_util = MessageUtil() self.groups = {} # 存储按group_id分组的消息列表,每个group_id最多保留10条消息 GroupBotManager.load_local_cache() # 权限模块加载 self.gbm = GroupBotManager() + # 初始化插件系统 self.LOG.info("开始初始化插件系统...") self.plugin_registry = PluginRegistry() self.event_system = EventSystem() self.plugin_modules = {} # 存储已加载的插件模块 self.plugins = {} # 存储已加载的插件实例 - + self.message_util = None # 设置插件系统上下文 self.system_context = { "config": config, - "client": gewe_client, "event_system": self.event_system, "plugin_registry": self.plugin_registry, "db_pool": self.db_pool, @@ -111,174 +94,366 @@ class Robot(Job): # 加载插件 self.LOG.info("插件系统初始化完成") - # 消息存档模块初始化,自动完成入库动作 - self.message_storage = MessageStorage(self.client) - - @staticmethod - def value_check(args: dict) -> bool: - if args: - return all(value is not None for key, value in args.items() if key != 'proxy') - return False - - def toChitchat(self, msg: WxMessage) -> bool: - """闲聊,接入 ChatGPT - """ - # 去除@的人和空格等字符 - q = re.sub(r"@.*?[\u2005|\s]", "", msg.content.raw_content).replace(" ", "") - - if q == "#今日百度新闻": - self.news_baidu_report((msg.roomid if msg.from_group() else msg.sender)) - return True - elif q in ["nbc", "cnn", "abc", "fox", "bbc"]: - self.news_en_report(q, (msg.roomid if msg.from_group() else msg.sender)) - return True - else: - # 如果是群消息,并且群没开启AI,则不处理该动作 - if msg.from_group() and self.gbm.get_group_permission(msg.roomid, - Feature.AI_CAPABILITY) == PermissionStatus.ENABLED: - resp = self.gbm.get_enabled_features(msg.roomid) - self.message_util.send_text(resp, (msg.roomid if msg.from_group() else msg.sender), msg.sender) - return True - else: - return True - - def processMsg(self, msg: WxMessage) -> None: - """当接收到消息的时候,会调用本方法。如果不实现本方法,则打印原始消息。 - 此处可进行自定义发送的内容,如通过 msg.content 关键字自动获取当前天气信息,并发送到对应的群组@发送者 - 群号:msg.roomid 微信ID:msg.sender 消息内容:msg.content - content = "xx天气信息为:" - receivers = msg.roomid - self.sendTextMsg(content, receivers, msg.sender) - """ + def init_wechat_ipad(self): + """初始化wechat_ipad客户端""" try: - # 检测群聊是否已加入机器人管理,如果没有则自动添加并开启机器人功能 - if msg.from_group() and msg.roomid not in GroupBotManager.local_cache["group_list"]: - self.LOG.info(f"检测到新群聊: {msg.roomid},自动添加到机器人管理列表并启用机器人功能") + # 读取config.toml文件 + with open("wechat_ipad/config.toml", "rb") as f: + self.ipad_config = tomllib.load(f) + + self.LOG.info("正在初始化wechat_ipad客户端...") + + # 检查必要的配置 + server_url = self.ipad_config.get("server_url", "") + if server_url == "": + self.LOG.error("server_url不能为空,wechat_ipad初始化失败") + return False + + server_ip = self.ipad_config.get("server_ip", "") + server_port = self.ipad_config.get("server_port", 8058) + + # 创建事件循环 + self.ipad_loop = asyncio.new_event_loop() + + # 在新线程中启动wechat_ipad客户端 + self.ipad_thread = threading.Thread( + target=self._run_wechat_ipad_client, + args=(server_ip, server_port), + daemon=True + ) + self.ipad_thread.start() + + self.LOG.info("wechat_ipad客户端初始化完成") + return True + except Exception as e: + self.LOG.error(f"初始化wechat_ipad客户端失败: {e}") + return False + + def _run_wechat_ipad_client(self, server_ip, server_port): + """在新线程中运行wechat_ipad客户端""" + asyncio.set_event_loop(self.ipad_loop) + self.ipad_loop.run_until_complete(self._wechat_ipad_core(server_ip, server_port)) + + async def _wechat_ipad_core(self, server_ip, server_port): + """wechat_ipad核心逻辑,基于bot-core.py""" + try: + self.LOG.info("启动wechat_ipad bot") + # 调用登录接口 + self.ipad_bot = wechat_ipad.WechatAPIClient(server_ip, server_port) + wxid = self.ipad_config.get("wxid", "") + device_name = self.ipad_config.get("device_name", "") + device_id = self.ipad_config.get("device_id", "") + + if device_name == "": + device_name = self.ipad_bot.create_device_name() + if device_id == "": + device_id = self.ipad_bot.create_device_id() + + # 登录逻辑 + if not await self.ipad_bot.is_logged_in(wxid): + await self._handle_ipad_login(wxid, device_name, device_id) + else: # 已登录 + self.ipad_bot.wxid = wxid + profile = await self.ipad_bot.get_profile() + + self.ipad_bot.nickname = profile.get("NickName").get("string") + self.ipad_bot.alias = profile.get("Alias") + self.ipad_bot.phone = profile.get("BindMobile").get("string") + + # 更新Robot类的属性 + self.wxid = self.ipad_bot.wxid + self.nickname = self.ipad_bot.nickname + self.alias = self.ipad_bot.alias + self.phone = self.ipad_bot.phone + + self.LOG.info( + f"wechat_ipad登录账号信息: wxid: {self.wxid} 昵称: {self.nickname} 微信号: {self.alias} 手机号: {self.phone}") + + self.LOG.info(f"wechat_ipad登录设备信息: device_name: {device_name} device_id: {device_id}") + self.LOG.info("wechat_ipad登录成功") + + # 登录成功后加载联系人信息 + self.allContacts = self.get_all_contacts() + self.contact_manager.set_contacts(self.allContacts) + + # 开启自动心跳(作为后台任务) + heartbeat_task = asyncio.create_task(self._heartbeat_task()) + self.message_storage = MessageStorage(self.ipad_bot) + + # 初始化消息工具类 - 使用联系人管理器 + self.message_util = MessageUtil(self.ipad_bot) + # 先接受堆积消息 + self.LOG.info("处理堆积消息中") + count = 0 + while True: + data = await self.ipad_bot.sync_message() + data = data.get("AddMsgs") + if not data: + if count > 2: + break + else: + count += 1 + continue + + self.LOG.debug(f"接受到 {len(data)} 条消息") + await asyncio.sleep(1) + self.LOG.info("处理堆积消息完毕") + + # 标记为运行中 + self.ipad_running = True + + # 开始处理消息 + self.LOG.info("开始处理wechat_ipad消息") + while self.ipad_running: + try: + data = await self.ipad_bot.sync_message() + except Exception as e: + self.LOG.warning(f"获取新消息失败 {e}") + await asyncio.sleep(5) + continue + + data = data.get("AddMsgs") + if data: + for message in data: + # 处理消息 + wxmsg: WxMessage = WxMessage.from_json(message) + await self._process_ipad_message(wxmsg) + + # 使用异步睡眠替代忙等待循环 + await asyncio.sleep(0.5) + + except Exception as e: + self.LOG.error(f"wechat_ipad客户端运行出错: {e}") + self.ipad_running = False + + async def _handle_ipad_login(self, wxid, device_name, device_id): + """处理wechat_ipad登录""" + while not await self.ipad_bot.is_logged_in(wxid): + # 需要登录 + try: + if await self.ipad_bot.get_cached_info(wxid): + # 尝试唤醒登录 + uuid = await self.ipad_bot.awaken_login(wxid) + self.LOG.info(f"获取到登录uuid: {uuid}") + else: + # 二维码登录 + if not device_name: + device_name = self.ipad_bot.create_device_name() + if not device_id: + device_id = self.ipad_bot.create_device_id() + uuid, url = await self.ipad_bot.get_qr_code(device_id=device_id, device_name=device_name, + print_qr=True) + self.LOG.info(f"获取到登录uuid: {uuid}") + self.LOG.info(f"获取到登录二维码: {url}") + except Exception as e: + self.LOG.error(f"登录过程出错: {e}") + # 二维码登录 + if not device_name: + device_name = self.ipad_bot.create_device_name() + if not device_id: + device_id = self.ipad_bot.create_device_id() + uuid, url = await self.ipad_bot.get_qr_code(device_id=device_id, device_name=device_name, print_qr=True) + self.LOG.info(f"获取到登录uuid: {uuid}") + self.LOG.info(f"获取到登录二维码: {url}") + + while True: + self.LOG.info(f"uuid: {uuid}, url: {url}") + stat, data = await self.ipad_bot.check_login_uuid(uuid, device_id=device_id) + if stat: + break + self.LOG.info(f"等待登录中,过期倒计时:{data}") + await asyncio.sleep(5) + + # 保存登录信息 + self.ipad_config["wxid"] = self.ipad_bot.wxid + self.ipad_config["device_name"] = device_name + self.ipad_config["device_id"] = device_id + with open("wechat_ipad/config.toml", "w", encoding="utf-8") as f: + toml.dump(self.ipad_config, f) + + # 获取登录账号信息 + self.ipad_bot.wxid = data.get("acctSectResp").get("userName") + self.ipad_bot.nickname = data.get("acctSectResp").get("nickName") + self.ipad_bot.alias = data.get("acctSectResp").get("alias") + self.ipad_bot.phone = data.get("acctSectResp").get("bindMobile") + + # 更新Robot类的属性 + self.wxid = self.ipad_bot.wxid + self.nickname = self.ipad_bot.nickname + self.alias = self.ipad_bot.alias + self.phone = self.ipad_bot.phone + + self.LOG.info( + f"wechat_ipad登录账号信息: wxid: {self.wxid} 昵称: {self.nickname} 微信号: {self.alias} 手机号: {self.phone}") + break + + async def _heartbeat_task(self): + """wechat_ipad心跳任务""" + self.LOG.info("开启wechat_ipad心跳!") + while self.ipad_running: + try: + success = await self.ipad_bot.heartbeat() + if success: + self.LOG.success("心跳进行中") + else: + self.LOG.warning("心跳失败") + except Exception as e: + self.LOG.error(f"wechat_ipad heartbeat: {e}") + await asyncio.sleep(5) + + async def _process_ipad_message(self, message: WxMessage): + """处理wechat_ipad消息""" + try: + self.LOG.debug(f"message: {message}") + # 消息已经是WxMessage对象,直接使用其属性和方法 + from_user = message.sender + to_user = message.to_user + content = message.content + msg_type = message.msg_type + + # 判断是否为群消息 + is_group = message.from_group() + group_id = message.roomid + + # 检测群聊是否已加入机器人管理 + if is_group and group_id not in GroupBotManager.local_cache["group_list"]: + self.LOG.info(f"检测到新群聊: {group_id},自动添加到机器人管理列表并启用机器人功能") # 添加群组到列表 - GroupBotManager.local_cache["group_list"].add(msg.roomid) + GroupBotManager.local_cache["group_list"].add(group_id) # 保存到Redis redis_conn = self.db_manager.get_redis_connection() - redis_conn.sadd("group:list", msg.roomid) + redis_conn.sadd("group:list", group_id) # 设置ROBOT功能为启用状态 - GroupBotManager.set_group_permission(msg.roomid, Feature.ROBOT, PermissionStatus.ENABLED) - # 更新联系人信息 - # 群第一次加入机器人管理,自动添加并开启机器人功能,需要进行群成员信息初始化。请完成写入数据库,并更新联系人信息 + GroupBotManager.set_group_permission(group_id, Feature.ROBOT, PermissionStatus.ENABLED) + + # 获取群成员信息并更新数据库 try: - chatroom_info = self.client.get_chatroom_info(self.app_id, msg.roomid) - self.LOG.info(f"chatroom_info: {chatroom_info}") - self.contacts_db.save_chatroom_info(chatroom_info.get('data', {})) - self.LOG.info(f"添加新的群信息到数据库成功:{chatroom_info}") - # 添加 memberList 到群组信息表中 - member_list = chatroom_info.get('data', {}).get('memberList', []) - self.contacts_db.save_chatroom_member_simple(msg.roomid, member_list) - for info in member_list: - wxid = info.get("wxid", "") - self.LOG.info(f"已添加新用户信息到数据库: {wxid}") - # 更新缓存 - self.allContacts[wxid] = info.get("nickName", "nickName") - self.LOG.info(f"已维护新用户信息到缓存: {wxid}") - self.contact_manager.set_contacts(self.allContacts) + chatroom_info = await self.ipad_bot.get_chatroom_info(group_id) + 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} 的成员信息") except Exception as e: - self.LOG.error(f"chatroom_info save error: {e}") - return + self.LOG.error(f"获取群成员信息失败: {e}") + + # 发布消息接收事件 + self.event_system.publish(EventType.MESSAGE_RECEIVED, {"message": message}) + + # 尝试使用插件处理消息 + plugin_processed = await self.process_plugin_message(message) + self.LOG.debug(f"plugin_processed: {plugin_processed}") + # 处理群聊命令或私聊命令 + if from_user == self.wxid: # 自己发送的消息 + if is_group: + rsp = self.gbm.handle_command(group_id, content) + if rsp is not None: + await self.send_text(rsp, group_id) + else: + # 处理特殊命令 + if content == "^更新$": + self.config.reload() + self.gbm.load_local_cache() + await self.send_text("已更新", "filehelper") + + if is_group: + self.LOG.debug(f"入库和记录群消息: {message}") + # 调用统计逻辑进行聊天数据统计: + try: + self.message_storage.process_message(message) + except Exception as e: + self.LOG.error(f"process_message error: {e}") + + # # 聊天记录入库动作: + try: + self.message_storage.archive_message(message) + # 单独处理图片消息 后续写定时任务自动完成下载。延时处理。 + # if message.msg_type == MessageType.IMAGE: # 图片消息类型 + # self.message_storage.process_image(message) + except Exception as e: + self.LOG.error(f"archive_message error: {e}") except Exception as e: - self.LOG.error(f"加入新群,自动添加并开启机器人功能 error: {e}") + self.LOG.error(f"处理wechat_ipad消息出错: {e}") + + def _convert_to_wx_message(self, message): + """将wechat_ipad消息转换为WxMessage对象""" + from wechat_ipad.models.message import WxMessage + return WxMessage.from_json(message) + + async def send_text(self, content, to_user, at_user=None): + """发送文本消息""" + if not self.ipad_bot or not self.ipad_running: + self.LOG.error("wechat_ipad客户端未初始化或未运行") + return False - # 如果用户信息缓存里面没有这个用户昵称,则添加用户信息,并且维护该用户信息 - # 以 wxid 作为唯一标识 try: - if msg.from_group(): - wxid = msg.sender - if wxid and wxid not in self.allContacts: - # 添加到数据库 - # 这里假设 contacts_db 有 save_contact_info 方法,参数为 dict - resp = self.client.get_chatroom_member_detail(self.app_id, msg.roomid, [wxid]) - infos = resp.get('data', {}) - for info in infos: - self.LOG.info(f"已添加新用户信息到数据库: {wxid}") - # 更新缓存 - self.allContacts[wxid] = info.get("nickName", "nickName") - self.contact_manager.set_contacts(self.allContacts) - self.LOG.info(f"已维护新用户信息到缓存: {wxid}") - self.contacts_db.save_chatroom_member_detail(msg.roomid, infos) + if at_user and to_user.endswith("@chatroom"): + # 在群里@某人 + await self.ipad_bot.send_text_message(to_user, content, at_list=[at_user]) + else: + # 普通发送 + await self.ipad_bot.send_text_message(to_user, content) + return True except Exception as e: - self.LOG.error(f"添加新用户信息到数据库失败: {e}") - # - # # 发布消息接收事件 - # self.event_system.publish(EventType.MESSAGE_RECEIVED, {"message": msg}) - # - # # 标记插件是否处理了消息 - # plugin_processed = False - # - # # 尝试使用插件处理消息 - # if self.process_plugin_message(msg): - # plugin_processed = True - # - # # 群聊消息处理 - 无论插件是否处理过,都执行数据存储 - if msg.from_group(): - # 调用统计逻辑进行聊天数据统计: - try: - self.message_storage.process_message(msg) - except Exception as e: - self.LOG.error(f"process_message error: {e}") + self.LOG.error(f"发送文本消息失败: {e}") + return False - # # 聊天记录入库动作: - try: - self.message_storage.archive_message(msg) - # 单独处理图片消息 后续写定时任务自动完成下载。延时处理。 - if msg.msg_type == MessageType.IMAGE: # 图片消息类型 - self.message_storage.process_image(msg) - except Exception as e: - self.LOG.error(f"archive_message error: {e}") + async def send_image(self, image_path, to_user): + """发送图片消息""" + if not self.ipad_bot or not self.ipad_running: + self.LOG.error("wechat_ipad客户端未初始化或未运行") + return False - # # 如果插件已处理消息,则不再执行后续的业务逻辑 - # if plugin_processed: - # return - # - # # 记录在群里发的最新消息,可以通过撤回指令撤回 - # try: - # if msg.from_self(): - # rsp = self.gbm.handle_command(msg.roomid, msg.content) - # # 不在群里发送,防止被骚扰 - # if rsp is not None: - # self.message_util.send_text(rsp, msg.roomid, msg.sender) - # return - # except Exception as e: - # self.LOG.error(f"revoke_receive_message error: {e}") - # - # return # 处理完群聊信息,后面就不需要处理了 - # - # # 如果插件已处理消息,则不再执行后续的业务逻辑 - # if plugin_processed: - # return - # - # elif msg.msg_type == MessageType.TEXT: # 文本消息 - # # 让配置加载更灵活,自己可以更新配置。也可以利用定时任务更新。 - # if msg.from_self(): - # if msg.content.clean_content == "^更新$": - # self.config.reload() - # self.gbm.load_local_cache() - # self.LOG.info("已更新") - # if msg.content.clean_content == "今日百度新闻": - # self.news_baidu_report() - # if msg.content.clean_content == "TO_DB": - # self.message_count_to_db() - # if msg.content.clean_content == "PDF": - # self.generate_sehuatang_pdf() - # if msg.content.raw_content.startswith("清除群-"): - # self.gbm.handle_command(msg.roomid, msg.content.clean_content) - # else: - # self.toChitchat(msg) # 闲聊 - - def onMsg(self, msg: WxMessage) -> int: try: - self.LOG.info(msg) # 打印信息 - self.processMsg(msg) + await self.ipad_bot.send_image_message(to_user, image_path) + return True except Exception as e: - self.LOG.error(e) + self.LOG.error(f"发送图片消息失败: {e}") + return False - return 0 + async def send_file(self, file_path, to_user): + """发送文件消息""" + if not self.ipad_bot or not self.ipad_running: + self.LOG.error("wechat_ipad客户端未初始化或未运行") + return False + + try: + await self.ipad_bot.send_file(to_user, file_path) + return True + except Exception as e: + self.LOG.error(f"发送文件消息失败: {e}") + return False + + def stop_wechat_ipad(self): + """停止wechat_ipad客户端""" + self.ipad_running = False + if self.ipad_loop: + self.ipad_loop.stop() + self.LOG.info("wechat_ipad客户端已停止") def keep_running_and_block_process(self) -> None: """ @@ -295,32 +470,36 @@ class Robot(Job): self.contact_manager.refresh_contacts(self.allContacts) self.LOG.info("联系人信息已刷新") - def send_group_txt_message(self, msg: str, feature: Feature): + async def send_group_txt_message(self, msg: str, feature: Feature): + """向所有启用了特定功能的群发送文本消息""" try: receivers = self.gbm.get_group_list() if not receivers: return for r in receivers: if self.gbm.get_group_permission(r, feature) == PermissionStatus.ENABLED: - self.message_util.send_text(msg, r) + await self.send_text(msg, r) except Exception as e: self.LOG.error(f"send_group_txt_message:{feature.description} error:{e}") - def send_group_file_message(self, path: str, feature: Feature): + async def send_group_file_message(self, path: str, feature: Feature): + """向所有启用了特定功能的群发送文件消息""" try: receivers = self.gbm.get_group_list() if not receivers: return for r in receivers: if self.gbm.get_group_permission(r, feature) == PermissionStatus.ENABLED: - self.message_util.send_file(path, r) + await self.send_file(path, r) except Exception as e: self.LOG.error(f"send_group_file_message:{feature.description} error:{e}") - def process_plugin_message(self, msg: WxMessage) -> bool: + async def process_plugin_message(self, msg) -> bool: """使用插件处理消息""" # 获取所有消息处理插件 message_plugins = self.plugin_registry.get_plugins_by_type(MessagePluginInterface) + if not message_plugins: + return False # 依次尝试处理消息 for plugin in message_plugins: @@ -328,267 +507,41 @@ class Robot(Job): continue try: - # 转换WxMessage为插件可处理的格式 + # 转换消息为插件可处理的格式 plugin_msg = { "type": msg.msg_type, "content": msg.content.clean_content, "sender": msg.sender, "roomid": msg.roomid if msg.from_group() else "", - "xml": msg.content.xml_content, - "is_at": msg.is_at(self.wxid), # 确保正确设置is_at标志 + "is_at": msg.is_at(self.wxid), "timestamp": time.time(), - "message_util": self.message_util, # 提供消息工具类 - "gbm": self.gbm, # 每次从程序变量中取,保证最新 "all_contacts": self.allContacts, - "full_wx_msg": msg + "full_wx_msg": msg, + "gbm": self.gbm, + "bot": self.ipad_bot } # 检查插件是否可以处理该消息 if plugin.can_process(plugin_msg): - processed, _ = plugin.process_message(plugin_msg) + processed, _ = await plugin.process_message(plugin_msg) if processed: # 发布消息处理事件 self.event_system.publish(EventType.MESSAGE_PROCESSED, { "message": msg, "plugin": plugin.name }) - return True except Exception as e: self.LOG.error(f"插件 {plugin.name} 处理消息失败: {e}") return False - # ============================================== 业务内容========================================================== - def news_baidu_report_auto(self) -> None: - try: - news = News().get_baidu_news() - self.send_group_txt_message(news, Feature.DAILY_NEWS) - except Exception as e: - self.LOG.error(f"newsBaiduReportAuto error:{e}") - - def news_baidu_report(self, sender: str = None) -> None: - try: - news = News().get_baidu_news() - if news and isinstance(news, str): - self.message_util.send_text(news, sender) - else: - self.LOG.error("获取百度新闻返回值异常") - except Exception as e: - self.LOG.error(f"newsBaiduReport error:{e}") - # 发送错误信息给用户,让用户知道发生了什么 - - def news_en_report(self, website, sender: str = None) -> None: - try: - news = News().get_eng_news(website) - self.message_util.send_text(news, sender) - except Exception as e: - self.LOG.error(f"newsEnReport error:{e}") - - # 使用装饰器标记定时任务 星期五 10:30 执行 - def send_epic_free_games(self): - try: - if is_friday(): - games = get_free() - self.send_group_txt_message(games, Feature.EPIC) - except Exception as e: - self.LOG.error(f"sendEpicFreeGames error:{e}") - - # 使用装饰器标记定时任务 - def message_count_to_db(self): - try: - self.message_storage.write_to_db() - except Exception as e: - self.LOG.error(f"write_to_db error:{e}") - - def generate_sehuatang_pdf(self): - try: - self.LOG.info("开始生成PDF,generate_sehuatang_pdf") - path = pdf_file_path() - # 暂时只发4K群 - self.send_group_file_message(path, Feature.PDF_CAPABILITY) - except Exception as e: - self.LOG.error(f"generateSehuatangPdf error:{e}") - - def generate_and_send_ranking(self): - try: - receivers = self.gbm.get_group_list() - if not receivers: - return - for r in receivers: - if self.gbm.get_group_permission(r, Feature.DAILY_SUMMARY) == PermissionStatus.ENABLED: - output = self.message_storage.generate_and_send_ranking(r, self.allContacts) - self.message_util.send_text(output, r) - except Exception as e: - self.LOG.error(f"SendRanking error:{e}") - - # - # # 设置定时任务 - # def game_auto_tasks(self): - # try: - # group_ids = get_group_ids() - # for gid in group_ids: - # if self.gbm.get_group_permission(gid, Feature.TASK_GAME) == PermissionStatus.ENABLED: - # rep = run_random_task_assignment(group_id=gid) - # message = rep["message"] - # player_id = rep["player_id"] - # print(f"消息: {message}") - # print(f"玩家ID: {player_id}") - # self.send_text_msg(message, gid, player_id) - # except Exception as e: - # self.LOG.error(f"message_summary_robot error:{e}") - - def xiu_ren_download_task(self): - try: - # 每天下载10组图,然后发一个帖子PDF - meitu_dowload_pub_pic() - except Exception as e: - self.LOG.error(f"xiu_ren_download_task error:{e}") - - def xiu_ren_pdf_send(self): - try: - pub_path = generate_pdf_from_images("xiuren") - self.message_util.send_file(pub_path, "45317011307@chatroom") - except Exception as e: - self.LOG.error(f"xiu_ren_pdf_send error:{e}") - - # 本逻辑主要解决加载联系人信息的问题,只从数据库里面提取,不完成下载行为。 def get_all_contacts(self) -> dict: """获取所有联系人信息并返回字典格式 {wxid: nickname}""" - # 从数据库提取信息,如果数据库没内容,则完成第一次初始化。 try: - # 先尝试从数据库获取联系人信息 - contacts_dict = self.contacts_db.get_all_contacts() - # 获取群成员列表 - return contacts_dict - + # 从数据库获取联系人信息 + contacts = self.contacts_db.get_all_contacts() + return contacts except Exception as e: self.LOG.error(f"获取联系人信息失败: {e}") return {} - - def sync_all_contacts(self): - """同步所有联系人信息""" - try: - # 数据库中没有联系人信息,需要初始化 - self.LOG.info("数据库中没有联系人信息,开始初始化...") - - contacts_dict = {} - # 获取所有联系人列表 - response = self.client.fetch_contacts_list(self.app_id) - self.LOG.info(f"获取联系人列表响应: {response}") - - if not response or response.get("ret") != 200: - self.LOG.warning(f"获取联系人列表失败: {response}") - return contacts_dict - - # 从响应中提取联系人数据 - contact_data = response.get("data", {}) - - # 处理好友列表 - friends = contact_data.get("friends", []) - for wxid in friends: - contacts_dict[wxid] = wxid # 默认使用wxid作为昵称 - - # 处理群聊列表 - chatrooms = contact_data.get("chatrooms", []) - for chatroom_id in chatrooms: - contacts_dict[chatroom_id] = chatroom_id - # 如果是群聊,则获取群成员信息 - self.update_chatroom_member_details(chatroom_id) - - # 处理公众号列表 - ghs = contact_data.get("ghs", []) - for gh_id in ghs: - contacts_dict[gh_id] = gh_id - - # 获取联系人详细信息(昵称等) - self.update_contact_details(contacts_dict) - - self.LOG.info(f"成功获取并保存{len(contacts_dict)}个联系人信息") - return contacts_dict - - except Exception as e: - self.LOG.error(f"获取联系人信息失败: {e}") - return {} - - def update_contact_details(self, contacts_dict): - """更新联系人详细信息(昵称等)""" - try: - # 将wxid列表分批处理,每批50个 - batch_size = 10 - wxids = list(contacts_dict.keys()) - - for i in range(0, len(wxids), batch_size): - batch_wxids = wxids[i:i + batch_size] - - # 批量获取联系人详细信息 - contact_info = self.client.get_detail_info(self.app_id, batch_wxids) - self.LOG.info(f"获取联系人详细信息响应: {contact_info}") - # 处理返回的数据 - if contact_info and contact_info.get("ret") == 200 and "data" in contact_info: - contact_data = contact_info.get("data", []) - - if contact_data: - for contact in contact_data: - user_name = contact.get("userName") - if not user_name or user_name not in contacts_dict: - continue - - # 更新昵称 - contacts_dict[user_name] = contact.get("nickName") or user_name - - try: - # 判断联系人类型 - contact_type = "friends" # 默认为好友类型 - if user_name.endswith("@chatroom"): - contact_type = "chatrooms" - elif user_name.startswith("gh_"): - contact_type = "ghs" - - # 保存到数据库 - self.contacts_db.save_contacts([contact], contact_type) - - except Exception as e: - self.LOG.error(f"处理联系人 {user_name} 失败: {e}") - continue - else: - self.LOG.error(f"获取联系人详情失败: {contact_info}") - - except Exception as e: - self.LOG.error(f"更新联系人详细信息失败: {e}") - - def update_chatroom_member_details(self, chatroom_id): - """更新群成员详细信息""" - try: - # 首先获取群成员列表 - members_response = self.client.get_chatroom_member_list(self.app_id, chatroom_id) - if members_response and members_response.get('ret') == 200: - member_list = members_response.get('data', {}).get('memberList', []) - - # 提取成员wxid列表 - member_wxids = [member.get('wxid') for member in member_list if member.get('wxid')] - - if member_wxids: - # 按照官方接口格式传递参数 - details_response = self.client.get_chatroom_member_detail( - self.app_id, - chatroom_id, - member_wxids # 直接传递列表,不需要转换为集合 - ) - - success = self.contacts_db.process_chatroom_member_detail_response(chatroom_id, details_response) - - if success: - self.LOG.info(f"成功更新群聊{chatroom_id}的成员详细信息") - else: - self.LOG.error(f"更新群聊{chatroom_id}的成员详细信息失败") - - return success - else: - self.LOG.warning(f"群聊{chatroom_id}没有成员") - return False - else: - self.LOG.error(f"获取群聊{chatroom_id}成员列表失败") - return False - except Exception as e: - self.LOG.error(f"更新群聊成员详细信息出错: {e}") diff --git a/utils/decorator/plugin_decorators.py b/utils/decorator/plugin_decorators.py index 4dc491b..5ef6a84 100644 --- a/utils/decorator/plugin_decorators.py +++ b/utils/decorator/plugin_decorators.py @@ -1,7 +1,8 @@ import functools import time import traceback -import logging +import asyncio +from loguru import logger from datetime import datetime from typing import Callable, Dict, Any, Tuple @@ -19,14 +20,13 @@ def plugin_stats_decorator(plugin_name: str) -> Callable: 装饰器函数 """ # 获取日志记录器 - logger = logging.getLogger(f"StatsCollector.{plugin_name}") logger.debug(f"为插件 '{plugin_name}' 应用统计装饰器") def decorator(func: Callable) -> Callable: logger.debug(f"装饰 '{plugin_name}' 的 {func.__name__} 方法") @functools.wraps(func) - def wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: + async def async_wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: # 获取数据库连接 try: logger.debug(f"[{plugin_name}] 开始处理消息") @@ -48,7 +48,122 @@ def plugin_stats_decorator(plugin_name: str) -> Callable: logger.debug(f"[{plugin_name}] 开始执行时间: {datetime.fromtimestamp(start_time).strftime('%Y-%m-%d %H:%M:%S.%f')}") try: - # 调用原始方法 + # 调用原始异步方法 + logger.debug(f"[{plugin_name}] 调用原始方法 {func.__name__}") + success, response = await func(self, message) + + # 计算执行时间(毫秒) + end_time = time.time() + process_time_ms = (end_time - start_time) * 1000 + logger.debug(f"[{plugin_name}] 执行完成,耗时: {process_time_ms:.2f}ms, 结果: {success}, 响应: {response}") + + # 记录插件调用 + logger.debug(f"[{plugin_name}] 记录插件调用统计") + stats_db.record_plugin_call( + plugin_name=plugin_name, + command=command, + user_id=sender, + group_id=roomid, + success=success, + process_time_ms=process_time_ms + ) + logger.info(f"[{plugin_name}] 成功记录插件调用: {command}, 耗时: {process_time_ms:.2f}ms") + + # 定义不需要记录错误的正常业务状态 + normal_responses = { + "没有权限", + "命令格式错误", + "请先开启功能", + # 可以添加其他正常的业务状态返回 + } + + # 新增:如果业务代码返回失败,且不属于正常业务状态,则记录错误信息 + if not success and response and response not in normal_responses: + logger.debug(f"[{plugin_name}] 业务代码返回失败,记录错误信息: {response}") + try: + stats_db.record_error( + plugin_name=plugin_name, + command=command, + user_id=sender, + group_id=roomid, + error_message=f"业务返回失败: {response}", + stack_trace="业务代码捕获的错误,无堆栈信息" + ) + logger.info(f"[{plugin_name}] 成功记录业务失败信息: {response}") + except Exception as err_record_error: + logger.error(f"[{plugin_name}] 记录业务失败信息出错: {err_record_error}") + + return success, response + except Exception as e: + # 计算执行时间(毫秒) + end_time = time.time() + process_time_ms = (end_time - start_time) * 1000 + + # 记录错误 + error_message = str(e) + stack_trace = traceback.format_exc() + logger.error(f"[{plugin_name}] 执行出错: {error_message}") + logger.debug(f"[{plugin_name}] 错误堆栈: {stack_trace}") + + try: + # 记录插件调用(失败) + logger.debug(f"[{plugin_name}] 记录插件调用失败统计") + stats_db.record_plugin_call( + plugin_name=plugin_name, + command=command, # 使用提取的指令而不是完整内容 + user_id=sender, + group_id=roomid, + success=False, + process_time_ms=process_time_ms + ) + + # 记录错误详情 + logger.debug(f"[{plugin_name}] 记录错误详情") + stats_db.record_error( + plugin_name=plugin_name, + command=command, # 使用提取的指令而不是完整内容 + user_id=sender, + group_id=roomid, + error_message=error_message[:500] if error_message else "未知错误", # 限制长度并确保不为空 + stack_trace=stack_trace[:2000] if stack_trace else "无堆栈信息" # 限制长度并确保不为空 + ) + logger.info(f"[{plugin_name}] 成功记录插件错误: {command}, 错误: {error_message}") + except Exception as db_error: + logger.error(f"[{plugin_name}] 记录插件统计数据失败: {db_error}") + logger.error(traceback.format_exc()) + + # 重新抛出异常,让上层处理 + raise + except Exception as outer_error: + logger.error(f"[{plugin_name}] 装饰器外层错误: {outer_error}") + logger.error(traceback.format_exc()) + # 确保原始函数仍然被调用,即使装饰器出错 + return await func(self, message) + + @functools.wraps(func) + def sync_wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: + # 获取数据库连接 + try: + logger.debug(f"[{plugin_name}] 开始处理消息") + db_manager = DBConnectionManager.get_instance() + stats_db = StatsDBOperator(db_manager) + + # 提取消息信息 + content = message.get("content", "") + sender = message.get("sender", "") + roomid = message.get("roomid", "") + + # 提取指令部分(假设指令是第一个单词或空格前的部分) + command = content.strip().split(' ')[0] if content else "" + + logger.debug(f"[{plugin_name}] 消息内容: '{content}', 指令: '{command}', 发送者: {sender}, 群ID: {roomid}") + + # 记录开始时间 + start_time = time.time() + logger.debug(f"[{plugin_name}] 开始执行时间: {datetime.fromtimestamp(start_time).strftime('%Y-%m-%d %H:%M:%S.%f')}") + + try: + # 调用原始同步方法 logger.debug(f"[{plugin_name}] 调用原始方法 {func.__name__}") success, response = func(self, message) @@ -140,6 +255,10 @@ def plugin_stats_decorator(plugin_name: str) -> Callable: # 确保原始函数仍然被调用,即使装饰器出错 return func(self, message) - return wrapper + # 根据原始函数是否为异步函数返回相应的包装器 + if asyncio.iscoroutinefunction(func): + return async_wrapper + else: + return sync_wrapper return decorator \ No newline at end of file diff --git a/utils/decorator/points_decorator.py b/utils/decorator/points_decorator.py index 2c8d731..7392627 100644 --- a/utils/decorator/points_decorator.py +++ b/utils/decorator/points_decorator.py @@ -1,7 +1,8 @@ import functools import time import traceback -import logging +import asyncio +from loguru import logger from typing import Callable, Dict, Any, Tuple, Union from db.connection import DBConnectionManager @@ -25,7 +26,7 @@ def points_reward_decorator(points_calculator: Union[int, Callable], source_type def decorator(func: Callable) -> Callable: @functools.wraps(func) - def wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: + async def async_wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: # 检查权限 roomid = message.get("roomid", "") @@ -33,7 +34,74 @@ def points_reward_decorator(points_calculator: Union[int, Callable], source_type if GroupBotManager.get_group_permission(roomid, feature) == PermissionStatus.DISABLED: return False, "没有权限" - # 调用原始方法 + # 调用原始异步方法 + success, response = await func(self, message) + + # 如果原始方法执行成功,奖励积分 + if success: + try: + # 获取消息信息 + sender = message.get("sender", "") + roomid = message.get("roomid", "") + + if sender and (roomid or sender): + # 计算奖励积分数量 + if callable(points_calculator): + # 如果是函数,调用函数计算积分 + points = points_calculator(self, message, success, response) + if not points or points <= 0: + # 如果计算结果为0或负数,不奖励积分 + return success, response + else: + # 如果是固定值,直接使用 + points = points_calculator + + # 获取积分来源类型 + source = PointSource.CHECKIN + if source_type.lower() == "game": + source = PointSource.GAME + elif source_type.lower() != "checkin": + source = PointSource.OTHER + + # 奖励积分 + db_manager = DBConnectionManager.get_instance() + points_db = PointsDBOperator(db_manager) + + # 如果description是函数,调用函数获取描述 + desc = description + if callable(description): + desc = description(self, message, success, response, points) + + reward_success, reward_result = points_db.add_points( + sender, roomid, points, source, + desc or f"使用 {self.name if hasattr(self, 'name') else '功能'} 获得奖励" + ) + + logger.info(f"PointsReward.{self.name if hasattr(self, 'name') else 'Unknown'}") + if reward_success: + logger.info(f"用户 {sender} 获得 {points} 积分奖励") + + # 如果响应中没有提到积分,添加积分信息 + if "积分" not in response: + response += f"\n\n🎁 恭喜获得 {points} 积分奖励!" + else: + logger.warning(f"用户 {sender} 积分奖励失败: {reward_result}") + except Exception as e: + logger.error(f"奖励积分失败: {e}") + logger.error(traceback.format_exc()) + + return success, response + + @functools.wraps(func) + def sync_wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: + # 检查权限 + roomid = message.get("roomid", "") + + if feature and roomid: + if GroupBotManager.get_group_permission(roomid, feature) == PermissionStatus.DISABLED: + return False, "没有权限" + + # 调用原始同步方法 success, response = func(self, message) # 如果原始方法执行成功,奖励积分 @@ -76,7 +144,7 @@ def points_reward_decorator(points_calculator: Union[int, Callable], source_type desc or f"使用 {self.name if hasattr(self, 'name') else '功能'} 获得奖励" ) - logger = logging.getLogger(f"PointsReward.{self.name if hasattr(self, 'name') else 'Unknown'}") + logger.info(f"PointsReward.{self.name if hasattr(self, 'name') else 'Unknown'}") if reward_success: logger.info(f"用户 {sender} 获得 {points} 积分奖励") @@ -86,13 +154,16 @@ def points_reward_decorator(points_calculator: Union[int, Callable], source_type else: logger.warning(f"用户 {sender} 积分奖励失败: {reward_result}") except Exception as e: - logger = logging.getLogger("PointsReward") logger.error(f"奖励积分失败: {e}") logger.error(traceback.format_exc()) return success, response - return wrapper + # 根据原始函数是否为异步函数返回相应的包装器 + if asyncio.iscoroutinefunction(func): + return async_wrapper + else: + return sync_wrapper return decorator @@ -111,19 +182,90 @@ def plugin_points_cost(points: int, description: str = None, feature: Feature = def decorator(func: Callable) -> Callable: @functools.wraps(func) - def wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: + async def async_wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: try: # 检查权限 roomid = message.get("roomid", "") if feature and roomid: - if GroupBotManager.get_group_permission(roomid, feature) == PermissionStatus.DISABLED: + gbm = message.get("gbm") + if gbm and gbm.get_group_permission(roomid, feature) == PermissionStatus.DISABLED: return False, "没有权限" - # 检查是否开启了积分获取功能 SIGNIN 和 TASK_GAME 如果没有开启,则不扣积分 请用== == PermissionStatus.DISABLED 判断 - if GroupBotManager.get_group_permission(roomid, - Feature.SIGNIN) == PermissionStatus.DISABLED and GroupBotManager.get_group_permission( - roomid, Feature.TASK_GAME) == PermissionStatus.DISABLED: + # 检查是否开启了积分获取功能 + if gbm and gbm.get_group_permission(roomid, Feature.SIGNIN) == PermissionStatus.DISABLED and gbm.get_group_permission( + roomid, Feature.TASK_GAME) == PermissionStatus.DISABLED: + return await func(self, message) + + # 获取消息信息 + sender = message.get("sender", "") + roomid = message.get("roomid", "") + + if not sender or not (roomid or sender): + return await func(self, message) + + # 检查用户积分是否足够 + db_manager = DBConnectionManager.get_instance() + points_db = PointsDBOperator(db_manager) + + plugin_name = self.name if hasattr(self, 'name') else "未知插件" + logger.info(f"PointsCost.{plugin_name}") + + user_points = points_db.get_user_points(sender, roomid) + if user_points["total_points"] < points: + # 积分不足 + await self.message_util.send_text( + f"❌ 积分不足\n无法使用 {plugin_name} 功能\n" + f"🪙 先参与积分活动[签到,答题/t]赚取吧!\n" + f"💰 有: {user_points['total_points']} | 需: {points} |差: {points - user_points['total_points']} ", + (roomid if roomid else sender), sender + ) + logger.info(f"用户 {sender} 积分不足,无法使用功能") + return False, "积分不足" + + # 调用原始异步方法 + success, response = await func(self, message) + + # 如果原始方法执行成功,扣除积分 + if success: + deduct_success, deduct_result = points_db.deduct_points( + sender, roomid, points, PointSource.PLUGIN, + description or f"使用 {plugin_name} 功能" + ) + + if deduct_success: + logger.info(f"用户 {sender} 使用 {plugin_name} 功能扣除 {points} 积分") + + # 添加对 response 的类型检查 + if isinstance(response, str) and "积分" not in response: + response += f"\n\n💰 已消费 {points} 积分" + await self.message_util.send_text( + f"💰消费 {points} 积分", + (roomid if roomid else sender), sender + ) + else: + logger.warning(f"用户 {sender} 积分扣除失败: {deduct_result}") + + return success, response + except Exception as e: + logger.error(f"积分消费失败: {e}") + logger.error(traceback.format_exc()) + return await func(self, message) + + @functools.wraps(func) + def sync_wrapper(self, message: Dict[str, Any]) -> Tuple[bool, str]: + try: + # 检查权限 + roomid = message.get("roomid", "") + if feature and roomid: + gbm = message.get("gbm") + if gbm and gbm.get_group_permission(roomid, feature) == PermissionStatus.DISABLED: + return False, "没有权限" + + # 检查是否开启了积分获取功能 + if gbm and gbm.get_group_permission(roomid, Feature.SIGNIN) == PermissionStatus.DISABLED and gbm.get_group_permission( + roomid, Feature.TASK_GAME) == PermissionStatus.DISABLED: return func(self, message) + # 获取消息信息 sender = message.get("sender", "") roomid = message.get("roomid", "") @@ -136,7 +278,7 @@ def plugin_points_cost(points: int, description: str = None, feature: Feature = points_db = PointsDBOperator(db_manager) plugin_name = self.name if hasattr(self, 'name') else "未知插件" - logger = logging.getLogger(f"PointsCost.{plugin_name}") + logger.info(f"PointsCost.{plugin_name}") user_points = points_db.get_user_points(sender, roomid) if user_points["total_points"] < points: @@ -150,7 +292,7 @@ def plugin_points_cost(points: int, description: str = None, feature: Feature = logger.info(f"用户 {sender} 积分不足,无法使用功能") return False, "积分不足" - # 调用原始方法 + # 调用原始同步方法 success, response = func(self, message) # 如果原始方法执行成功,扣除积分 @@ -175,11 +317,14 @@ def plugin_points_cost(points: int, description: str = None, feature: Feature = return success, response except Exception as e: - logger = logging.getLogger("PointsCost") logger.error(f"积分消费失败: {e}") logger.error(traceback.format_exc()) return func(self, message) - return wrapper + # 根据原始函数是否为异步函数返回相应的包装器 + if asyncio.iscoroutinefunction(func): + return async_wrapper + else: + return sync_wrapper return decorator diff --git a/utils/media_downloader.py b/utils/media_downloader.py index 5e070ed..cdcd047 100644 --- a/utils/media_downloader.py +++ b/utils/media_downloader.py @@ -3,7 +3,7 @@ import requests import uuid from typing import Optional from urllib.parse import urlparse -import logging +from loguru import logger import time class MediaDownloader: @@ -16,13 +16,13 @@ class MediaDownloader: Args: download_dir: 下载目录,默认为项目下的 media_downloads 目录 """ - self.logger = logging.getLogger("MediaDownloader") + self.LOG = logger self.download_dir = download_dir or os.path.join( os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "media_downloads" ) os.makedirs(self.download_dir, exist_ok=True) - self.logger.info(f"媒体下载目录: {self.download_dir}") + self.LOG.info(f"媒体下载目录: {self.download_dir}") def download_media(self, url: str, file_type: str = None) -> Optional[str]: """ @@ -47,7 +47,7 @@ class MediaDownloader: local_path = os.path.join(self.download_dir, filename) - self.logger.info(f"开始下载媒体文件: {url} -> {local_path}") + self.LOG.info(f"开始下载媒体文件: {url} -> {local_path}") # 下载文件 response = requests.get(url, stream=True, timeout=30) @@ -58,7 +58,7 @@ class MediaDownloader: if chunk: f.write(chunk) - self.logger.info(f"媒体文件下载成功: {local_path}") + self.LOG.info(f"媒体文件下载成功: {local_path}") # 下载成功后清理旧文件 self.clear_downloads() @@ -66,7 +66,7 @@ class MediaDownloader: return os.path.abspath(local_path) except Exception as e: - self.logger.error(f"下载媒体文件失败: {url}, 错误: {str(e)}") + self.LOG.error(f"下载媒体文件失败: {url}, 错误: {str(e)}") return None def _guess_file_type(self, url: str) -> Optional[str]: @@ -138,12 +138,12 @@ class MediaDownloader: try: os.remove(file_path) cleared_count += 1 - self.logger.debug(f"已删除过期文件: {file_path}") + self.LOG.debug(f"已删除过期文件: {file_path}") except Exception as e: - self.logger.error(f"删除文件失败 {file_path}: {str(e)}") + self.LOG.error(f"删除文件失败 {file_path}: {str(e)}") if cleared_count > 0: - self.logger.info(f"清理完成,共删除 {cleared_count} 个过期文件") + self.LOG.info(f"清理完成,共删除 {cleared_count} 个过期文件") except Exception as e: - self.logger.error(f"清理下载文件时出错: {str(e)}") \ No newline at end of file + self.LOG.error(f"清理下载文件时出错: {str(e)}") \ No newline at end of file diff --git a/utils/robot_cmd/robot_command.py b/utils/robot_cmd/robot_command.py index 6461ed9..60b00f6 100644 --- a/utils/robot_cmd/robot_command.py +++ b/utils/robot_cmd/robot_command.py @@ -6,15 +6,15 @@ # 3.群AI能力 #启用群AI #关闭群AI # 4.群总结能力 #启用群总结 #关闭群总结 # 5.sehuatang PDF能力 #启用pdf #关闭pdf -import logging from typing import List import redis from enum import Enum +from loguru import logger + # 连接到本地 Redis 服务 r = redis.StrictRedis(host='192.168.2.40', port=6379, db=0, decode_responses=True) -logger = logging.getLogger(f"GroupBotManager") class PermissionStatus(Enum): """权限状态枚举""" diff --git a/utils/wechat/contact_manager.py b/utils/wechat/contact_manager.py index 9779ac7..ffaf74d 100644 --- a/utils/wechat/contact_manager.py +++ b/utils/wechat/contact_manager.py @@ -2,10 +2,10 @@ """ 联系人管理器 - 提供全局访问联系人信息的单例类 """ -import logging + +from loguru import logger from typing import Dict, Optional, List, Tuple -from gewechat_client import GewechatClient from utils.json_converter import json_to_object @@ -20,7 +20,7 @@ class ContactManager: _official_accounts: Dict[str, str] = {} # 公众号 _head_images: Dict[str, str] = {} # 头像信息 _initialized = False - _logger = logging.getLogger("ContactManager") + _logger = logger _friends: List[Dict] = [] _group_contacts_friends: Dict[str, Dict[str, str]] = {} # 定义公共好友列表 diff --git a/utils/wechat/message_to_db.py b/utils/wechat/message_to_db.py index 4fba756..f4a3685 100644 --- a/utils/wechat/message_to_db.py +++ b/utils/wechat/message_to_db.py @@ -1,29 +1,24 @@ import time from datetime import datetime, timedelta import xml.etree.ElementTree as ET -import logging import concurrent.futures # 添加线程池支持 import os -from gewechat_client import GewechatClient - from db.connection import DBConnectionManager from db.message_storage import MessageStorageDB # 导入积分系统 from db.points_db import PointsDBOperator, PointSource -from gewechat.call_back_message.message import WxMessage, MessageType +from wechat_ipad import WechatAPIClient +from wechat_ipad.models.message import WxMessage, MessageType -# 配置日志 -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' -) -logger = logging.getLogger("MessageStorage") +from loguru import logger + +logging = logger class MessageStorage: - def __init__(self, client: GewechatClient = None): + def __init__(self, client: WechatAPIClient = None): # 获取数据库连接管理器的单例 self.db_manager = DBConnectionManager.get_instance() self.message_db = MessageStorageDB(self.db_manager) @@ -123,38 +118,38 @@ class MessageStorage: if not os.path.exists(target_dir): os.makedirs(target_dir, exist_ok=True) # 尝试使用wcf下载图片到分组后的目录 - json = self.client.download_image(msg.appid, msg.content.xml_content, 2) - # { - # "ret": 200, - # "msg": "操作成功", - # "data": { - # "fileUrl": "/download/20240720/wx_BTVoJ_o_r6DpxNCNiycFE/0ca5b675-8e2c-4dc1-b288-3c44a40086ec4" - # } - # } - # 解析JSON http://192.168.2.240:2532/download/20250428/wx_3BC6eSHGE5xEm_hH3__7c/03ab5c03-5524-4a39-aabe-27ca014a4d1e.png - if json and json.get('data') and json['data'].get('fileUrl'): - file_url = json['data']['fileUrl'] - if file_url: - logger.info(f"记录gewe服务端图片路径成功: {msg.msg_id} -> {file_url}") - # 后续如果需要使用,则去服务器端提取图片 - # 直接使用下载后的路径更新数据库 - self.message_db.update_message_image_path(msg.msg_id, file_url) - - return { - 'success': True, - 'message_id': msg.msg_id, - 'roomid': msg.roomid, - 'sender': msg.sender, - 'file_path': file_url - } - else: - return { - 'success': False, - 'message_id': msg.msg_id, - 'roomid': msg.roomid, - 'sender': msg.sender, - 'error': "图片下载失败" - } + # json = self.client.download_image(msg.appid, msg.content.xml_content, 2) + # # { + # # "ret": 200, + # # "msg": "操作成功", + # # "data": { + # # "fileUrl": "/download/20240720/wx_BTVoJ_o_r6DpxNCNiycFE/0ca5b675-8e2c-4dc1-b288-3c44a40086ec4" + # # } + # # } + # # 解析JSON http://192.168.2.240:2532/download/20250428/wx_3BC6eSHGE5xEm_hH3__7c/03ab5c03-5524-4a39-aabe-27ca014a4d1e.png + # if json and json.get('data') and json['data'].get('fileUrl'): + # file_url = json['data']['fileUrl'] + # if file_url: + # logger.info(f"记录gewe服务端图片路径成功: {msg.msg_id} -> {file_url}") + # # 后续如果需要使用,则去服务器端提取图片 + # # 直接使用下载后的路径更新数据库 + # self.message_db.update_message_image_path(msg.msg_id, file_url) + # + # return { + # 'success': True, + # 'message_id': msg.msg_id, + # 'roomid': msg.roomid, + # 'sender': msg.sender, + # 'file_path': file_url + # } + # else: + # return { + # 'success': False, + # 'message_id': msg.msg_id, + # 'roomid': msg.roomid, + # 'sender': msg.sender, + # 'error': "图片下载失败" + # } else: return { 'success': False, diff --git a/wechat_ipad/bot-core.py b/wechat_ipad/bot-core.py index e30c286..6a430ff 100644 --- a/wechat_ipad/bot-core.py +++ b/wechat_ipad/bot-core.py @@ -8,6 +8,8 @@ import wechat_ipad # 明确导入需要的类 from loguru import logger +from wechat_ipad.models.message import WxMessage + async def bot_core(): # 读取 config.toml 文件 @@ -140,7 +142,11 @@ async def bot_core(): data = data.get("AddMsgs") if data: for message in data: - logger.info("message: {}".format(message)) + # 获取原始JSON数据 + # 创建消息对象 + msg = WxMessage.from_json(message) + logger.info("source message: {}".format(message)) + logger.info("parse msg: {}".format(msg)) # 使用异步睡眠替代忙等待循环 await asyncio.sleep(0.5) diff --git a/wechat_ipad/client/__init__.py b/wechat_ipad/client/__init__.py index bfaa79d..3631662 100644 --- a/wechat_ipad/client/__init__.py +++ b/wechat_ipad/client/__init__.py @@ -34,10 +34,11 @@ class WechatAPIClient(LoginMixin, MessageMixin, FriendMixin, ChatroomMixin, User raise UserLoggedOut("请先登录") output = "" - for id in at: - nickname = await self.get_nickname(id) + for at_id in at: + nickname = await self.get_chatroom_nickname(at_id, wxid) output += f"@{nickname}\u2005" + output += "\n" output += content return await self.send_text_message(wxid, output, at) diff --git a/wechat_ipad/client/fallback.png b/wechat_ipad/client/fallback.png new file mode 100644 index 0000000000000000000000000000000000000000..466ff2e47cb41203e15ae3fb441929a14565d506 GIT binary patch literal 1025077 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

Gx>i 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�@i{{9HA#(Lu8F(elU#}xRAQ>F%aJ-;0Q>X^hq$Xi;6`vE@_ zY-;SaB3-K@e&1xyg;^b_chOScEgfr>{8d4A&<9-LkBx#v%@qr|09a!{!b*%9>Yhu( z>AXyFIa9f$sFJyrGrqQmFN%dv=QmVz<0gZ0m@T_L*Vn%o(gEN4OuQMvh{HQU52FTQ z^;RmFHIW!G&xE-D5KbTczn|6^x5CHI@d*V{cFZ;^0D=X_WG%M++}2E=l|$>o|{sN z;Rjaoq%NmkTydRiN=!$3Ph5=8x_se@D@i6dLb}ZE&%uVXe?f|Td!kCq;YZzqxi_rs zfDnS`!CF?6G(W85b5s}V&F|J2wdoLDpZc_l;|uVeS`4LB#;+FRF$v6yWjOpij5uKF zipnD8i0f>nZ)z_Dscr$Dur|^?O~1}!-0+M1#QH6WQSfnwo?{;K@i#hn7zSE(v4l1B zOu-f38cum?)G>XVpB!$K*A$P1M8s~hB+a3G3x*ZLX!G?nZMOnTRNQOehm{>cYF_iI z4|ehp;W!a(GHXrD4As@JR07;KHuj`_1ZnfUtuuKXGBO$6HK

J3e5+x`>2IP5*gj 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

vX8-O4d5&7bJBDU|dskJN=LzlWP=cpxusgCaX< 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

sj>_0v;~C!n!j63IB>Q$~n^0iNQg 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 y3pzF_r(zLM{X&GMHUq}*ufA; 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

bz9fMsRXJO#`qNPQTc+@PY44bb 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