微信公众号仅认腾讯官方短链服务,必须调用https://api.weixin.qq.com/cgi-bin/shorturl接口生成短网址,其他第三方短链(如TinyURL、Bitly)在图文或菜单中会被拦截或跳转失败;该接口需有效access_token、JS安全域名配置及“公众号消息管理”权限,且access_token有效期2小时须动态获取,单次最多提交100条长链接但建议≤50条,并发推荐8~12路并配合限频与错误重试策略。

短网址生成必须用腾讯官方API还是能自建?
微信公众号只认腾讯短链服务(https://api.weixin.qq.com/cgi-bin/shorturl),其他第三方短链(如TinyURL、Bitly)在公众号图文或菜单里会被拦截或跳转失败。Node脚本调用这个接口是唯一合规路径,且需公众号后台已配置JS接口安全域名并获取有效access_token。
常见错误现象:{"errcode":40014,"errmsg":"invalid access_token"}——说明token过期或未正确刷新;{"errcode":40001,"errmsg":"invalid credential"}——AppID/AppSecret写错或权限不足(需开通“公众号消息管理”接口权限)。
- access_token有效期2小时,不能硬编码,必须每次请求前检查缓存或重新获取
- 短链生成接口限频:每个公众号每天最多调用10万次,单次最多提交100条长链接(但实际建议单次≤50条,避免超时)
- 微信不支持批量提交后返回映射表,必须逐条调用
shorturl接口,但可用Promise.all并发控制(推荐8~12路并发)
VSCode里怎么跑Node脚本调用微信短链接口?
不需要装插件,直接用VSCode内置终端(Ctrl+`)执行即可。关键在于环境准备和脚本结构清晰,避免把token、AppID等敏感信息写死在代码里。
实操建议:
- 新建
shorturl.js,用dotenv读取.env文件(含APP_ID、APP_SECRET、LONG_URLSJSON数组字符串) - 用
axios发POST请求,Content-Type必须设为application/json,body结构严格按文档:{"action":"long2short","long_url":"https://..."} - 加
try/catch捕获axios网络错误,并对微信返回的errcode !== 0单独处理(比如重试或记录失败URL) - 输出结果建议写入
output.json,格式为[{"long":"...","short":"...","errcode":0}],方便后续导入公众号菜单或图文
示例核心片段:
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
const axios = require('axios');
const { APP_ID, APP_SECRET } = process.env;
async function getAccessToken() {
const res = await axios.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APP_ID}&secret=${APP_SECRET}`);
return res.data.access_token;
}
async function shorten(url, token) {
const res = await axios.post('https://api.weixin.qq.com/cgi-bin/shorturl', {
action: 'long2short',
long_url: url
}, { params: { access_token: token } });
return res.data;
}
并发太多被限流怎么办?
微信后端对shorturl接口有隐式QPS限制,不是文档写的“日总量”,而是秒级熔断。表现是连续返回errcode:60001(接口调用超限)或HTTP 500,此时再重试只会加剧失败。
解决方法不是加大重试次数,而是主动降频:
- 用
p-limit库控制并发数,设为10比默认Infinity更稳 - 每次请求后加
await new Promise(r => setTimeout(r, 200))——不是为了“等”,而是让请求错开时间片,避开服务端瞬时检测 - 失败时区分错误类型:
errcode === 60001就sleep 1秒再重试;errcode === 40014立刻刷新token再重试;其他错误(如网络超时)最多重试2次 - 把失败URL单独存成
failed_urls.txt,人工检查是否含非法字符(如空格、未encode的中文)或协议头缺失(必须http://或https://)
生成的短链在公众号里点不开?
最常被忽略的一点:微信短链只在公众号上下文生效。如果直接浏览器访问https://w.url.cn/s/xxxx,会跳转到提示页“该链接无法在浏览器中打开”。这不是脚本问题,而是微信策略。
验证方式只有两种:
- 粘贴短链到公众号后台「素材管理」→「新建图文」→ 插入链接,预览时点开看是否跳转正常
- 发测试消息给公众号(服务号需开通客服消息,订阅号只能发给已关注用户),在聊天窗口点链接
另外注意:短链有效期永久,但原长链接若失效(如页面404、域名过期),短链仍可访问但内容为空——脚本无法提前校验长链接有效性,需人工确保源地址可用。


















