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

推荐订阅源

C
Cisco Blogs
Schneier on Security
Schneier on Security
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Security Latest
Security Latest
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU
L
Lohrmann on Cybersecurity
Scott Helme
Scott Helme
Webroot Blog
Webroot Blog
Project Zero
Project Zero
Google Online Security Blog
Google Online Security Blog
The Last Watchdog
The Last Watchdog
Spread Privacy
Spread Privacy
Hacker News: Ask HN
Hacker News: Ask HN
PCI Perspectives
PCI Perspectives
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News | PayPal Newsroom
Help Net Security
Help Net Security
The Hacker News
The Hacker News
H
Heimdal Security Blog
O
OpenAI News
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security Affairs
P
Proofpoint News Feed
S
Secure Thoughts
腾讯CDC
Google DeepMind News
Google DeepMind News
量子位
罗磊的独立博客

遐说

2026第一场日出日落-黄山 [徒步]宁波九龙爱心线 [徒步]仙居公盂徒步+丽人谷溯溪(多图) 文献引用批量标注蓝色-Zotero/EndNote [出差]内蒙草原风光 [徒步]浙东小九寨 [徒步]西湖小猫线 微软Office365家庭版拼车5年180 2024浏阳跨年烟火 一路向北-广西 落日余晖——武汉东湖 博士论文盲审通过 青海出差 我开盒了我自己 hexo-butterfly+artalk无法显示文章PV浏览次数 记某站字体混淆解析方案 记第一次进藏 2024川西大环线 Python读取NetCDF文件-裁剪&计算 2024武汉东湖樱花园 zotero批量修改条目语言解决”等”和”et al”混排问题 torch_geometric_temporal安装报错找不到to_dense_adj 武汉冻雨&乡村春节 云南镇雄县凉水村滑坡:卫星影像解析 博客聚合平台RSS订阅-BlogFinder&博友圈&十年之约 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无法识别解决方案 pymongo 使用记录 Redis学习记录 Laravel 5.6 学习记录 文件名批量提取工具介绍及使用教程 win7x64 下 redis 的安装 CI框架常用数据库操作技巧
微博/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 才能抓取。

¶参考

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 遐说

请喝果茶

  • Wechat

    Wechat

  • Alipay

    Alipay