解决bilibili-api动态发布中'str' object has no attribute 'content'错误

解决bilibili-api动态发布中'str' object has no attribute 'content'错误

【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api 【免费下载链接】bilibili-api 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-api

问题背景

在使用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动态发布的完整流程:

mermaid

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类的实例

记住这个简单的模式:

  1. 使用BuildDynamic.empty()创建构建器
  2. 使用.add_text().add_image()等方法添加内容
  3. 将构建器实例传递给send_dynamic

通过遵循这些最佳实践,你可以避免这个常见的错误,并顺利实现bilibili动态发布功能。


进一步学习:

  • 查看bilibili-api官方文档中的动态模块说明
  • 学习Python类型提示和参数验证
  • 掌握异步编程的最佳实践

希望本文能帮助你彻底解决这个错误,顺利开发bilibili相关应用!

【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api 【免费下载链接】bilibili-api 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-api

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值