您的位置:1010cc时时彩经典版 > 服务器&运维 > 1010cc时时彩经典版:web中实现验证码图片代码分

1010cc时时彩经典版:web中实现验证码图片代码分

发布时间:2019-12-01 21:25编辑:服务器&运维浏览(66)

    纯数字验证码的时候利用的,收拾如下:

    (四)短信验证码

    短信验证码基本上是种种App必备的多少个效应了,所以说几日前就来记录一下那几个作用的兑现,这里短信验证用的是第三方的所以须要拜望Mob官网

    1010cc时时彩经典版 1

    image.png

    温和自行注册点登入,依照箭头下载SDK,本人筛选相应版本下载

    1010cc时时彩经典版 2

    image.png

    将下载好的解压

    1010cc时时彩经典版 3

    image.png

    1010cc时时彩经典版 4

    image.png

    1010cc时时彩经典版 5

    image.png

    1010cc时时彩经典版 6

    image.png

    将方面多少个jar包放到大家项目libs下边,右键点击,选取 add as library
    下一场在我们的gradle下边增添如下代码

    repositories {
        flatDir {
            dirs 'libs'
        }
    }
    

    那个时候我们的gradle应该如下图所示

    1010cc时时彩经典版 7

    image.png

    接下去张开 AndroidManifest.xml,加多如下放权力限

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

    那是我们的application

    1010cc时时彩经典版 8

    image.png

    还供给足够二个Activity,增加如下代码

     <activity
                android:name="com.mob.tools.MobUIShell"
                android:configChanges="keyboardHidden|orientation|screenSize"
                android:theme="@android:style/Theme.Translucent.NoTitleBar"
                android:windowSoftInputMode="stateHidden|adjustResize" />
    

    开发mob官方网站,点击步入后台

    1010cc时时彩经典版 9

    image.png

    1010cc时时彩经典版 10

    image.png

    1010cc时时彩经典版 11

    image.png

    1010cc时时彩经典版 12

    image.png

    1010cc时时彩经典版 13

    image.png

    将那五个复制到如下代码中,此代码放在大家要发送短信验证的Activity中

    SMSSDK.initSDK(this, "Appkey", "App Secret");
    

    调用以下代码就发送短信成效,这里的phone正是我们的选用短信的手机号

      SMSSDK.getVerificationCode("86", phone);
    

    此时大家将会接收四个表明码 ,不过我们改怎么验证我们输入的验证码是还是不是精确吧。

    Handler mHandle = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                int event = msg.arg1;
                int result = msg.arg2;
                Object data = msg.obj;
                Log.e("event", "event="   event);
                if (result == SMSSDK.RESULT_COMPLETE) {
                    if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                        System.out.print("验证码校验成功");
                        Intent intent = new Intent(PhoneCodeActivity.this,Setting_NickName_Activity.class);
                        startActivity(intent);
                        phone_Code.setText("");
                        cancelProgressDialog();
    
                    } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {//服务器验证码发送成功
                        System.out.print("验证码发送成功");
                    } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {//返回支持发送验证码的国家列表
                        System.out.print("返回支持发送验证码的国家列表");
                    }
                }else{
                    ((Throwable) data).printStackTrace();
                    int resId = getStringRes(PhoneCodeActivity.this, "smssdk_network_error");
                    LoadingCustom.dismissprogress();
                    CustomToast.INSTANCE.showToast(PhoneCodeActivity.this,"验证码错误");
                    cancelProgressDialog();
                    phone_Code.setText("");
                    if (resId > 0) {
                        Toast.makeText(PhoneCodeActivity.this, resId, Toast.LENGTH_SHORT).show();
                    }
                }
            }
    
            private int getStringRes(PhoneCodeActivity phoneCodeActivity, String smssdk_network_error) {
                return 0;
            }
        };
    
     EventHandler eh = new EventHandler() {
                @Override
                public void afterEvent(int i, int i1, Object o) {
                    super.afterEvent(i, i1, o);
                    Message msg = new Message();
                    msg.arg1 = i;
                    msg.arg2 = i1;
                    msg.obj = o;
                    mHandle.sendMessage(msg);
                }
            };
            SMSSDK.registerEventHandler(eh);
    

    将上述代码考到我们输入验证码的Activity中,然后在我们的验证开关点击加上如下代码就能够评释我们的验证码是或不是输入正确,这里的phone是大家承当短信的手提式有线话机号,而那边的iCrad便是大家输入的验证码,那样我们就对验证码举行了申明。

    SMSSDK.submitVerificationCode("86", phone, iCrad);
    

    那我们怎么明白验证成功了啊依然战败然后做相应的政工呢

    if (result == SMSSDK.RESULT_COMPLETE) {
                    if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                        System.out.print("验证码校验成功");
                        Intent intent = new Intent(PhoneCodeActivity.this,Setting_NickName_Activity.class);
                        startActivity(intent);
                        phone_Code.setText("");
                        cancelProgressDialog();
    
                    } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {//服务器验证码发送成功
                        System.out.print("验证码发送成功");
                    } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {//返回支持发送验证码的国家列表
                        System.out.print("返回支持发送验证码的国家列表");
                    }
                }else{
                    ((Throwable) data).printStackTrace();
                    int resId = getStringRes(PhoneCodeActivity.this, "smssdk_network_error");
                    LoadingCustom.dismissprogress();
                    CustomToast.INSTANCE.showToast(PhoneCodeActivity.this,"验证码错误");
                    cancelProgressDialog();
                    phone_Code.setText("");
                    if (resId > 0) {
                        Toast.makeText(PhoneCodeActivity.this, resId, Toast.LENGTH_SHORT).show();
                    }
                }
    

    上面代码正是验证大家验证码准确了 ,做相应的事务,笔者这里表明正确了,做了三个跳转操作

     if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                        System.out.print("验证码校验成功");
                        Intent intent = new Intent(PhoneCodeActivity.this,Setting_NickName_Activity.class);
                        startActivity(intent);
                        phone_Code.setText("");
                        cancelProgressDialog();
    
                    }
    

    下边这段代码正是印证大家的验证码错误,小编这边给了多个提醒,提醒她验证码错误。

    else{
                    ((Throwable) data).printStackTrace();
                    int resId = getStringRes(PhoneCodeActivity.this, "smssdk_network_error");
                    LoadingCustom.dismissprogress();
                    CustomToast.INSTANCE.showToast(PhoneCodeActivity.this,"验证码错误");
                    cancelProgressDialog();
                    phone_Code.setText("");
                    if (resId > 0) {
                        Toast.makeText(PhoneCodeActivity.this, resId, Toast.LENGTH_SHORT).show();
                    }
                }
    

    差不离Android短信验证码就成功了,其实依然挺轻便的没啥太难的。

    day4作业小代码演习,day4作业代码练习

    签到模块:

      大家不论上十分网址,平日境遇这么的场所,让我们登陆那些网址,流程图如下:

      1010cc时时彩经典版 14

    思路:

      1.当我们登陆网址的时候,大家率先会输入用户名,这时候,有个别网址会提示我们客商名是或不是存在,假诺大家输入的客户名不设有的话,会不能自已提示,告诉大家客商名不设有,那个时候,大家就必要再行输入,可能采纳注册,当然,大家那边只是让客户重新输入;

      2.客户名存在的话,就必要输入密码,大家领略,输入密码的时候,大家是不表达密码是还是不是准确的,如若一向先验证密码是或不是科学,也就失去了让顾客输入验证码的魔法,由此大家总是先不表明密码,而是让客商输入验证码,先验证顾客输入的验证码是还是不是科学;

      3.借使验证码不得法,则让客户重新输入验证码;假若验证码准确,那么当时就要回来来重新验证密码是不是准确;如若密码正确,就登入成功了;否则,如若密码不许确,那时,就须要客商重新输入密码,由于这时候,顾客已经输入了顾客名,因而无需再重新输入客商名了,只供给输入密码和验证码就能够;即重新输入密码,然后输入验证码;假设密码正确,则登陆成功,不然重新输入密码和验证码,验证码是历次输入密码必得输入的;

      要促成上述代码的法力,肯定要采纳while循环,由于是逐层查验,因而客商名的输入分明是一个循环,直到顾客输入准确的验证码甘休,关键是,如何贯彻客户名科学,当密码依然验证码输入错误的时候,不须要重新输入客商名,不然会令人看不起的;这时就要考虑,当顾客名科学的时候,就要告生龙活虎段落那么些轮回了,不能够再施行下三回顾客输入密码或验证码的时候循环输入客商名。

      代码的兑现如下:

      

    def login(name,password):
        '''用户登录模块,用户登录时候的各种设置,本次实现功能'''
        '''用户登录验证的时候,一般会先判断验证码是否正确,因此要让用户首先验证验证码'''
        active = True
        while True:
            while active:
                username = input("请输入你的用户名:")
                '''首先验证用户名是否存在'''
                users = []
                for user_list in userfile.usernames:
                    users.append(user_list[0])
                if username in users:
                    active = False
                else:
                    print("对不起,您输入的用户名不存在,请重新输入:")
            pwd = input("请输入你的密码:")
    
            while True:
                '''加入一个用户输入验证码的模块,让用户输入验证码'''
                verification_code = str(random.randint(0,9))   chr(random.randint(65,90))   str(random.randint(0,9))   chr(random.randint(97,122))
                print(verification_code)
                test_num = input("请输入验证码:")
                if test_num == verification_code.lower() or test_num == verification_code.upper():
                    '''无论用户输入大小写都可以验证成功'''
                    '''用户验证成功后,开始进行用户自己的认证,是否注册,或者用户名正确'''
                    break
                else:
                    print("您输入的验证码有误,请重新输入!")
            if [username,int(pwd)] in userfile.usernames:
                print("Successful!")
                return (username,pwd)
            else:
                print("对不起,您输入的密码有误,请重新输入:")
    

      上述代码运行如下:

    请输入你的用户名:geng
    请输入你的密码:123
    3D0t
    请输入验证码:3d0t
    对不起,您输入的密码有误,请重新输入:
    请输入你的密码:222
    8I9z
    请输入验证码:8888
    您输入的验证码有误,请重新输入!
    2G0j
    请输入验证码:8888
    您输入的验证码有误,请重新输入!
    7T1a
    请输入验证码:7t1a
    对不起,您输入的密码有误,请重新输入:
    请输入你的密码:2222
    7X4q
    请输入验证码:7x4q
    对不起,您输入的密码有误,请重新输入:
    请输入你的密码:666
    2O0q
    请输入验证码:2o0q
    Successful!
    ('geng', '666')
    

      上述代码的实施结果如上所示,当我们想单独截止二个循环的时候,能够给这段循环设置贰个标记符,用来拉开只怕关闭循环,当满意条件的时候,关闭这些轮回,让这么些轮回在举行其余程序的时候不交易会开;

       active = True
      while True:
      while active:
        username = input("请输入你的客户名:"卡塔尔(قطر‎
        '''首先验证客户名是或不是存在'''
        users = []
        for user_list in userfile.usernames:
          users.append(user_list[0])
      if username in users:
      active = False
      else:
        print("对不起,您输入的顾客名不设有,请重新输入:"卡塔尔国
        pwd = input("请输入你的密码:"卡塔尔(قطر‎

      上述代码,大家就兑现了这么的意义,当咱们想结束那一个轮回的时候,大家就让内层循环的标志符关闭。

    登入模块: 大家随意上这几个网址,平时蒙受这么的情状,让我们登陆那一个网址,流程图如下: 思路...

    在Python web中贯彻验证码图片代码分享,

    系统版本: CentOS 7.4
    Python版本: Python 3.6.1

    在现今的WEB中,为了防止爬虫类程序提交表单,图片验证码是最平淡无奇也是最轻便易行的答疑方法之后生可畏。

    1.验证码图片的浮动

      在python中,图片验证码貌似用PIL或许Pillow库完结,上边就是接受Pillow生成图片验证码的代码:

    #!/usr/bin/env python3
    
    #- * -coding: utf - 8 - * -#@Author: Yang#@ Time: 2017 / 11 / 06 1: 04
    import random
    from PIL
    import Image, ImageDraw, ImageFont, ImageFilter
    _letter_cases = "abcdefghjkmnpqrstuvwxy"#
    小写字母, 去除可能干扰的i, l, o, z
    _upper_cases = _letter_cases.upper()# 大写字母
    _numbers = ''.join(map(str, range(10)))# 数字
    init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
    
    def create_validate_code(size = (120, 30),
        chars = init_chars,
        img_type = "GIF",
        mode = "RGB",
        bg_color = (230, 230, 230),
        fg_color = (18, 18, 18),
        font_size = 20,
        font_type = ‘/usr/share / fonts / dejavu / DejaVuSans - Bold.ttf',
        length = 4,
        draw_lines = True,
        n_line = (1, 2),
        draw_points = True,
        point_chance = 1):
      ''
    '@
    todo: 生成验证码图片@ param size: 图片的大小, 格式( 宽, 高), 默认为(120, 30)@ param chars: 
    允许的字符集合, 格式字符串@ param img_type: 图片保存的格式, 默认为GIF, 可选的为GIF, JPEG, TIFF, 
    [email protected] param mode: 图片模式, 默认为[email protected] param bg_color: 背景颜色, 默认为白色@ param fg_color: 前景色, 
    验证码字符颜色, 默认为蓝色 #0000FF
      @param font_size: 验证码字体大小
      @param font_type: 验证码字体的详细路径,默认为 ae_AlArabiya.ttf
      @param length: 验证码字符个数
      @param draw_lines: 是否划干扰线
      @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
      @param draw_points: 是否画干扰点
      @param point_chance: 干扰点出现的概率,大小范围[0, 100]
      @return: [0]: PIL Image实例
      @return: [1]: 验证码图片中的字符串
      '''
      width, height = size# 宽, 高
    img = Image.new(mode, size, bg_color)# 创建图形
    draw = ImageDraw.Draw(img)# 创建画笔
    def get_chars():
      ''
    '生成给定长度的字符串,返回列表格式'
    ''
    return random.sample(chars, length)
    def create_lines():
      ''
    '绘制干扰线'
    ''
    line_num = random.randint( * n_line)# 干扰线条数
    for i in range(line_num): #起始点
    begin = (random.randint(0, size[0]), random.randint(0, size[1]))# 结束点
    end = (random.randint(0, size[0]), random.randint(0, size[1]))
    draw.line([begin, end], fill = (0, 0, 0))
    def create_points():
      ''
    '绘制干扰点'
    ''
    chance = min(100, max(0, int(point_chance)))# 大小限制在[0, 100]
    for w in range(width):
      for h in range(height):
      tmp = random.randint(0, 100)
    if tmp > 100 - chance:
      draw.point((w, h), fill = (0, 0, 0))
    def create_strs():
      ''
    '绘制验证码字符'
    ''
    c_chars = get_chars()
    strs = ' %s ' % ' '.join(c_chars)# 每个字符前后以空格隔开
    font = ImageFont.truetype(font_type, font_size)
    font_width, font_height = font.getsize(strs)
    draw.text(((width - font_width) / 3, (height - font_height) / 3),
      strs, font = font, fill = fg_color)
    return ''.join(c_chars)
    if draw_lines:
      create_lines()
    if draw_points:
      create_points()
    strs = create_strs()# 图形扭曲参数
    params = [1 - float(random.randint(1, 2)) / 100,
      0,
      0,
      0,
      1 - float(random.randint(1, 10)) / 100,
      float(random.randint(1, 2)) / 500,
      0.001,
      float(random.randint(1, 2)) / 500
    ]
    img = img.transform(size, Image.PERSPECTIVE, params)# 创建扭曲
    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)# 滤镜, 边界加强( 阈值更大)
    return img, strs
    
    if __name__ == '__main__':
      img, str = create_validate_code()
    img.save('./test.gif', 'gif')
    

      最后的结果会回到三个元组,第1个重回值为一个Image类的实例,第一个再次回到值为验证码图片中的字符串,能够用来比对验证码是不是正确。

    变化的验证码图片效果:

    1010cc时时彩经典版 15

     不过内需专一一点,以上代码需求依据于系统字体,借使font_type设置不得法,就能够抛出 OSError 非常。

    1010cc时时彩经典版 16

    对此CenOS系统,字体文件常常在 /usr/share/fonts/dejavu/ 下, 如CentOS 7.4:

    1010cc时时彩经典版 17

    从当中随便接受一个就能够。windows 下同理,只需将 font_type 设置成正确的书体路线即可, 如

    font_type=r"C:WindowsFontsArial.ttf"

    1010cc时时彩经典版 18

    2.怎么样在网页中浮现验证码

    1010cc时时彩经典版,  在上述代码中,验证码都以以文件的艺术保存。假使要在web中央银行使验证码,不可能每一趟都先生成验证码图片,先保存到磁盘,再回到给前端 web。那样会大增磁盘的花销,其它频仍爆发的验证码也会并吞大批量的磁盘空间。那时候,能够应用 BytesIO 模块,使验证码图片的读写直接在内部存款和储蓄器中开展,并一直回到给前端。同一时间将正确验证码字符串存在session中,当客户提交表单时,就足以和session中的正确字符串作相比较了。

      以Flask为例,以下为在Flask中运用验证码的全体 德姆o:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*- 
    # @Author : Yang
    # @Time  : 2017/11/08 15:35 
    import random
    from PIL import Image, ImageDraw, ImageFont, ImageFilter
    from io import BytesIO
    from flask import Flask, session, request
    _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
    _upper_cases = _letter_cases.upper() # 大写字母
    _numbers = ''.join(map(str, range(10))) # 数字
    init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
    def create_validate_code(size=(120, 30),
                 chars=init_chars,
                 img_type="GIF",
                 mode="RGB",
                 bg_color=(230, 230, 230),
                 fg_color=(18, 18, 18),
                 font_size=20,
                 font_type='/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf',
                 length=4,
                 draw_lines=True,
                 n_line=(1, 2),
                 draw_points=True,
                 point_chance=1):
      '''
      @todo: 生成验证码图片
      @param size: 图片的大小,格式(宽,高),默认为(120, 30)
      @param chars: 允许的字符集合,格式字符串
      @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
      @param mode: 图片模式,默认为RGB
      @param bg_color: 背景颜色,默认为白色
      @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
      @param font_size: 验证码字体大小
      @param font_type: 验证码字体的详细路径,默认为 ae_AlArabiya.ttf
      @param length: 验证码字符个数
      @param draw_lines: 是否划干扰线
      @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
      @param draw_points: 是否画干扰点
      @param point_chance: 干扰点出现的概率,大小范围[0, 100]
      @return: [0]: PIL Image实例
      @return: [1]: 验证码图片中的字符串
      '''
      width, height = size # 宽, 高
      img = Image.new(mode, size, bg_color) # 创建图形
      draw = ImageDraw.Draw(img) # 创建画笔
      def get_chars():
        '''生成给定长度的字符串,返回列表格式'''
        return random.sample(chars, length)
      def create_lines():
        '''绘制干扰线'''
        line_num = random.randint(*n_line) # 干扰线条数
        for i in range(line_num):
          # 起始点
          begin = (random.randint(0, size[0]), random.randint(0, size[1]))
          # 结束点
          end = (random.randint(0, size[0]), random.randint(0, size[1]))
          draw.line([begin, end], fill=(0, 0, 0))
      def create_points():
        '''绘制干扰点'''
        chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
        for w in range(width):
          for h in range(height):
            tmp = random.randint(0, 100)
            if tmp > 100 - chance:
              draw.point((w, h), fill=(0, 0, 0))
      def create_strs():
        '''绘制验证码字符'''
        c_chars = get_chars()
        strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开
        font = ImageFont.truetype(font_type, font_size)
        font_width, font_height = font.getsize(strs)
        draw.text(((width - font_width) / 3, (height - font_height) / 3),
             strs, font=font, fill=fg_color)
        return ''.join(c_chars)
      if draw_lines:
        create_lines()
      if draw_points:
        create_points()
      strs = create_strs()
      # 图形扭曲参数
      params = [1 - float(random.randint(1, 2)) / 100,
           0,
           0,
           0,
           1 - float(random.randint(1, 10)) / 100,
           float(random.randint(1, 2)) / 500,
           0.001,
           float(random.randint(1, 2)) / 500
           ]
      img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲
      img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)
      return img, strs
    app = Flask(__name__)
    app.config.update(
      DEBUG=True,
      SECRET_KEY='...'
    )
    @app.route('/')
    def index():
      return 'test'
    @app.route('/code')
    def get_code():
      # 把strs发给前端,或者在后台使用session保存
      code_img, strs = create_validate_code()
      buf = BytesIO()
      code_img.save(buf, 'jpeg')
      buf_str = buf.getvalue()
      response = app.make_response(buf_str)
      response.headers['Content-Type'] = 'image/gif'
      session['img'] = strs.upper()
      return response
    @app.route("/login", methods=["POST", "GET"])
    def login():
      if request.method == 'POST':
        if session.get('img') == request.form.get('img').upper():
          return 'OK'
        return 'Error'
      return """
      <form action="" method="post">
        <p>Name:<input type=text name=username>
        <p>Password:<input type=text name=password>
        <p>CAPTCHA:<input type=text name=img>
        <img id="verficode" src="./code" onclick="this.src='./code?' Math.random()">    # onclick事件用于每次
    点击时获取一个新的验证码
        <p><input type=submit value=Login>
      </form>
      """
    if __name__ == "__main__":
      app.run(host="0.0.0.0", port=18888, debug=True)
    

    说起底效果:

    1010cc时时彩经典版 19

    总结

    上述正是本文关于在Python web中完成验证码图片代码分享的全部内容,希望对我们具有利于。感兴趣的相爱的人能够继续参照本站:python完结人脸识别代码、Python爬虫实例爬取网址好笑段子、Python入门之三角函数全解【收藏】等,有哪些难点得以每10日留言,小编会及时回复大家的。谢谢朋友们对本站的支撑!

    web中达成验证码图片代码分享, 系统版本: CentOS 7.4 Python版本: Python 3.6.1 在今天的WEB中,为了防守爬虫类程序提交表单,图片验证...

    本文由1010cc时时彩经典版发布于服务器&运维,转载请注明出处:1010cc时时彩经典版:web中实现验证码图片代码分

    关键词: