当前位置:小鱼儿玄机二站 > 编程应用 > Python使用PIL库实现验证码图片的方法,python实现

Python使用PIL库实现验证码图片的方法,python实现

文章作者:编程应用 上传时间:2019-09-03

python达成出殡和埋葬和获得手提式有线电话机短信验证码,python手提式有线电话机短信

第一为我们分享python实现发送手提式有线电电话机短信验证码后台方法,供大家仿效,具体内容如下

1、生成4位数字验证码

def createPhoneCode(session): 
  chars=['0','1','2','3','4','5','6','7','8','9'] 
  x = random.choice(chars),random.choice(chars),random.choice(chars),random.choice(chars) 
  verifyCode = "".join(x) 
  session["phoneVerifyCode"] = {"time":int(time.time()), "code":verifyCode} 
  return verifyCode 

2、发送给外界短信接口(post格局)

def sendTelMsg(msg, phoneID): 
  SendTelMsgUrl="http://www.810086.com.cn/jk.aspx" 
  params = {"zh":"china", "mm":"[email protected]",  
       "hm":phoneID,"nr":msg,"sms_type":88} 
  postData=urllib.urlencode(params) 
  req = urllib2.Request(SendTelMsgUrl, postData) 
  req.add_header('Content-Type', "application/x-www-form-urlencoded") 
  respone = urllib2.urlopen(req) 
  res = respone.read() 
  return res 

中间session参数是django urls.py 后台方法 以request.session传入

3、前端js

$("button[name=getVerifyBt]").bind("click", function(){ 
  var self = this; 
  var userPhoneEl = $("input[name=phoneNum]"); 
  var userPhone = $.trim(userPhoneEl.val()); 
  if (userPhone == ""){ 
    alert("请填写号码!"); 
    return; 
  } 
  $.get("/getPhoneVerifyCode/"+userPhone + "/") 
  .success(function(msg){ 
    console.info(msg); 
    var ddEl = $(self).siblings("dd.showTag"); 
    if(msg == "ok"){ 
      ddEl.find("span").hide(); 
      ddEl.find("span[name=success]").show(); 
    }else{ 
      ddEl.find("span").hide(); 
      ddEl.find("span[name=error]").show();           
    } 
  }) 
  .error(function(msg){ 
    console.info(msg); 
  }); 
  var step = 60; 
  $(this).attr("disabled", true);  
  $(this).html("重新发送"+step); 
  var interThread = setInterval(function(){ 
    step-=1; 
    $(self).html("重新发送"+step); 
    if(step <=0){ 
      $(self).removeAttr("disabled"); 
      $(self).html("获取验证码"); 
      clearInterval(interThread); 
    } 
  }, 1000); 


}); 

下边就为我们介绍python解决接口测量检验获取手机验证码难点的主意

多年来在做接口测验的时候境遇四个主题素材,就是有个很首要的接口要用到手提式有线电电话机短信验证码,而任何接口都正视于那么些验证码,若无短信验证码就不可能展开上面接口的测量检验,所感到了按时的验证线上的接口是否平时,何况又不修改代码,所以就悟出以下技术方案,要是我们有了更好方案能够一并交换分享。

Android在接到短信后会发送二个Action为android.provider.Telephony.SMS_RECEIVED的播音,所以我们只必要写个类承接布罗兹castReceiver就足以很轻松地监听到短信。

package com.example.getsms;


import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.text.TextUtils;
import android.util.Log;


public class SmsInterceptReceiver extends BroadcastReceiver {


private final String TAG = "SmsRec";

 private static final String SMS_EXTRA_NAME ="pdus";

 @Override
 public void onReceive(Context context, Intent intent) {
 // TODO Auto-generated method stub
 String message = "";

 Log.e(TAG, "free message " );

    Bundle extras = intent.getExtras();
    if ( extras != null ) {
      try {
      Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );
        ContentResolver contentResolver = context.getContentResolver();

        Log.e(TAG, "free message " );
        for ( int i = 0; i < smsExtra.length; ++i ) {
          SmsMessage sms = SmsMessage.createFromPdu((byte[]) smsExtra[i]);

          String body = sms.getMessageBody().toString();
          message += body;
        }


        Log.e(TAG, "free message : " + message);
      } catch (Exception e) {
      // TODO: handle exception
      Log.e(TAG, e.getMessage());
      }
    } 

 }


}

AndroidManifest.xml里登记一下接收器:

 <receiver android:name=".SmsInterceptReceiver">
     <intent-filter>
     <action android:name="android.provider.Telephony.SMS_RECEIVED" />
     </intent-filter>
    </receiver>

增添权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

python 代码,首要透过adb log来取得apk包所截取的短信新闻,然后实行分析后既可选择。

__author__ = 'guozhenhua'
#coding=utf-8
import urllib2
import os,time



#解析短信验证码
os.system("adb logcat -c")
cmd="adb logcat -d |findstr E/SmsRec"
#time.sleep(30);
while(1):
  smscode= os.popen(cmd).read()
  #print smscode
  if (smscode!=""):
    smscode=smscode.split("验证码:")[1].split(",")[0]
    break;


print "验证码是:"+smscode

以上就是本文的全体内容,内容很丰硕,不过也设有部分欠缺,希望大家谅解,共同学习发展。

Python使用PIL库达成验证码图片的点子,

正文实例陈说了Python使用PIL库达成验证码图片的不二诀窍。共享给大家供大家参照他事他说加以考察,具体如下:

今昔的网页中,为了防范机器人提交表单,图片验证码是很宽泛的回应手腕之一。这里就不详细介绍了,相信我们都赶上过。

前段时间就交给用Python的PIL库达成验证码图片的代码。代码中有详尽注脚。

#!/usr/bin/env python
#coding=utf-8
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(3, 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=(255, 255, 255),
             fg_color=(0, 0, 255),
             font_size=18,
             font_type="ae_AlArabiya.ttf",
             length=4,
             draw_lines=True,
             n_line=(1, 2),
             draw_points=True,
             point_chance = 2):
  '''
  @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 xrange(width):
      for h in xrange(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__":
  code_img = create_validate_code()
  code_img.save("validate.gif", "GIF")

谈起底结果再次回到八个元组,第三个重返值是Image类的实例,第贰个参数是图片中的字符串(比较是还是不是正确的作用)。

最后结果回到三个元组,第四个重临值是Image类的实例,第叁个参数是图形中的字符串(比较是不是科学的效应)。

亟需提示的是,倘若在生成ImageFont.truetype实例的时候抛出IOError非凡,有非常大希望是运作代码的管理器未有包括内定的字体,须要下载安装。

浮动的验证码图片效果:

图片 1

此时,留心的同桌恐怕要问,若是每便生成验证码,都要先保存生成的图形,再彰显到页面。这么做令人太无法经受了。那个时候,我们须求运用python内置的StringIO模块,它装有近乎file对象的行为,不过它操作的是内部存款和储蓄器文件。于是,大家能够如此写代码:

try:
  import cStringIO as StringIO
except ImportError:
  import StringIO
mstream = StringIO.StringIO()
img = create_validate_code()[0]
img.save(mstream, "GIF") 

如此那般,大家须要输出的图样的时候若是使用“mstream.getvalue()”就能够。比如在Django里,大家先是定义这样的url:

from django.conf.urls.defaults import *
urlpatterns = patterns('example.views',
  url(r'^validate/$', 'validate', name='validate'),
)

在views中,大家把科学的字符串保存在session中,那样当客商提交表单的时候,就足以和session中的正确字符串实行相比较。

from django.shortcuts import HttpResponse
from validate import create_validate_code
def validate(request):
  mstream = StringIO.StringIO()
  validate_code = create_validate_code()
  img = validate_code[0]
  img.save(mstream, "GIF")
  request.session['validate'] = validate_code[1]
  return HttpResponse(mstream.getvalue(), "image/gif")

企望本文所述对大家Python程序设计有所协理。

您可能感兴趣的小说:

  • python 图片验证码代码
  • python 图片验证码代码分享
  • Python 随机生成普通话验证码的实例代码
  • python为tornado增添recaptcha验证码功用
  • python生成随机验证码(普通话验证码)示例
  • python使用PyFetion来发送短信的事例
  • python调用短信猫控件实现发短信成效实例
  • Python生成验证码实例
  • Python随机生成多个6位的验证码代码共享

首先为大家享用 python完成出殡和埋葬手提式有线电话机短信验证码后台方法 ,供我们参照他事他说加以考察,具体内容如下...

你或然感兴趣的篇章:

  • Python中用PIL库批量给图片加上序号的学科
  • Python中运用PIL库达成图片高斯模糊实例
  • python PIL模块与人身自由生成汉语验证码
  • python生成验证码图片代码分享
  • 详解Python验证码辨识
  • Python网址验证码识别
  • python完成出殡和埋葬和获取手提式有线电话机短信验证码
  • Python验证码辨识管理实例
  • Python验证码识别的办法
  • Python生成验证码实例

本文实例陈诉了Python使用PIL库达成验证码图片的方法。分享给我们供我们参考,具体如下: 今后的...

本文由小鱼儿玄机二站发布于编程应用,转载请注明出处:Python使用PIL库实现验证码图片的方法,python实现

关键词: