r/SideProject 用户厌倦了每月支付 29 美元以上的费用来购买他们几乎不使用的 SEO 工具。本教程构建了一个薄 API 层,用于包装 Scavio、跟踪每个查询的成本,并让您(或您的用户)查看准确的使用情况。将其视为您控制的计量 SEO API。
前置条件
- Scavio API 密钥
- Python 3.8+ 与 Flask 或 FastAPI
- SQLite 用于使用情况跟踪
操作指南
步骤 1: 设置 API 服务器
最小的 FastAPI 应用程序,通过使用情况跟踪代理到 Scavio。
Python
from fastapi import FastAPI, Header, HTTPException
from pydantic import BaseModel
import requests, os, sqlite3, datetime
app = FastAPI()
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
conn = sqlite3.connect('usage.db', check_same_thread=False)
conn.execute('CREATE TABLE IF NOT EXISTS usage (ts TEXT, user TEXT, query TEXT, cost REAL)')
class SearchRequest(BaseModel):
query: str
country_code: str = 'us'步骤 2: 通过成本跟踪代理搜索请求
每个请求都会记录成本。
Python
@app.post('/seo/rank-check')
async def rank_check(req: SearchRequest, x_user: str = Header()):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'platform': 'google', 'query': req.query,
'country_code': req.country_code}).json()
# Log usage: $0.005 per query
conn.execute('INSERT INTO usage VALUES (?, ?, ?, ?)',
(datetime.datetime.now().isoformat(), x_user, req.query, 0.005))
conn.commit()
return {'results': data.get('organic_results', []), 'cost': 0.005}步骤 3: 添加使用情况仪表板端点
让用户看到他们的使用情况和费用。
Python
@app.get('/usage/{user}')
async def get_usage(user: str):
rows = conn.execute(
'SELECT date(ts) as day, count(*) as queries, sum(cost) as total '
'FROM usage WHERE user=? GROUP BY date(ts) ORDER BY day DESC LIMIT 30',
(user,)).fetchall()
return {'user': user,
'daily_usage': [{'date': r[0], 'queries': r[1], 'cost': r[2]} for r in rows],
'total_cost': sum(r[2] for r in rows)}步骤 4: 添加预算限制
防止用户超出每月预算。
Python
@app.post('/seo/rank-check-metered')
async def rank_check_metered(req: SearchRequest, x_user: str = Header()):
monthly_spend = conn.execute(
'SELECT sum(cost) FROM usage WHERE user=? AND ts >= date("now", "start of month")',
(x_user,)).fetchone()[0] or 0
budget = 5.00 # $5/month default budget
if monthly_spend >= budget:
raise HTTPException(429, f'Monthly budget of ${budget} exceeded. Current: ${monthly_spend:.2f}')
return await rank_check(req, x_user)Python 示例
Python
# Self-hosted metered SEO API:
# $0.005 per rank check via Scavio
# SQLite tracks per-user usage
# Budget limits prevent overuse
# 100 queries/month = $0.50 vs $29+ for Ahrefs StarterJavaScript 示例
JavaScript
// Express.js equivalent:
app.post('/seo/rank-check', async (req, res) => {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'google', query: req.body.query})
}).then(r => r.json());
// log usage to DB
res.json({results: data.organic_results, cost: 0.005});
});预期输出
JSON
Self-hosted metered SEO API with per-query cost tracking, usage dashboard, and budget limits. 100 queries/month = $0.50 vs Ahrefs Starter at $29/mo.