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


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 相关文章推荐
Swift中的协议(protocol)学习教程
Jul 08 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
基于windows下pip安装python模块时报错总结
Jun 12 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
Django 响应数据response的返回源码详解
Aug 06 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
记一次Django响应超慢的解决过程
Sep 17 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 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压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
js实现商城星星评分的效果
2015/12/29 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
python 文件操作删除某行的实例
2017/09/04 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
市场营销专科应届生求职信
2013/11/24 职场文书
民族团结先进个人材料
2014/02/05 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
不忘国耻振兴中华演讲稿
2014/05/14 职场文书
庆六一活动总结
2014/08/29 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
英文道歉信
2015/01/20 职场文书
客户答谢会致辞
2015/07/30 职场文书
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android