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


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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
python实现人人网登录示例分享
Jan 19 Python
python原始套接字编程示例分享
Feb 21 Python
python3之模块psutil系统性能信息使用
May 30 Python
python绘制立方体的方法
Jul 02 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
python web框架 django wsgi原理解析
Aug 20 Python
python命令 -u参数用法解析
Oct 24 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 Python
Python实现给PDF添加水印的方法
Jan 25 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
咖啡的植物学知识
2021/03/03 咖啡文化
由php的call_user_func传reference引发的思考
2010/07/23 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
js实现幻灯片效果(基于jquery插件)
2013/11/05 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
2014/03/27 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
AngularJS手动表单验证
2016/02/01 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
Python中optparse模块使用浅析
2015/01/01 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
django使用admin站点上传图片的实例
2019/07/28 Python
在django模板中实现超链接配置
2019/08/21 Python
详解Django CAS 解决方案
2019/10/30 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
大学毕业生的自我鉴定
2013/11/30 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
大学生见习总结报告
2015/06/24 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers
MySQL主从切换的超详细步骤
2022/06/28 MySQL
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python