一、目标
在 n8n 平台配置自动化 workflow,实现 定时触发 -> 获取b站关键词为 AI 大模型的20个视频 -> 自定义热度算法进行排序 -> 生成 OpenAI 结构化输出报告 -> 发送邮箱

二、实现步骤
2.1 步骤一:创建定时触发器
点击 Add first step 添加第一个节点

由于我们想每天获取最新的资讯,因此需要设定定时触发器(schedule trigger)每天上午10:00定时触发


同时请注意时区需要选择 Asia/shanghai

2.2 步骤二:HTTP Request 获取B站视频
搜索节点,选择 HTTP Request

基础配置信息如下:
plain
Method: GET
URL: https://api.bilibili.com/x/web-interface/search/type
Response Format: JSON
添加查询参数如下:
plain
search_type = video
keyword = AI大模型 教程
order = pubdate
page = 1
page_size = 20
添加请求头信息如下:
plain
User-Agent = Mozilla/5.0
Referer = https://search.bilibili.com/
- 其中 order=pubdate 是按发布时间取最近视频。
- 直接 order=click 按播放量搜更像"热度最高",但更容易触发 B 站 412 风控。
- 所以后面会在 n8n 里按播放、点赞、收藏、弹幕、评论计算热度分。
2.3 步骤三:Code 对视频进行排序处理
搜索节点,选择 Code 节点

复制如下 JavaScript 代码
javascript
const response = items[0].json;
const rows = response?.data?.result || [];
function stripHtml(text) {
return String(text || '')
.replace(/<[^>]*>/g, '')
.replace(/"/g, '"')
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.trim();
}
function toNumber(value) {
if (typeof value === 'number') return value;
const text = String(value || '').trim();
if (!text || text === '--') return 0;
if (text.endsWith('万')) return Number.parseFloat(text) * 10000;
return Number.parseFloat(text.replace(/,/g, '')) || 0;
}
const videos = rows
.filter(v => v.type === 'video')
.map(v => {
const play = toNumber(v.play);
const like = toNumber(v.like);
const favorites = toNumber(v.favorites);
const danmaku = toNumber(v.danmaku);
const review = toNumber(v.review);
return {
title: stripHtml(v.title),
author: v.author || '',
bvid: v.bvid || '',
url: v.bvid ? `https://www.bilibili.com/video/${v.bvid}` : v.arcurl,
description: stripHtml(v.description),
tags: v.tag || '',
duration: v.duration || '',
publishedAt: v.pubdate
? new Date(v.pubdate * 1000).toISOString().slice(0, 10)
: '',
play,
like,
favorites,
danmaku,
review,
heatScore: play + like * 20 + favorites * 30 + danmaku * 10 + review * 15,
};
})
.sort((a, b) => b.heatScore - a.heatScore)
.slice(0, 10);
const reportInput = {
date: new Date().toLocaleDateString('zh-CN', { timeZone: 'Asia/Shanghai' }),
topic: 'Bilibili 最新 AI 教程视频热度 Top 10',
videos,
};
return [{ json: reportInput }];

2.4 步骤四:OpenAI 生成结构化报告
搜索节点,选择 AI 节点,并选择 OpenAI 分组的 Message Model

模型选择gpt-4o-mini,系统提示词如下:
plain
你是我的中文 AI 学习助理。下面是今天从 Bilibili 抓取到的"AI 教程"相关视频候选列表,请你生成一份结构化中文报告。
要求:
1. 不要编造视频里没有的信息,只能基于标题、描述、标签、作者、热度数据分析。
2. 先给出 150 字以内的总览。
3. 按排名列出 10 个视频,每个包含:标题、作者、链接、推荐理由、适合人群、可能能学到什么。
4. 最后给出"今天最值得优先看的 3 个"和理由。
5. 输出适合直接作为邮件正文阅读,使用清晰的小标题和列表。
今天日期:{{ $json.date }}
视频数据 JSON:
{{ JSON.stringify($json.videos, null, 2) }}

2.5 步骤五:发送报告到邮箱
搜索节点,选择 Send Email 节点

点击 setup credentials,配置如下内容
- user:你的 163 邮箱账号
- password:是你的 163 授权码,可以在163设置中查看
- Host:smtp.163.com
- Port:465

然后继续配置如下内容:
- from email:发件人
- to email:收件人
- subject: 主题
- email format:邮件格式(text 文本)
- text:文本内容
plain
{{ $json.output[0].content[0].text }}

三、测试
点击执行: execute workflow,如果没有报错说明执行成功

此时在邮件中也能看到发送成功,一切大功告成!
