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


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自动连接ssh的方法
Mar 07 Python
理解Python中的类与实例
Apr 27 Python
深入解读Python解析XML的几种方式
Feb 16 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
python 图像处理画一个正弦函数代码实例
Sep 10 Python
python 伯努利分布详解
Feb 25 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
安装多个版本的TensorFlow的方法步骤
Apr 21 Python
Python中的xlrd模块使用原理解析
May 21 Python
python实现逻辑回归的示例
Oct 09 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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
php中函数的形参与实参的问题说明
2010/09/01 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
初学JavaScript第二章
2008/09/30 Javascript
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
浅析python 字典嵌套
2020/09/29 Python
浅析Python中字符串的intern机制
2020/10/03 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
组织关系转移介绍信
2014/01/16 职场文书
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
中学生运动会入场词
2014/02/12 职场文书
基督教婚礼主持词
2014/03/14 职场文书
合作协议书怎么写
2014/04/18 职场文书
新闻发布会策划方案
2014/06/12 职场文书
2014年招生工作总结
2014/11/26 职场文书
维稳工作承诺书
2015/01/20 职场文书
学雷锋感言
2015/08/03 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL