网页抓取手机号(本文最后修改于天前天前,部分内容可能已经过时! )
优采云 发布时间: 2021-11-01 14:10网页抓取手机号(本文最后修改于天前天前,部分内容可能已经过时!
)
本文最后修改于543天前,部分内容可能已过时!
最近在写一个小程序,使用了云开发,然后在获取手机号的时候出现了一个小问题。
作弊百度一查出,重复错误的例子很多。
上面的答案都是这样的,但是我总觉得哪里不对
微信小程序云开发获取手机号也需要通过代码发送到微信平台获取会话密钥解密获取手机号
因为企鹅已经说过,云开发是自动认证的,应该不是代码解密的。
于是就跟着文档找了下,试了试,试了试,找出了通过云功能获取手机号码的正确流程
然后我想给这些文档作者和不法BD一锤子,但是我找不到我想要的东西,但是广告很多。
首先我们找到官方文档获取手机号的说明
我们看一下cloudID在其返回参数中的描述(基础库2.80及以上,一般新云开发都是以此为基础的,老基础库这里不解释)
敏感数据对应的云ID只有在打开云开发的小程序时才会返回,开放数据可以通过云调用直接获取。有关详细信息,请参阅
然后我们跳转到关于云开发、云调用、直接访问开放数据这里
1)获取手机号页面的cellphone.wxml或者需要调用这个的地方加这句话
手机号码
2) 对应的cellphone.js页面新建一个函数getPhoneNumber对应上面的bindgetphonenumber
//获取用户手机号
getPhoneNumber(e) {
wx.cloud.callFunction({
name: 'openapi',//调用openapi云函数文件
data: {
action:'getcellphone',//调用openapi云函数文件里的getcellphone函数
id:wx.cloud.CloudID(e.detail.cloudID)//在这里通过wx.cloud.CloudID云函数把敏感数据转值,如果直接id:e.detail.cloudID这样把e.detail.cloudID赋予给id,则只能得到cloudId的值,当时我就是错在这一步上(真是羞耻QAQ)
}
}).then(res => {
console.log('res: ', res)
//这里写业务逻辑代码,then是succeed的另一种写法,也就是说获取手机号成功后这里执行些什么操作,一般常见的就是setdata赋值
})
},
3)进入云函数openapi的index.js//不一定是openapi,可以自己写一个自定义的云函数,同样修改上面的代码
首先我们需要在这里引入node_modules和package-lock.json包,放到openapi的云函数文件夹下
// 云函数入口文件,如果没有这句话,自己添加
const cloud = require('wx-server-sdk')
查找开关(event.action){添加这个功能
case 'getcellphone':{
return getCellphone(event);
}
然后在文件末尾我们添加这个函数的执行代码
async function getCellphone(event){
console.log(event.id.data.phoneNumber);
return event.id.data.phoneNumber;
}
整个过程不需要获取code和session_key和解密。云开发是自然认证,最后附上wxml和js的完整代码。如果需要,您可以使用和修改以供参考。
xml文件
请点击获取您的手机号
phone}}
wxss
.phone {
justify-content: space-between;
margin-top: 45rpx;
width: 100%;
height: 92rpx;
background: #f1f3f8;
border-radius: 10rpx;
text-align: left;
padding: 0 20rpx 0 36rpx;
box-sizing: border-box;
font-size: 32rpx;
display: flex;
align-items: center;
color: #8c9aa8;
border: none;
}
.phone::after {
border: none;
}
.right {
width: 30rpx;
height: 30rpx;
}
js
//获取用户手机号
getPhoneNumber(e) {
let that = this;
//判断用户是否授权确认
if (!e.detail.errMsg || e.detail.errMsg != "getPhoneNumber:ok") {
wx.showToast({
title: '获取手机号失败',
icon: 'none'
})
return;
}
wx.showLoading({
title: '获取手机号中...',
})
console.log(JSON.stringify(e.detail.cloudID));
wx.cloud.callFunction({
name: 'openapi',
data: {
action:'getcellphone',
id:wx.cloud.CloudID(e.detail.cloudID),
},success: res => {
console.log('res: ', res.result)
//判断该手机号是否注册,如果手机号在数据库中注册了则直接跳转主页
db.collection('otk_user_main').where({phone:res.result}).get().then(res=>{
if(res.data.length!=0){
wx.setStorageSync('userinfo',res.data[0]);
wx.setStorageSync('openid',res.data[0]._openid);
wx.switchTab({url:'../my/my'})
}
})
wx.hideLoading();
if (res.result == null) {
wx.showToast({
title: '获取失败,请重新获取',
icon: 'none',
duration: 2000
})
return false;
}
//获取成功,设置手机号码
that.setData({
phone: res.result
})
},
fail: err => {
console.error(err);
wx.hideLoading()
wx.showToast({
title: '获取失败,请重新获取',
icon: 'none',
duration: 2000
})
}
})
},
附录与正文无关:
2) 对应的cellphone.js页面新建一个函数getPhoneNumber对应上面的bindgetphonenumber
getPhoneNumber(e) {
var that = this;
wx.cloud.callFunction({
name: 'getMobile',
data: {
weRunData: wx.cloud.CloudID(e.detail.cloudID),
}
}).then(res => {
console.log('res: ', res)
//这里写业务逻辑代码
}).catch(err => {
console.error(err);
});
},
3)云函数getMobile文件
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
var moblie = event.weRunData.data.phoneNumber;
return moblie
}