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


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 相关文章推荐
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
浅析python参数的知识点
Dec 10 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 Python
python的移位操作实现详解
Aug 21 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
django框架ModelForm组件用法详解
Dec 11 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
Aug 24 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 Python
Python如何实现感知器的逻辑电路
Dec 25 Python
pytorch 梯度NAN异常值的解决方案
Jun 05 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 高手之路(二)
2006/10/09 PHP
如何使用脚本模仿登陆过程
2006/11/22 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
php实现源代码加密的方法
2015/07/11 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
2014/08/27 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
Bootstrap3 图片(响应式图片&图片形状)
2017/01/04 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
python的即时标记项目练习笔记
2014/09/18 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
python+matplotlib绘制旋转椭圆实例代码
2018/01/12 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
简单了解python关系(比较)运算符
2019/07/08 Python
python 自动识别并连接串口的实现
2021/01/19 Python
《埃及的金字塔》教学反思
2014/04/07 职场文书
入党积极分子评语
2014/05/04 职场文书
奉献家乡演讲稿
2014/09/16 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
个人专业技术总结
2015/03/05 职场文书
解约证明模板
2015/06/19 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
MySQL视图概念以及相关应用
2022/04/19 MySQL
redis lua限流算法实现示例
2022/07/15 Redis