实战:基于 Next.js+MoonShot API 开发一个 Github Trending 总结助手
十月·2025-02-10·via 十月指南
目标
#
自动抓取 GitHub Trending 仓库列表。
使用 MoonShot API 总结每个仓库的简介。
展示一个用户友好的界面,列出描述和简介。
下面这个页面即最终的运行效果,小编还贴心的加上了暗黑模式。
功能需求:
获取 GitHub Trending 数据。
利用 OpenAI API 生成自然语言总结。
技术选型:
前端框架:Next.js、Tailwind CSS
API 服务:GitHub API, MoonShot API
为什么选择 MoonShot API?因为 MoonShot API 对于新注册用户有一定的免费额度,且和 OpenAI 兼容,如果想迁移到 OpenAI 也非常方便。
技术实现
#
初始化 Next.js 项目
#
首先,我们使用以下命令创建一个 Next.js 项目:
npx create-next-app@latest
✔ What is your project named? … github-trending
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes
constfetchRepoDetail=async(repoName)=>{try{constresponse=awaitfetch(`https://api.github.com/repos/${repoName}`);if(!response.ok)thrownewError("Failed to fetch repo details");returnawaitresponse.json();}catch(error){console.error(`Error fetching repo details for ${repoName}:`,error);returnnull;}};
GitHub API 也有访问限制,对于未认证的请求:每小时的请求限额:60 次。对于认证的请求:每小时的请求限额:5000 次。
consttranslatedDescription=awaittranslateDescription(repoDetail.description||"无描述");constfetchMoonShotResponse=async(content,role)=>{try{constcompletion=awaitclient.chat.completions.create({model:"moonshot-v1-8k",messages:[{role:"system",content:role,},{role:"user",content,},],temperature:0.3,});returncompletion.choices[0].message.content;}catch(error){console.error("Error in request:",error);return"";}};consttranslateDescription=async(description)=>{returnawaitfetchMoonShotResponse(`${description} 翻译成中文`,"你是翻译专家,擅长各种语言翻译");};
总结 Readme
#
constsummarizeReadme=async(repoName)=>{try{constresponse=awaitfetch(`https://api.github.com/repos/${repoName}/readme`);if(!response.ok)thrownewError("Failed to fetch readme");constreadmeData=awaitresponse.json();constreadmeStr=atob(readmeData.content);returnawaitfetchMoonShotResponse(`${readmeStr} 总结成200字的中文`,"你是翻译专家,擅长各种语言翻译和总结");}catch(error){console.error(`Error summarizing README for ${repoName}:`,error);return"";}};