Skip to content

OneBot v11 Bot发送的合并转发消息无法序列化 #74

Description

@njdldkl666699

如下代码,在v0.7.0版本中发送消息后报错。

bot_id, bot_nickname = await get_onebot_info(bot)
node_custom_message = OneBotMessage()
for segment in segments:
    node_custom_message += MessageSegment.node_custom(
        bot_id, bot_nickname, OneBotMessage(segment)
    )
await matcher.finish(node_custom_message)

这段代码让Bot回复一个合并转发消息,包含若干条文本消息。代码本身逻辑没有问题,可以正常发送。但在nonebot_plugin_chatrecorder的 CalledAPI hook中报错如下:

07-26 16:27:36 [ERROR] nonebot | Error when running CalledAPI hook. Running cancelled!
Traceback (most recent call last):
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1817, in _execute_context
    context = constructor(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 1496, in _init_compiled
    flattened_processors[key](compiled_params[key])
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/sql/sqltypes.py", line 2802, in process
    return json_serializer(value)
  File "/home/cola/.local/share/uv/python/cpython-3.13.12-linux-x86_64-gnu/lib/python3.13/json/__init__.py", line 235, in dumps
    return _default_encoder.encode(obj)
  File "/home/cola/.local/share/uv/python/cpython-3.13.12-linux-x86_64-gnu/lib/python3.13/json/encoder.py", line 202, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/home/cola/.local/share/uv/python/cpython-3.13.12-linux-x86_64-gnu/lib/python3.13/json/encoder.py", line 263, in iterencode
    return _iterencode(o, 0)
  File "/home/cola/.local/share/uv/python/cpython-3.13.12-linux-x86_64-gnu/lib/python3.13/json/encoder.py", line 182, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type MessageSegment is not JSON serializable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
> File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/anyio/_core/_tasks.py", line 275, in _run_coro
    retval = await self._coro
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/nonebot_plugin_chatrecorder/adapters/onebot_v11.py", line 106, in record_send_msg
    await db_session.commit()
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/ext/asyncio/session.py", line 999, in commit
    await greenlet_spawn(self.sync_session.commit)
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
    result = context.switch(value)
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/session.py", line 2035, in commit
    trans.commit(_to_root=True)
  File "<string>", line 2, in commit
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
    ret_value = fn(self, *arg, **kw)
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/session.py", line 1316, in commit
    self._prepare_impl()
  File "<string>", line 2, in _prepare_impl
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
    ret_value = fn(self, *arg, **kw)
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/session.py", line 1290, in _prepare_impl
    self.session.flush()
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/session.py", line 4353, in flush
    self._flush(objects)
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/session.py", line 4488, in _flush
    with util.safe_reraise():
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/util/langhelpers.py", line 122, in __exit__
    raise exc_value.with_traceback(exc_tb)
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/session.py", line 4449, in _flush
    flush_context.execute()
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/unitofwork.py", line 465, in execute
    rec.execute(self)
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/unitofwork.py", line 641, in execute
    util.preloaded.orm_persistence.save_obj(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/persistence.py", line 94, in save_obj
    _emit_insert_statements(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/orm/persistence.py", line 1234, in _emit_insert_statements
    result = connection.execute(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1421, in execute
    return meth(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/sql/elements.py", line 526, in _execute_on_connection
    return connection._execute_clauseelement(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1643, in _execute_clauseelement
    ret = self._execute_context(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1823, in _execute_context
    self._handle_dbapi_exception(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 2365, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/engine/base.py", line 1817, in _execute_context
    context = constructor(
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/engine/default.py", line 1496, in _init_compiled
    flattened_processors[key](compiled_params[key])
  File "/home/cola/Softwares/kanade-bot/.venv/lib/python3.13/site-packages/sqlalchemy/sql/sqltypes.py", line 2802, in process
    return json_serializer(value)
  File "/home/cola/.local/share/uv/python/cpython-3.13.12-linux-x86_64-gnu/lib/python3.13/json/__init__.py", line 235, in dumps
    return _default_encoder.encode(obj)
  File "/home/cola/.local/share/uv/python/cpython-3.13.12-linux-x86_64-gnu/lib/python3.13/json/encoder.py", line 202, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/home/cola/.local/share/uv/python/cpython-3.13.12-linux-x86_64-gnu/lib/python3.13/json/encoder.py", line 263, in iterencode
    return _iterencode(o, 0)
  File "/home/cola/.local/share/uv/python/cpython-3.13.12-linux-x86_64-gnu/lib/python3.13/json/encoder.py", line 182, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
sqlalchemy.exc.StatementError: (builtins.TypeError) Object of type MessageSegment is not JSON serializable
[SQL: INSERT INTO nonebot_plugin_chatrecorder_messagerecord_v2 (session_persist_id, time, type, message_id, message, plain_text) VALUES (?, ?, ?, ?, ?, ?)]
[parameters: [{'message': [{'type': 'node', 'data': {'user_id': '2772953784', 'nickname': '宵崎奏', 'content': [MessageSegment(type='text', data={'text': '……绘名是你的太阳啊。' ... (462 characters truncated) ... e': datetime.datetime(2026, 7, 26, 8, 27, 36, 964212), 'plain_text': '', 'type': 'message_sent', 'message_id': '1371756018', 'session_persist_id': 14}]]

根据日志,报错显示的是这条合并转发消息中的V11 MessageSegment无法序列化。

代码 nonebot_plugin_chatrecorder/adapters/onebot_v11.py 中,对于Message的序列化实现是调用__dict__,这并不是一个最好的实现方式。希望大佬能够修改实现支持合并转发消息的序列化。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions