颠覆你的信息流:AI帮你发现Github爆款项目

378 阅读5分钟

大家好,我是前端小嘎。

作为一个开发者,我一直在关注能够给我的生活和工作带来效率、便利提升的开源项目。但在信息获取的过程中,我发现我的来源来源非常分散:

  • bestofjs.org:内容不错,但仅限前端领域,且是英文网站,覆盖面比较窄。
  • HelloGitHub:由网站管理员精选并撰写简短评价,评价比较短。
  • B站视频:质量依赖于 UP 主的更新频率,不够及时。

这些渠道都很有价值,但对我来说还不够理想。于是我萌生了一个想法:能否做一个网站,不仅可以实时发现新兴项目,还能借助 AI 自动分析项目,甚至解读源码?

于是,我把这个功能整合到之前做的我的博客中,这样这个博客就变成了内容分发的中心。 👉 在线预览


📸 看看效果

点击导航进入列表页面,涵盖了最近github上的热门项目,用户可以选择总star数,日增长,周增长,月增长这四种排序,但是周和月榜暂时还没有到爬取时间

屏幕截图 2025-08-17 151854.png

然后选择一个项目进入详情页面,可以看到AI分析的简介,核心功能,用到的技术,优缺点

屏幕截图 2025-08-17 151919.png


⚙️ 如何实现

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开源项目发现与解读平台
这是一套完全免费的方案,并且能够自动化收集信息、追踪趋势、并产出分析文章,让我可以更高效地了解新兴项目。