天翼开放平台免费短信验证码接口使用实例


Posted in Python onDecember 18, 2013

对于目前众多的验证码解决方案来说,这个API有着中国电信这个重量级的运营商为靠山,应该是比较靠谱的了,而且还是免费的。详细情况请参阅:http://open.189.cn

使用方式:
#定义app_id和app_secret
r = RandCode('app_id', 'app_secret')
#支持平台的两种接口方式
#方式1:自定义接收验证码的回调URL
r.send('phone number', 'http://yourdomain/rand_code.php', '3')
#方式2:自定义验证码内容
r.send_sms('phone number', 189189)

#!/usr/bin/env python
# coding: utf-8
from time import strftime, localtime
import urllib, urllib2, json
import hmac, hashlib
class RandCode(object):
 APP_ID = ''
 APP_SECRET = ''
 ACCESS_TOKEN = ''
 RANDCODE_TOKEN = ''
 TOKEN_API = 'https://oauth.api.189.cn/emp/oauth2/v2/access_token'
 RANDCODE_TOKEN_API = 'http://api.189.cn/v2/dm/randcode/token'
 RANDCODE_SEND_API = 'http://api.189.cn/v2/dm/randcode/send'
 RANDCODE_SENDSMS_API = 'http://api.189.cn/v2/dm/randcode/sendSms'

 def __init__(self, app_id='', app_secret='', access_token=''):
  self.APP_ID = app_id or RandCode.APP_ID
  self.APP_SECRET = app_secret or RandCode.APP_SECRET
  self.ACCESS_TOKEN = access_token or self.__fetch_access_token()
  self.RANDCODE_TOKEN = self.__fetch_randcode_token()
 def send(self, phone, url, exp_time):
  result = False
  if self.ACCESS_TOKEN and self.RANDCODE_TOKEN:
   data = {
    'app_id':self.APP_ID,
    'access_token':self.ACCESS_TOKEN,
    'token':self.RANDCODE_TOKEN,
    'phone':phone,
    'url':url,
    'exp_time':exp_time,
    'timestamp':self.__date_time(),
    }
   data = self.__build_request_string(data)
   data = self.__data_sign(data)
   if data:
    res = self.__request_data('post', data, self.RANDCODE_SEND_API)
    json_data = json.loads(res)
    if json_data['res_code'] == 0:
     result = True
  return result
 def send_sms(self, phone, randcode, exp_time='2'):
  result = False
  if self.ACCESS_TOKEN and self.RANDCODE_TOKEN:
   data = {
    'app_id':self.APP_ID,
    'access_token':self.ACCESS_TOKEN,
    'token':self.RANDCODE_TOKEN,
    'phone':phone,
    'randcode':str(randcode),
    'exp_time':exp_time,
    'timestamp':self.__date_time(),
    }
   data = self.__build_request_string(data)
   data = self.__data_sign(data)
   if data:
    res = self.__request_data('post', data, self.RANDCODE_SENDSMS_API)
    json_data = json.loads(res)
    if json_data['res_code'] == 0:
     result = True
  return result
  pass
 def __request_data(self, method, data, url):
  if isinstance(data, dict):
   data = urllib.urlencode(data)
  if method == 'post':
   req = urllib2.Request(url, data)
  else:
   url = '%s?%s' % (url, data)
   req = urllib2.Request(url)
  return urllib2.urlopen(req).read()
 def __fetch_access_token(self):
  access_token = self.ACCESS_TOKEN
  if access_token == '':
   data = {
    'grant_type':'client_credentials',
    'app_id':self.APP_ID,
    'app_secret':self.APP_SECRET,
    }
   res = self.__request_data('post', data, self.TOKEN_API)
   json_data = json.loads(res)
   if json_data['res_code'] == '0':
    access_token = json_data['access_token']
   else:
    raise ValueError(json_data['res_message'])
  return access_token
 def __fetch_randcode_token(self):
  result = ''
  if self.ACCESS_TOKEN != '':
   data = {
    'app_id':self.APP_ID,
    'access_token':self.ACCESS_TOKEN,
    'timestamp':self.__date_time(),
    }
   data = self.__build_request_string(data)
   data = self.__data_sign(data)
   if data:
    res = self.__request_data('get', data, self.RANDCODE_TOKEN_API)
    json_data = json.loads(res)
    if json_data['res_code'] == 0:
     result = json_data['token']
    else:
     raise ValueError(json_data['res_message'])
  return result
 def __data_sign(self, data):
  result = ''
  if data:
   if isinstance(data, dict):
    data = self.__build_request_string(data)
    sign = hmac.new(self.APP_SECRET, urllib.urlencode(data), hashlib.sha1).digest()
   elif isinstance(data, unicode):
    sign = hmac.new(self.APP_SECRET, data, hashlib.sha1).digest()
   if data:
    result = "%s&sign=%s" % ( data, urllib.quote(sign.encode('base64').strip()) )
  return result
 def __build_request_string(self, dict):
  keys = dict.keys()
  keys.sort()
  return '&'.join([ key + "=" + dict[key] for key in keys ])
 def __date_time(self):
  return strftime("%Y-%m-%d %H:%M:%S", localtime())
 
if __name__  == '__main__':
 r = RandCode('app_id', 'app_secret')
 r.send('phone number', 'http://yourdomain/rand_code.php', '3')
 r.send_sms('phone number', 189189)
Python 相关文章推荐
python中去空格函数的用法
Aug 21 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
python使用webbrowser浏览指定url的方法
Apr 04 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
Python基于动态规划算法计算单词距离
Jul 25 Python
python常见排序算法基础教程
Apr 13 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
Python生成一个迭代器的实操方法
Jun 18 Python
python实现飞机大战项目
Mar 11 Python
Python turtle库的画笔控制说明
Jun 28 Python
Python异常处理机制结构实例解析
Jul 23 Python
python模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 #Python
python抓取京东商城手机列表url实例代码
Dec 18 #Python
python获取糗百图片代码实例
Dec 18 #Python
python算法学习之计数排序实例
Dec 18 #Python
python算法学习之基数排序实例
Dec 18 #Python
python算法学习之桶排序算法实例(分块排序)
Dec 18 #Python
python计算最大优先级队列实例
Dec 18 #Python
You might like
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
JavaScript实现答题评分功能页面
2020/06/24 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
运动会广播稿300字
2014/01/10 职场文书
运动会通讯稿150字
2014/02/15 职场文书
《一株紫丁香》教学反思
2014/02/19 职场文书
班级体育活动总结
2014/07/05 职场文书
2015年见习期工作总结
2014/12/12 职场文书
花木兰观后感
2015/06/10 职场文书
社区服务活动感想
2015/08/11 职场文书
alibaba seata服务端具体实现
2022/02/24 Java/Android