微信小程序IDE http接口分析

在2017年的时候就做了这个分析,一直没发出来。⚠️注意文中使用的ide版本是Mac 版的,ide version: 1.01.1711020,不推荐在生产环境中使用。

准备工作

下载IDE版本:1.01.1711020

  • 美化开发工具js代码:在js目录执行命令 find . -type f -name '*.js' -exec js-beautify -r -s 2 -p -f '{}' \;

  • 打开针对IDE的调试工具:在./app.nw/js/core/index.js 第81行 init() 过后 加入以下代码:nw.Window.get().showDevTools();

  • 在IDE源码中使用 global.contentWindow.console.log 来打印变量

微信开发者工具登陆接口

URL配置文件
全局搜索 LOGIN_URL
登录页面的固定url:
https://open.weixin.qq.com/connect/qrconnect?appid=xxx&redirect_uri=https%3a%2f%2fmp.weixin.qq.com%2fdebug%2fcgi-bin%2fwebdebugger%2fqrcode&scope=snsapi_login&state=login
他返回二维码扫码页面(html)。
此处代码可以全局搜索 _longPollURL 定位到该文件。
在集成到发布系统的时候,完全可以用headless chrome 或者是 phantom js 模拟请求来一步搞定。

ide中登陆流程如下

// step1: 拿到二维码链接
const content = ''; // 上面接口返回的html
const qrcodeReg = /src="\/(connect\/qrcode\/.+)"/;
const s = c.match(qrcodeReg)[1];
const src = `https://open.weixin.qq.com/${s}`; // 拼接出登陆二维码url
 
// step2 : 拿到轮询链接, 用于轮询登陆状态
const longPollReg = /"(https:\/\/long.open.weixin.qq.com\/connect\/l\/qrconnect\?uuid=.+?)"/;
const pollUrl = content.match(longPollReg)[1];
 
// step3 轮询登陆结果
const LOGIN_WX_ERRR_CODE = {
    SUCCESS: 405,
    SCANNED: 404,
    CANCELLED: 403,
    TIMEOUT: 402,
    ERROR: 500,
    KEEP_ALIVE: 408
}

const platform = "darwin" === process.platform ? "darwin" : "win";

// poll
request({
    url: `${pollUrl}&last=""}&_=${+new Date()}`,
    headers: { "Content-Type": "application/javascript" },
    timeout: 60000
}, (a, b, c) => {
    // 返回了一段js代码
    eval(c);
    const e = window.wx_errcode;
    switch(e) {
        case LOGIN_WX_ERRR_CODE.SUCCESS:
            const loginRedirectUrl = `https://mp.weixin.qq.com/debug/cgi-bin/webdebugger/qrcode?code=${window.wx_code}&state=${platform}`;
            // 拿到登陆信息
            request({ url: loginRedirectUrl }, (a, b, res) => {
                let a = JSON.parse(res);
                let i = b.headers,
                j = i["debugger-signature"],
                k = i["debugger-newticket"],
                l = +new Date(),
                m = {
                  signature: j,
                  newticket: k,
                  openid: a.openid,
                  nickName: a.nickname,
                  headUrl:
                    a.headurl ||
                    "https://res.wx.qq.com/zh_CN/htmledition/v2/images/web_wechat_no_contect.png",
                  ticketExpiredTime: 1e3 * a.ticket_expired_time + l,
                  signatureExpiredTime: 1e3 * a.signature_expired_time + l,
                  sex: 1 === a.sex ? "male" : "female",
                  province: a.province,
                  city: a.city,
                  contry: a.contry
                };
            });
    }
});

生成体验版二维码

体验版二维码链接: https://open.weixin.qq.com/sns/getexpappinfo?appid=xxx&path=pages%2Fhome.html#wechat-redirect

⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️注意

预览接口 和 上传接口的 http method 都是 post,下面表格列的参数 是需要附加到url上面的query参数。
post的 body数据就是打包好的.wx文件,示例代码 见文章 微信小程序上传/预览代码分析 末尾。

预览接口

接口描述 预览小程序
域名 https://servicewechat.com
路径 /wxa-dev/testsource
请求方法 POST
入参 参数见下面
返回 返回结果见下面

query参数:

{
  _r: '0.8530581592723374', // 随机数
  appid: 'xxx', // 小程序appid
  platform: 0, // 平台
  ext_appid: '',
  os:   'darwin',
  clientversion: '101171018',
  gzip: 1,
  path: 'pages/home?',// 预览页面的路径
  newticket: 'jGUKNzQ59CI5yEoZRgmVP7P6PCnY1xaTv7QSdOXYoIM', // 未知,该数据从登陆接口拿到
  os: 'darwin', // 系统
  clientversion: '1.01.171018'
}

返回结果

{
    "baseresponse": {
        "errcode": 0,
        "errmsg": "test source success."
    },
    "qrcode_img": " base64 图片   ",
    "wxpkg_size": 48269,
    "compile_time": 0,
    "widget_size": 0
}

上传接口

接口描述 上传小程序
域名 https://servicewechat.com
路径 /wxa-dev/commitsource
请求方法 POST
入参 参数见下面
返回 返回结果见下面

query 入参

{
  _r: '0.8530581592723374', // 随机数
  appid: 'xxx', // 小程序appid
  platform: 0, // 平台
  ext_appid: '',
  os:   'darwin',
  clientversion: '101171018',
  "user-version": 1,
  "user-desc": "xxx",
  "uuid": "",
  gzip: 1,
  newticket: 'jGUKNzQ59CI5yEoZRgmVP7P6PCnY1xaTv7QSdOXYoIM', // 未知,该数据从登陆接口拿到
  os: 'darwin', // 系统
  clientversion: '1.01.171018'
}

返回结果

{
    "baseresponse": {
        "errcode": 0,
        "errmsg": "commit source success."
    },
    "wxpkg_size": 48269,
    "compile_time": 0,
}

检查是否已经设置了预览版

{
  protocol: "https:",
  host: "servicewechat.com",
  pathname: "/wxa-dev-logic/getcommitqrcode",
  query: {
    _r: "0.014995344596100635",
    os: "darwin",
    clientversion: "1011711300",
    appid: "xxx",
    newticket: "uVMVEwpFifCRfXjx53x9ORZsbn1X_ygFWl61kwaEeBg"
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容