大家好,我是前端小嘎。
作为一个开发者,我一直在关注能够给我的生活和工作带来效率、便利提升的开源项目。但在信息获取的过程中,我发现我的来源来源非常分散:
- bestofjs.org:内容不错,但仅限前端领域,且是英文网站,覆盖面比较窄。
- HelloGitHub:由网站管理员精选并撰写简短评价,评价比较短。
- B站视频:质量依赖于 UP 主的更新频率,不够及时。
这些渠道都很有价值,但对我来说还不够理想。于是我萌生了一个想法:能否做一个网站,不仅可以实时发现新兴项目,还能借助 AI 自动分析项目,甚至解读源码?
于是,我把这个功能整合到之前做的我的博客中,这样这个博客就变成了内容分发的中心。 👉 在线预览
📸 看看效果
点击导航进入列表页面,涵盖了最近github上的热门项目,用户可以选择总star数,日增长,周增长,月增长这四种排序,但是周和月榜暂时还没有到爬取时间
然后选择一个项目进入详情页面,可以看到AI分析的简介,核心功能,用到的技术,优缺点
⚙️ 如何实现
1. 数据源
GitHub 提供了丰富的 API,可以实时获取项目信息。
例如,使用获取热门项目可以用 Search API:
GET /search/repositories?q=react+language:javascript+stars:>5000
上面的请求?后面是filter,可以编写想要的数据,例子中的调用会返回所有与 React 相关、star 数量大于 5000 的 JavaScript 项目。
然后我们爬取具体的项目信息就可以用
GET /repos/owner/repo
它会返回项目的当前信息,我们需要保存这些信息做我们自己的推荐策略。
2. 数据存储
我的博客是基于 Sanity 作为内容分发后台。
这个也写过一篇文章告别繁琐,拥抱自由:使用 Sanity.io 轻松搭建你的现代化博客
我们完全可以把sanity作为数据库来源,它慷慨地给我们提供了100个g的存储,应对我们的搜索器可以说是绰绰有余了。
先申请一个写权限的 token api key,然后初始化sanity client带进去就可以上传数据了!
不得不说sanity是个好东西,完全不需要麻烦的关系型数据库。
3. 部署及爬取
有了云存储后,那么我们就不需要在公网部署服务了,直接部署到家用服务器上,我之前买了一台小主机当家庭软路由,主要的功能是科学上网,现在又可以赋予它另外一个使命了。
我的方案是:
-
使用 Elysia.js 启动一个 Bun HTTP 服务。Bun是一个高性能的js运行时,并且可以直接打包成二进制文件,还支持交叉编译,最终实测镜像大小只有 100MB,运行时内存仅 30MB,对于我这台2g4核心的小主机来说,几乎是无感的,cpu占用都不动的。
-
然后将服务打包成 Docker 镜像,部署在主机上。
-
可以用elysia的插件 @elysiajs/cron 设定任务定时执行:
- 每日进行一次数据收集,通过访问search接口查询前300的热门项目,把信息交给ai,由ai来给该项目打分判断是否有潜力入选
// 评估项目是否有潜力(基于AI分析结果和基础数据)
private evaluateProjectPotential(repo: GitHubRepo, analysis: ProjectAnalysis): { shouldAccept: boolean; reason: string; score: number } {
let score = 0;
const reasons: string[] = [];
// 1. 基础指标评分(40分)
if (repo.stargazers_count >= 50) {
score += 10;
reasons.push('Star数量合理');
}
if (repo.forks_count >= 5) {
score += 5;
reasons.push('有社区参与');
}
if (repo.language) {
score += 5;
reasons.push('使用主流语言');
}
if (repo.description && repo.description.length > 10) {
score += 10;
reasons.push('有详细描述');
}
// 活跃度
const lastUpdate = new Date(repo.updated_at);
const daysSinceUpdate = (Date.now() - lastUpdate.getTime()) / (1000 * 60 * 60 * 24);
if (daysSinceUpdate < 30) {
score += 10;
reasons.push('近期活跃');
}
// 2. AI分析质量评分(40分)
if (analysis.features.length >= 3) {
score += 10;
reasons.push('功能丰富');
}
if (analysis.pros.length >= 2) {
score += 10;
reasons.push('优点明显');
}
if (analysis.tech_stack.length >= 2) {
score += 10;
reasons.push('技术栈完整');
}
if (analysis.use_cases.length >= 2) {
score += 10;
reasons.push('应用场景清晰');
}
// 3. 项目创新性和实用性(20分)
const innovativeKeywords = ['ai', 'ml', 'blockchain', 'web3', 'defi', '区块链', '人工智能', '机器学习'];
const practicalKeywords = ['tool', 'framework', 'library', 'cli', 'api', '工具', '框架', '库'];
const description = (repo.description || '').toLowerCase();
const summary = analysis.summary.toLowerCase();
const allText = `${description} ${summary} ${analysis.features.join(' ')} ${analysis.tags.join(' ')}`;
if (innovativeKeywords.some(keyword => allText.includes(keyword))) {
score += 10;
reasons.push('技术创新');
}
if (practicalKeywords.some(keyword => allText.includes(keyword))) {
score += 10;
reasons.push('实用性强');
}
// 4. 质量红线(扣分项)
if (analysis.cons.some(con => con.includes('abandoned') || con.includes('废弃') || con.includes('停止维护'))) {
score -= 20;
reasons.push('⚠️ 项目可能废弃');
}
if (repo.stargazers_count < 10) {
score -= 15;
reasons.push('⚠️ Star数量过少');
}
if (daysSinceUpdate > 180) {
score -= 15;
reasons.push('⚠️ 长期未更新');
}
const shouldAccept = score >= 60; // 60分及格线
const reason = `评分: ${score}/100 (${reasons.slice(0, 3).join(', ')})`;
return { shouldAccept, reason, score };
}
- 由于github api无法提供star增长,所以我们只能我们来记录了,通过定时任务每日,每周,每月计算star增长数量,目前排序策略就是根据star增长数量来排的,简单又质朴。
4. AI 分析
如上面说的,ai目前需要干三件事情
1.评估项目是否有潜力
2.给出项目的分析
3.每月任务结束后,根据月度项目排行生成一个markdown文档,盘点一下这些项目发布到sanity里
我使用langchain 集成了2个gemini api和1个cloudflare ai,首选gemini,其他2个遇到限流或者报错时顶替。
接下来就是写prompt了,让 AI 返回 JSON 格式的结构化结果。例如:
你是一个专业的软件项目分析师,请分析以下 GitHub 项目信息
项目信息:
- 名称:{name}
- 描述:{desc}
README 内容:
{readme}
请返回 JSON 格式结果:
{
"summary": "项目简介"
}
这样一来,AI 就能自动输出对项目的解读结果,后续可以在博客中直接展示,其他两个任务也只需要编写相应的prompt就可以工作了
说一下Cloudflare AI是真的拉,经常听不懂人话给我返回非json的结果。
✨ 总结
通过 GitHub API、Sanity、Bun,以及 AI 分析,我做了一个Github开源项目发现与解读平台。
这是一套完全免费的方案,并且能够自动化收集信息、追踪趋势、并产出分析文章,让我可以更高效地了解新兴项目。