这段代码让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}]]
如下代码,在v0.7.0版本中发送消息后报错。
这段代码让Bot回复一个合并转发消息,包含若干条文本消息。代码本身逻辑没有问题,可以正常发送。但在nonebot_plugin_chatrecorder的 CalledAPI hook中报错如下:
根据日志,报错显示的是这条合并转发消息中的V11 MessageSegment无法序列化。
代码 nonebot_plugin_chatrecorder/adapters/onebot_v11.py 中,对于Message的序列化实现是调用
__dict__,这并不是一个最好的实现方式。希望大佬能够修改实现支持合并转发消息的序列化。