平台 API 开发与集成
Cloudflare
R2 Object Storage
Cloudflare R2 是一个对象存储服务,类似于 AWS S3。它提供了一个简单的 API 来存储和检索数据。
在设置中可以自定义域名(域名需要托管在 Cloudflare 上),并设置 CORS 策略
可以使用
rclone工具来管理 R2 存储桶 --> 站内相关内容链接R2 的 API Tokens 存储权限分
Admin Read & Write和Object Read & Write。如果是在存储桶根目录下上传新的文件,可能会遇到
Access Denied错误(未深究具体原因),这时需要使用Admin Read & Write权限的 API Token。
亚马逊
名词概念
AWS:Amazon Web Services,亚马逊云服务平台
IAM:Identity and Access Management,身份和访问管理,用于管理 AWS 资源的访问权限
S3:Simple Storage Service,亚马逊简单存储服务,用于存储和检索任意数量的数据
EC2:Elastic Compute Cloud,亚马逊弹性计算云,用于提供虚拟服务器
Route 53:Amazon Route 53,亚马逊路由 53,用于管理 DNS 记录
CloudFront:亚马逊的内容分发网络(CDN),用于加速静态和动态内容的分发
CloudWatch:亚马逊的监控服务,用于监控 AWS 资源和应用程序
如果要查看 CloudWatch 的日志,需要先在 IAM 中创建一个具有
CloudWatchLogsReadOnlyAccess权限的用户,并分配给 EC2 实例。EBS:Elastic Block Store,亚马逊弹性块存储,用于为 EC2 实例提供持久化存储
VPC:Virtual Private Cloud,亚马逊虚拟私有云,用于创建和管理虚拟网络
AMIs:Amazon Machine Images,亚马逊机器镜像,用于创建 EC2 实例的模板
EC2
迁移不同区域的实例(镜像实现)
本方案基于 AMI 的镜像复制(适合小规模/允许停机),如果需要迁移大规模实例,建议使用 AWS Application Migration Service(MGN)。
在美国的实例上,创建一个 Amazon Machine Image (AMI)。
登录 AWS 管理控制台,进入 EC2 → 实例 页面。
找到你要迁移的美国服务器实例,右键 → 镜像和模板 → 创建映像 (Create Image)。
填写映像名称和描述,然后点击 创建映像。
在 AWS 控制台或 CLI 中,将该 AMI 复制到东京区域。
等待几分钟后,你会在 AMI 页面(左边导航栏 → 映像 → AMIs)看到刚生成的镜像。
注意:需要等待镜像状态变为
available后才能复制,否则会提示找不到该镜像。可以在快照中查看镜像创建进度。选中镜像,点击 操作 → 复制 AMI,选择目标区域(比如 Asia Pacific (Tokyo)),这通常也需要几分钟时间。
在东京区域用这个 AMI 启动新的 EC2 实例。
如果有 EBS 数据卷,也需要分别做 快照 并复制到东京区域。
调整安全组、弹性 IP、VPC 子网等配置。
切换 DNS 或者负载均衡指向新实例。
降低 EC2 实例的配置
本质上就是把实例的 Instance Type(实例类型)改成更小的规格。必须 先停止实例 才能修改(公网IP可能变化(如果不是Elastic IP)。
登录 AWS 控制台,进入 EC2 → 实例 页面。
找到你要修改的实例,实例状态 → 停止。
实例停止后,选择 行为 → 实例设置 → 修改实例类型,选择更小的规格,然后点击 应用。
启动实例,确认实例运行正常。
Route53
Route53 是 AWS 提供的 DNS 服务,可以用于管理域名和 IP 地址的映射关系。
修改域名 Nameserver
迁移域名时别选择保留原 DNS,而是选择使用 Route53 提供的 DNS,不然这一步就一定要做,不然会出问题。
在 AWS Route53 中,可以修改域名的 Nameserver。
- 打开 AWS Route 53 控制台 → Registered Domains
- 找到你的域名,点击进入
- 进入 “Name servers” 区块,点击 “Add or Edit name servers”
- 替换为新的 Nameserver,点击 “Save changes”
域名转入推荐流程
- 打开 AWS Route 53 控制台 → 托管区域 → 添加托管区域 → 输入要转入的域名(获得 4 条 NS 记录)
- 在托管区域添加原域名的解析记录(原域名注册商处获取,可以通过导出导入的方式)
- 登录原域名注册商 → 找到域名管理 → 修改 Nameserver 为 AWS Route 53 提供的 NS 记录(这样可以保证域名解析总是正常)
- [可选] 如果之前的域名存在备案,需要先在原域名注册商处操作备案转移或者注销备案(不然之后注销备案会很麻烦)
- 在原域名注册商操作转出域名,获得转移码,并在 AWS Route 53 中转入域名
阿里云可以快速转出域名,在转出流程页面有“快速转出”按钮,这样通常只需要 30 分钟左右就可以完成域名转出,非常丝滑
CloudFront
CloudFront 是 AWS 提供的内容分发网络(CDN),可以用于加速静态和动态内容的分发。
推荐配备,否则服务器的流量会直接打到 EC2 实例上,导致流量费用高且速度慢。
创建 CloudFront 分配
EC2 实例绑定域名
在 AWS 控制台打开 CloudFront 服务
点击 创建分配
Get started 页面填写自定义别名
Specify origin 页面中,Origin Type 选择 Other,填入 EC2 实例的公有 DNS(不支持 IP)
注意源中协议的选择,如果源是 HTTPS,这里也选择 HTTPS,否则选择 HTTP Only,不然会导致 502 错误
CloudWatch Agent
安装
步骤一:创建 IAM 角色(仅需一次)
如果你尚未给 EC2 实例分配 IAM 角色,请先执行此步骤。
- 创建 IAM 角色并附加权限
- 登录 AWS 控制台,进入 IAM > 角色。
- 创建角色,选择 EC2 类型。
- 附加以下策略:
AmazonSSMManagedInstanceCoreCloudWatchAgentServerPolicy
- 将角色附加到你的 EC2 实例
- 进入 EC2 控制台 > 实例 > 操作 > 安全 > 修改 IAM 角色。
- 将刚创建的角色分配给该实例。
步骤二:安装 CloudWatch Agent
- 登录 EC2 实例
ssh -i your-key.pem ubuntu@your-ec2-public-ip- 下载并安装 CloudWatch Agent
sudo apt update
sudo apt install -y wget
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb步骤三:配置 CloudWatch Agent
- 创建配置文件
你可以用 Amazon 提供的命令行工具生成配置文件:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard根据提示选择需要收集的数据(CPU、内存、磁盘等),完成后会生成一个配置文件,例如 /opt/aws/amazon-cloudwatch-agent/bin/config.json。
- 或者使用这个最小配置模板:
创建文件 /opt/aws/amazon-cloudwatch-agent/bin/config.json:
{
"metrics": {
"metrics_collected": {
"mem": {
"measurement": ["mem_used_percent"],
"metrics_collection_interval": 60
},
"disk": {
"measurement": ["used_percent"],
"metrics_collection_interval": 60,
"resources": ["*"]
}
}
}
}步骤四:启动 CloudWatch Agent
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json \
-s步骤五:在 CloudWatch 控制台查看
- 登录 AWS 控制台
- 打开 CloudWatch > Metrics > CWAgent
- 选择你的实例,查看 内存、磁盘使用率等指标
常用操作
查看 Agent 状态
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status重启 Agent
sudo systemctl restart amazon-cloudwatch-agent查看日志(Ubuntu 通常如下)
sudo tail -n 50 /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.logAWS Certificate Manager (ACM)
申请不可导出的证书是免费的,但是如果是可导出的证书,需要支付一定费用。
可导出完全限定域名的 SSL 证书 15 美元/个,通配符证书 149 美元/个。
申请可以导出的证书
登录 AWS 控制台,进入 Certificate Manager。
点击 请求证书。
选择 公有证书,点击 下一步。
输入要申请的域名,点击 下一步。 如果是通配符的证书,域名前加
*.,例如*.example.com。选择 DNS 验证,点击 下一步。
点击 创建记录,根据提示在 DNS 服务商处添加 CNAME 记录。
等待验证通过,证书状态变为 已颁发。
导出并使用证书文件
在颁发后,可以导出证书文件,这个时候需要输入一个密码,用于保护私钥。
下载后会得到三个文件:
certificate.txt
certificate_chain.txt
private_key.txt如果是nginx服务器,可以用命令将它们修改为需要的文件:
cat certificate.txt certificate_chain.txt > fullchain.pem
cp private_key.txt privkey.pem通常亚马逊下载的密钥文件开头为 -----BEGIN ENCRYPTED PRIVATE KEY-----,
直接使用会在每次读取时,要求输入密码,我们也可以提前移除密码保护,生成不带密码的私钥文件:
openssl rsa -in private_key.txt -out privkey.pemVultr
Cloud Storage
产品类型
共四种存储类型:Block Storage、Object Storage、File System、Storage Gateways,
下面是它们各自的特点和应用场景:
1. Block Storage (块存储)
把存储卷划分成固定大小的数据块,每个块都有唯一标识。对操作系统来说,表现得像一块硬盘,可以挂载到云主机上当本地盘使用。
应用场景包括:需要高性能、低延迟的读写操作。数据库存储(MySQL、PostgreSQL、MongoDB 等)。需要文件系统的应用(例如 Web 服务的持久化存储)。扩容本地磁盘空间(挂载多块卷,按需扩展)。
2. Object Storage (对象存储)
包含 1000GB 存储空间,每月固定收费。超过套餐的部分额外收费。
以“对象”的形式存储数据,每个对象由文件数据 + 元数据 + 唯一 ID 组成。通过 HTTP(S) API 访问(S3 兼容)。没有层级目录结构(文件夹只是逻辑上的 key 前缀)。
应用场景包括:静态文件托管(图片、视频、音频、文档)。备份与归档(数据库备份、日志归档)。内容分发(配合 CDN 提供大规模分发)。存储海量非结构化数据(大文件存储、数据湖)。
对象存储下面有多个产品可以选择,主要区别在于存储的价格,如果对读取要求不高,很少访问的大文件,可以选择最便宜的。
3. File System (文件存储)
提供一个共享的网络文件系统(NAS 类似 NFS)。可以被多个计算实例同时挂载访问。适合需要文件级别共享的应用。
应用场景包括:多台应用服务器共享文件(例如 WordPress 多节点共享 wp-content/uploads)。需要文件锁、目录结构的应用。用户上传文件存储(SaaS 系统、公有云盘)。
4. Storage Gateways (存储网关)
主要针对 裸金属服务器(Bare Metal),因为裸金属没有云磁盘挂载的便利性。Storage Gateway 就是一个中间层,把裸金属服务器与 Vultr File System 对接起来。让多台 Bare Metal 可以同时访问同一个共享存储。
应用场景包括:在裸金属服务器上需要共享存储资源。构建高可用集群(多台 Bare Metal 访问同一份数据)。扩展裸金属本地硬盘容量,用网关挂接云存储。混合场景:裸金属提供计算性能,文件系统/对象存储提供数据持久化。
👉 简单记忆:
Block = 像硬盘 → 给单台主机用。
Object = 像网盘 → 给应用/用户/海量数据用。
File = 像共享文件夹 → 多台机器一起用。
Gateway = 桥梁 → 让裸金属也能用云文件系统。
阿里云
OSS 对象存储
允许网页项目通过AccessKey上传访问OSS
思路概括:保持 OSS Bucket 或文件为私有权限,通过设置 RAM 用户的权限策略,允许通过 AccessKey 进行上传和访问。
如果需要网页项目也支持通过 AccessKey 上传和访问 OSS 文件,还需要设置 CORS 跨域资源共享。
- 配置 OSS 跨域(CORS)规则
在 OSS 控制台 --> 选择 Bucket --> 数据安全 --> 跨域设置,添加如下规则:
# 允许指定域名访问
测试时可临时填 *,正式环境请填写你的网页域名,如 https://www.example.com
# 允许的方法
GET, PUT, POST, DELETE, HEAD- 创建 RAM 用户并分配权限
在 RAM 控制台 --> 用户管理 --> 创建用户,创建一个新的 RAM 用户。
然后为该用户分配权限策略,可以使用如下的自定义策略:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": ["oss:ListObjects", "oss:GetBucketInfo"],
"Resource": "acs:oss:oss-{$regionId}:{#accountId}:{$bucketName}"
},
{
"Effect": "Allow",
"Action": ["oss:GetObject", "oss:PutObject"],
"Resource": "acs:oss:oss-{$regionId}:{#accountId}:{$bucketName}/*"
},
{
"Effect": "Allow",
"Action": "oss:ListBuckets",
"Resource": "acs:oss:oss-{$regionId}:{#accountId}:*"
}
]
}替换 {$regionId}、{#accountId}、{$bucketName} 为你的实际值,这样就设置了允许该用户列出 Bucket、获取 Bucket 信息、上传和下载对象的权限。
CDN 服务
注意事项以及使用技巧
- 如果源站端口使用443端口,会影响源站证书的校验,可以考虑用 DNS-01 方式验证证书,避免端口问题。
允许CDN域名访问OSS文件,不受到阻止公共访问的影响
思路概括:保持 OSS Bucket 或文件为私有权限,通过 CDN 的私有 Bucket 回源功能实现访问,同时配置CDN的防盗链策略防止外部恶意访问。
- 首先需要启用 CDN 加速访问 OSS 的功能:
在 CDN 控制台 --> 选择域名 --> 基础配置 --> 源站类型 选择 OSS Bucket,确保 CDN 能够以私有方式访问 OSS Bucket。
- 启用 OSS 私有 Bucket 回源功能
在 CDN 控制台 --> 选择域名 --> 回源配置 --> 开启阿里云OSS私有Bucket回源”**选项。
这样就可以通过该CDN域名访问 OSS 文件,而不会受到 OSS 阻止公共访问的影响。
开启跨域资源共享
在 CDN 控制台 --> 选择域名 --> 缓存配置 --> 修改出站响应头 --> 添加:
Access-Control-Allow-Origin: * (或者指定域名)Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
即可允许跨域请求。
短信服务
通过 API 发送短信
这里以 PHP 为例,使用阿里云的短信服务发送短信。
需要使用全局 Composer 安装两个包:
composer require alibabacloud/dysmsapi-20170525 4.1.2
composer require alibabacloud/darabonba-openapi微信公众号开发
相关资源
开发者文档:微信公众平台开发者文档
测试号平台:公众平台测试账号
接口调试工具:在线接口调试工具
开发者工具:web 开发者工具
这些资源都可以在 开发接口管理 --> 开发者工具 找到
群发消息
群发消息的接口为 https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN
发布接口为 https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=ACCESS_TOKEN
要注意它们的区别:
发布图文后,已发布的内容可被自定义菜单、自动回复、合集引用等使用。
群发消息是直接发送给用户,也就是我们常理解的推送图文消息给用户。
ChatGPT/Chatbox 类 API
模型的选择
在选择模型时,通常会有一个模型列表,用户可以选择不同的模型来进行对话或生成图片。
模型的名称通常是一个字符串,如 deepseek-r1-distill-llama-8b、dall-e-3 等。
它们表示:
deepseek:模型类型,对话模型r1:模型版本,通常是数字distill-llama-8b:模型的配置-
distill:模型的训练方式,通常是distill或ft(fine-tuning)-
llama:模型的类型,如llama、gpt等-
8b:模型的大小,通常是8b、16b等,表示模型的参数量,b代表billion,即 10 亿,8b表示 80 亿参数
文字对话
文字对话都是通过 SSE 流的方式进行回复的,这样才可以实现实时对话的效果。
如果是文件,通常客户端会解析文件,然后将文件内容发送给服务器,服务器会返回对应的回复。
基础案例
请求数据
url = "https://api.example.com/chat/completions"
headers = {
host: 'localhost:3000',
connection: 'keep-alive',
'content-length': '1044',
'sec-ch-ua': '"Not?A_Brand";v="8", "Chromium";v="108"',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) xyz.chatboxapp.app/1.10.5 Chrome/108.0.5359.215 Electron/22.3.27 Safari/537.36',
authorization: 'Bearer 449175e4c05f92119361dfa24887ec3709311ef',
'content-type': 'application/json',
baggage: 'sentry-environment=production,sentry-release=1.10.5,sentry-public_key=3cf8d15960fc432cb886d6f62e3716dc,sentry-trace_id=57d8ffae51e3445fa53f0328bdd3536a',
'sentry-trace': '57d8ffae51e3445fa53f0328bdd3536a-825f60796cb21e4b',
'sec-ch-ua-platform': '"macOS"',
accept: '*/*',
'sec-fetch-site': 'cross-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US'
}
data = {
messages: [
{
role: 'system',
content: '\n' +
'Current model: deepseek-r1\n' +
'Current date: 2025-03-11T07:18:15.877Z\n' +
'\n' +
'You are a helpful assistant.'
},
{ role: 'user', content: '您好' },
{
role: 'assistant',
content: '欢迎您来到深度求索!我是深度求索的一款智能助手,随时准备帮助您解答问题、提供信息或者进行愉快的对话。请随时告诉我您需要什么帮助,我会尽力提供!'
},
],
model: 'deepseek-r1',
temperature: 0.7,
top_p: 0.9,
stream: true
}如果是文件,还需要先读取文件内容,并以这样的格式进行发送:
messages: [
{
"role": "user",
"content": "输入的文字内容\n\n\n<ATTACHMENT_FILE>\n<FILE_INDEX>File 1</FILE_INDEX>\n<FILE_NAME>文件名称.md</FILE_NAME>\n<FILE_CONTENT>\n# 内容标题...\n</FILE_CONTENT>\n</ATTACHMENT_FILE>\n"
}
]如果是图片,需要转成 url 或者 base64 格式进行发送:
messages: [
{
"role": "user",
"content": [
{
"type": "text",
"text": "输入的内容\n[image]"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,iV...="
}
}
]
}
]返回数据
返回的数据类似下面这样,不断地发送给客户端,直到最后会发送一条 end 事件,表示对话结束。
data: {"choices":[{"delta":{"content":null,"reasoning_content":"“"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1741676945,"system_fingerprint":null,"model":"deepseek-r1","id":"chatcmpl-fbc7c94f-05e2-98d6-840a-897837dac57d"}如果有错误时会返回:
{
"error": {
"code": "invalid_type",
"param": "'messages.[0].content'",
"message": "Invalid type for 'messages.[0].content': expected one of a string or array of objects, but got an object instead.",
"type": "invalid_request_error"
},
"request_id": "chatcmpl-29eac547-a262-9c24-9690-e4c3a31ad122"
}初始化对话名称
通常需要给当前对话一个名称,可以在新建的对话后,发送第一次对话内容时让 AI 先帮忙起一个名字,消息可以类似下面这种:
{
"messages": [
{
"role": "user",
"content": "Based on the chat history, give this conversation a name.\nKeep it short - 10 characters max, no quotes.\nUse 简体中文.\nJust provide the name, nothing else.\n\nHere's the conversation:\n\n```\n<用户第一次发送的消息,替换这里,不包括符号>\n\n---------\n\n\n```\n\nName this conversation in 10 characters or less.\nUse 简体中文.\nOnly give the name, nothing else.\n\nThe name is:"
}
]
}相关知识
- role 角色,通常有
user、assistant、system三种角色
图片生成
请求数据
url = "https://api.example.com/images/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"prompt": "laiba",
"response_format": "b64_json",
"model": "dall-e-3",
"style": "vivid"
}返回数据
{
"created": 1631234567, // 时间戳
"data": [
{
"b64_json": "base64-encoded-image-data" // Base64 编码的图片数据
}
]
}