
深入解析谷歌翻译API:基于Gemini的规模化高质量翻译与创新应用
在开源生态日益繁荣的今天,每周 GitHub 上都会涌现出一批具有创新意义和实用价值的 API 项目。2025年7月第2周,我们挑选了三款值得关注的热门仓库:
本文将分别介绍它们的核心功能、安装与快速上手,并以 rustfs/rustfs 为例,结合视频中演示的方式,手把手带你用 Rust 构建一个 CLI 工具,通过 GitHub API 获取某个仓库的高赞 Issues。希望能激发你将这三款开源项目融入实际工程的灵感。
rustfs/rustfs 是一款以 Rust 语言编写的文件系统抽象层库,目的是让开发者能够通过统一的 API 访问本地文件、Amazon S3、Google Cloud Storage、IPFS 等后端存储。核心设计思路如下:
FileSystem
、File
、DirEntry
等一系列 trait,所有后端实现都必须遵循。async
/await
和 Tokio,支持高并发场景。在你的 Cargo.toml
中引入:
[dependencies]
rustfs = { git = "https://github.com/rustfs/rustfs.git", branch = "main" }
tokio = { version = "1", features = ["full"] }
> 同时你可能还需要为具体后端添加对应的 feature,例如:rustfs-s3
、rustfs-gcs
等。
以下示例展示了如何使用 rustfs
访问本地文件和 S3 存储,并列出根目录下的所有文件:
use rustfs::{FileSystem, LocalFs, S3Fs};
use std::sync::Arc;
#[tokio::main]
async fn main() - > anyhow::Result < () < {
// 本地文件系统
let local = Arc::new(LocalFs::new("/path/to/dir"));
// S3 文件系统
let s3 = Arc::new(S3Fs::new("my-bucket", "us-east-1")?);
// 列出本地文件
println!("Local files:");
for entry in local.read_dir("/").await? {
println!(" - {}", entry.path());
}
// 列出 S3 对象
println!("\nS3 objects:");
for entry in s3.read_dir("/").await? {
println!(" - {}", entry.path());
}
Ok(())
}
pocketbase/pocketbase 是一个用 Go 语言编写的开源 BaaS(Backend-as-a-Service)项目,目标是让前端或移动端开发者能够“零运维”快速拥有一套完整的后端,包括:
下载预编译二进制包,或自行编译:
# 下载并赋予执行权限
curl -L https://github.com/pocketbase/pocketbase/releases/download/v0.15.1/pocketbase_0.15.1_linux_amd64.zip -o pb.zip
unzip pb.zip && chmod +x pocketbase
# 初次运行将创建数据目录
./pocketbase serve
在浏览器访问 http://127.0.0.1:8090/_/
,即可看到 Admin 控制台,初始化管理员账号后便可创建数据模型与用户。
tasks
。添加字段:
title
(text)completed
(bool)在代码层面,通过 HTTP 请求操作数据,示例(Node.js):
import fetch from 'node-fetch';
// 假设已通过登录接口获取到 token
const TOKEN = 'YOUR_JWT_TOKEN';
async function createTask(title) {
const res = await fetch('http://127.0.0.1:8090/api/collections/tasks/records', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': Bearer ${TOKEN}
,
},
body: JSON.stringify({ title, completed: false }),
});
return res.json();
}
createTask('学习 Rust').then(console.log);
smallcloudai/refact 是一款面向机器学习工程师和研究人员的模型重构与优化工具。它支持:
# Python 环境安装
pip install refact
示例:对 PyTorch 模型进行 8-bit 量化并导出:
from refact import Quantizer
# 加载模型
model = torch.load('model.pt')
# 量化
quantizer = Quantizer(model, backend='pytorch', precision=8)
qmodel = quantizer.quantize()
# 保存量化后模型
qmodel.save('model_quantized.pt')
更多高级用法请参考官方文档。
为了帮助大家更好地理解如何借助 Rust 与 GitHub API 快速构建实用工具,下面以 rustfs 社区推荐方式引用视频中的示例,分步骤带你用 Rust + Tokio 构建一个命令行程序,从指定仓库批量获取最高赞的 Issues。
正如视频开头所述,教学最好的方式就是“build cool stuff”。本示例将创建一个 CLI 工具,核心功能:
该示例分两部分,第一部分实现基础功能,第二部分引入并发与优化。
cargo new gh_top_issues
cd gh_top_issues
Cargo.toml
中添加依赖:
[dependencies]
tokio = { version = "1", features = ["full"] }
reqwest = { version = "0.11", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
dotenv = "0.15"
futures = "0.3"
anyhow = "1.0"
.env
中的 GitHub TokenBoxFuture
在项目根目录创建 .env
,写入:
GITHUB_TOKEN=your_personal_access_token_here
根据 GitHub REST API 文档,我们关心的字段有:
Issue 列表接口 GET /repos/{owner}/{repo}/issues
number
(Issue 编号)title
(标题)pull_request
(可选,若存在则为 PR)Reactions 接口 GET /repos/{owner}/{repo}/issues/{issue_number}/reactions
content
(例如 "+1"
表示 👍)user.login
(用户名)Rust 代码:
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
struct Issue {
number: u64,
title: String,
#[serde(rename = "pull_request")]
pr: Option < serde_json::Value > ,
}
#[derive(Debug, Serialize, Deserialize)]
struct IssueReaction {
content: String,
user: User,
}
#[derive(Debug, Serialize, Deserialize)]
struct User {
login: String,
}
use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION, USER_AGENT, ACCEPT};
use std::env;
async fn get_issues(owner: &str, repo: &str, page: u32) - > anyhow::Result < Vec < Issue > > {
let token = env::var("GITHUB_TOKEN")?;
let url = format!(
"https://api.github.com/repos/{}/{}/issues?per_page=100&page={}",
owner, repo, page
);
let mut headers = HeaderMap::new();
headers.insert(AUTHORIZATION, format!("Bearer {}", token).parse()?);
headers.insert(USER_AGENT, HeaderValue::from_static("rust-cli"));
headers.insert(ACCEPT, HeaderValue::from_static("application/vnd.github.v3+json"));
let resp = reqwest::Client::new()
.get(&url)
.headers(headers)
.send()
.await?;
if !resp.status().is_success() {
return Ok(vec![]);
}
let issues: Vec < Issue > = resp.json().await?;
// 过滤掉 PR
Ok(issues.into_iter().filter(|i| i.pr.is_none()).collect())
}
GitHub API 每页最多返回 100 条,通过响应头中的 Link
字段判断是否有下一页:
fn extract_next_link(headers: &HeaderMap) - > Option < String > {
headers
.get("link")
.and_then(|v| v.to_str().ok())
.and_then(|s| {
s.split(',')
.find(|part| part.contains("rel=\"next\""))
})
.map(|part| {
part.split(';').next().unwrap()
.trim()[1..part.find(' >').unwrap()].to_string()
})
}
封装递归调用为 BoxFuture
,不断获取下一页,直至无 next
link。
async fn get_issue_reactions(owner: &str, repo: &str, issue_number: u64) - > anyhow::Result < usize > {
let token = env::var("GITHUB_TOKEN")?;
let url = format!(
"https://api.github.com/repos/{}/{}/issues/{}/reactions",
owner, repo, issue_number
);
let mut headers = HeaderMap::new();
headers.insert(AUTHORIZATION, format!("Bearer {}", token).parse()?);
headers.insert(USER_AGENT, HeaderValue::from_static("rust-cli"));
headers.insert(ACCEPT, HeaderValue::from_static("application/vnd.github.squirrel-girl-preview"));
let resp = reqwest::Client::new()
.get(&url)
.headers(headers)
.send()
.await?;
let reactions: Vec < IssueReaction > = resp.json().await?;
Ok(reactions.into_iter().filter(|r| r.content == "+1").count())
}
最终在 main
中:
get_issue_reactions
(下一集内容)如视频所言,下一步将在 Tokio 中使用 futures::stream::FuturesUnordered
或 tokio::task::spawn
,将对每个 Issue 的 Reaction 请求并发化,大幅提升整体速度。
既然我们掌握了上述原理,不妨将这种“基于 API 构建 CLI 工具”的思路,迁移到 rustfs/rustfs
。例如,可以借助 rustfs
统一接口,实现:
这正是开源项目结合的魅力:一个项目解决存储,一套工具解决 API 交互,你的业务场景便可以灵活扩展。
2025年7月第2周,rustfs/rustfs
、pocketbase/pocketbase
、smallcloudai/refact
三款热门仓库各具特色——前者让多后端文件操作无缝衔接,后者让后端即服务触手可及,后者则为模型重构提供利器。更重要的是,通过以上示例,我们学习了如何使用 Rust 与 GitHub API 打通数据流,快速构建高效 CLI 工具。
希望本文能帮助你:
原文引自YouTube视频:https://www.youtube.com/watch?v=zzfZ13_Ig78