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


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读大数据txt
Mar 28 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
Python AES加密实例解析
Jan 18 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
python存储16bit和32bit图像的实例
Dec 05 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
pyftplib中文乱码问题解决方案
Jan 11 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
Python3的socket使用方法详解
Feb 18 Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 Python
pycharm 激活码及使用方式的详细教程
May 12 Python
Python configparser模块封装及构造配置文件
Aug 07 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中上传大体积文件时需要的设置
2006/10/09 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
JavaScript展开操作符(Spread operator)详解
2019/07/20 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
python添加模块搜索路径方法
2017/09/11 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
python 读取二进制 显示图片案例
2020/04/24 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
华为C++笔试题
2014/08/05 面试题
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
单位接收函范文
2015/01/30 职场文书
赡养老人协议书范本
2015/08/06 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
Python进程池与进程锁之语法学习
2022/04/11 Python
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python