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


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 09 Python
Python下的subprocess模块的入门指引
Apr 16 Python
使用Python编写基于DHT协议的BT资源爬虫
Mar 19 Python
Django csrf 验证问题的实现
Oct 09 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
Pillow图像处理库安装及使用
Apr 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优化需要注意的地方
2014/11/27 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
img标签中onerror用法
2009/08/13 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
Select2.js下拉框使用小结
2016/10/24 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
koa源码中promise的解读
2018/11/13 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
Python匹配中文的正则表达式
2016/05/11 Python
解决Python中回文数和质数的问题
2019/11/24 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
linux面试题参考答案(7)
2014/07/24 面试题
企业员工集体活动方案
2014/08/17 职场文书
学校社团活动总结
2015/05/07 职场文书
草房子读书笔记
2015/06/29 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
gojs实现蚂蚁线动画效果
2022/02/18 Javascript