重构 B站提取器:移除技能配置,添加Python脚本实现
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
B站视频提取脚本
|
||||
提取视频信息、统计数据、字幕并生成Markdown笔记
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
import re
|
||||
from datetime import datetime
|
||||
|
||||
# 添加skills路径
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'skills', 'obsidian-kb'))
|
||||
|
||||
from src.extractors.bilibili_extractor import BilibiliExtractor
|
||||
from src.config import get_config
|
||||
|
||||
|
||||
def format_number(num):
|
||||
"""格式化数字"""
|
||||
if num >= 100000000:
|
||||
return f"{num / 100000000:.1f}亿"
|
||||
elif num >= 10000:
|
||||
return f"{num / 10000:.1f}万"
|
||||
else:
|
||||
return f"{num:,}"
|
||||
|
||||
|
||||
def generate_markdown(result, bvid):
|
||||
"""生成Markdown笔记"""
|
||||
metadata = result['metadata']
|
||||
stats = result['stats']
|
||||
description = result['description']
|
||||
subtitle = result['subtitle']
|
||||
|
||||
# 获取当前时间
|
||||
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||
|
||||
md = f"""# {metadata['title']}
|
||||
|
||||
> **来源**: [B站](https://www.bilibili.com/video/{bvid})
|
||||
> **作者**: {metadata['author']}
|
||||
> **发布时间**: {metadata['pubtime']}
|
||||
> **提取时间**: {now}
|
||||
> **时长**: {metadata['duration']}
|
||||
|
||||
## 📊 统计数据
|
||||
|
||||
| 指标 | 数量 |
|
||||
|------|------|
|
||||
| 👀 播放 | {format_number(stats['view'])} |
|
||||
| 💬 弹幕 | {format_number(stats['danmaku'])} |
|
||||
| 📝 评论 | {format_number(stats['reply'])} |
|
||||
| ⭐ 收藏 | {format_number(stats['favorite'])} |
|
||||
| 🪙 投币 | {format_number(stats['coin'])} |
|
||||
| 🔗 分享 | {format_number(stats['share'])} |
|
||||
| 👍 点赞 | {format_number(stats['like'])} |
|
||||
|
||||
## 📝 视频简介
|
||||
|
||||
{description if description else '(暂无简介)'}
|
||||
|
||||
## 📌 标签
|
||||
|
||||
{metadata['tags'] if metadata['tags'] else '(无标签)'}
|
||||
|
||||
## 🎬 字幕
|
||||
|
||||
{subtitle if subtitle else '(无字幕)'}
|
||||
|
||||
---
|
||||
|
||||
**元数据**:
|
||||
- BV号: `{metadata['bvid']}`
|
||||
- AV号: `{metadata['aid']}`
|
||||
- UP主ID: `{metadata['mid']}`
|
||||
"""
|
||||
|
||||
return md
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
# BV号
|
||||
bvid = "BV1N5foBjE5K" # 从 https://b23.tv/btMGoOi 解析得到
|
||||
|
||||
print(f"开始提取B站视频: {bvid}")
|
||||
print("=" * 60)
|
||||
|
||||
# 获取配置
|
||||
try:
|
||||
config = get_config()
|
||||
except Exception as e:
|
||||
print(f"⚠️ 获取配置失败,使用默认配置: {e}")
|
||||
config = None
|
||||
|
||||
# 创建提取器
|
||||
extractor = BilibiliExtractor(config=config)
|
||||
|
||||
# 提取视频信息
|
||||
try:
|
||||
result = extractor.extract(bvid)
|
||||
|
||||
print("\n✅ 提取成功!\n")
|
||||
print("=" * 60)
|
||||
print("基本信息:")
|
||||
print("=" * 60)
|
||||
print(f"标题: {result['metadata']['title']}")
|
||||
print(f"作者: {result['metadata']['author']}")
|
||||
print(f"时长: {result['metadata']['duration']}")
|
||||
print(f"发布: {result['metadata']['pubtime']}")
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("统计数据:")
|
||||
print("=" * 60)
|
||||
print(f"播放: {format_number(result['stats']['view'])}")
|
||||
print(f"弹幕: {format_number(result['stats']['danmaku'])}")
|
||||
print(f"评论: {format_number(result['stats']['reply'])}")
|
||||
print(f"收藏: {format_number(result['stats']['favorite'])}")
|
||||
print(f"投币: {format_number(result['stats']['coin'])}")
|
||||
print(f"点赞: {format_number(result['stats']['like'])}")
|
||||
|
||||
# 生成 Markdown 笔记
|
||||
md_content = generate_markdown(result, bvid)
|
||||
|
||||
# 确保 notes 目录存在
|
||||
notes_dir = "/home/admin/.openclaw/workspace/notes"
|
||||
os.makedirs(notes_dir, exist_ok=True)
|
||||
|
||||
# 生成文件名(使用BV号作为文件名)
|
||||
filename = f"{bvid}.md"
|
||||
filepath = os.path.join(notes_dir, filename)
|
||||
|
||||
# 写入文件
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
f.write(md_content)
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print(f"✅ Markdown笔记已生成: {filepath}")
|
||||
print("=" * 60)
|
||||
|
||||
# 返回笔记内容
|
||||
return md_content
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n❌ 提取失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return None
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -0,0 +1,45 @@
|
||||
# 【建议收藏】2026 最实用的 Skills 清单
|
||||
|
||||
> **来源**: [B站](https://www.bilibili.com/video/BV1N5foBjE5K)
|
||||
> **作者**: 松小鼠呀ya
|
||||
> **发布时间**: 2026-02-04 20:34:23
|
||||
> **提取时间**: 2026-02-07 14:52:30
|
||||
> **时长**: 09:29
|
||||
|
||||
## 📊 统计数据
|
||||
|
||||
| 指标 | 数量 |
|
||||
|------|------|
|
||||
| 👀 播放 | 3,666 |
|
||||
| 💬 弹幕 | 20 |
|
||||
| 📝 评论 | 68 |
|
||||
| ⭐ 收藏 | 379 |
|
||||
| 🪙 投币 | 126 |
|
||||
| 🔗 分享 | 45 |
|
||||
| 👍 点赞 | 159 |
|
||||
|
||||
## 📝 视频简介
|
||||
|
||||
本频道持续分享创富案例 & AI 前沿应用
|
||||
关于投资,会员内容以专题形式呈现,系统梳理从财富认知、全球趋势,到投资理念与实操策略的完整方法论,帮助你构建稳健而清晰的投资思维体系。
|
||||
欢迎订阅。
|
||||
|
||||
热门推荐:
|
||||
一个人,年入2000万,AI时代怎么创业?拆解他的全部爆款项目:BV1iKbrzhEFt
|
||||
为什么还没财富自由?90% 的人都卡在这 3 道坎:BV1WkGHz7Ead
|
||||
【只赚不赔】怎么投资,才能穿越牛熊周期?:BV1mRVbzLEvK
|
||||
|
||||
## 📌 标签
|
||||
|
||||
(无标签)
|
||||
|
||||
## 🎬 字幕
|
||||
|
||||
(无字幕)
|
||||
|
||||
---
|
||||
|
||||
**元数据**:
|
||||
- BV号: `BV1N5foBjE5K`
|
||||
- AV号: `116012368270013`
|
||||
- UP主ID: `689748391`
|
||||
@@ -1,191 +0,0 @@
|
||||
---
|
||||
name: bilibili-extractor
|
||||
description: B站视频内容提取工具,使用Playwright + undetected-playwright绕过反爬虫,支持提取视频信息、统计数据、字幕并生成Markdown笔记。
|
||||
---
|
||||
|
||||
# SKILL.md - B站视频内容提取工具
|
||||
|
||||
## 功能说明
|
||||
|
||||
这个工具可以从B站(bilibili.com)提取视频内容并生成结构化的Markdown笔记。
|
||||
|
||||
**核心能力:**
|
||||
- ✅ 绕过B站极验验证码
|
||||
- ✅ 提取视频基本信息(标题、UP主、时长、发布时间)
|
||||
- ✅ 获取视频统计数据(播放量、点赞、投币、收藏、分享、弹幕、评论)
|
||||
- ✅ 提取视频字幕(如果有CC字幕)
|
||||
- ✅ 生成结构化Markdown笔记
|
||||
|
||||
## 适用场景
|
||||
|
||||
当用户请求:
|
||||
- "帮我提取这个B站视频的内容:[链接]"
|
||||
- "分析这个B站视频:BV号"
|
||||
- "获取B站视频的字幕"
|
||||
- "生成B站视频的笔记"
|
||||
|
||||
## 工作原理
|
||||
|
||||
使用 Playwright + undetected-playwright (stealth_async) 绕过B站的反爬虫检测:
|
||||
1. 使用stealth模式启动浏览器
|
||||
2. 访问B站视频页面
|
||||
3. 多策略提取数据(JS变量 → HTML解析 → API备用)
|
||||
4. 处理验证码(如果触发)
|
||||
5. 生成Markdown笔记
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 方式1:直接运行脚本
|
||||
|
||||
```bash
|
||||
cd /home/admin/.openclaw/workspace
|
||||
./bilibili_venv/bin/python bilibili_extractor.py
|
||||
```
|
||||
|
||||
### 方式2:修改视频ID
|
||||
|
||||
编辑 `bilibili_extractor.py` 文件,修改 `bvid` 变量:
|
||||
|
||||
```python
|
||||
bvid = "BV11t64BJEDZ" # 修改为目标视频的BV号
|
||||
```
|
||||
|
||||
### 方式3:作为子代理任务使用
|
||||
|
||||
启动子代理处理:
|
||||
|
||||
```python
|
||||
sessions_spawn(
|
||||
task="提取B站视频内容:BV11t64BJEDZ",
|
||||
model="zhipu/glm-4.7"
|
||||
)
|
||||
```
|
||||
|
||||
## 文件位置
|
||||
|
||||
**主程序:** `/home/admin/.openclaw/workspace/bilibili_extractor.py`
|
||||
|
||||
**虚拟环境:** `/home/admin/.openclaw/workspace/bilibili_venv/`
|
||||
|
||||
**文档:**
|
||||
- `BILIBILI_EXTRACTOR_README.md` - 完整技术文档
|
||||
- `USAGE.md` - 快速使用指南
|
||||
- `PROJECT_SUMMARY.md` - 项目总结
|
||||
|
||||
**输出目录:** `/home/admin/.openclaw/workspace/notes/`
|
||||
|
||||
## 处理验证码
|
||||
|
||||
如果遇到验证码:
|
||||
|
||||
1. 修改脚本中的 `headless` 参数:
|
||||
```python
|
||||
# 改为非headless模式
|
||||
browser = p.chromium.launch(headless=False, args=args)
|
||||
```
|
||||
|
||||
2. 运行脚本,浏览器会显示,手动完成验证
|
||||
3. 验证通过后可以改回 `headless=True`
|
||||
|
||||
## 支持的输入格式
|
||||
|
||||
- 短链接:`lid6E0m`
|
||||
- 完整短链接:`https://b23.tv/lid6E0m`
|
||||
- BV号:`BV11t64BJEDZ`
|
||||
- 完整视频链接:`https://www.bilibili.com/video/BV11t64BJEDZ`
|
||||
|
||||
## 短链接转换工具
|
||||
|
||||
如果需要将B站短链接转换为完整链接,可以使用:
|
||||
|
||||
```bash
|
||||
./scripts/bilibili-short-to-long.sh lid6E0m
|
||||
```
|
||||
|
||||
输出:`https://www.bilibili.com/video/BV11t64BJEDZ`
|
||||
|
||||
## 注意事项
|
||||
|
||||
⚠️ **反爬虫警告:**
|
||||
- B站可能随时更新反爬虫策略
|
||||
- 频繁请求可能导致IP封禁
|
||||
- 建议控制请求频率
|
||||
|
||||
⚠️ **法律风险:**
|
||||
- 仅用于个人学习
|
||||
- 遵守B站服务条款
|
||||
- 不要大规模爬取
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 问题1:无法绕过验证码
|
||||
|
||||
**解决方案:**
|
||||
- 使用非headless模式手动处理验证
|
||||
- 更新 undetected-playwright 到最新版本
|
||||
- 尝试更换浏览器配置参数
|
||||
|
||||
### 问题2:页面加载超时
|
||||
|
||||
**解决方案:**
|
||||
- 检查网络连接
|
||||
- 增加超时时间(修改脚本中的 timeout 参数)
|
||||
- 使用代理IP
|
||||
|
||||
### 问题3:无法提取字幕
|
||||
|
||||
**原因:** 目标视频可能没有CC字幕
|
||||
|
||||
**解决方案:**
|
||||
- 检查视频是否有字幕
|
||||
- 脚本已优雅处理无字幕情况
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **Playwright** - 浏览器自动化框架
|
||||
- **undetected-playwright** - 反检测插件
|
||||
- **BeautifulSoup4** - HTML解析
|
||||
- **Python 3.10+**
|
||||
|
||||
## 依赖安装
|
||||
|
||||
```bash
|
||||
pip install playwright undetected-playwright beautifulsoup4 requests
|
||||
playwright install chromium
|
||||
```
|
||||
|
||||
(虚拟环境已安装所有依赖)
|
||||
|
||||
## 示例输出
|
||||
|
||||
生成的Markdown笔记包含:
|
||||
```markdown
|
||||
# 时代真变了!glm4.7+playwright cli, AI自主进行自动化测试
|
||||
|
||||
**UP主**: 录教程的乙醇啦
|
||||
**BV号**: BV11t64BJEDZ
|
||||
**时长**: 04:46
|
||||
**发布时间**: 2026-02-01 18:39:58
|
||||
|
||||
## 视频统计
|
||||
- 播放量: 969
|
||||
- 点赞: 22
|
||||
- 投币: 10
|
||||
- 收藏: 72
|
||||
- 分享: 15
|
||||
- 弹幕: 0
|
||||
- 评论: 9
|
||||
|
||||
## 字幕内容
|
||||
(如果有字幕)
|
||||
...
|
||||
```
|
||||
|
||||
## 相关脚本
|
||||
|
||||
- `scripts/bilibili-short-to-long.sh` - B站短链接转换工具
|
||||
- `scripts/install-browser-for-openclaw.sh` - 浏览器环境一键安装脚本
|
||||
|
||||
## 更多信息
|
||||
|
||||
查看完整文档:`/home/admin/.openclaw/workspace/BILIBILI_EXTRACTOR_README.md`
|
||||
Reference in New Issue
Block a user