字节小游戏获取用户头像绑定spriteFrame失败,求指点

请问有没有哥哥知道字节小游戏获取敏感数据后怎么解密呀,想尝试下走下流程卡在这里了

这个encryptedData 解密 看不大懂,第一次接触到这个,谢谢了

signature = sha1(${rawData}${session_key})

他给的这个解密算法在编译器里报错,要是能给个完整的流程例子就更好了

问题追踪: 求求字节小游戏获取到的用户头像并绑定spriteFrame代码示例

1赞

只要头像和昵称不用后端解密啊,是你直接调用该方法出问题的吧,需要先走用户授权

1赞

咦神奇,那应该就是我调用错了。好嘞谢谢老哥,我去试试

login() {

    this.tt = window['tt'];

    this.tt.login({

        force: true,

        success: (res) => {

            console.log('login 调用成功res.code ',res.code);

            this.tt.getUserInfo({

                withCredentials: true,

                // withRealNameAuthenticationInfo: true,

                success: (suc) => {

                    console.log(`getUserInfo`, suc.userInfo);

                    if(suc && suc.userInfo && suc.userInfo.avatarUrl && suc.userInfo.nickName){

                        let url = suc.userInfo.avatarUrl;

                        let name = suc.userInfo.nickName;

                        console.log("登录获得的用户信息: ", url, name);

                        cc.game.emit(Consts.EVENT_KEYS.REFRESH_HEAD);

                    }

                },

                fail(res) {

                    console.log(`getUserInfo 调用失败`, res.errMsg);

                },

            });

        },

        fail: (res) => {

            console.log(`login 调用失败`, res);

        },

    })

}
1赞

啊啊啊多谢多谢。我已经调用成功啦,只是遇到一个问题,就是远程加载的头像是.image,cocos引擎识别不了,但我发现输入网址预览时把.image换成.png也能读取到图片,我的想法就是 对获取到的字符串地址进行操作,请问还有什么其他办法嘛 :sunflower:

要本地显示头像是吧

不是,远程加载 res给的头像地址信息

就是本地加载字节用户头像嘛,使用下面的方法,第一个传sprite组件,第二个传返回的url

setSpriteFrame(spr: cc.Sprite, res: string | cc.Texture2D | cc.SpriteFrame) {

    if (!spr || !res) {

        return;

    }

    if (res instanceof cc.Texture2D) {

        spr.spriteFrame = new cc.SpriteFrame(res);

    } else if (res instanceof cc.SpriteFrame) {

        spr.spriteFrame = res;

    } else if ('string' === typeof res) {

        if (0 === res.indexOf('http') || 0 === res.indexOf('//')) {//网络资源

            //使用字节的头像下载功能,

            const image = window['tt'].createImage();

            image.src = res;

            image.width = 160;

            image.height = 160;

            image.onload = (res) => {

                let canvas = document.createElement('canvas');

                canvas.width = image.width;

                canvas.height = image.height;

                let ctx = canvas.getContext('2d');

                ctx.drawImage(image, 100, 200, 200, 200);

                let node = new cc.Node();

                let sprite = node.addComponent(cc.Sprite);

                let sf = new cc.SpriteFrame();

                let texture = new cc.Texture2D();

                texture.initWithElement(image);

                sf.setTexture(texture);

                spr.spriteFrame = sf;

            }

        } else {

            cc.resources.load(res, cc.SpriteFrame, (err: Error, asset: cc.SpriteFrame) => {

                if (err) {

                    cc.error(err);

                    return;

                }

                spr.spriteFrame = asset;

            });

        }

    }

}
1赞

:laughing: 你写的好全呀,还在认真琢磨中,3.6版本有点不一样


setSpriteFrame(spr: Sprite, res: string | Texture2D | SpriteFrame) {

    if (!spr || !res) {

        return;

    }

    if (res instanceof Texture2D) {

        let sf = new SpriteFrame();

        sf = spr.spriteFrame;
        sf.texture = res
        spr.spriteFrame = sf

    } else if (res instanceof SpriteFrame) {

        spr.spriteFrame = res;

    } else if ('string' === typeof res) {

        if (0 === res.indexOf('http') || 0 === res.indexOf('//') || 0 === res.indexOf('https')) {//网络资源

            //使用字节的头像下载功能,

            const image = window['tt'].createImage();

            image.src = res;

            image.width = 160;

            image.height = 160;

            image.onload = (res) => {

                let canvas = document.createElement('canvas');

                canvas.width = image.width;

                canvas.height = image.height;

                let ctx = canvas.getContext('2d');

                ctx.drawImage(image, 100, 200, 200, 200);

                // let node = new Node();

                // let sprite = node.addComponent(Sprite);

                let sf = new SpriteFrame();

                let texture = new Texture2D();


                texture.image = image;
                sf.texture = texture;

                spr.spriteFrame = sf;

            }

        } else {

            resources.load(res, SpriteFrame, (err: Error, asset: SpriteFrame) => {

                if (err) {

                    console.error(err);

                    return;

                }

                spr.spriteFrame = asset;

            });

        }

    }

}

通过res获取到的远程资源地址:
https://p9-passport.byteacctimg.com/img/mosaic-legacy/3796/2975850990~300x300.image

this.setSpriteFrame(touxiang, remoteUrl)

读取出来头像一直是空的

这样就可以,但是地址后缀不一样感觉又好奇怪
image

o .我给的是2.4.x的。3.0以上改改再用

https://developer.open-douyin.com/docs/resource/zh-CN/mini-game/develop/api/drawing/picture/tt-create-image/
朋友字节建议用createImage方法去创建用户头像哈

嗯嗯,我刚想说在手机上预览地址又不一样了


谢谢你:flower !

朋友,我想请问下 这个nitWithElement()是什么意思呀
image
我这样改好像不对
image
卡在了HTMLImageElement到Node_Sprite.spriteFrame这一步了
image

w我找到了
image
那按道理应该没错呀

let texture = new Texture2D();

    texture.image = img;

    let sf = new SpriteFrame();

    sf.texture = texture;

    sf.packable = false;

    sprite!.getComponent(Sprite).spriteFrame = sf;


不能够,直接变黑了,原来是这样都不行
image

登陆成功—>调用方法

还是不行 谢谢谢谢,周末愉快! :laughing:等下周一再来看看了

周末愉快 :sweat_smile:

:sunflower: :sunflower: :sunflower: biu~~