好友是是很多游戏都有的功能,原因在于好友玩法可以提升用户间的互动性,增加产品和用户的黏性、对提升留存率有重要帮助。很多游戏策划和产品经理都喜欢在游戏中加入这个设定,在腾讯开发平台、空间玩吧平台也都提供获取QQ好友关系链的API,供开发者开发更丰富更好玩的游戏产品。

但是,微信平台基于用户数据隐私性的考虑,并不提供直接的api来获取好友关系链。而是设计了一套开放数据域的api机制来供开发者使用,游戏“主域”内不能直接获取好友排行榜数据,而是借助“子域”来呈现排行榜,“子域”无法和服务器通信,也无法传递数据给“主域”。关于这部分基础知识请见微信关系数据链来了解。

本文将要分享的是通过技术技巧教你“偷偷”的获取微信小游戏好友关系链数据

核心知识:把”子域“中获取到的好友关系链字符串数据作为一个个像素色值绘制在在”子域“画布上,然后在”主域“内逐个像素读取再转化为字符串数据。

子域核心代码如下:

//上报初始数据,这样别的好友请求好友数据的时候就能看到你了
if(wx.setUserCloudStorage){var value2 = Date.parse(new Date()).toString() + '_' + parseInt(Math.random() * 10000);wx.setUserCloudStorage({ KVDataList: [{ key: "localid", value: value2 }] });
}function beginCall(data) {let ctx = sharedCanvas.getContext("2d");ctx.clearRect(0, 0, sharedCanvas.width, sharedCanvas.height);var _dataStr = JSON.stringify(data)+":";for (let i = 0; i < _dataStr.length; i++) {let num = _dataStr.charCodeAt(i);let str = ("00000000" + num.toString(2)).slice(-9);for (let k = 0; k < 3; k++) {var r = Number(str.charAt(k * 3)) * 255;var g = Number(str.charAt(k * 3 + 1)) * 255;var b = Number(str.charAt(k * 3 + 2)) * 255;let i1 = i * 3 + k;var x = (i1 % sharedCanvas.width);var y = Math.floor(i1 / sharedCanvas.width);ctx.fillStyle = "rgb(" + r + "," + g + "," + b + ")";ctx.fillRect(x, y, 1, 1);}}
}
function escapeCode(obj,){if ("KVDataList" in obj){for (let i = 0; i < obj.KVDataList.length;i++) {obj[obj.KVDataList[i].key] = obj.KVDataList[i].value;}delete obj.KVDataList;}//这里可以根据业务加逻辑,处理字段,减少数据量,加快数据处理速度if("nickname" in obj) {obj.nick = encodeURIComponent(obj.nickname);delete obj.nickname;}
}
function drawSaveFun(mainData, fun){wx.getFriendCloudStorage({keyList: mainData.keys,success: (res2) => {let list1 = res2.data;let openids = mainData.openids || {};for(let i = 0;i<list1.length;i++){let have = openids[ list1[i].openid ];escapeCode(list1[i]);}beginCall({isOK:true, data: list1});},fail: (res) => {beginCall({isOK:false, fail: res});}})
}

主域核心代码如下:

class WXDecodeOpenData
{public static init(){if(DEBUG) return;if(!window["wx"] || !window["wx"].getOpenDataContext) return;let time = egret.getTimer();WXDecodeOpenData.drawSaveData((resdata:any)=>{//  console.log("resdata", resdata);let myObj;var kk = "score";let totalGroup = [];for(var i = 0; i < resdata.length; i++){//{"openid":"o9FSW5NhY05kUwqWNdOumWW3cNlk","nick":"eternity","avatarUrl":"https://wx.qlogo.cn/","score":"49904"}var item = resdata[i];// item.type = kk;item.level = item.orderindex  = Number(item[kk]);totalGroup.push(item);}ArrayUtil.sortByField(totalGroup, ["level","orderindex"], [1,0]);//对数据数据排序for (let i = 0; i < totalGroup.length; i++) {totalGroup[i].index = (i+1);}//此处可以添加其他逻辑,比如保存到服务端,客户端各种业务}, (errdata)=>{//数据读取异常,做好兼容});}private static isRuning = false;private static drawSaveData(success:(any)=>void,fail:(any)=>void):egret.Bitmap{if(this.isRuning) return null;this.isRuning = true;platform.openDataContext.postMessage({isDisplay:true, command:"drawSaveData", keys:["score"]});let bb = <egret.Bitmap>platform.openDataContext.createDisplayObject();let bmp = new egret.Bitmap(bb.texture);let tex = new egret.RenderTexture();egret.Tween.get(this,{loop:true}).wait(100).call(this.test,this,[bmp,tex,success,fail,true]);return bmp;}private static test(bmp:egret.Bitmap,tex:egret.RenderTexture,success:(any)=>void,fail:(any)=>void,isfriend:boolean){tex.drawToTexture(bmp,new egret.Rectangle(0,0,3,3));let a = "";for(var k = 0;k<3;k++){let arr = tex.getPixel32(k,2);for(let j = 0;j<3;j++) a += Number(arr[j] > 127);}let str = String.fromCharCode(parseInt(a,2));if(str == "{"){tex.drawToTexture(bmp,new egret.Rectangle(0,0,bmp.width,bmp.height));let i = 0;let codeStr = "";let _s = "";while(true){let a = "";for(var k = 0;k<3;k++){let i1 = i*3+k;let x = (i1%bmp.width);let y = Math.floor(i1/bmp.width);let arr = tex.getPixel32(x,tex.textureHeight-y-1);for(let j = 0;j<3;j++) a += Number(arr[j] > 127);}let s = String.fromCharCode(parseInt(a,2));if(s == ":" && _s == "}") break;codeStr += s;_s = s;i++;}tex.dispose();egret.Tween.removeTweens(this);platform.openDataContext.postMessage({type:"clear"});this.isRuning = false;let obj = JSON.parse(codeStr); //{isOK:true, data:[]}if(obj.isOK){if(isfriend && "data" in obj){obj.data.forEach(element => {if(element.nick) element.nick = decodeURIComponent(element.nick);});}delete obj.isOK;if(success) success(obj.data);}else{delete obj.isOK;if(fail) fail(obj);}}}
}

特别说明:本文只是做技术学习,并不是鼓励开发者绕开微信小游戏规范,作者十分反对各种平台和开发者利用和传播用户的隐私数据。

补充说明:微信在2019年3月份发布的游戏基础库已经针对开放数据域获取像素的方法进行了屏蔽,本文章介绍的方法已经失效。

教你“偷偷”的获取微信小游戏好友关系链数据相关推荐

  1. 教你快速开发一个微信小游戏好友排行榜

    概述 ​ 要做这个好友排行榜.必然要有好友的战绩比分,然后再做排序,最后将数据呈现在UI上 , 可以分为下面几个步骤: 保存每个用户的分数 获取好友列表,并获取好友的分数 渲染排行榜 保存每个用户的分 ...

  2. 菜鸟| 微信小游戏好友排行榜教程

    写在前面:随着越来越多的新人开始接触白鹭引擎,创作属于自己的游戏.考虑到初学者会遇到一些实际操作问题,我们近期整理推出"菜鸟"系列技术文档,以便更好的让这些开发者们快速上手,Egr ...

  3. 菜鸟|Egret微信小游戏好友排行榜教程

    原文链接:https://mp.weixin.qq.com/s/kYIdnHv-C5KuR9snekPNBg 原文虽然是菜鸟教程,但是有几个地方没有说清楚,补充如下. 你可以先看原文,看不懂时,再来这 ...

  4. Layabox开发微信小游戏好友排行榜功能流程

    官方参考文档:(https://ldc2.layabox.com/doc/?nav=zh-ts-5-0-7) 一.主域项目,即小游戏(Laya2.0版本) 针对微信小游戏初始化 MiniAdpter. ...

  5. 微信小游戏好友排行榜快速开发教程

    要做这个好友排行榜.必然要有好友的战绩比分,然后再做排序,最后将数据呈现在UI上 , 可以分为下面几个步骤: 保存每个用户的分数 获取好友列表,并获取好友的分数 渲染排行榜 保存每个用户的分数 保存每 ...

  6. web端获取微信小程序云数据库数据实现增删改查等操作

    获取小程序数据库 前言 一.微信小程序Web SDK 1.微信官方示例 2.未登录模式注意事项 二.完整流程演示 1.开启云数据库访问权限 2.编写云函数 3.web前端引入js 4.web页面js访 ...

  7. 微信小游戏 Egret开发数据域官方Demo下载地址

    随着引擎的升级,伴随而来就是各种问题,使用官方调试过的Demo,少走弯路. Mark下 官方Demo 转载于:https://www.cnblogs.com/gamedaybyday/p/919218 ...

  8. 微信小游戏开发接入系列文章

    教你"偷偷"的获取微信小游戏好友关系链数据 3D游戏3D素材资源zip压缩解决方案 微信小游戏代码包侵权的避开技巧(含处理脚本代码) 微信小游戏 获取判群ID方法 微信小游戏(字节 ...

  9. H5 微信小游戏群 openGID 解密

    这里使用的 Wechat Lib 版本是 2.0.6 ,高于此版本则不再能获得分享成功与否的回调.后来直接把基础库升级到 2.2.2 ,发现只是开发者工具拿不到回调而已,手机上还是还能拿到回调. 在使 ...

最新文章

  1. hibernate jar包_源码分析 | 咋嘞?你的IDEA过期了吧!加个Jar包就破解了为什么?
  2. 查看linux java home_查看Linux中自带的jdk,设置JAVA_HOME
  3. html5--6-59 其他常用CSS属性
  4. 【Python】青少年蓝桥杯_每日一题_1.19_Python 求和
  5. BugKuCTF 加密 这不是摩斯密码
  6. 不可摸数http://acm.hdu.edu.cn/showproblem.php?pid=1999
  7. CRM_OPPORT_TEXT_DETER_STANDARD
  8. c++ vector拷贝构造_JDK源码分析-Vector
  9. wordpress 基础文件
  10. CNN框架的搭建及各个参数的调节
  11. 面向对象程序设计中“超类”和“子类”概念的来历
  12. 第 6 章 认知吝啬鬼
  13. soul群聊派对显示服务器异常,soul群聊派对在哪?功能、查找步骤有这些
  14. IE浏览器无法查看源文件的8大原因
  15. 2012 快速减肥 美女舒淇的懒人减肥法
  16. Web前端 | HTML | 基础
  17. 大学生程序设计邀请赛(华东师范大学)A
  18. c语言调幅度程序,广播监测设备入网技术要求及测量方法(DOC 72页).doc
  19. 【STM32】 中断详解
  20. 信号与电源完整性分析(一)提高信号质量

热门文章

  1. 通过配置光猫路由器实现家用主机远程桌面连接
  2. Mysql错误代码1045
  3. halocn标定找旋转中心_HALOCN运算功能函数快查 | 学步园
  4. 英文论文写作排版-IEEE论文排版技巧
  5. docker容器状态Exited(1)第一篇
  6. Harbor再次安装与使用
  7. Manjaro 安装 MySQL
  8. python多维list去重
  9. 2022年全球市场智能室内空气质量检测仪总体规模、主要生产商、主要地区、产品和应用细分研究报告
  10. 小程序RSA加密 - 公钥加密