
最近我用AI编程的方式从零搭了一个专门生成小红书引流图片的网站。这事情听着挺大其实整个过程比我预想的顺利不少——不是我技术有多强而是现在的AI编程工具确实把门槛拉到了很低的程度。先说一下背景我平时在做小红书账号需要大量封面图、配图、活动引流图每次都用PS套模板改字调色很费时间。后来我干脆动了念头做一个网站输入标题和风格自动生成一张合适尺寸的引流图。这个项目前后花了两周的下班时间从想法到上线中间踩了不少坑也积累了一些可以直接用的经验写出来分享给同样想用AI编程搞点实用工具的朋友。这个网站解决的核心问题其实很简单把“做图”这件事产品化。以前你需要打开设计软件一点点排字、选背景、调构图现在你只需要在网页框里输入“秋季新品上新”“限时特惠”“知识星球招募”几个词选择想要的风格简约、活泼、复古、ins风AI在几十秒内就给你生成一组符合小红书发布尺寸的图片。你不用懂设计不用懂代码甚至不用会写提示词——页面上的按钮和表单已经把流程简化到傻瓜级。让不同基础的人都能从这个项目里拿到东西如果你是完全不懂编程的小白你可以学到一个“用AI辅助开发完整小工具”的思路知道怎么把需求拆成功能让AI帮你写代码如果你会一点前端或后端能直接参考我分享的项目结构和关键代码片段倒推实现如果你是小红书运营者你会对这种引流图工具的能力边界有概念至少知道以后这类需求可以怎么被自动化处理。1. 内容整体设计与思路拆解1.1 引流图的本质需求不是“好看”而是“点击”做小红书久了你会发现一张引流图好不好关键不是审美多高级而是它能不能在信息流里让人停下来。这就决定了引流图有几个硬性指标尺寸必须要适配平台小红书图文封面一般以3:4竖版为主信息流里占比最大的是封面竖图其次是1:1方图文字要少而精手机上大部分用户只看一眼所以主标题字要大低信息密度视觉风格要统一同一主题的系列图保持色调一致才显得专业最后就是要有“钩子”比如“免费领取”“保姆级教程”“5分钟学会”等字眼配合视觉突出。正因为这些要求相对固定用AI生成图片反而比我手工设计更高效。因为AI图像生成模型可以从训练数据里学到“小红书风格”大概是什么样子你只要把标题文字传进去它自动排版、配色、配图。当然它也有短板比如对中文文字的渲染经常出错特别是复杂的标题文字容易缺笔画或多字符。所以实际设计网站时我没有让AI直接生成带文字的完整图而是让它先生成纯背景或主体画面再用HTML/CSS在浏览器里动态叠加经过美化的文字层。这个思路等于把“AI生成纯视觉”和“前端精确排版”结合起来既保证美观又避免了AI文字错漏问题。这个方案选型的逻辑是我不会自己做复杂的生成模型也不想去调Stable Diffusion的参数更不想买一堆付费素材所以我选择了先把前端页面做得足够好用后端直接调用成熟的图像生成API比如一些国内外平台提供的图生图、文生图接口把生成的图片作为背景图层返回给前端前端再叠加用户填写的标题和副标题文字最后用canvas把整个合成结果导出成一张完整的PNG。整个过程对服务器压力小代码量可控也方便以后替换生成引擎。1.2 技术方案怎么选AI编程帮我做了什么我得承认我的编程水平属于“能看懂代码、会改bug、但没法从零手搓架构”的程度。以前遇到这种项目我大概率会放弃或者外包。但这次不一样因为我在开发全流程里都用AI编程工具我用的是Cursor来摊平很多实现细节。所谓AI编程简单说就是用提示词让你身边的AI写代码、改代码、解释代码。比如我会告诉它“我要一个Python Flask后端提供两个接口一个是生成背景图返回图片URL另一个是接收标题和风格参数返回合成完成的图片。”它会立刻给我生成一版可运行的代码。我拿到代码后自己读一遍有问题直接问它“这个函数是干什么的”“如果API超时了怎么加重试”它再帮你改。这个过程就像有个24小时在线、脾气还很好的工程师做副驾驶。我的具体技术栈是这样的前端用纯HTML CSS JavaScript没有用React或Vue因为功能简单不想引入构建工具增加复杂度。页面包含一个表单有输入框主标题、副标题、按钮文字、风格选择下拉框、尺寸切换3:4、1:1、9:16以及一个生成结果的展示区域和下载按钮。后端用Python Flask因为写起来最简洁部署也简单。图像生成接口我接了一个支持图生图的API——我上传一个没有文字的海报模板有渐变背景和图形元素API根据指定的风格描述做变化返回新的背景图。前端拿到背景图后在画布上绘制背景然后用指定字体和字号把用户填写的文字画上去最后用canvas.toDataURL()生成下载链接。AI编程在这个项目里主要帮了我三件事第一写基础框架代码尤其是我之前没怎么写过的Flask路由、cors跨域配置等直接让AI写比我翻文档快得多第二帮我调试报错比如有段时间API返回的图片URL在前端怎么都加载不出来AI一眼指出是HTTP和HTTPS混合内容的问题我立刻加了代理转换第三优化交互细节比如“下载按钮要同时支持手机和电脑”“生成过程要显示loading状态”AI给了很成熟的方案。1.3 为什么不做成爬虫下载工具而是生成工具这个项目名字里虽然有“引流图片网站”但一定有人会联想到“下载小红书图片”。这里我得说清楚我做的网站是帮用户生成属于自己的原创引流图而不是去别人的主页抓图。一方面从合规角度讲未经授权抓取和下载平台内容可能涉及侵权尤其是他人创作的作品另一方面你真正需要的引流图应该是你的产品、你的活动、你的文案的视觉包装而不是复制别人的成品。所以整个项目围绕“生成”来建设素材也是用户自己上传或者从模板库里调用方向上更可持续。当然网站也开放了一个上传功能你可以上传自己手机里的实拍图AI会基于你上传的图生成不同风格的引流背景这样融合了原图的一部分内容又赋予了新的设计感更适合个人博主使用。2. 核心细节解析与实操要点2.1 图片尺寸与文字安全区的设计小红书引流图的尺寸我梳理过最常见是3:4竖版比如1080x1440适合信息流封面另外还有1:1方图1080x1080适合图文详情和分享卡片以及9:16全屏1080x1920适合做微信朋友圈或抖音封面。在网站里我做了这三种固定尺寸的选项用户不用手动输入像素值直接选。但光有尺寸还不够必须考虑文字安全区。小红书界面在信息流中会把封面图的中心区域和底部区域占掉一部分——比如左边有头像和点赞按钮底部有标题文案遮挡。我查阅了一些博主分享的经验顶部至少留10%的空白底部留15%的空白左右各留8%的空白。所以在合成图片时我让文字内容始终活动在画面中央的矩形安全区内主标题距离画布顶部约22%的位置副标题约在70%的位置如果需要放按钮文字保持在85%以内。这样生成的图就算被平台UI遮挡一部分关键信息依然完整可见。同时图片上文字不能太多。我的页面里主标题限制在10个汉字以内副标题限制在20个汉字以内如果超出我会在前端做截断处理避免生成乱掉的排版。对于字体大小我按画布宽度动态计算主标题大概是画布宽度的11%副标题大概是7%这样即使用户选择全屏尺寸也能保持视觉比例一致。为了让最终生成的图精度高我用canvas以2倍图来绘制——也就是如果画布设置为1080x1440我就用2160x2880的像素尺寸来画然后导出时压缩到目标尺寸这样文字边缘更锐利不会在手机上发虚。2.2 风格模板库的设计逻辑引流图不能千篇一律所以我在网站里内置了一套风格模板。这个模板库分“基础模板”和“用户自定义”两层。基础模板是6种预设风格清新白适合美妆、生活、手作、活力橙适合活动、促销、商务蓝适合职场、知识付费、暗夜风适合数码、电影感、粉彩渐变适合女性生活方式、杂志风适合潮流、探店。每一种风格对应一组背景参数主色调、渐变方向、辅助图形类型、装饰纹理。实现时后端并不会用代码硬编码这些视觉参数而是把它们转成一段固定的英文提示词发给图像生成API。比如“清新白”的提示词是a clean minimal background with soft white tones and subtle pastel texture, light gray abstract shapes, bright atmosphere, no text。这很重要——AI生成模型大多数是英文训练语料如果你用中文“干净的白色背景”往往能得到一种塑料感强烈的效果但用上面的英文短语会让图片的气质更自然。为了让用户看到效果我把每种风格缩略图都提前生成了几张示例图放在页面上供参考用户选择风格后当前预览区域也会实时切换到该风格的首选背景。用户自定义模板则简单一些——用户上传一张自己的照片或素材图前端会把图片发送到后端后端调用API进行图生图处理生成三张不同构图的变体。用户可以在三张里选一个作为背景然后继续叠加标题文字。这个功能很实用等于给一张普通手机照做了三种设计排版。2.3 提示词的“可复用性”技巧在搭建这个网站的过程中我最大的体会是AI生成图片的成败一半在提示词。由于是给不同风格做背景我会把提示词拆成“基础结构风格词质量词”三段式。基础结构固定是a clean background with soft gradient确保整体干净风格词从模板参数里动态拼接比如warm orange tones, subtle geometric shapes, glossy texture质量词统一追加high quality, 8k, minimal, no text, no watermark, centered composition, negative space suitable for text overlay。这个三段式是我实验了很多次才总结出来的。一开始我直接写“请给我一张适合做小红书的背景图”这种大白话出来的图有大量复杂元素没法放文字。后来我借鉴了一些专业设计师分享的经验把“negative space suitable for text overlay”这句加进提示词图片的留白比例瞬间就上来了。另外统一在提示词里加“no text, no watermark”也非常关键不然模型偶尔会在图上生成一些毫无意义的英文花体字或假文字后期很难去除。对于中文文字我也测试过让AI直接生成中文比如输入“请在海报上写‘限时优惠’”效果一塌糊涂不是缺笔画就是多出奇怪的字符。所以网站里我彻底放弃让AI写中文改成前端canvas层叠。这也算一个非常实用的避坑经验不要把AI生图模型当成PS排版工具它擅长的是色彩、光影和氛围而不是精准文字排版。2.4 前端交互和加载状态的细节因为图片生成需要时间后端调用API一般得花10到30秒所以前端交互必须给用户明确的反馈。我在生成按钮上做了三种状态初始状态显示“开始生成”点击后变成“正在绘制灵感…”并同时出现一个动画风loading指示条和一行小字“平均等待约15秒请保持页面打开”。生成完成后按钮变成“再生成一张”同时图片区域自动滚动到结果预览处。这样做虽然简单但能明显降低用户的焦虑感。还有一个小细节因为图片合成是在前端canvas完成的如果用户手机内存不够大尺寸canvas很容易白屏。所以我采用“按需绘制”的逻辑——用户点击生成按钮后先把背景图加载出来背景图完全加载后再在canvas上绘制文字。绘制时使用getContext(2d)并把canvas的width/height设为当前设备像素比的两倍但CSS尺寸控制在屏幕宽度以内。这样既保证导出清晰度又避免一次处理过大的像素矩阵。3. 实操过程与核心环节实现3.1 从空文件夹到能看的前端页面我先说我整个项目的目录结构非常简单xiaohongshu-tool/ ├── app.py # Flask 后端主文件 ├── templates/ │ └── index.html # 前端页面 ├── static/ │ ├── css/style.css # 样式 │ ├── js/main.js # 前端逻辑 │ └── images/ │ ├── templates/ # 内置风格缩略图 │ └── uploads/ # 用户上传临时文件 ├── config.py # 配置文件API Key等 └── requirements.txt创建项目时我没有手打代码而是直接在Cursor里新建了一个项目文件夹然后输入一个总体提示词“帮我创建一个Flask网站用途是生成小红书引流图片。用户输入标题、副标题、选择风格和尺寸点击生成后先调用外部图像生成API得到背景图再在前端canvas上叠加文字并允许下载。页面要现代简洁移动端适配良好。请先帮我创建项目结构和所需文件。” AI马上就生成了一整套文件虽然有些细节不完美但骨架是完整的。我拿到初版后先跑通最核心的流程。打开终端执行pip install flask requests然后启动python app.py浏览器访问本地5000端口看到一个简单的页面有输入框和按钮也能调用API生成图。这一步顺利之后我再逐步优化样式和交互。我的经验是别想着让AI一次性给你完美的产品MVP先跑通再迭代细节。3.2 后端接口怎么设计后端就两个接口一个负责图像生成一个负责健康检查。# app.py 简化示意 import requests from flask import Flask, request, jsonify, send_file from config import API_KEY, API_URL app Flask(__name__) app.route(/api/generate-background, methods[POST]) def generate_background(): data request.get_json() style_key data.get(style, fresh_white) upload_id data.get(upload_id, None) # 构造提示词 prompt build_prompt(style_key) # 如果有上传图使用图生图模式否则文生图 if upload_id: image_path get_upload_path(upload_id) payload build_payload_with_image(prompt, image_path) else: payload build_payload(prompt, width720, height960) # 背景图没那么大 headers {Authorization: fBearer {API_KEY}} resp requests.post(API_URL, jsonpayload, headersheaders, timeout60) if resp.status_code ! 200: return jsonify({error: image generation failed}), 502 image_url resp.json().get(data, [{}])[0].get(url) # 将结果保存到临时目录并返回给前端 return jsonify({image_url: image_url})这里我用了width720, height960是因为生成的背景图只会作为画布底层最终导出尺寸我放到前端处理。这样能降低API费用和时间成本。如果你需求是输出1080宽那可以设置720足够因为canvas画布最终是2160宽但背景图只需要占1/3像素放大后会有点模糊实际上我做了缩放处理720x960拉到2160x2880会模糊。所以后来我改成了让后端直接生成1080x1440的背景图这样放大2倍到2160x2880还算可接受。另外API调用的timeout我设置了60秒。但有些生成接口确实可能超过60秒这时前端可能已经超时。所以我加了重试机制第一次请求60秒超时后自动再发一次请求用同样的参数第二次如果成功就用如果还不行返回一个友好提示。测试下来重试成功率能提升不少。3.3 前端核心合成代码前端关键的合成代码在main.js里。用户点击按钮后先调用后端接口获取背景图URL再用new Image()加载这张图。等onload触发后创建canvas设置尺寸为目标尺寸的2倍把背景图铺满然后在上面绘制文字。// 合成图片的核心逻辑 async function composePoster(bgUrl, mainText, subText, buttonText, sizeKey) { const SIZES { 3:4: { w: 1080, h: 1440 }, 1:1: { w: 1080, h: 1080 }, 9:16: { w: 1080, h: 1920 } }; const target SIZES[sizeKey]; const scale 2; // 2倍图 const canvas document.createElement(canvas); canvas.width target.w * scale; canvas.height target.h * scale; const ctx canvas.getContext(2d); // 绘制背景 const bg new Image(); bg.crossOrigin anonymous; bg.src bgUrl; await new Promise((resolve, reject) { bg.onload resolve; bg.onerror reject; }); ctx.drawImage(bg, 0, 0, canvas.width, canvas.height); // 绘制主标题 ctx.font bold ${Math.round(canvas.width * 0.11)}px PingFang SC, Microsoft YaHei, sans-serif; ctx.fillStyle #FFFFFF; ctx.shadowColor rgba(0,0,0,0.5); ctx.shadowBlur 20; ctx.shadowOffsetY 4; ctx.textAlign center; ctx.textBaseline middle; const mainY canvas.height * 0.22; ctx.fillText(mainText, canvas.width / 2, mainY); // 绘制副标题 ctx.font normal ${Math.round(canvas.width * 0.07)}px PingFang SC, Microsoft YaHei, sans-serif; ctx.fillStyle rgba(255,255,255,0.9); const subY canvas.height * 0.40; wrapText(ctx, subText, canvas.width / 2, subY, canvas.width * 0.6, canvas.height * 0.05); // 可选按钮文字 if (buttonText) { // 绘制圆角矩形按钮 文字 } return canvas.toDataURL(image/png); }这里有几个细节值得说。ctx.shadowColor和shadowBlur是我用来给白色文字加黑色投影的这样不管背景多花文字都容易看清。wrapText是一个自定义函数用来处理副标题换行因为canvas的fillText默认不会自动换行我需要按字数分成多行。按钮文字的处理也很有讲究。我不是直接把“立即领取”四个字画上去而是先画一个半透明的白色圆角矩形类似于胶囊按钮再把文字放进去这样视觉上会更像一个可点击的按钮引流效果更好。圆角矩形的半径是矩形高度的一半看起来非常圆润。为了适配不同尺寸矩形宽度根据文字长度动态计算。3.4 部署上线时需要避开的小坑网站需要一个能被访问的地址我用了一台云服务器把Flask应用部署在上面。部署方式是gunicorn加Nginx反向代理。因为我的应用需要处理canvas跨域图片合成所以在后端设置了CORS允许所有域名访问图片资源。同时为了安全我把API Key放在config.py里并在gitignore中排除防止提交到公共仓库泄露。这里有个很惨的教训我第一次部署后发现别人打开网站时点生成按钮背景图能生成但前端canvas一直报跨域错误。原因就是背景图是从API返回的图片服务器没有加Access-Control-Allow-Origin响应头。我在前端用crossOriginanonymous加载图片但服务器不认导致canvas被污染。解决方法是让后端自己去下载图片然后通过自己的Flask路由返回图片数据也就是加一个代理接口。具体实现是后端拿到image_url后再用requests.get把图片二进制取回来存到本地然后把本地图片地址传给前端。这样前端加载的是同域名图片跨域问题就消失了。这个改动让代码多了一些但非常值得。毕竟用户体验是第一位如果老是出现“生成成功但下载不了”这个工具就废了。4. 常见问题与排查技巧实录4.1 典型问题速查表我整理了一下这个项目上线后自己和用户反馈中遇到的高频问题做成一个速查表方便大家一目了然。问题现象根本原因解决办法生成按钮点了没反应后端接口挂掉或前端JS报错F12查看控制台先确认网络请求是否发出再检查Flask日志生成背景图很慢API模型本身耗时长或者网络传输慢调低生成分辨率在后端增加超时重试给用户显示loading提示图片上文字出现方块或乱码前端canvas使用中文字体加载失败确保使用了系统中文字体PingFang SC/微软雅黑可尝试使用Web Font下载的图片是空白的canvas跨域污染确保背景图通过同域代理加载不能直接用第三方URL手机端显示排版错乱没有做移动端适配或viewport缺失在HTML中加入meta nameviewport contentwidthdevice-width, initial-scale1并调整表单宽度API Key泄露被刷爆密钥暴露在前端代码或公共仓库把密钥全部放到后端配置前端只调用后端接口用环境变量管理密钥同一风格生成效果不稳定AI生成的随机性固定随机种子seed参数同一风格用同一seed能得到较一致的风格表现生成图片上有AI水印部分API默认加水印查看API文档关闭水印选项或付费去水印4.2 我自己踩得最深的坑文字排版比例第一个坑是字体大小。我最初设置主标题字号为画布宽度的8%结果在手机上看字很小完全没有冲击力。后来改成11%甚至12%画面才饱满。但一定要配合文字安全区如果主标题字体太大很容易超出边界被截断。我后来加了动态宽度检测在绘制前先用ctx.measureText()测量文字实际宽度如果超过画布宽度的60%就按比例缩小字号。这样即使输入10个字也能自动适配。第二个坑是换行逻辑。中文文案往往没有空格如果副标题很长比如“点击主页查看全部分享/关注我领取更多模板”如果不手动换行它会超出边界。我写的wrapText函数按字符数量硬切遇到半个字符会出问题。最终我改成按“视觉宽度”测量每次把下一个字加到当前行如果超出最大宽度就回退并另起一行。这种测量方式运行起来比较流畅效果也稳定。第三个坑是背景图样式。有些风格如“杂志风”生成的背景有强烈的大色块和几何元素导致白色文字看不清。我在前端写了一个自动判断背景平均亮度的函数——把背景图绘制到一个小canvas上获取每个像素的RGB值然后计算平均亮度。如果平均亮度偏暗就用白色文字加阴影如果偏亮就用黑色文字加白色阴影。这个方案虽然粗糙但实测已经很够用比让用户自己调节文字颜色要省心得多。4.3 低成本调试技巧在开发这个网站时我并没有一开始就使用正式付费API。我建议想复刻这个项目的朋友可以先接一个免费或者试用额度的图像生成接口同时设置一个假的API URL用于验证前后端互动逻辑。怎么验证就是在前端写死一个背景图URL比如来自unsplash然后看合成功能是否正常。这样做不消耗API额度还能快速排除是前端问题还是后端问题。另外我把生成过的图片都按时间戳保存到服务器上并生成一个URL列表页面方便排查历史生成记录。刚开始是为了调试后来发现这个功能反而成了运营时的素材管理库——我可以随时回看过往生成过的图方便追溯文案效果。还有一点建议写一份最小化的README记录如何启动项目、环境变量有哪些、API文档链接。AI编程工具生成代码很快但如果你过两周再看这些代码你可能会忘了为什么要写某个重试函数。把这些记下来后面维护成本低很多。5. 如何用AI编程持续优化这个网站5.1 让AI帮你分析数据而不是只写代码网站上线后我更关注的是用户点了什么风格、在哪个尺寸上停留最久、生成失败率有多高。这些数据分析工作也可以用AI编程完成。我在后端加了一个简单的埋点每次生成成功或失败就写入一行日志包含风格、尺寸、耗时。每周把这些日志导出丢给AI分析让它告诉我“哪种风格最受欢迎”“哪个尺寸最容易失败”“建议增加什么功能”。AI能从数据里提炼出很多我没注意到的规律比如有用户连续失败三次后就不再使用于是我加了一个“生成失败自动重试并切换风格”的逻辑用户几乎没有感知就成功了。我还用AI编程给网站加了一个“历史记录”功能。每次生成完前端会把最终的图片DataURL压缩后存到localStorage并且在页面上展示最近20条记录。用户不用手动保存回来还能继续下载。这个小功能完全是由AI根据需求生成的我只提了需求描述它就帮我实现了。5.2 丰富模板和风格的方法模板风格目前只有6种我还想继续增加。过去扩展风格需要手动调提示词现在我会用AI编程来“批量生成风格参数”。我给AI一个已有的风格JSON示例告诉它“照着这个格式帮我新增10种适合小红书引流图风格的提示词参数”它直接输出一份完整的JSON我复制到代码里就能生效。这个效率比我自己想高太多了。同时我也利用AI编程做图片风格的“模糊搜索”——这句话的意思是用户在页面上传一张参考图上传后AI用CLIP模型计算参考图和已有模板的相似度然后自动匹配一个最接近的内置风格。这样用户不用了解“暗夜风”“杂志风”这些概念直接放一张自己喜欢的图系统就帮你找到类似风格并生成同系列的背景。这个功能听着复杂但其实也是调接口写一些匹配逻辑AI编程撸下来并没有想象中困难。5.3 把网站打包成“个人引流工作台”的想法现在这个网站只是一个单页工具后续我想把它扩展成一个“小红书运营工作台”。比如增加“文案灵感库”从我的笔记历史中提取标题结构自动生成多个标题列表增加“发布时间规划”根据我记录的历史笔记数据推荐最佳发布时间增加“素材管理”把每个项目生成的图片、文案集中在一个项目卡里方便按专题管理。这些模块虽然越来越大但我并不打算自己从头写。我的策略是把需求拆成一个个小功能然后逐个用AI编程实现每个功能先做MVP验证有效再迭代。比如“文案灵感库”我先做一个最简单的页面能随机抽取我收藏的100条爆款标题并展示它们的字数、情绪词、标点符号频率。跑通之后再接入提示词生成功能。这样做的好处是每个功能都能快速交付不会因为一个整体的大工程而拖延。我觉得AI编程真正改变的不是写代码这个动作本身而是让我们普通创作者也能快速把一个具体的想法变成产品。它像是一个极其耐心的搭档你负责判断“这东西到底有没有用”它负责搞定“怎么实现出来”。这个网站的经验告诉我只要需求足够清晰AI编程能在两天内完成过去两周的工作量。最后再分享一个非常实用的小技巧在开发这类工具网站时让AI编程先输出最简可用版本然后你真实地去用它把使用过程中感觉别扭的地方记录下来再把这些记录原样发给AI让它针对性地改。我遇到的很多优化点其实不是技术问题而是我作为创作者在“用产品”而不是“想产品”时才发现的。希望大家也能用这个思路去搭建属于自己的AI编程小工具。