独角鲸同步合作方公司数据项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

105 lines
3.9 KiB

import datetime
import traceback
import requests, logging, random, re, json
from rest_framework import status
from rest_framework.throttling import AnonRateThrottle
from rest_framework.views import APIView
from django_redis import get_redis_connection
from ChaCeRndTrans import settings
from ChaCeRndTrans.basic import CCAIResponse
from ChaCeRndTrans.code import SERVER_ERROR, BAD # PHONE_NO_BIND, PHONE_IS_BIND, NO_REGISTER_PHONE
from rbac.models import UserProfile
logger = logging.getLogger('error')
msg_redis_code = 'rndMsgCode' # 用户短信验证码缓存标志
def random_str():
_str = '1234567890'
return ''.join(random.choice(_str) for i in range(4))
def send_message(phone, template_type):
msg_code = random_str()
key = msg_redis_code + phone
visit_time_key = "dodo_visit_" + phone # 用于控制一段时间后放行短信发送
conn = get_redis_connection('default')
visit_key = conn.get(visit_time_key)
if visit_key is None:
conn.incrby(visit_time_key, 1)
else:
visit_count = int(conn.get(visit_time_key).decode('utf8'))
if visit_count < 10:
conn.incrby(visit_time_key, 1)
else:
# is_ttl = conn.ttl(visit_time_key) # 获取剩余时间,秒
# if is_ttl != -1:
# return CCAIResponse(msg="发送短信频繁,请稍后再发送。", status=BAD)
conn.expire(visit_time_key, 60)
return CCAIResponse(data="发送短信频繁,请稍后再发送。", msg="发送短信频繁,请稍后再发送。", status=BAD)
# 验证码
conn.hset(key, 'code', msg_code)
conn.expire(key, 300)
conn.expire(visit_time_key, 300) # 保证5分钟以后这个键会消失
url = settings.MSG_URL
if settings.DEVELOP_DEBUG:
url = settings.TEST_MSG_URL
# params = '{"name":"szccwl","pwd":"md","address":"bz","phone":"13000000000"}'
params = {}
params['username'] = 'ccw'
params['password'] = 'chacewang123456'
params['phone'] = phone
params['template_type'] = template_type
args = '{"code":"%s"}' % msg_code
params['args'] = args
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
try:
count = 0
flag = False
result = {}
response = {}
while count < 3 and flag is False:
response = requests.request("GET", url, headers=headers, data=params)
if response.status_code == 200:
flag = True
else:
count = count + 1
if flag is True:
result = json.loads(response.text)
if 'code' in result.keys() and result['code'] == 200:
return CCAIResponse('success')
else:
return CCAIResponse(data="发送短信失败", msg="发送短信失败!", status=BAD)
except Exception as e:
logger.error("get MessageView failed: \n%s" % traceback.format_exc())
return CCAIResponse(msg='发送验证码出错', status=SERVER_ERROR)
class MessageView(APIView):
"""
发送验证码
"""
# throttle_classes = (AnonRateThrottle,)
def get(self, request, *args, **kwargs):
try:
params = request.GET
phone = params.get('phone')
if phone == None or phone == '':
return CCAIResponse(data="请输入正确的手机号", msg="手机号不能为空", status=status.HTTP_400_BAD_REQUEST)
ret = re.match(r"^1[3-9]\d{9}$", phone)
if ret:
# return CCAIResponse('success')
return send_message(phone, 'Ccw_TemplateType_Captcha')
else:
return CCAIResponse(data="请输入正确的手机号", msg="请输入正确的手机号", status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
logger.error("send MessageView failed: \n%s" % traceback.format_exc())
return CCAIResponse(data="发送验证码出错", msg="发送验证码出错", status=SERVER_ERROR)