大模型学习应用 6: Vercel 部署 自动获取微信公众号文章获取 项目

大模型落地开发实战指南!请关注微信公众号:「AGI启程号」 深入浅出,助你轻松入门!
数据分析、深度学习、大模型与算法的综合进阶,尽在CSDN博客主页

本文将详细介绍如何在 Vercel 平台上部署 自动微信公众号文章获取 项目,包括项目结构、代码实现、部署流程以及常见问题的解决方案。

注意:本项目源代码github链接,可自行克隆到自己的代码仓库完成vercel部署,注意需要稳定ip输出(微信白名单需求),免费版只用作部署测试,最好是自己租服务器部署或者用vercel企业版。

最终结果:可以看到已经能获取到草稿箱中已经发布过的文章(注意这里我获取的是草稿箱中的文章,原因是群通知发布的文章没有对应api进行获取,所以需要保证文章在发布前尽心一次草稿箱保存)
大模型学习应用 6: Vercel 部署 自动获取微信公众号文章获取 项目_第1张图片

目录

  • 微信公众号文章获取 API 项目实战总结(Vercel FastAPI 部署)
    • 一、项目结构与代码解析
      • 1.1 目录结构
      • 1.2 主要文件与代码解析
        • 1.2.1 FastAPI 主应用(api/index.py)
        • 1.2.2 依赖配置(requirements.txt)
        • 1.2.3 路由配置(vercel.json)
        • 1.2.4 .gitignore
    • 二、部署方法
      • 2.1 GitHub 自动部署
      • 2.2 Vercel CLI 部署
      • 2.3 本地开发调试
    • 三、注意事项与常见问题
      • 3.1 微信接口 IP 白名单
      • 3.2 依赖与环境变量
      • 3.3 路由与入口
      • 3.4 其他常见错误
      • 3.5 其他建议
    • 结语


微信公众号文章获取 API 项目实战总结(Vercel FastAPI 部署)

本文将详细介绍如何用 FastAPI + Vercel Serverless 部署一个可获取微信公众号草稿箱文章的 API,包括项目结构、核心代码解析、部署方法、注意事项与常见问题处理。


一、项目结构与代码解析

1.1 目录结构

微信公众号文章获取/
├── api/
│   └── index.py           # FastAPI 主应用,所有API入口
├── requirements.txt       # Python 依赖
├── Pipfile                # Python 环境配置(可选)
├── vercel.json            # Vercel 路由配置
├── .gitignore             # Git 忽略文件
└── test_api2.ipynb        # Jupyter Notebook 示例(本地开发用,已被 .gitignore 忽略)

1.2 主要文件与代码解析

1.2.1 FastAPI 主应用(api/index.py)
import os
import time
import requests
from fastapi import FastAPI, HTTPException
from dotenv import load_dotenv

# 加载本地 .env(生产环境下在 Vercel Dashboard 配置环境变量,无需 .env)
load_dotenv()

APPID  = os.getenv("APPID")
SECRET = os.getenv("APPSecret")
if not APPID or not SECRET:
    raise RuntimeError("Missing APPID or APPSecret environment variables")

_token = {}

def get_access_token(force: bool = False) -> str:
    """获取并缓存 access_token;提前 5 分钟失效"""
    info = _token.get("wx")
    if info and info["expire_at"] > time.time() and not force:
        return info["token"]

    resp = requests.get(
        "https://api.weixin.qq.com/cgi-bin/token",
        params={
            "grant_type": "client_credential",
            "appid": APPID,
            "secret": SECRET
        },
        timeout=10
    ).json()

    if "access_token" not in resp:
        raise RuntimeError(f"WX API error: {resp}")

    _token["wx"] = {
        "token": resp["access_token"],
        "expire_at": time.time() + resp["expires_in"] - 300
    }
    return resp["access_token"]

def _parse_draft(item: dict):
    """拆分草稿列表中的每篇文章,只保留关键字段"""
    ts = time.strftime("%Y-%m-%d %H:%M", time.localtime(item["update_time"]))
    for art in item["content"]["news_item"]:
        yield {
            "updated": ts,
            "title":   art.get("title", ""),
            "url":     art.get("url", ""),
            "digest":  art.get("digest", "")
        }

def list_drafts(offset: int = 0, count: int = 20):
    """拉取一页草稿并返回 (列表, 总数)"""
    ak = get_access_token()
    resp = requests.post(
        f"https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token={ak}",
        json={"offset": offset, "count": count},
        timeout=10
    )
    resp.encoding = "utf-8"
    data = resp.json()
    if "item" not in data:
        raise RuntimeError(f"WX API error: {data}")

    rows = []
    for it in data["item"]:
        rows.extend(_parse_draft(it))
    return rows, data["total_count"]

# ------ FastAPI 应用 & 路由 ------

app = FastAPI(title="微信草稿箱 API")

@app.get("/")
async def get_drafts(offset: int = 0, count: int = 20):
    """
    获取草稿列表
    - offset: 从第几条开始(默认 0)
    - count: 本次拉取数量(默认 20)
    返回 JSON: { items: [...], total_count: N }
    """
    try:
        items, total = list_drafts(offset, count)
        return {"items": items, "total_count": total}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

代码要点:

  • 通过环境变量获取公众号 APPIDAPPSecret,安全灵活。
  • 使用内存缓存 access_token,减少微信接口调用频率。
  • / 路由支持分页参数,返回所有草稿文章的关键信息。
  • 错误处理友好,便于前端调试。
1.2.2 依赖配置(requirements.txt)
fastapi==0.104.1
requests
python-dotenv
  • 只包含必要依赖,Vercel 会自动安装。
1.2.3 路由配置(vercel.json)
{
  "routes": [
    { "src": "/(.*)", "dest": "api/index.py" }
  ]
}
  • 所有请求都交给 api/index.py,由 FastAPI 应用分发。
1.2.4 .gitignore
  • 已包含 .envtest_api2.ipynb__pycache__.vercel 等,保证敏感和本地文件不会上传。

二、部署方法

2.1 GitHub 自动部署

  1. 初始化并推送代码
    git init
    git add .
    git commit -m "init: wechat article api"
    git remote add origin https://github.com/your-username/your-repo.git
    git push -u origin main
    
  2. Vercel 导入项目
    • 在 Vercel 控制台选择 Import Project,关联 GitHub 仓库。
    • 设置环境变量 APPIDAPPSecret(在 Vercel 项目 Settings → Environment Variables)。
    • 点击 Deploy,自动完成部署。

2.2 Vercel CLI 部署

  1. 安装 Vercel CLI
    npm install -g vercel
    
  2. 登录 Vercel
    vercel login
    
  3. 部署项目
    vercel
    
  4. 设置环境变量
    • 在 Vercel 控制台设置 APPIDAPPSecret

2.3 本地开发调试

  1. 安装依赖
    pip install -r requirements.txt
    
  2. 本地运行
    uvicorn api.index:app --reload
    
  3. 访问本地 API
    • 打开浏览器访问 http://localhost:8000/?offset=0&count=20

三、注意事项与常见问题

3.1 微信接口 IP 白名单

  • 现象:API 报错 invalid ip ... not in whitelist
  • 原因:Vercel 云函数 IP 不在微信公众平台后台的 IP 白名单。
  • 解决
    1. 登录 微信公众平台 → 开发 → 基本配置 → IP白名单。
    2. 将报错信息中的 Vercel 出口 IP(如 34.235.166.164)加入白名单。
    3. 注意:Vercel IP 可能变化,生产建议用自有服务器做代理。

3.2 依赖与环境变量

  • 依赖缺失:确保 requirements.txt 包含 fastapirequestspython-dotenv
  • 环境变量未生效:本地用 .env,线上在 Vercel 控制台设置。

3.3 路由与入口

  • 只保留 api/index.py 作为主入口,vercel.json 路由所有请求到此文件。
  • 不需要 handler、Mangum、builds 配置,避免 Vercel 识别错误。

3.4 其他常见错误

  • ModuleNotFoundError: No module named ‘fastapi’
    • 检查 requirements.txt 是否包含 fastapi。
  • issubclass() arg 1 must be a class
    • 不要定义 handler = Mangum(app),直接导出 app。
  • Vercel 构建警告
    • 删除 vercel.json 中的 builds 配置,只保留 routes。

3.5 其他建议

  • .gitignore 已包含 test_api2.ipynb,Notebook 仅本地开发用,不会上传。
  • 只保留必要文件,项目结构极简,便于维护和部署。

结语

本项目通过 FastAPI + Vercel Serverless 实现了微信公众号草稿箱文章的高效获取,结构极简,部署便捷。
如遇问题,优先检查依赖、环境变量、vercel.json 配置和微信白名单设置。
欢迎参考本项目进行二次开发或集成到更大的系统中!


如需转载或引用,请注明出处。
如有疑问或建议,欢迎留言交流!

你可能感兴趣的:(大模型应用与学习,学习,微信,大模型应用开发,python,github,flask)