python使用网易云信实现短信验证码功能

 通过访问网易云信提供的URL,可以向目标手机号发送短信验证码并且还可以检验验证码。

网易云信官方文档:https://dev.yunxin.163.com/docs/product/%E7%9F%AD%E4%BF%A1/%E7%9F%AD%E4%BF%A1%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97

向目标手机号发送短信验证码的URL:POST https://api.netease.im/sms/sendcode.action

其中在访问该URL时需要携带请求头

具体的代码实现如下(获取请求头):

def get_header():
    appkey = ''
    appsecret = ''
    nonce = random.randint(10000, 100000000)
    ctime = datetime.datetime.utcnow()
    curtime = str(int(time.mktime(ctime.timetuple())))
    s = appsecret + str(nonce) + curtime
    checksum = hashlib.sha1(s.encode('utf-8')).hexdigest()
    Content_Type = "application/x-www-form-urlencoded;charset=utf-8"
    header = {'Content-Type': Content_Type, 'AppKey': appkey, 'Nonce': str(nonce), 'CurTime': curtime,'CheckSum': checksum}
    return header

然后就是整理data,然后请求URL,返回验证码:

class SendCodeViewSet(APIView):
    authentication_classes = [OAuth2Authentication, SessionAuthentication]
    permission_classes = [permissions.AllowAny]
    def post(self, request):
        url = "https://api.netease.im/sms/sendcode.action"
        codeLen = settings.CODELEN
        mobile = request.data['mobile']
        pattern = re.compile('13[0,1,2,3,4,5,6,7,8,9]|15[0,1,2,7,8,9,5,6,3]|18[0,1,9,5,6,3,4,2,7,8]|17[6,7]|147\d{8}')
        if pattern.match(str(mobile)):
            header = get_header()
            data = {'mobile': str(mobile), 'codeLen': codeLen}
            response = requests.post(url=url, data=data, headers=header)
            text = json.loads(response.text)
            print(text)
            return Response({'status': text['code']})
        else:
            return Response({'status': 100030, 'msg': '请输入正确的手机号码!'})

校验验证码:

URL:POST https://api.netease.im/sms/verifycode.action

def verifycode(code, sendid, mobile):
    url = 'https://api.netease.im/sms/verifycode.action'
    header = get_header()
    data = {'mobile': str(mobile), 'code': code}
    response = requests.post(url=url, data=data, headers=header)
    text = json.loads(response.text)
    # 验证失败 {"code":413,"msg":"verify err","obj":2}
    return text

 其中,code是验证码,sendid是此次发送验证码的sendid,mobile是目标手机号。

 


版权声明:本文为weixin_42336574原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。