网易云音乐扫码登录

news2024/10/6 2:28:15

简介

尚硅谷的网易云音乐项目无法登录,因为目前网易修改了接口使用手机号和密码登录的话需要先通过认证才可以,所以目前无法使用手机号登录,只能使用二维码登录,接下来我就教大家如何使用 二维码进行登录

实现步骤

1.获取nodejs接口文件

gitee仓库:nodejs文件点我获取
在这里插入图片描述

  • 会git的小伙伴直接克隆我的仓库即可,这样比较方便,
  • 不会git的小伙伴也没关系,选择下方的下载zip压缩包也是可以的。

2.运行nodejs,让后台跑起来

  1. 打开下载好的文件,先在终端命令行输入npm i 下载依赖(切记不要忘了这步)
  2. 使用npm start 运行即可

3.编写扫码业务(这里大家直接复制我的就可以)

js文件

/**
 * 作者:白的夜
 * 日期:2023/8/2
 * 功能:实现扫码登录功能
 */
import request from '../../utils/request'

Page({
  timer: "",//定时器返回值
  data: {
    phone: "",    //电话
    password: "", //密码
    qrimg: ""     //二维码图片base64
  },

  //收集手机号和密码
  handlerInput(e) {
    if (e.currentTarget.dataset.type == 'phone') {
      //防抖处理
      if (this.timer) clearTimeout(this.timer)
      this.timer = setTimeout(() => {
        this.setData({ phone: e.detail.value })
      }, 1000)
    }
    else if (e.currentTarget.dataset.type == 'password') {
      //防抖处理
      if (this.timer) clearTimeout(this.timer)
      this.timer = setTimeout(() => {
        this.setData({ password: e.detail.value })
      }, 1000)
    }
  },
  //发送验证码(表单失去焦点触发)
  async sendCode() {
    let { phone } = this.data
    const res = await request('/captcha/sent', { phone })
    if (res.code == 200) {
      wx.showToast({
        title: '已发送验证码',
      })
    }
  },
  //登录按钮
  async login() {
    let { phone, password } = this.data
    let phoneRegex = /^1(3|4|5|6|7|8|9)\d{9}$/;
    //校验手机号
    if (!phone) {
      return wx.showToast({
        title: '手机号不能为空',
        icon: "error"
      })
    } else {
      if (!phoneRegex.test(phone)) {
        return wx.showToast({
          title: '手机号格式不对',
          icon: "error"
        })
      }
    }
    //校验密码
    if (!password) {
      return wx.showToast({
        title: '密码不能为空',
        icon: "error"
      })
    }
    //发送登录请求
    const res = await request('/login/cellphone', { phone, password })
    if (res == 200) {
      wx.showToast({
        title: '登录成功',
        icon: 'success'
      })
    }
  },
  //二维码登录
  async codeLogin() {
    //第一步:获取key time为时间戳防止请求被缓冲
    const res = await request('/login/qr/key', { time: Date.now() })
    if (res.code == 200) {
      let key = (res.data.unikey);
      //第二步:根据key发送请求获取二维码图片
      const qrImgRes = await request('/login/qr/create', { key, qrimg: true, time: Date.now() })
      if (qrImgRes.code == 200) {
        //获取到二维码图片
        this.setData({ qrimg: qrImgRes.data.qrimg })
      }
      else {
        return wx.showToast({
          title: '图片获取失败',
        })
      }
      //第三步:使用定时器长轮询检测是否登录
      this.timer = setInterval(async () => {
        const statusRes = await request('/login/qr/check',
          { key, time: Date.now() })
        if (statusRes.code == 800) {
          wx.showToast({ title: '二维码已过期' })
          //清除定时器
          clearInterval(this.timer);
        } else if (statusRes.code === 801) {
          console.log('等待扫码');
        } else if (statusRes.code === 802) {
          console.log('等待授权');
        } else if (statusRes.code === 803) {
          wx.showToast({
            title: '登录成功',
          })
          //清除定时器
          clearInterval(this.timer);
          //存储cookie
          wx.setStorageSync('cookie', JSON.stringify(statusRes.cookie))
          //存储账号信息
          const loginStatus = await request(`/login/status?time=${Date.now()}`, { cookie: statusRes.cookie }, 'POST')
          if (loginStatus.data.code == 200) {
            wx.setStorageSync('UserInfo', JSON.stringify(loginStatus.data.profile))
          }
          //跳转至主页
          wx.reLaunch({
            url: '/pages/mine/mine',//这里换成自己的主页路径
          })
        }
      }, 1000)
    }
  },

  /*监听页面加载*/
  onLoad(options) { },

  /*监听页面初次渲染完成*/
  onReady() { },

  /*监听页面显示*/
  onShow() { },

  /*监听页面隐藏*/
  onHide() { },

  /*监听页面卸载*/
  onUnload() { },

  /*监听用户下拉动作*/
  onPullDownRefresh() { },

  /*页面上拉触底事件的处理函数*/
  onReachBottom() { },

  /*用户点击右上角分享*/
  onShareAppMessage() { }
})

在这里插入图片描述

注意哦这里换成自己主页的路径,在js代码的125行位置

wxss文件

/* pages/login/login.wxss */
.wrapper {
  position: relative;
  z-index: 90;
  padding-bottom: 40rpx;
}

.left-top-sign {
  font-size: 150rpx;
  color: #f8f8f8;
  position: relative;
  left: 0rpx;
  top: 0rpx;
}

.welcome {
  position: relative;
  left: 50rpx;
  top: -90rpx;
  font-size: 46rpx;
  color: #555;
}


.input-content {
  box-sizing: border-box;
  padding: 10rpx 60rpx;
}

.input-item {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 0 30rpx;
  background: #f8f6fc;
  height: 130rpx;
  border-radius: 10px;
  margin-bottom: 50rpx;
}

.input-item:last-child {
  margin-bottom: 0;
}

.input-item .tit {
  height: 50rpx;
  line-height: 56rpx;
  font-size: 30rpx;
  color: #606266;
}

.input-item input {
  height: 70rpx;
  font-size: 30rpx;
  color: #303133;
  width: 100%;
}

.confirm-btn {
  width: 630rpx !important;
  height: 76rpx;
  line-height: 76rpx;
  border-radius: 50rpx;
  margin-top: 70rpx;
  background: #d43c33;
  color: #fff;
  font-size: 32rpx;
  padding: 0;
}

.forget-section {
  font-size: 28rpx;
  color: #4399fc;
  text-align: center;
  margin-top: 40rpx;
  display: flex;
  justify-content: center;
  align-items: center;
}

.forget-section text {
  margin-left: 20rpx;
}

.register-section {
  position: absolute;
  left: 0;
  bottom: 50rpx;
  width: 100%;
  font-size: 28rpx;
  color: #606266;
  text-align: center;
}

.register-section text {
  color: #4399fc;
  margin-left: 10rpx;
}

.qrcode {
  width: 200rpx;
  height: 200rpx;
  position: absolute;
  bottom: 10%;
  left: 37%;
  z-index: 999;
}

wxml文件

<view class="container">
  <view class="wrapper">
    <view class="left-top-sign">LOGIN</view>
    <view class="welcome"> 欢迎回来!</view>
    <view class="input-content">
      <view class="input-item">
        <text class="tit">手机号码</text>
        <input type="text" placeholder="请输入手机号码" bind:input="handlerInput" data-type="phone" bind:blur="sendCode" />
      </view>
      <view class="input-item">
        <text class="tit">密码</text>
        <input type="text" placeholder="请输入密码" bind:input="handlerInput" data-type="password" />
      </view>
    </view>
    <button class="confirm-btn" bind:tap="login">登录</button>
    <view class="forget-section" bind:tap="codeLogin">
      <image src="../../static/images/logo.png" style="width: 50rpx;height:50rpx" />
      <text>二维码登录</text>
    </view>
  </view>
  <view class="register-section">
    <text> 还没有账号?</text>
    <text style="color: red;">马上注册</text>
  </view>
  <!--二维码登录 -->
  <image src="{{qrimg}}" class="qrcode" wx:if="{{qrimg}}" />
</view>

json文件

{
  "usingComponents": {},
  "navigationBarTitleText": "登录"
}

效果图

在这里插入图片描述

注意点

  • 扫码的时候不要用微信扫,用网易云音乐扫一扫
  • cookie我已经帮大家写好了。大家登录成功后cookie自动存储在storage中
  • 执行后续需要登录才能获取到数据的接口时,只需要将cookie以query参数的形式发送给服务器即可。以下是例子
    在这里插入图片描述
    就是这些,有任何其他问题大家在评论区给我留言即可!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring Cloud 四】Ribbon负载均衡

Ribbon负载均衡 系列文章目录背景一、什么是Ribbon二、为什么要有Ribbon三、使用Ribbon进行负载均衡服务提供者A代码pom文件yml配置文件启动类controller 服务提供者Bpom文件yml配置文件启动类controller 服务消费者pom文件yml文件启动类controller 运行测试 四、Ribbon的负载均…

Kubespray-offline v2.21.0-1 下载 Kubespray v2.22.1 离线部署 kubernetes v1.25.6

文章目录 1. 目标2. 预备条件3. vcenter 创建虚拟机4. 系统初始化4.1 配置网卡4.2 配置主机名4.3 内核参数 5. 打快照6. 安装 git7. 配置科学8. 安装 docker9. 下载介质9.1 下载安装 docker 介质9.2 下载 kubespray-offline-ansible 介质9.3 下载 kubernetes 介质 10. 搬运介质…

css, resize 拖拉宽度

效果如下&#xff1a; 可直接复制预览查看属性值: 关键样式属性&#xff1a; resize: horizontal; overflow-x: auto; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…

睿讯微带你深度了解汽车交流充电桩

这几年随着新能源汽车的普及&#xff0c;充电桩也越来越多的出现在我们的视野中。新能源纯电汽车就好比一种大号的电子产品&#xff0c;而充电桩则是它不可缺少的子系统&#xff0c;是新能源车主们的必要选择。 汽车充电桩分为直流和交流两种&#xff0c;2022年底全国公共充电桩…

华为防火墙会话表

会话表是设备转发报文的关键表项。所以当出现业务故障时&#xff0c;通常可以通过查看会话表信息&#xff0c;大致定位发生故障的模块或阶段。 当某个业务发生问题&#xff0c;例如流量不通或者断断续续时&#xff0c;通过查看会话表可以得出以下信息&#xff1a; 如果该项业…

Android 死机问题学习笔记

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、死机系统简图二、死机的可能原因三、死机问题需要分析哪些数据四 、Java Backtrace 分析五、常见 Java backtrace 举例六、Native Backtrace七、Ke…

单月涨粉90w,小红书科普视频引发高关注

为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出7月月度榜单&#xff0c;从创作者、品牌、品类多方面入手&#xff0c;解析月榜数据&#xff0c;为从业者提供参考。 爆款笔记涨粉90w 科普视频引发高关注 据7月的『涨粉排行榜』TOP500数据显示&#xff0c;头…

在线LaTeX公式编辑器编辑公式

在线LaTeX公式编辑器编辑公式 在编辑LaTex文档时候&#xff0c;需要输入公式&#xff0c;可以使用在线LaTeX公式编辑器编辑公式&#xff0c;其链接为: 在线LaTeX公式编辑器&#xff0c;https://www.latexlive.com/home 图1 在线LaTeX公式编辑器界面 图2 在线LaTeX公式编辑器…

IDEA用Gradle构建项目时,lombok插件无效的解决办法

Lombok 可用来帮助开发人员消除 Java 的重复代码&#xff0c;尤其是对于简单的 Java 对象&#xff08;POJO&#xff09;&#xff0c;比如说getter/setter/toString等方法的编写。它通过注解实现这一目的。 正确使用姿势 一、安装Lombok插件 菜单栏File -> Settings ->…

C++继承——多继承导致的菱形继承

目录 单继承&#xff1a; 多继承&#xff1a; 菱形继承&#xff1a;菱形继承是多继承的一种特殊情况。 三.菱形继承的两种解决方式区别&#xff1a; 3.1采用作用域解决的菱形继承&#xff1a; 检测器运行图&#xff1a; 反汇编运行图&#xff1a; 3.1菱形虚继承&…

私募证券基金动态-23年7月报

成交量&#xff1a;7月日均8,481.84亿元 2023年7月A股两市日均成交8,481.84亿元&#xff0c;环比下降11.78%、同比下降15.77%。7月整体21个交易日&#xff0c;仅有月初第1个交易日单日成交金额过万亿&#xff0c;且成交量起伏较大&#xff0c;单日成交金额最低仅有6610.11亿元…

深度学习(32)——CycleGAN(1)

深度学习&#xff08;32&#xff09;——CycleGAN&#xff08;1&#xff09; 文章目录 深度学习&#xff08;32&#xff09;——CycleGAN&#xff08;1&#xff09;1. GAN原理2. CycleGAN&#xff08;1&#xff09;原理&#xff08;2&#xff09;核心思想&#xff08;3&#xf…

双环抱式“星环“座舱设计:比亚迪仰望U8内饰曝光,搭载骁龙8+车机

根据8月3日的消息&#xff0c;比亚迪车机先前使用的高通骁龙625芯片在网友中引发了一些批评&#xff0c;不过随着比亚迪将车机升级为骁龙665、骁龙690/695&#xff0c;这个问题得到了改善。 与此同时&#xff0c;大多数主流车企还在继续使用高通8155芯片&#xff08;相当于骁龙…

【Kubernetes】

目录 一、Kubernetes 概述1、K8S 是什么&#xff1f;2、为什么要用 K8S?3、Kubernetes 集群架构与组件 二、核心组件1、Master 组件2、Node 组件3、K8S创建Pod的工作流程&#xff1f;&#xff08;重点&#xff09;4、K8S资源对象&#xff08;重点&#xff09;5、Kubernetes 核…

基于Dockerfile构建镜像应用

目录 一、镜像概述 二、镜像构建方式 三、镜像构建案例 3.1、基于已有容器创建镜像 3.2、基于本地模板创建镜像 3.3、基于Dockerfile构建镜像 3.3.1、Docker 镜像结构 3.3.2、Dockerfile介绍 3.3.3、Dockerfile详解 3.3.4、Dockerfile构建SSHD镜像 3.3.5、Dockerfile…

基于Vue3的数据可视化低代码平台

经过技术调整与迁移&#xff0c;JNPF快速开发平台升级为Vue3.0技术。 Vue3.0作为最新版本的Vue.js框架&#xff0c;拥有更强大的性能和更丰富的功能&#xff0c;为低代码开发平台注入了全新的活力。而JNPF快速开发平台作为其应用的典范之一&#xff0c;利用Vue3.0的优势&#x…

VUE框架、UNIAPP框架:vue2转vue3全面细节总结(1)vue框架:路由模式、路由跳转;uniapp框架:存储数据写法、引入数据写法;

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

list删除重复元素几种思路

文章目录 list删除重复元素几种思路hashsetStream流删除所有重复元素 list删除重复元素几种思路 hashset List<String> list2 new ArrayList<>();list2.add("a");list2.add("b");list2.add("a");Set<String> set new HashS…

Unity | 编辑器运行时固定启动场景

1 简介 在多场景游戏的开发过程中&#xff0c;通常需要按照特定的顺序启动场景&#xff0c;以完成一些初始化工作。因此当我们想要在编辑器中运行某个中间场景时&#xff0c;必须先切换到第一个场景。这样的操作不仅繁琐&#xff0c;而且影响开发效率。利用 RuntimeInitialize…

google谷歌gmail邮箱账号注册手机号无法进行验证怎么办?此电话号码无法用于进行验证 或 此电话号码验证次数太多

谷歌gmail邮箱账号注册手机号无法进行验证怎么办? 使用手机号码注册谷歌gmail邮箱账号时会遇到&#xff1a;此电话号码无法用于进行验证 或 此电话号码验证次数太多。造成注册google谷歌gmail邮箱账号受阻&#xff0c;无法正常完成注册。 谷歌Gmail邮箱账号正确的注册方法与教…