教学:制作 GitHub 同步近期博客卡片
创始人
2024-02-02 15:44:00
0

这几天看到有小伙伴将自己近期更新的博客同步显示到了 GitHub 主页,这么有趣的小卡片我是一定要尝试一把的,完整的教程我已经整理好了,一起搞起来吧~

 

4757d4c5cccb08c1321a0517f203a36b.png

2. 开始教程

2.1 实现流程:

d560e32c1f7f221bcdc53f043be621b0.png

 

Github 的主页装修主要讲的就是主页的 Markdown 文档,当我们访问 Github 的主页时,Markdown 内嵌的img标签就会对文章卡片接口发起请求,经服务器对博客站点提供的RSS数据解析转换并生成卡片数据(svg)返回到 Github,完成了博客卡片的一次渲染过程;

2.2 环境配置:

  • Vercel 部署:https://vercel.com/

  • 依赖模块:

  •  

  • 目录结构主要由 api、generators、parsers 组成:

 

github-readme-recent-article  ├─ api                        │  └─ blog                    │     └─ [index].ts           ├─ generators                 │  ├─ index.ts                │  ├─ logo.ts                 │  └─ template.html           ├─ parsers                    │  └─ index.ts                ├─ logo.png                   ├─ package-lock.json          ├─ package.json               ├─ readme.md                  └─ vercel.json

复制代码

3. 开始编码

3.1 编写分析器:

分析器主要用来解析博客站点提供的 RSS 数据。并返回指定序号的文章数据,用来生成一张文章卡片~

 

提供getArticle函数获取指定序号的文章数据,其中使用到在线服务https://api.rss2json.com/v1/api.json?{rss_url}来转换 RSS 数据,因为我们操作 JSON 要不 XML 更加的方便:

 

import axios from 'axios';
export const getArticle = async (index) => {  // 通过在线服务将RSS默认的xml数据转换为JSON格式  const originUrl = 'https://it200.cn/rss.xml';  const rssUrl = `https://api.rss2json.com/v1/api.json?rss_url=${originUrl}`;  const { data: { items } } = await axios.get(rssUrl);  const { title, pubDate: date, link: url, description } = items[    index || 0    ];  return {    title: title.length > 20 ? title.substring(0, 20) + ' ...' : title,    url,    date,    description:      description      .replace(/

.*<\/h3>|
.*<\/figcaption>|<[^>]*>/gm, '') .substring(0, 30) + '...', };}

复制代码

3.2 编写文章卡片生成器:

由接口返回的数组组合成完成的 SVG 数据

 

文章卡片数据是一个 SVG 字符串组成,这样的话使用art-template模块将是一个不错的选择,通过导出的template函数很方便的获取的完整 SVG 数据来返回到 Github:

 

import template from "art-template";import {logo} from "./logo";
export const genArticleCard = (options: {    title: string,    url: string,    date: string,    description: string,}) => {    const { title, url, date, description } = options;    return template(`${__dirname}/template.html`, {        logo,        title,        url,        date,        description,    });}

复制代码

 

art-template模块同样使用的是Mustache语法:

 

      
{logo}}" />

{{title}}

{{date}}

{{description}}

复制代码

 

注意:在使用时发现LogoGithub渲染时出现了跨域的现象,所以我选择直接使用base64字符串来替换;

3.3 编写接口:

我们选择部署到Vercel,接口编写使用Vercel的规则;

 

在项目根目录的配置文件中标明了接口的ROOT地址,[index]对应着请求时传递的文章序号参数:

 

  • 接口地址定义:api\blog\[index].ts

  • 接口实际地址:[https://root-url/blog/0](https://github-readme-recent-article.vercel.app/blog/0)

 

{  "version": 2,  "rewrites": [    {      "source": "/(.*)",      "destination": "/api/$1"    }  ]}

复制代码

 

解析请求参数中的index传到解析器中获取指定的文章数据,再将文章数据交由卡片生成器组装数据并返回到请求方:

 

import { NowRequest, NowResponse } from '@vercel/node';import { getArticle } from '../../parsers/index';import { genArticleCard } from '../../generators';
export default async (req: NowRequest, res: NowResponse) => {  const { query: { index } } = req;  const { title, url, date, description } = await getArticle(index);  res.setHeader('Cache-Control', 's-maxage=3600, stale-while-revalidate');  res.setHeader('Content-Type', 'image/svg+xml');  return res.send(    genArticleCard({      title,      url,      date,      description,    })  );}

复制代码

3.4 Vercel部署:

访问https://vercel.com/new页面开始新项目的部署,第一次部署完成后,后续将自动进行部署:选择你要部署的项目,比如说我刚创建的第一个项目,点击import

 

a046410c6be710d86aa4cb27d6ed6e04.png

 

不需要做更多的设置可以直接点击Deploy开始部署:

 

 

 

部署完成后就得到了项目的访问地址,如分配给我这个项目的github-readme-recent-article.vercel.app:

 

0f23723ffcd4212c5d127998a483bfe9.png

 

通过get形式获取序号0所对应的文章卡片:

 

ce9d53f17f0b9c006a512a9e1fa0697b.png

4. 更新 Github 主页:

加入如下的内容来获取近 3 篇写的博客的卡片吧~

 

#### 🚀 近期笔记
  
  
  

复制代码

 

f8d1628bc402a6e7231303e5f57a23f0.png

3. 总结

使用了120行左右的代码就实现了这个文章卡片在 Github 主页的展示,完整的代码已经上传至 Github,欢迎你也尝试一下这个小巧的功能~

 

本文项目已推送至 GitHub,欢迎克隆演示:git clone git@github.com:OSpoon/github-readme-recent-article.git


如果看完觉得有收获,欢迎点赞、评论、分享支持一下。你的支持和肯定,是我坚持写作的动力

 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...