如何不错过优秀的开源项目

前言

我们可以在 GitHub trending 页面上搜到最近火热的开源项目,那能不能做一个程序,自动爬取这些火热的开源项目呢?

我之前在公众号上做过一个专栏,叫每天一个开源项目,不过后续反响一般,就没有继续做下去了。这里倒是可以分享一下如何快速的拉取好的开源项目。

脚本实现

首先来到这个网站——https://ossinsight.io/

image.png

这是一个类似于 GitHub trending 的网站,提供了 API 供我们调用。 GitHub trending 现在的反爬虫机制做的很强,对于我这种爬虫小白来说破解不了。

来到这个 api 页面,就可以看到这个网站提供的 api ,没有任何限制,直接调用即可。

image.png

所以我们可以写一个脚本,脚本的具体思路如下:

  1. 根据入参获取活跃项目
  2. 使用 GitHub API 获取项目更详细的信息
  3. 配合模板创建对应的目录及 markdown 文件
  4. AI 大模型为我们生成一篇开源报告

获取开源项目

首先实现一个获取开源项目的方法,如下:

const fetchData = async (lang) => {
  const config = {
    method: "get",
    maxBodyLength: Infinity,
    url: `https://api.ossinsight.io/v1/trends/repos?period=past_week&language=${lang}`,
    headers: {
      Accept: "application/json",
    },
  };

  try {
    const res = await axios(config);
    return res.data.data.rows;
  } catch (error) {
    console.log("error", error);
    return [];
  }
};

这里根据语言,来获取对应火热的开源项目榜单。 lang 的取值范围可以参考下图或者官方文档:

image.png

然后实现一个 run 方法来拉取开源项目,我这里比较关心 jsts 的项目,所以我会这么实现

const run = async () => {
  const res = await Promise.all([
    fetchData("JavaScript"),
    fetchData("TypeScript"),
  ]);

  let list = [];
  res.forEach((item) => {
    list.push(...item);
  });
  list = list.sort((a, b) => b.stars - a.stars)
  list = list.map((item) => {
    return {
      repoName: item.repo_name,
      name: item.repo_name.split("/")[1], // 项目名称
      lang: item.primary_language, //主要语言
      stars: item.stars, //star数量
      docUrl: `https://cdn.jsdelivr.net/gh/${item.repo_name}/README.md`,
      url: `https://github.com/${item.repo_name}`,
    };
  }).slice(10);
  for(let i = 0;i<list.length;i++) {
    const item = list[i]
    const baseInfo = await getRepoExtraInfo(item.repoName);
    list[i] = {
      ...list[i],
      ...baseInfo
    }
  }
  createFolderAndFiles(todayData);
};
run();

getRepoExtraInfo 用来获取更详细的信息,这里调用的是 GitHubAPI ,实现如下:

async function getRepoExtraInfo(name) {
  try {
    const response = await axios.get(`https://api.github.com/repos/${name}`);
    return {
      stars: response.data.stargazers_count,
      forks: response.data.forks_count,
      license: response.data?.license?.name || "暂无",
    };
  } catch (error) {
    return {
      stars: "未知",
      forks: "未知",
      license: "未知",
    };
  }
}

然后实现一个模版,把每一个开源项目的信息拼接好模版写入文件中,模版大概长成这个样子:

const getTemplate = (data) => {
  return `
开源项目简介如下:

>仓库名:\`${data.repoName}\`
>
>项目名:\`${data.name}\`
>
>开源地址:${data.url}
>
>主要语言: \`${data.lang}\` 
>
>stars数量:\`${data.stars}\`
>
>forks数量:\`${data.forks}\`
>
>开源协议:\`${data.license}\`

`;
};

拼接写入文件这里就不演示,也是调用 nodefs api ,你也可以按照你自己喜欢的方式来。大概生成的文件是这样的:

image.png

coze扩写

我们这个时候就可以借助 AI 来帮我们分析这个开源项目,它具体是做什么的,这样我们就不用一个个点进去看,直接把链接丢给 ai 就行。很多开源项目的 README 都是英文的,对于我这种英文不好的人读起来就很吃力。

这里直接在coze新建一个机器人:

image.png

选择上 LinkReader 插件, Prompt 如下,仅供参考:

你是一个资深的程序员,根据我后面给你的开源项目的仓库地址,输出一篇详细的报告。

## 技能
- 报告内容包括:标题、一句话介绍项目、详细描述、具体功能、如何使用。
- 标题十个字左右概括这个开源项目,必须吸人眼球、引人注意
- 报告必须用中文输出
- 输出的报告应尽量详细,需要帮助用户深刻理解项目的用途以及如何使用。
- 如果项目中包含demo代码,则报告中必须包含demo代码,以保证报告内容更加丰富
- 报告中的专有名词、英文、或者变量名使用 ` ` 包裹
- 报告必须包含介绍这个开源项目的图片,并使用这种格式 ![xxx](图片链接) 嵌入在相应的内容段落中。
- 报告应使用 Markdown 格式
- 报告需要发布到公众号中,所以需要排版精美,逻辑清晰。
- 在写报告的时候,确保使用缩略语、成语、过渡词、感叹词和口语化表达,带有人类情感,同时避免重复的词组和不自然的句式,防止别人一眼看去就是AI写出来的。
- 报告的风格尽量轻松、风趣幽默、易于阅读
- 报告尽量详细,1000个汉字以上

## 限制
- 报告中的图片应直接使用图片链接嵌入在 Markdown 中,不需要下载或上传图片。
- 报告的大纲如下:
## 标题
## 一句话介绍
这是一个 xxx
## 详细描述 
xxx
## 具体功能
xxx
## 如何使用
xxx

如果你了解了我的需求,请回答是的

这个时候,就把我们生成的文件里的仓库链接丢给 AI ,让它开始帮我们分析:

image.png

看完之后,你大概也就知道这个开源项目是干什么的了,如果你对他有兴趣的话,就点进仓库里面再仔细研究。

如果你觉得还不够过瘾,那么还可以接入消息推送,如邮件推送+定时任务,这样你每天就可以收到推送的开源项目。

最后

以上就是本文的全部内容,如果你觉得有意思的话,点点关注点点赞吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值