惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

遐说

2026第一场日出日落-黄山 [徒步]宁波九龙爱心线 [徒步]仙居公盂徒步+丽人谷溯溪(多图) 文献引用批量标注蓝色-Zotero/EndNote [出差]内蒙草原风光 [徒步]浙东小九寨 [徒步]西湖小猫线 微软Office365家庭版拼车5年180 2024浏阳跨年烟火 一路向北-广西 2025你好 落日余晖——武汉东湖 博士论文盲审通过 青海出差 我开盒了我自己 hexo-butterfly+artalk无法显示文章PV浏览次数 记某站字体混淆解析方案 记第一次进藏 2024川西大环线 Python读取NetCDF文件-裁剪&计算 2024武汉东湖樱花园 zotero批量修改条目语言解决”等”和”et al”混排问题 torch_geometric_temporal安装报错找不到to_dense_adj 武汉冻雨&乡村春节 云南镇雄县凉水村滑坡:卫星影像解析 博客聚合平台RSS订阅-BlogFinder&博友圈&十年之约 腾讯云CDN正式取消免费10G流量包 2023跨年闲逛武汉 观感|小米SU7技术发布会 【留痕】解密微信聊天记录工具:年度报告、聊天导出一键搞定! 小米电脑管家 vs. MIUI+: 手机与PC协同体验大比拼! Waline私有化部署(Docker+VPS) rclone数据同步使用记录(OneDrive+COS+AList) 科研绘图工具 秋意渐浓 Docker buildx交叉编译Python记录 Word分章节图片公示编号方法 Lightroom+Google Map生成个人足迹 评论|如何看待面青地项目允许博士后变更依托单位 Memos添加utterances评论区 收到明信片啦! [Adobe]Your Adobe app is not genuine解决方案-Clash版 尝试配置PicGo-Core日志输出等级 巴东三峡巫峡长 摄影|东湖绿道 旅行|彩云之南 超实用的铁路地图网站 新冠首阳 树莓派netplan连接开放网络(无密码WIFI) 归期已至-回国 回国前的碎碎念 法国巴黎|老牌工业帝国之旅(多图) 周末|流浪地球2|维也纳展映 维也纳黄昏&夜景 Sony A7M4/M3欧版解锁多国语言 GRASS斜坡单元分割插件(r.slopeunits) windows移植方案 周末|Prater公园|夜景 快乐五一|布拉格Praha 周末|Melk小镇一日游 CDN流量太贵?图床图片批量压缩替换 维也纳|生活感受|交通|物价|通货膨胀 GitHub Remark|给Gay Hub的小伙伴加备注 周末自制烤冷面-不想干活 布达佩斯|匈牙利游记(多图) Notion2Markdown联动发布Hexo博客-自动化部署方案 SPI/TWI水文参数计算公式-ArcGIS Pro 【再见】难得是欢聚, 最是离别多 拯救者R9000P氮化镓电源适配器测评 今天你的华为P30无限重启了吗? pyTranscriber字幕生成软件(带代理版本) Adobe Illustrator错误代码160解决方案 EndNote导入PDF文件关联(SCI-RIS-Helper)插件 ZED-F9PK4 RTK GNSS模块使用指南 pyeemd安装教程--win10 wsl + ubuntu 樱花草 - 小学回忆 咸九高速-幕阜山扶贫攻坚重点项目 NXP i.MX6ULL平台Nodejs & npm 安装教程 全国分省12.5米DEM数字高程数据(ALOS 12.5m)下载 2018&2010全国四级行政区划(省-市-区/县-街道/乡镇)c 儿童节快乐 全国/湖南省/浙江省水文监测站基本数据&湖北省水文观测站历史数据 天舟二号发射成功 解决方案:Grammarly for Word 无法使用 SDZM: Software for determining shear failure regions of rock joints CNKI知网油猴插件-一键导入Endnote&下载PDF RSS 订阅地大新闻 - CUG News Word 公式字体替代方案 ArcGIS License Manager 无法启动 - Sorry, this application cannot run under a virtual machine html table 批量转 Excel(xlsx) ImageColorAnalysisTool-图像颜色分析工具-Matlab GUI版 matlab柱状图(bar)转折线图(line)方案 图像主要颜色分析工具(pyImageColorAnalysisTool) 科研资料备份同步方案(FreeFileSync) 海量文献自定义格式整理方法(EndNote) CUG校外访问内网网站方法(官方VPN) 通过三个点绘制三维圆弧-python 记挖竹笋 日常实用小软件 长江流域三峡库区水情水位信息获取 EndNote导入文献期刊名-J无法识别解决方案
微博/Twitter同步到博客瞬间方案-RSSHub
Dorad · 2023-07-07 · via 遐说

发表于|更新于|博客

|总字数:1.4k|阅读时长:6分钟|浏览量:|

起因

看到不少博客会有“瞬间”页面,一般用来发送简短的心情,类似于说说,例如瞬间 - 长街短梦

。故也想倒腾一个。

但 Hexo 是静态博客,所以我准备将 Twitter 上的内容直接同步过来。

操作流程(简洁版)

打开RSSHub 网站,找到你需要的数据源类型,并定制化你的 URL,在 URL 末尾添加.json,指定返回数据为 JSON 格式。例如:https://rsshub.app/twitter/user/_Dorad.json

2. 创建新页面

首先使用 Hexo 命令创建新页面

1
hexo new page mood

打开页面 md 文件,添加以下内容(按需修改):

1
2
3
4
5
6
7
8
9
10
11
12
13
---
title: 瞬间
comments: "false"
date: 2023-07-06 15:53:58
---

<div class="mood-container"></div>

<script src="https://lib.baomitu.com/dayjs/1.10.6/dayjs.min.js"></script>
<script src="https://lib.baomitu.com/dayjs/1.10.6/plugin/relativeTime.min.js"></script>
<script src="https://lib.baomitu.com/dayjs/1.10.6/locale/zh-cn.min.js"></script>
<link rel="stylesheet" href="/mood/index.css" />
<script data-pjax src="/mood/index.js"></script>

在 mood 文件夹下,新建 index.js 和 index.css 文件,分别存放 js 代码和 css 样式,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
dayjs.extend(window.dayjs_plugin_relativeTime);
dayjs.locale("zh-cn");

function loadMood() {
fetch("/mood/mood.json")
.then((res) => res.json())
.then((data) => {
console.log(data);
data["items"].forEach((post) => {
const moodPostDiv = document.createElement("div");
moodPostDiv.classList.add("mood-post");
moodPostDiv.innerHTML = `
<div class="mood-avatar-container"><img class="mood-avatar"
src="${data.icon}">
</div>
<div class="mood-right">
<div class="mood-title">
<div class="mood-nickname"><a href="${post.url}"
target="_blank">${
post.authors[0]?.name
}</a></div>
<div class="mood-time">${dayjs(
post.date_published
).fromNow()}</div>
</div>
<div class="mood-dotted-line"></div>
<div class="mood-content">${post.content_html}</div>
</div>
`;
document.querySelector(".mood-container").appendChild(moodPostDiv);
});
});
}

window.onload = loadMood();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
.mood-container {
margin: 0 auto;
}

.mood-post {
display: flex;
margin-bottom: 10px;
padding: 4px;
border-radius: 1rem;
background-color: var(--global-bg);
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.3);
}

.mood-avatar-container {
width: 4rem;
margin-top: 3px;
margin-right: 0.5rem;
display: inline-block;
vertical-align: middle;
}

.mood-avatar {
overflow: hidden;
width: 5em;
border-radius: 50%;
}

.mood-right {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
margin-bottom: 3px;
}

.mood-title {
display: grid;
grid-template-columns: auto auto;
align-items: left, center;
}

.mood-nickname {
font-weight: bold;
text-align: left;
}

.mood-time {
color: var(--font-color);
margin-right: 0.3rem;
text-align: right;
}

.mood-content {
margin-top: 3px;
color: var(--font-color);
flex: 1;
}

.mood-dotted-line {
height: 1px;
background-image: linear-gradient(
to right,
#d9d9d9 50%,
#d9d9d9 50%,
transparent 0%
);
background-size: 10px 1px;
background-repeat: repeat-x;
}

3. JSON 缓存

采用 shell 或者 bash,在部署的时候自动将JSON缓存到本地文件。

1
curl https://rsshub.app/twitter/user/_Dorad.json -o ./source/mood/mood.json

由于我是采用 GitHub Action 进行自动化部署,所以我将上面的代码加入到了 GitHub Action 工作流,并设置每小时同步一次~

以下是我使用的案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
name: Automatic sync links

on:
workflow_dispatch:
schedule:
- cron: '0 2-17/1 * * *'

jobs:
syncLinks:
name: Ubuntu and node ${{ matrix.node_version }} and ${{ matrix.os }}
runs-on: ubuntu-latest
strategy:
matrix:
os: [ubuntu-latest]
node_version: [18.x]
outputs:
HAS_CHANGES: ${{ steps.changes.outputs.HAS_CHANGES }}
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Featch the friendly link & mood link
run: |
mood_str=$(curl https://rsshub.app/twitter/user/_Dorad.json)
if [[ $mood_str =~ "^(\{.*\}|\[.*\])$" ]]; then
echo "mood_str is not vaild json file"
else
echo $mood_str > source/mood/mood.json
fi
- name: Check if there is anything changed in source dir
id: changes
run: |
if [[ -n "$(git status --porcelain)" ]]; then
echo "HAS_CHANGES=true" >> $GITHUB_OUTPUT;
echo "Updates available & redeployment required."
else
echo "HAS_CHANGES=false" >> $GITHUB_OUTPUT;
echo "Nothing to commit & deploy."
fi
- name: Commit & Push
if: steps.changes.outputs.HAS_CHANGES == 'true'
uses: stefanzweifel/git-auto-commit-action@v4
with:
file_pattern: 'source/'
commit_message: link sync.

4. 网站部署&效果展示

由于我采用的 GitHub Action 自动化部署,所以配置完基本不用管。

如果是手动部署的小伙伴,推荐使用以下自用脚本:

1
2
curl https://rsshub.app/twitter/user/_Dorad.json -o ./source/mood/mood.json
hexo c& hexo g & hexo d

根据自己的情况,修改 URL 和 JSON 存储路径即可,部署时执行./deploy.bat即可一键同步部署。

方案分析

由于 Twitter API 比较难搞,而我又经常用 RSS,理所当然的想到了RSSHub项目,几乎能订阅一切,哈哈哈哈 😂 故本方案基于RSSHub项目的订阅而生。

数据流

  1. RSSHub 订阅某数据源,例如微博、Twitter、小红书、Telegram、抖音、豆瓣、知乎、B 站.etc

  2. 部署的时候通过命令行,将 Feed 同步到本地,保存为 JSON 文件

  3. 博客“瞬间”页面加载时,读取 JSON,并渲染页面

优点

  • 兼容性极强:基于 RSSHub 通用 JSON 格式,可用于微博、Twitter、小红书、Telegram、抖音、豆瓣、知乎、B 站、酷安等等等一众数据源,详情参考RSSHub 官方文档

  • 配置相对简单,迁移博客也方便

  • 有 JSON 缓存,响应更快,无墙烦恼(相对于直接请求方案)

缺点

  • 同步相对缓慢:首先 RSSHub 有缓存,更新不是那么及时,其次手动部署方案更加不及时,所以推荐使用 GitHub Action 自动化部署方案的同学使用。GitHub Action 自动化部署 Hexo 参考博文

  • RSSHub 提供的信息不一定全面:像是 Twitter、知乎、微博等防爬严重的数据源,基本都是只能抓取 20 条最新条目。

  • 反爬严重:如上所述,很多网站反爬严重,需要私有化部署 RSSHub 才能抓取。

参考