解决bilibili-api动态发布中'str' object has no attribute 'content'错误
问题背景
在使用bilibili-api进行动态发布时,开发者经常会遇到一个令人困惑的错误:'str' object has no attribute 'content'。这个错误通常发生在调用send_dynamic函数时,看似简单的代码却抛出AttributeError,让开发者无从下手。
错误原因深度分析
1. 根本原因:参数类型错误
这个错误的根本原因是参数类型传递错误。在bilibili-api的send_dynamic函数中,第一个参数info需要是BuildDynamic类的实例,而不是字符串或其他类型。
# 错误示例 - 会导致 'str' object has no attribute 'content'
await send_dynamic("Hello World", credential)
# 正确示例 - 使用BuildDynamic实例
dynamic_content = BuildDynamic.empty().add_text("Hello World")
await send_dynamic(dynamic_content, credential)
2. API调用流程解析
让我们通过一个流程图来理解bilibili-api动态发布的完整流程:
3. 错误发生的具体位置
错误通常发生在send_dynamic函数内部的这一行代码:
data = {
"dyn_req": {
"content": {
"contents": await info.get_contents(credential=credential)
}, # 这里调用info.get_contents()
"scene": info.get_dynamic_type().value,
# ... 其他参数
}
}
当info是字符串时,字符串对象没有get_contents方法,因此抛出'str' object has no attribute 'get_contents'错误。
完整解决方案
方案一:正确使用BuildDynamic类
import asyncio
from bilibili_api import dynamic, Credential
async def send_text_dynamic():
# 初始化凭据
credential = Credential(
sessdata="你的SESSDATA",
bili_jct="你的bili_jct",
buvid3="你的BUVID3"
)
# 创建动态内容
dynamic_builder = dynamic.BuildDynamic.empty()
dynamic_builder.add_text("这是一条测试动态")
# 发送动态
try:
result = await dynamic.send_dynamic(dynamic_builder, credential)
print("动态发布成功:", result)
except Exception as e:
print("动态发布失败:", str(e))
# 运行
asyncio.run(send_text_dynamic())
方案二:使用create_by_args快捷方法
async def send_dynamic_with_args():
credential = Credential(
sessdata="你的SESSDATA",
bili_jct="你的bili_jct"
)
# 使用快捷方法创建动态
dynamic_content = dynamic.BuildDynamic.create_by_args(
text="带话题的动态 #测试话题#",
topic_id=123456 # 实际的话题ID
)
result = await dynamic.send_dynamic(dynamic_content, credential)
return result
方案三:包含图片的动态发布
from bilibili_api.utils.picture import Picture
async def send_image_dynamic():
credential = Credential(
sessdata="你的SESSDATA",
bili_jct="你的bili_jct"
)
# 加载图片
image = await Picture.from_file("path/to/your/image.jpg")
# 构建动态
dynamic_builder = dynamic.BuildDynamic.empty()
dynamic_builder.add_text("分享一张图片")
dynamic_builder.add_image(image)
result = await dynamic.send_dynamic(dynamic_builder, credential)
return result
常见错误场景及修复
场景1:直接传递字符串
错误代码:
# 错误:直接传递字符串
await dynamic.send_dynamic("Hello B站!", credential)
修复方案:
# 正确:使用BuildDynamic包装
builder = dynamic.BuildDynamic.empty().add_text("Hello B站!")
await dynamic.send_dynamic(builder, credential)
场景2:混淆参数顺序
错误代码:
# 错误:参数顺序颠倒
await dynamic.send_dynamic(credential, "动态内容")
修复方案:
# 正确:参数顺序正确
builder = dynamic.BuildDynamic.empty().add_text("动态内容")
await dynamic.send_dynamic(builder, credential)
最佳实践指南
1. 参数验证装饰器
建议在开发时添加参数类型验证:
from functools import wraps
def validate_dynamic_param(func):
@wraps(func)
async def wrapper(info, credential, *args, **kwargs):
if not isinstance(info, dynamic.BuildDynamic):
raise TypeError("info参数必须是BuildDynamic实例")
if not isinstance(credential, Credential):
raise TypeError("credential参数必须是Credential实例")
return await func(info, credential, *args, **kwargs)
return wrapper
# 使用装饰器
@validate_dynamic_param
async def safe_send_dynamic(info, credential):
return await dynamic.send_dynamic(info, credential)
2. 错误处理模板
async def robust_dynamic_send(builder, credential, max_retries=3):
for attempt in range(max_retries):
try:
result = await dynamic.send_dynamic(builder, credential)
return result
except AttributeError as e:
if "'str' object has no attribute" in str(e):
print("参数类型错误,请检查是否正确使用BuildDynamic")
raise
else:
print(f"其他AttributeError: {e}")
raise
except Exception as e:
print(f"尝试 {attempt + 1} 失败: {e}")
if attempt == max_retries - 1:
raise
await asyncio.sleep(2 ** attempt) # 指数退避
调试技巧
1. 使用type()函数验证类型
# 调试时添加类型检查
print(f"info类型: {type(info)}")
print(f"credential类型: {type(credential)}")
2. 查看BuildDynamic结构
# 查看BuildDynamic对象的结构
builder = dynamic.BuildDynamic.empty().add_text("测试")
print("contents:", builder.contents)
print("pics:", builder.pics)
总结
'str' object has no attribute 'content'错误是一个典型的参数类型错误,解决方案很简单:确保传递给send_dynamic的第一个参数是BuildDynamic类的实例。
记住这个简单的模式:
- 使用
BuildDynamic.empty()创建构建器 - 使用
.add_text()、.add_image()等方法添加内容 - 将构建器实例传递给
send_dynamic
通过遵循这些最佳实践,你可以避免这个常见的错误,并顺利实现bilibili动态发布功能。
进一步学习:
- 查看bilibili-api官方文档中的动态模块说明
- 学习Python类型提示和参数验证
- 掌握异步编程的最佳实践
希望本文能帮助你彻底解决这个错误,顺利开发bilibili相关应用!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



