Beispiel #1
0
 def send_sms(phone, code):
     api = KavenegarAPI(KAVENEGAR_API)
     # api.host="79.175.172.10"
     # for OTP account
     params = {
         'receptor': phone,
         'token': '%d' % code,
         'type': 'sms',
         'template': 'verifyasoude'
     }
     api.verify_lookup(params)
Beispiel #2
0
def send_sms_kavenegar(token, phone_number, code):
    api = KavenegarAPI(token)
    params = {
        'receptor': phone_number,
        'token': code,
        'template': 'SymptomCheckerVerify'
    }
    response = api.verify_lookup(params)
    return response
Beispiel #3
0
    def verify_call(self, reciever, code):
        sms = self.create(reciever=reciever)
        try:
            api = KavenegarAPI(settings.KAVENEGAR_API_CODE)
            params = {
                'receptor': reciever,
                'template': 'verify',
                'token': code,
                'type': 'call',  # sms vs call
            }
            sms.response = api.verify_lookup(params)
            sms.save()

        except APIException as e:
            print(e)
        except HTTPException as e:
            print(e)
Beispiel #4
0
class Kavenegar(SMS):
    def __init__(self) -> None:
        self.api = KavenegarAPI(KAVENEGAR_KEY)

    def _send(self, mobile_number, **kwargs):
        kwargs['receptor'] = mobile_number
        return self._verify_send(**kwargs)

    def _sms_send(self, **kwargs):
        try:
            response = self.api.sms_send(kwargs)
            return response
        except APIException as e:
            return e
        except HTTPException as e:
            return e

    def _verify_send(self, **kwargs):
        try:
            response = self.api.verify_lookup(kwargs)
            return response
        except APIException as e:
            return e
        except HTTPException as e:
            return e

    def _log(self, res, ip):
        if isinstance(res, Exception):
            return logger.error(res)
        if isinstance(res, list):
            res = res[0]
        app_timezone = timezone.get_default_timezone()
        return SMSModel.objects.create(
            cost=res['cost'],
            datetime=datetime.fromtimestamp(
                res['date']).astimezone(app_timezone),
            receptor=res['receptor'],
            sender=res['sender'],
            statustext=res['statustext'],
            status=res['status'],
            message=res['message'],
            messageid=res['messageid'],
            user_ip=ip,
        )

    def generate_code(self, mobile_number):
        yesterday = make_aware(datetime.today() - timedelta(days=1))
        user_phone_valid = UserphoneValid.objects.filter(
            MobileNumber=mobile_number, Date__gte=yesterday, Validation=False)
        if user_phone_valid.exists():
            return user_phone_valid[0].ValidCode
        else:
            return str(random.randint(100000, 999999))

    def _get_try_count(self, mobile_number, ip, deltatime):
        return SMSModel.objects.filter(
            (Q(receptor=mobile_number) | Q(user_ip=ip)),
            datetime__gte=deltatime).count()

    def _confirm_allowed(self, mobile_number, ip):
        '''
        this method check this user is allowed to receive SMS 
        now the only policy is checking maximux allowed number of sms

        return :
            confirm -> True
            not confirm -> False
        '''
        MAX_NUMBER_SMS_IN_10_MIN = 5
        MAX_NUMBER_SMS_IN_A_DAY = 10
        # check that user is not overloading SMS with many requests
        ten_minutes_ago = timezone.now() + timedelta(minutes=-10)
        one_day_ago = timezone.now() + timedelta(hours=-24)
        count_10min = self._get_try_count(mobile_number, ip, ten_minutes_ago)
        count_day = self._get_try_count(mobile_number, ip, one_day_ago)
        if count_day < MAX_NUMBER_SMS_IN_A_DAY:
            if count_10min < MAX_NUMBER_SMS_IN_10_MIN:
                return None
            else:
                return 'شما بیشتر از تعداد مجاز درخواست کردید. لطفا 10 دقیقه دیگر امتحان کنید.'

        else:
            return 'شما بیشتر از تعداد مجاز درخواست کردید. لطفا فردا دوباره امتحان کنید.'