Генерировать 1 миллион небольших программных кодов партиями? Узнать о.

внешний интерфейс сервер WeChat GitHub

введение

未标题-2.png

В последнее время возникла необходимость сгенерировать много мелких программных кодов.Сгенерированные небольшие программные коды нужно встроить в заданный шаблон изображения, поэтому я пошла искать колеса, но подходящего колеса не нашла. . В отчаянии я решил пойти на один. Теперь он закончен и выпущен в npm.

Гитхаб:GitHub.com/Jon-mill en T…

нужно

Как показано ниже

  • Сгенерировать QR-код апплета с параметрами
  • Указание размера и положения на чертеже-шаблоне
  • Создание нескольких листов в пакетах

начать работать

Сгенерировать QR-код апплета с параметрами

В официальной документации указаны три режима генерации QR-кодов для небольших программ.

  • 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');

Эффект:

Как проверить параметры? Я добавил в этот опубликованный апплет пасхалку, то есть долгое нажатие红色圈出区域两次Вы можете вызвать консоль, чтобы увидеть параметры

Screenshot_2018-11-17-10-55-13-286_com.tencent.mm.png

Синтезируйте QR-код в изображение шаблона

Эта операция зависит от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');

template.png

Пакетная обработка

В нормальных условиях серийное производство100Чжан нуждается62.556秒, в среднем каждый0.62556秒, наверное нужно 10000 листов1.73小时.Массовый пример кода

Об отладке

Используйте инструмент разработчика WeChat для отладки параметров моделирования

QQ截图20181117104623.png

тестовый интерфейс

Здесь я предоставляю тестовый интерфейс, который может генерировать онлайн-код апплета с параметрами для отладки.

[get] http://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

Оба сгенерированные параметры для генерации ограниченного количества двумерного кода, параметры непосредственно после пути маршрута, например:

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

output-createWXAQRCode.png

getWXACodeUnlimit

Это может генерировать неограниченное количество, но может содержать только ограниченные параметрыscene, здесь рекомендуется аналитический методkey:value-key:value

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

output-getWXACodeUnlimit.png

Пример разбора

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截图20181117104623.png