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


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文件操作整理汇总
Oct 21 Python
Python中模块与包有相同名字的处理方法
May 05 Python
python urllib urlopen()对象方法/代理的补充说明
Jun 29 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
python同步两个文件夹下的内容
Aug 29 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
python cv2截取不规则区域图片实例
Dec 21 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 Python
Python Django项目和应用的创建详解
Nov 27 Python
Django框架中模型的用法
Jun 10 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 生成随机验证码图片代码
2010/02/08 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
Python中字符串对齐方法介绍
2015/05/21 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python3安装Pymongo详细步骤
2017/05/26 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
经理秘书岗位职责
2013/11/14 职场文书
竞聘上岗演讲稿范文
2014/01/10 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
绿里奇迹观后感
2015/06/15 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python