日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

批量生成100万张小程序码?了解一下。

發布時間:2024/4/13 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 批量生成100万张小程序码?了解一下。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

最近有一個生成很多小程序碼的需求,生成的小程序碼還要嵌入在指定的圖片模板上,就去找輪子,沒找到合適的輪子。。無奈之下就決定去擼一個。目前已經完成并發布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] 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

這兩種生成的參數,生成二維碼數量有限,參數直接跟在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 才能獲取到生成二維碼時傳入的 scenethis.scene = decodeURIComponent(query.scene)this.queryJson = JSON.stringify(query)// 嘗試解析 scene 格式: shop:1-id:2try {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}}, 復制代碼

在開發者工具中例如下面模擬

總結

以上是生活随笔為你收集整理的批量生成100万张小程序码?了解一下。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。