AI修图代码怎么写?后端程序员给小程序加功能的经过

AI修图代码怎么写?后端程序员给小程序加功能的经过
用ai修图代码调用AI修图接口,小程序照片从上传到自动修图的流程示意

结果先说:功能已经上线两个多月,老婆店里客户照片拍完上传就自动去皱提亮,她再没手动美颜过。代价是我踩了三天坑,7月还多花了一笔本可省掉的费用。想动手的先把限流和计费文档看完,再写第一行代码。

ai修图代码这件事,我的结论是:接口本身比想象中好接,真正费劲的是鉴权细节、限流策略和账单。今年6月底,我给老婆裁缝店用的那个记账小程序加了"拍照上传自动修图",功能代码不到两百行,调通却花了三天多。下面按我实际踩坑的顺序摊开讲,你照着能少走不少弯路。

动线想清楚再动手:小程序只管传图,修图全压在后端

小程序端只做拍照、压缩和上传,修图请求由后端转发给AI接口,密钥永远不出服务器。这样密钥可控,出问题有日志可查,计费也算得清。

背景交代一句:老婆的小裁缝店,接定制单、记账、给客户发进度照片,全靠我去年给她写的小程序。她一直有个诉求——客户拍的布料和成衣照片光线乱七八糟,发朋友圈前得她自己一张张修。今年6月她又随口念叨了一次,我索性说:给你做成上传完自动修。

动手前先定架构。方案A是前端拿着密钥直接调AI接口,写起来快,但密钥打包进小程序等于裸奔,被人扒出来刷量,账单全是我的。方案B是小程序只负责拍照压缩,传到我的服务器,后端拿到图再调AI修图接口,结果原路回传。我选了B,多一跳延迟,换密钥安全和可控,值。

同步还是异步也得想清楚。实测一张 1280 宽的照片修图耗时 4 到 8 秒,让客户在前台干等肯定不行。我的做法是上传完立刻返回"已收到",修图任务丢进队列慢慢跑,跑完推一条模板消息。老婆店里一天 30 到 50 张的单量,队列完全撑得住。

选服务商那步我没急着看参数表,先挨个把各家在线版手动试了一圈,效果好坏一眼就能看出来,那段体验跟云修图在线修图实测里写的差不多。网页上试得满意的,接口出来的效果才敢信,这个顺序别反过来。

鉴权和参数:第一个坑就卡在签名时间戳上

AI修图接口普遍用 AccessKey 加 HMAC 签名鉴权,报 401 十有八九是时间戳单位错了或参数没按字典序排序。别急着怀疑密钥,先打印签名原文。

鉴权流程不复杂:服务商控制台建个应用,拿到 AccessKey 和 SecretKey,请求时把参数按 key 做字典序排序、拼接,用 SecretKey 算 HMAC-SHA256,签名塞进请求头。麻烦的全是细节。签名这东西有点像小区门禁:卡号对不对是一回事,你进门的时间不对,保安照样拦你。这个比喻马上应验。

我第一版代码跑起来,接口稳稳返回 40103,报错文案是"timestamp invalid"。我对着文档把密钥配置翻了半天,没毛病。折腾了快一个小时,把拼接前的签名原文打印出来逐字符比对,才发现时间戳传成了毫秒,文档要的是秒。就这么一个单位问题,卡掉我一下午。话说回来,那晚我本来答应陪老婆看剧的,结果抱着笔记本调签名,被她拍了张丑照存进相册,现在还在。

参数上还有三个小坑,一并说了。一是图片字段传 base64 时得去掉"data:image/png;base64,"这个前缀,我头一回没去,直接报 41301 图片格式非法。二是单张图不能超过 5MB,手机直出的照片基本都超,我在小程序端用 canvas 压到 1280 宽、质量 0.8,体积稳定在 400KB 上下,顺带把上传等待从 6 秒压到 2 秒以内。三是 iPhone 拍的照片带 EXIF 方向信息,修完横过来一张,老婆问"怎么我这件衣服是躺着拍的",后来我在后端发请求前先读 EXIF 把图摆正,才算完。

修图力度参数我最开始把 retouch_level 拉到 80,出来的图磨皮磨得布料纹理都没了——卖布料的店,纹理没了等于白拍。老婆看了一眼:这还是我的货吗。降回 40,既提亮又保纹理,才算过关。这种参数文档不会告诉你多少合适,只能拿真实照片一张张试。

限流和账单:功能不赚钱,调用是真花钱

免费额度用完后按张计费,我这边 0.06 元一张,接口限 QPS 2,超了直接返回 429,重试和排队得自己写。账单才是这个功能真正的成本中心。

上线第一天就撞了限流。QPS 限制是 2,老婆店里早上开工那阵集中传图,瞬间打出一串 429。我的第一反应是写个循环重试,结果更糟——几十个请求原地蹦跶,谁也挤不进去。后来改成队列排队加指数退避,失败后等 2 秒、4 秒、8 秒再试,最多三次,才算平稳。

钱的事更值得展开。免费额度每月 500 张,6 月底上线,三天出头就用光了,我自己测试烧掉小一百张,剩下是店里真实单量。7 月账单出来,63 块 7。老婆的反应挺有意思:比我上礼拜给她买奶茶的花销还低,行,准了。说实话这个单价对个人项目完全扛得住,怕的是失控。

失控真发生过一回。8 月初我翻账单,发现某天凌晨有 300 多次调用,店里那个点早关门了。顺着日志查,是重试逻辑的 bug:接口返回 5xx 时我的代码无限重试,而请求一旦被服务端受理,失败的结果照样计费。那晚 37 块钱就这么烧没了,找客服核实,答复是计算资源已消耗、不予退款。我把重试上限锁死在 3 次,429 一律不立刻重试、进队列排队,这类账单异常再没出现过。

现在每月的量稳定在 1200 张上下、七八十块,照片发出去客户明显更愿意停下来问价。这功能不直接收钱,算给她店铺引流的小开支,值不值她说了算,反正账单我月月盯。

现在打开那个小程序,拍照、上传、几秒后拿到一张修好的图,老婆已经忘了手动美颜这回事。回头看那不到两百行的功能代码,真正的工作量根本不在主流程,全藏在报错分支、重试策略和账单核对里。你要是也想给自己人加点这种小功能,别急着写代码,先把服务商的限流规则和计费说明那两页文档看完,再动手不迟。

常见问题

AI修图接口能用前端JavaScript直接调吗?

技术上能跑通,但密钥会暴露在浏览器请求或小程序包里,被人扒出来批量刷量,账单全记在你头上。最低限度也要用自己的后端或云函数中转一层,密钥放环境变量里,前端只传图片、不碰鉴权。

修图接口返回的结果图链接是永久的吗?

大多数服务商只给一个 24 小时时效的临时下载地址,过期就取不到了。原图和结果图都得自己转存到对象存储;我这边原图额外留一份,是为了效果不满意时换个参数重新跑,不用麻烦客户再拍一遍。

不会后端也能给自己的小店接AI修图吗?

可以走省事路线:部分服务商提供现成的云函数模板或网页批量处理入口,不用自己写签名代码。但要做进自己的小程序、按自己的业务流程触发,后端那一层绕不开,至少得会部署别人写好的服务并看懂报错。

延伸阅读