• 标记生成出错,请与管理员联系! 2019-05-17
  • 这个问题,不是我们那些学者所讲的,国家崛起美国害怕了。而是美国舞着大棒,配合国内的资本共同讹诈。 2019-05-17
  • 香河县纪委监委严把信访举报交办督办回复“三关” 让信访举报件件有着落 2019-05-16
  • 向雷锋同志学习 厉害了!体彩志愿服务团队 2019-05-14
  • 美国20岁说唱歌手在迈阿密中枪疑似身亡 2019-05-14
  • 第37届香港电影金像奖颁奖典礼举行 2019-05-04
  • 这是一个错误的观点!这个错误的观点在自以为懂得马克思主义的人群中非常普遍!所以,这也就是中国为什么真正懂马克思主义的人不多的主要原因! 2019-05-02
  • 经济专家那么多,谁写出如何搞好公有制呢? 2019-05-02
  • 海军首次举行水雷战竞赛性考核 2019-05-02
  • 公共图书馆如何更有效地服务读者 2019-05-02
  • 男子模仿网红骑马上路 机动车道飞奔当街摔晕 2019-04-30
  • 小长假前两天,广州哪些文化场馆最火爆? 2019-04-30
  • 高清图集:习近平在山东考察 2019-04-28
  • 2000多家国企医院年底前完成剥离 2019-04-25
  • 天津旅游嘉年华下周开幕 多项活动展现文旅融合--旅游频道 2019-04-15
  • 用户
     找回密码
     立即注册

    QQ登录

    只需一步,快速开始

    扫一扫,登录网站

    小程序社区 首页 教程 查看内容

    11选五输死了:批量生成100万张小程序码?了解一下

    河北体彩11选5今天开奖 www.7vek.com Rolan 2018-11-20 00:01

    最近有一个生成很多小程序码的需求,生成的小程序码还要嵌入在指定的图片模板上,就去找轮子,没找到合适的轮子。。无奈之下就决定去撸一个。目前已经完成并发布npm。Github:github.com/Jon-Millent…需求如下图生 ...

    最近有一个生成很多河北体彩11选5今天开奖码的需求,生成的小程序码还要嵌入在指定的图片模板上,就去找轮子,没找到合适的轮子。。无奈之下就决定去撸一个。目前已经完成并发布npm。

    Github: github.com/Jon-Millent…

    需求

    如下图

    • 生成带参数的小程序二维码
    • 要指定尺寸和位置到模板图上
    • 要批量生成若干张

    开始干活

    生成带参数的小程序二维码

    通过官方文档,列出了生成小程序二维码的三种模式

    • createWXAQRCode 获取 小程序二维码 ,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制。官方说明

    • getWXACode 获取 小程序码 ,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制。官方说明

    • getWXACodeUnlimit 获取 小程序码 ,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。官方说明

    这些接口都要通过 access_token 来换取。让我们造个类

    let AngerWechat = require('anger-wechat') // 微信操作辅助库(自己写的)
    
    class miniQrcode {
    
       // 存放三种模式的接口
       constructor(config) {
            this.mode = {
              'getWXACode': 'https://api.weixin.qq.com/wxa/getwxacode',
              'getWXACodeUnlimit': 'https://api.weixin.qq.com/wxa/getwxacodeunlimit',
              'createWXAQRCode': 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode',
            }
            
            // 初始化微信辅助库
            this.$wx = new AngerWechat({
              appId: this.config.appId, // appId 必传
              appSecret: this.config.appSecret, // appSecret 必传
            })
            
            // 临时数据存放文件,用于存放access_token,因为access_token有2个小时的生存期,避免重复获取
            this.databasePath = path.join(__dirname, '../', 'database.json')
       }
    }
    复制代码

    实现核心方法

    // 生成核心方法
        async getWxQrcodeInfo(concatConfig){
            // 获取已经存放的文件里的access_token,如果有的话并且有效的话就不用再掉接口
            let innerDatabase = this.getDatabase() 
            
            // 如果本地的数据没有access_token 或者超过2个小时 就去请求获取
            if(!innerDatabase.access_token ||  ((new Date().getTime() - innerDatabase.create_time) > 7200000) ) {
                let accessInfo = await this.$wx.getGlobalAccessToken()
                // 获取access_token然后写入文件
                // 具体代码省略
            }
            
            
            // 获取到access_token去请求接口
            
            let qrcodeInfo  = await this.postMan(
                this.getApiUrl(innerDatabase.access_token, concatConfig.mode), // 根据mode来区调用接口
                concatConfig.config // 用户传的参数
            )
            
            let returnData = {
        
            }
        
            if(qrcodeInfo.type.indexOf('image') !== -1) { //类型是图片的就是获取成功了
              // 请求成功 保存图片
              returnData = {
                code: 200,
                image: qrcodeInfo.data,
                error: null
              }
            } else {
              returnData = {
                code: 500,
                error: JSON.stringify(qrcodeInfo.data.toString()),
                image: null
              }
            }
        
            return returnData
        }
    复制代码

    写好后让我们测试一下

    let qrocode = new miniQrcode({
          appId: 'xxx',
          appSecret: 'xxx'
        });
        let info = await qrocode.getWxQrcodeInfo({
    	  mode: 'getWXACode',
    	  config: {
    	    path: `pages/index/main?id=123456`
    	  },
    	})
       fs.writeFileSync(`./output-juejin-test1.png`, info.image, 'utf8');
    复制代码

    效果:

    如何测试参数?我在这个已经发布的小程序里面加了个彩蛋,就是长按 红色圈出区域两次 即可调出控制台看参数

    将二维码合成到模板图片里面

    这个操作依赖于 sharp 库

    const sharp = require('sharp');
    
    class miniSharp {
    
      constructor(templateUrl){
        this.templateUrl = templateUrl
      }
    
      // 重置图片大小
      async resizeQrcode(imageBuffer, config){
        return new Promise(resolve => {
    
          sharp(imageBuffer).resize(config.width, config.width).toBuffer().then(function(outputBuffer) {
            resolve(outputBuffer)
          });
    
        })
      }
      
      // 合并图片
      async concatImage(buffer, config){
        return new Promise(resolve => {
          sharp(this.templateUrl)
            .overlayWith(buffer, {
              top: config.top,
              left: config.left
            }).toBuffer().then(function(outputBuffer) {
              resolve(outputBuffer)
            });
        })
      }
    
      // 主函数
      async renderImage(qrcodeBuffer, config){
    
        let resizeQrcodeBuffer = await this.resizeQrcode(qrcodeBuffer, config)
        let concatQrocdeBuffer = await this.concatImage(resizeQrcodeBuffer, config)
    
        return concatQrocdeBuffer
      }
    
    }
    
    module.exports = miniSharp
    
    复制代码

    测试一下

    let qrocode = new miniQrcode({
          appId: 'xxxx',
          appSecret: 'xxx'
        });
        
        let mySharp = new miniSharp('./template.png');
    
        let info = await qrocode.getWxQrcodeInfo({
          mode: 'getWXACode',
          config: {
            path: `pages/index/main?id=123456`
          },
        })
        
        let renderBuffer = await mySharp.renderImage(info.image, // 二维码图片的 buffer 数组 
        { 
          width: 200, // 重新设置二维码宽度
          left: 362, // x轴偏移
          top: 53 // y轴偏移
        })
        
        fs.writeFileSync(`./output-juejin-test1.png`, renderBuffer, 'utf8');
    复制代码

    批量处理

    正常情况下,批量生成 100 张需要 62.556秒 ,平均每张需要 0.62556秒 ,1万张大概需要 1.73小时 。 批量示例代码

    关于调试

    使用微信开发者工具可以进行模拟参数调试

    测试接口

    这里我提供了一个测试接口,可以带参数生成线上的小程序码,用来调试

    [get] //wx.toolos.cc 参数

    • mode 必传 [createWXAQRCode | getWXACode | getWXACodeUnlimit] 之一

    注意

    • 其他参数对应上面的文档的 mode 对应的参数, path 或者 page 需要 encodeURIComponent一下
    • 目前小程序只有一个路径 pages/index/main
    • 线上服务器配置低

    示例

    http://wx.toolos.cc/?mode=createWXAQRCode&path=pages%2Findex%2Fmain
    复制代码

    关于参数模式

    createWXAQRCode & getWXACode

    这两种生成的参数,生成二维码数量有限,参数直接跟在path路径后面,例如:

    let info = await qrocode.getWxQrcodeInfo({
      mode: 'createWXAQRCode',
      config: {
        page: `pages/index/main?sgr=521314&i=loveyou`
      },
    })
    复制代码

    getWXACodeUnlimit

    这个可以生成无限个,但是只能携带有局限性的参数 scene ,在这里推荐一种解析方式 key:value-key:value

    let info = await qrocode.getWxQrcodeInfo({
      mode: 'getWXACodeUnlimit',
      config: {
        page: `pages/index/main`,
        scene: 'i:loveyou-sgr:521314'
      },
    })
    复制代码

    解析示例

    onLoad (query) {
      // scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
      this.scene = decodeURIComponent(query.scene)
      this.queryJson = JSON.stringify(query)
    
      // 尝试解析  scene 格式: shop:1-id:2
    
      try {
        let oneArr = this.scene.split('-')
        let twoJson = {}
        for(let i=0; i<oneArr.length; i++) {
          let target = oneArr[i].split(':')
          twoJson[target[0]] = target[1]
        }
        this.twoJson = JSON.stringify(twoJson)
    
      } catch(e) {
        this.twoJson = e
      }
    
    },
    复制代码

    在开发者工具中例如下面模拟

    分享至 : QQ空间
    收藏
    原作者: Jon-Millent 来自: 掘金

    相关阅读

  • 标记生成出错,请与管理员联系! 2019-05-17
  • 这个问题,不是我们那些学者所讲的,国家崛起美国害怕了。而是美国舞着大棒,配合国内的资本共同讹诈。 2019-05-17
  • 香河县纪委监委严把信访举报交办督办回复“三关” 让信访举报件件有着落 2019-05-16
  • 向雷锋同志学习 厉害了!体彩志愿服务团队 2019-05-14
  • 美国20岁说唱歌手在迈阿密中枪疑似身亡 2019-05-14
  • 第37届香港电影金像奖颁奖典礼举行 2019-05-04
  • 这是一个错误的观点!这个错误的观点在自以为懂得马克思主义的人群中非常普遍!所以,这也就是中国为什么真正懂马克思主义的人不多的主要原因! 2019-05-02
  • 经济专家那么多,谁写出如何搞好公有制呢? 2019-05-02
  • 海军首次举行水雷战竞赛性考核 2019-05-02
  • 公共图书馆如何更有效地服务读者 2019-05-02
  • 男子模仿网红骑马上路 机动车道飞奔当街摔晕 2019-04-30
  • 小长假前两天,广州哪些文化场馆最火爆? 2019-04-30
  • 高清图集:习近平在山东考察 2019-04-28
  • 2000多家国企医院年底前完成剥离 2019-04-25
  • 天津旅游嘉年华下周开幕 多项活动展现文旅融合--旅游频道 2019-04-15
  • 重庆幸运农场秘诀 福彩3d预测分析汇总 上海基诺彩经网 老时时彩开奖统计 12生肖时时彩官网 北京赛车pk10程序源码 河北时时彩网站 浙江体彩 澳门五分彩基本走势 短信报警号码 腾讯分分彩开计划 南国彩票论坛特区 福建时时彩开奖查询 七星彩开奖 快乐8大玩家 360时时彩