教学:制作 GitHub 同步近期博客卡片

news2024/10/7 14:27:24

这几天看到有小伙伴将自己近期更新的博客同步显示到了 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>.*<\/h3>|<figcaption>.*<\/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语法:

 

<svg fill="none" width="500" height="100" xmlns="http://www.w3.org/2000/svg">  <foreignObject width="100%" height="100%">    <div xmlns="http://www.w3.org/1999/xhtml">      <style>        ...      </style>      <div class="container">        <img src="{{logo}}" />        <div>          <h3>{{title}}</h3>          <small>{{date}}</small>          <p>{{description}}</p>        </div>      </div>    </div>  </foreignObject></svg>

复制代码

 

注意:在使用时发现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 篇写的博客的卡片吧~

 

#### 🚀 近期笔记
<a target="_blank" href="https://it200.cn/">  <img src="https://github-readme-recent-article.vercel.app/blog/0"></a>
<a target="_blank" href="https://it200.cn/">  <img src="https://github-readme-recent-article.vercel.app/blog/1"></a>
<a target="_blank" href="https://it200.cn/">  <img src="https://github-readme-recent-article.vercel.app/blog/2"></a>

复制代码

 

f8d1628bc402a6e7231303e5f57a23f0.png

3. 总结

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

 

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


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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security自定义验证码登录

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 验证码登录也是项目中一个常见的需求&#xff0c;但是Spring Security并未提供自动化配置方案。所以需要开发者自行定义。这里…

Spring的创建和使用

1. 创建Spring项目 1.1 创建一个 Maven 项目 不需要使用任何模板, 点击下一步.注:所有的名称都不能包含中文.Maven仓库中的结构: 1.2 添加 Spring 框架支持 在Spring 的 配置文件 中添加依赖 spring-context: Spring的上下文spring-beans: 管理Spring对象(bean) <depende…

36、异常(Exception)

一、 引入: 不应该出现了一个不算致命的问题就导致整个系统崩溃&#xff0c;所以java设计者提供了一个异常处理机制来解决问题 快速入门&#xff1a; package exception_;public class Exception01 {public static void main(String[] args) {int num110;int num20;//异常处…

软件工程复习

文章目录&#xff08;一&#xff09;软件软件发展三阶段软件的概念什么是软件危机&#xff1f;内容包括&#xff1a;软件危机的表现&#xff1a;软件危机的原因(4)消除软件危机的途径&#xff1a;软件工程软件工程定义&#xff08;要背&#xff09;简称&#xff1a;软件工程的基…

【Java基础】第六章 | IO流

目录 | 总框架 | 文件路径相关知识 | Peoperties类与IO流、配置文件* | 1.文件流 文件字节输入流&#xff08;标准输入流&#xff09; FileInputStream 文件字节输出流 FileOutputStream 文件字符输入流 FileReader 文件字符输出流 FileWriter 应用&#xff1a;使用字…

MMDetection库中的一些模块介绍

本文目前仅包含1个主干网络和1个颈部网络。如果有机会&#xff0c;会继续补充更多模型。 若发现内容有误&#xff0c;欢迎指出。 MMDetection的图像数据一般会经历如下步骤/模块&#xff1a; #mermaid-svg-XxM18Ychr9OSpdV6 {font-family:"trebuchet ms",verdana,ari…

JavaScript 防抖与节流

目录1 函数1.1 调用函数1.2 闭包2 防抖与节流2.1 定义2.2 区别2.3 应用场景3 防抖3.1 非立即执行3.1.1 一般写法3.1.2 Vue2 中写法3.1.3 过程3.2 立即执行3.2.1 一般写法3.2.2 Vue2 中写法3.2.3 过程1 函数 应用防抖节流首先需理解以下知识 1.1 调用函数 js 函数内部 return…

电影售票系统

项目介绍 基于SpringBoot &#xff0c;Mybatis&#xff0c; Vue 的电影售票及影院管理系统&#xff08;前后端分离&#xff09;&#xff0c;具体功能见 下面演示截图 需要安装的软件 Java8 MySQL5.7或以上 Navicat或者其他管理工具 IDEA或者Eclipse Node.js 14或以上 运行项…

PLC学习笔记(三):PLC结构(2)

目录&#xff1a; PLC学习笔记&#xff08;一&#xff09;&#xff1a;概述 PLC学习笔记&#xff08;二&#xff09;&#xff1a;PLC结构&#xff08;1&#xff09; PLC学习笔记&#xff08;三&#xff09;&#xff1a;PLC结构&#xff08;2&#xff09; &#x1f981;&…

SpringBoot+Mybaits搭建通用管理系统实例八:系统权限控制实现

一、本章内容 实现自定义权限控制,通过自定义PermissionEvaluator实现操作权限的检测及控制,关于权限控制模型有ACL, DAC, MAC, RBAC, ABAC等,具体原理可参考:【权限系统设计】ACL, DAC, MAC, RBAC, ABAC 模型的不同应用场景 完整课程地址 二、开发视频 SpringBoot+Mybaits…

《操作系统-真象还原》12. 进一步完善内核

文章目录Linux 的系统调用系统调用的实现 —— 图解系统调用的实现 —— 代码触发中断寻找 IDT 中断描述符执行对应的中断例程中断例程中通过用户传入的功能号去执行对应的功能函数关于 printf你需要知道可变参数的原理Linux 中的可变参数原理Linux 中的可变参数实现printf 只是…

【微服务】SpringCloud轮询拉取注册表及服务发现源码解析

&#x1f496; Spring家族及微服务系列文章 ✨【微服务】SpringCloud微服务剔除下线源码解析 ✨【微服务】SpringCloud微服务续约源码解析 ✨【微服务】SpringCloud微服务注册源码解析 ✨【微服务】Nacos2.x服务发现&#xff1f;RPC调用&#xff1f;重试机制&#xff1f; ✨【微…

机器学习:支持向量机SVM的SVC和SVR

支持向量机SVMSVM的工作原理及分类支持向量机的原理线性可分的SVM非线性可分的支持向量机支持向量机分类SVC支持向量机回归SVRSVR原理SVR模型时间序列曲线预测SVM的工作原理及分类 支持向量机的原理 支持向量机(Support Vector Machine&#xff0c;SVM)是一种二类分类器&…

积极融入信创生态 | 思腾合力软件产品完成多个信创产品适配

从2019年我国提出发展信创产业&#xff0c;2020年迈入信创发展元年&#xff0c;到2022信创开始向行业深水区迈进&#xff0c;逐渐延伸到金融、电信等重点行业、核心业务中&#xff0c;开启了“行业信创元年”。一个真正的“大信创”时代已开启&#xff0c;一个数万亿规模的市场…

MybatisPlus---从入门到深化

目录 MyBatisPlus入门 MyBatisPlus介绍 ​编辑Spring集成MyBatisPlus SpringBoot集成MyBatisPlus MyBatisPlus_CRUD 添加 CRUD_相关注解 修改 删除 查询 条件构造器 全局配置 ActiveRecord_概念 ActiveRecord_增删改查 MyBatisPlus插件_插件概述 MyBatisPlus插件_…

超神之路 数据结构 3 —— Stack栈实现及应用

栈也是一种线性表结构&#xff0c;相较于数组&#xff0c;栈对应的操作是数组的子集&#xff0c;我们只要实现从一端添加元素&#xff0c;并从这个一端取出元素&#xff0c;这一端我们称呼它为栈顶&#xff0c;正是由于这种结构&#xff0c;它具有“后入先出”&#xff08;LIFO…

PTA题目 计算工资

某公司员工的工资计算方法如下&#xff1a;一周内工作时间不超过40小时&#xff0c;按正常工作时间计酬&#xff1b;超出40小时的工作时间部分&#xff0c;按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工&#xff0c;进公司不少于5年的员工为老职工&#…

基于jsp+mysql+ssm健身信息交流网站-计算机毕业设计

项目介绍 随着全民健身运动的兴起&#xff0c;越来越多的人走进了健身房&#xff0c;而传统的管理模式已不能适应现代健身机构的发展趋势&#xff0c;如何增强健身房会员卡的管理和完善客户服务&#xff0c;成了健身房发展的当务之急。健身信息管理系统的研究与开发&#xff0…

文本摘要实战:基于句子相似度矩阵构建图结构实现文本摘要 代码+数据

任务描述: 自动文本摘要(Text Summarization)是指给出一段文本,我们从中提取出要点,然后再形成一个短的概括性的文本。自动的文本摘要是非常具有挑战性的,当我们作为人类总结一篇文章时,我们通常会完整地阅读它以发展我们的理解,然后写一个摘要突出其要点。由于计算机缺乏…

计算机毕业设计springboot+vue基本微信小程序的码高教育课后在线小程序

项目介绍 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,码高教育课后在线小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行码高教育课后在线小程序的设计与开…