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


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图像处理之镜像实现方法
May 30 Python
Python自定义主从分布式架构实例分析
Sep 19 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
详解Django admin高级用法
Nov 06 Python
Keras之自定义损失(loss)函数用法说明
Jun 10 Python
python是怎么被发明的
Jun 15 Python
10个示例带你掌握python中的元组
Nov 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
smarty section简介与用法分析
2008/10/03 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
python爬虫 正则表达式解析
2019/09/28 Python
Python实现word2Vec model过程解析
2019/12/16 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Django values()和value_list()的使用
2020/03/31 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
车辆工程专业求职信
2014/06/14 职场文书
教师个人学习总结
2015/02/11 职场文书
物流业务员岗位职责
2015/04/03 职场文书
六年级情感作文之500字
2019/10/23 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript