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


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实现通过哈希算法检测图片重复的教程
Apr 02 Python
详解Python中的正则表达式的用法
Apr 09 Python
python 简单的多线程链接实现代码
Aug 28 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Python实现网站表单提交和模板
Jan 15 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
python装饰器使用实例详解
Dec 14 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
Apr 01 Python
Python实现AI换脸功能
Apr 10 Python
基于Python爬取素材网站音频文件
Oct 21 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 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 SQLite类
2009/05/07 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
php 中的closure用法详解
2017/06/12 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
年级组长自我鉴定
2014/02/22 职场文书
三年级学生评语
2014/04/23 职场文书
课外小组活动总结
2014/08/27 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
一条慢SQL语句引发的改造之路
2022/03/16 MySQL