Skip to content

关于添加无缓存引用回复方法的建议 #22

@open8eye

Description

@open8eye

我在使用您的软件的时候,希望可以轮询调用(即使轮询很消耗cpu性能)获取下一条新的消息也就是这个issue #21 。这样每次确实可以获取新的消息和他对应的chat_name.但是如果有多条消息,进行回复时,会用到引用回复。我在观察您代码时,发现他只能发送监听中的引用回复。这有点不方便,所以我阅读了wxauto的代码和接口文档,发现wxauto是支持获取当前窗口所有消息的(GetAllMessage()),根据您的代码实现,我在app/wechat_adapter.py下引入了GetAllMessage方法:

    def GetAllMessage(self):
        if not self._instance:
            raise AttributeError("微信实例未初始化")
        return self._instance.GetAllMessage()

然后为了实现无缓存引用回复,我又在app/api/message_operations.py添加了:

@message_ops_bp.route('/quote_stateless', methods=['POST'])
@require_api_key
def quote_stateless_message():
    """无需监听的 引用回复消息"""
    wx_instance = wechat_manager.get_instance()
    if not wx_instance:
        return jsonify({
            'code': 2001,
            'message': '微信未初始化',
            'data': None
        }), 400

    data = request.get_json()
    who = data.get('who')
    message_id = data.get('message_id')
    message = data.get('message', '')

    if not who or not message_id:
        return jsonify({
            'code': 1002,
            'message': '缺少必要参数',
            'data': None
        }), 400

    try:
        # 切换到who的窗口
        wx_instance.ChatWith(who)
        time.sleep(0.5)  # 等待窗口加载
        messages = wx_instance.GetAllMessage()
        logger.info(f"已切换到聊天窗口: {messages}")
        target_message = None
        for msg in messages:
            if getattr(msg, 'id', '') == message_id:
                target_message = msg
                break

        if not target_message:
            # 可能在独立窗口中 尝试关闭窗口
            wind = wx_instance.get_instance().core.get_sub_wnd(who)
            if wind:
                wind.close()
                # 因为是每次关闭窗口 消息id都会变 所以用普通的方法发送
                return send_message()

            return jsonify({
                'code': 3001,
                'message': f'未找到消息ID: {message_id}',
                'data': None
            }), 404
        # 引用回复
        target_message.quote(message)
        return jsonify({
            'code': 0,
            'message': '引用回复成功',
            'data': {
                'who': who,
                'message_id': message_id,
                'reply_text': message
            }
        })
    except Exception as e:
        logger.error(f"引用回复失败: {str(e)}")
        return jsonify({
            'code': 3001,
            'message': f'引用回复失败: {str(e)}',
            'data': None
        }), 500

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions