驗證碼自動識別源碼
⑴ 驗證碼源代碼,jsp
<%@ page language="java" import="java.util.*" pageEncoding="數租UTF-8"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.awt.Graphics2D"%>
<%@page import="java.awt.Color"%>
<%@page import="java.awt.Font"%>
<%@page import="javax.imageio.ImageIO"%>
<%
int width = 60;
int height = 20;
// 創建具有可訪問圖像數據緩沖區的Image
BufferedImage buffImg = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
// 創建一個隨機數生成器
Random random = new Random();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 創建字體,字體的大小應該根據圖片的高度來定薯拍兆
Font font = new Font("Times New Roman", Font.PLAIN, 18);
// 設置字體
g.setFont(font);
//賀滑 畫邊框
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
// 隨機產生160條干擾線
g.setColor(Color.LIGHT_GRAY);
for (int i = 0; i < 160; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int x1 = random.nextInt(12);
int y1 = random.nextInt(12);
g.drawLine(x, y, x + x1, y + y1);
}
// randomCode 用於保存隨機產生的驗證碼
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0;
// 隨機產生4位數字的驗證碼
for (int i = 0; i < 4; i++) {
// 得到隨機產生的驗證碼數字
String strRand = String.valueOf(random.nextInt(10));
// 產生隨機的顏色分量來構造顏色值
red = random.nextInt(110);
green = random.nextInt(50);
blue = random.nextInt(50);
// 用隨機產生的顏色將驗證碼繪制到圖像中
g.setColor(new Color(red, green, blue));
g.drawString(strRand, 13 * i + 6, 16);
randomCode.append(strRand);
}
// 將四位數字的驗證碼保存到session中
//HttpSession session = request.getSession();
session.setAttribute("randomCode", randomCode.toString());
// 禁止圖像緩存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
// 將圖像輸出到servlet輸出流中
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(buffImg, "jpeg", sos);
sos.close();
//sos = null;
out.clear();
out = pageContext.pushBody();
%>
⑵ 易語言網頁掃號
答1。不需要用到模塊,HTTP讀文祥野件() 不需要用物如到精易助手。 答2。每個人都有自己的思路,相信自己的思路,按照自己的思路去寫,去摸索。 如果掃號需要訪問到猴島,那麼可能CPU內存等會逐漸提高,但如果你電腦配置好那就另當別論。 答3。判斷登陸可以通過讀取網站返回來判斷是否成功。 易語言可以寫識別驗證碼,但這對於菜鳥來說是一重大難題。 By:Kiss灬小豬罩宴啟 希望採納!
⑶ 驗證碼人工代答平台哪個好
答題平台又稱遠程答題平台,驗證碼自動識別平台;
具有對驗證碼自動識別,自動輸入等功能;
網上有答 題 吧驗證碼識別平台可以去看看;
⑷ 求大神 .NET怎樣寫個桌面程序,自動掃描驗證碼並截取出來 求源碼
開啟線程,訪問指定的驗證碼鏈接
獲取驗證碼地址
背景噪音和二值化
製作字元樣本
匹配
優化和調整
驗證結果
http://wenku..com/view/d752810916fc700abb68fc71.html
http://www.cnblogs.com/Aimeast/archive/2012/10/13/2722488.html
⑸ 如何利用python做簡單的驗證碼識別
1摘要
驗證碼是目前互聯網上非常常見也是非常重要的一個事物,充當著很多系統的防火牆功能,但是隨時OCR技術的發展,驗證碼暴露出來的安全問題也越來越嚴峻。本文介紹了一套字元驗證碼識別的完整流程,對於驗證碼安全和OCR識別技術都有一定的借鑒意義。
然後經過了一年的時間,筆者又研究和get到了一種更強大的基於CNN卷積神經網路的直接端到端的驗證識別技術(文章不是我的,然後我把源碼整理了下,介紹和源碼在這裡面):
基於python語言的tensorflow的『端到端』的字元型驗證碼識別源碼整理(github源碼分享)
2關鍵詞
關鍵詞:安全,字元圖片,驗證碼識別,OCR,Python,SVM,PIL
3免責聲明
本文研究所用素材來自於某舊Web框架的網站完全對外公開的公共圖片資源。
本文只做了該網站對外公開的公共圖片資源進行了爬取,並未越權做任何多餘操作。
本文在書寫相關報告的時候已經隱去漏洞網站的身份信息。
本文作者已經通知網站相關人員此系統漏洞,並積極向新系統轉移。
本報告的主要目的也僅是用於OCR交流學習和引起大家對驗證安全的警覺。
4引言
關於驗證碼的非技術部分的介紹,可以參考以前寫的一篇科普類的文章:
互聯網安全防火牆(1)--網路驗證碼的科普
裡面對驗證碼的種類,使用場景,作用,主要的識別技術等等進行了講解,然而並沒有涉及到任何技術內容。本章內容則作為它的技術補充來給出相應的識別的解決方案,讓讀者對驗證碼的功能及安全性問題有更深刻的認識。
5基本工具
要達到本文的目的,只需要簡單的編程知識即可,因為現在的機器學習領域的蓬勃發展,已經有很多封裝好的開源解決方案來進行機器學習。普通程序員已經不需要了解復雜的數學原理,即可以實現對這些工具的應用了。
主要開發環境:
python3.5
python SDK版本
PIL
圖片處理庫
libsvm
開源的svm機器學習庫
准備原始圖片素材
圖片預處理
圖片字元切割
圖片尺寸歸一化
圖片字元標記
字元圖片特徵提取
生成特徵和標記對應的訓練數據集
訓練特徵標記數據生成識別模型
使用識別模型預測新的未知圖片集
達到根據「圖片」就能返回識別正確的字元集的目標
- def get_feature(img): """
- 獲取指定圖片的特徵值,
- 1. 按照每排的像素點,高度為10,則有10個維度,然後為6列,總共16個維度
- :param img_path:
- :return:一個維度為10(高度)的列表 """
- width, height = img.size
- pixel_cnt_list = []
- height = 10 for y in range(height):
- pix_cnt_x = 0 for x in range(width): if img.getpixel((x, y)) == 0: # 黑色點
- pix_cnt_x += 1
- pixel_cnt_list.append(pix_cnt_x) for x in range(width):
- pix_cnt_y = 0 for y in range(height): if img.getpixel((x, y)) == 0: # 黑色點
- pix_cnt_y += 1
- pixel_cnt_list.append(pix_cnt_y) return pixel_cnt_list
關於環境的安裝,不是本文的重點,故略去。
6基本流程
一般情況下,對於字元型驗證碼的識別流程如下:
7素材准備
7.1素材選擇
由於本文是以初級的學習研究目的為主,要求「有代表性,但又不會太難」,所以就直接在網上找個比較有代表性的簡單的字元型驗證碼(感覺像在找漏洞一樣)。
最後在一個比較舊的網站(估計是幾十年前的網站框架)找到了這個驗證碼圖片。
原始圖:
然後就將圖片素材特徵化,按照libSVM指定的格式生成一組帶特徵值和標記值的向量文
⑹ c# Winform 實現登錄界面驗證碼功能(文末附源碼)
閑來無事,最近自己發現自己的驗證碼功能還沒有寫過。於是就寫下了這篇文章。
界面就比較丑了,一個picturebox,一個textbox,一個button按鈕主要想的是先把功能實現了,萬一以後業務上需要使用呢。
實現以後的功能圖
在文本框中輸入對應文字,點擊確定來驗證,正確時候如圖所示
如果驗證失敗,沒有提示,直接更新驗證碼,當然需要使用的時候根據業務邏輯來就是了,這個就比較簡單了。
第一:生成驗證碼字元串,用到的是Random隨機函數
第二:將該字元串畫在picturebox中
第三點擊圖片,刷新驗證碼
第四驗證驗證碼不區分大小寫
或者區分大小寫
此時完成
源碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace suijima
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//驗證碼的長度
private const int iVerifyCodeLength = 6;
//驗證碼
private String strVerifyCode = "";
//匹配字元的臨時變數
string strTemp = "";
private void btnUpdate_Click(object sender, EventArgs e)
{
UpdateVerifyCode();
}
private void Form1_Load(object sender, EventArgs e)
{
UpdateVerifyCode();
}
//更新驗證碼
private void UpdateVerifyCode()
{
strVerifyCode = CreateRandomCode(iVerifyCodeLength);
if(strVerifyCode=="")
{
return;
}
strTemp = strVerifyCode;
CreateImage(strVerifyCode);
}
//生成驗證碼字元串
private string CreateRandomCode(int iLength)
{
int rand;
char code;
string randomCode = String.Empty;
//生成一定長度的驗證碼
System.Random random = new Random();
for (int i = 0; i < iLength; i++)
{
rand = random.Next();
if (rand % 3 == 0)
{
code = (char)('A' + (char)(rand % 26));
}
else
{
code = (char)('0' + (char)(rand % 10));
}
randomCode += code.ToString();
}
return randomCode;
}
/// 創建驗證碼圖片
private void CreateImage(string strVerifyCode)
{
try
{
int iRandAngle = 45; //隨機轉動角度
int iMapWidth = (int)(strVerifyCode.Length * 21);
Bitmap map = new Bitmap(iMapWidth, 28); //創建圖片背景
Graphics graph = Graphics.FromImage(map);
graph.Clear(Color.AliceBlue);//清除畫面,填充背景
graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//畫一個邊框
graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式
Random rand = new Random();
//背景噪點生成
Pen blackPen = new Pen(Color.LightGray, 0);
for (int i = 0; i < 50; i++)
{
int x = rand.Next(0, map.Width);
int y = rand.Next(0, map.Height);
graph.DrawRectangle(blackPen, x, y, 1, 1);
}
//驗證碼旋轉,防止機器識別
char[] chars = strVerifyCode.ToCharArray();//拆散字元串成單字元數組
//文字距中
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
//定義顏色
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green,
Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//定義字體
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋體" };
for (int i = 0; i < chars.Length; i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(5); Font f = new System.Drawing.Font(font[findex], 13, System.Drawing.FontStyle.Bold);//字體樣式(參數2為字體大小)
Brush b = new System.Drawing.SolidBrush(c[cindex]);
Point dot = new Point(16, 16);
float angle = rand.Next(-iRandAngle, iRandAngle);//轉動的度數
graph.TranslateTransform(dot.X, dot.Y);//移動游標到指定位置
graph.RotateTransform(angle);
graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
graph.RotateTransform(-angle);//轉回去
graph.TranslateTransform(2, -dot.Y);//移動游標到指定位置
}
pictureBox1.Image = map;
}
catch (ArgumentException)
{
MessageBox.Show("創建圖片錯誤。");
}
}
private void button1_Click(object sender, EventArgs e)
{
//驗證大小寫
char[] ch1 = textBox1.Text.ToCharArray();
char[] ch2 = strTemp.ToCharArray();
int nCount = 0;
for (int i = 0; i < strTemp.Length;i++ )
{
if((ch1[i]>='a'&&ch1[i]<='z')||(ch1[i]>='A'&&ch1[i]<='Z'))
{
if (ch1[i] - 32 == ch2[i] || ch1[i] + 32 == ch2[i])
{
nCount++;
}
}
else
{
if (ch1[i]==ch2[i])
{
nCount++;
}
}
}
if (nCount==strTemp.Length)
{
MessageBox.Show("驗證通過");
}
else
{
UpdateVerifyCode();
textBox1.Text = "";
}
////不能驗證大小寫
//if(textBox1.Text==strTemp)
//{
// MessageBox.Show("驗證通過");
//}
//else
//{
// UpdateVerifyCode();
// textBox1.Text = "";
//}
}
/// <summary>
/// 圖片點擊事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_Click(object sender, EventArgs e)
{
UpdateVerifyCode();
}
}
}
⑺ 驗證碼 代碼
你在java發這個問題!我就把java 的驗證碼源碼給你。
<tr>
<td><font color="#FFFFFF">驗證碼:</font></td>
<td width="22%"><input type="text" name="randomcode" class='input' size='4' maxlength="8" style="width:50px;height:18px" onKeyDown="if (event.keyCode==13)submitLogin();">
</td>
<td width="48%"><img src="./showradomcode.jsp"></td>
</tr>
文件二:showradomcode.jsp
<%@ page contentType="image/jpeg" import="java.awt.image.*,javax.imageio.*" %><jsp:useBean id="rc" class="com.hanweb.sso.ldap.util.RandomChar" scope="page"/><%
//設置頁面不緩存
//response.reset();
response.setContentType("image/jpeg");
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
//在內存中創建圖象寬60 高18 4個字元 0條干擾線
BufferedImage image = rc.getRandomImage(58, 18, 4, 1);
//設置其session值
session.setAttribute("jcmsrandomchar", rc.getRandomString());
session.setMaxInactiveInterval(100000000);
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
文件三:RandomChar.java
package com.hanweb.sso.ldap.util;
/**
* Title: 隨機碼圖形生成程序的處理 Description:
* 為了加強網路安全,防止黑課工具對系統的攻擊,現在通用隨機碼來解決這個問題,因為每一次產生的隨機碼是隨機的,所以使用窮舉法破解密碼的工具就無能為力了
* Copyright: Copyright (c) 2004-2010 Company: SDLDAP
*
* @author LiChanglai
* @version 1.0
*/
import java.util.*;
import java.awt.*;
import java.awt.image.*;
public class RandomChar {
/**
* 給定范圍獲得隨機顏色
*
* @param fc
* int 參數1
* @param bc
* int 參數2
* @return Color 返回的color對象
*/
private String strRandomString; // 生成的隨機數
/**
* 取其生成的隨機數
*
* @return String
*/
public String getRandomString() {
return strRandomString;
}
/**
* 設置其生成的隨數
*
* @param randomString
* String
*/
public void setRandomString(String randomString) {
this.strRandomString = randomString;
}
/**
* 取其某一范圍的color
*
* @param fc
* int 范圍參數1
* @param bc
* int 范圍參數2
* @return Color
*/
private Color getRandColor(int fc, int bc) {
// 取其隨機顏色
Random random = new Random();
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
/**
* 用於生成其隨機數
*
* @param randomCount
* int 隨機數總長度
* @return String 返回的隨機數
*/
private String getRandomString(int nRandomCount) {
/*
* String[] a = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
* "B", "C", "D", "E", "F", "G", "H", "I", "G", "K", "L", "M", "N", "O",
* "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c",
* "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q",
* "r", "s", "t", "u", "v", "w", "x", "y", "z" };
*/
String[] a = { "a", "b", "c", "d", "e", "f", "g", "h", "g", "k", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
String strRand = "";
int nRand;
// 取其隨機數的總數
int LengthOfRandom = a.length;
// 生成隨機類
Random random = new Random();
// 循環取隨機取其整數,並將其整數所對應的結果進行累加
for (int i = 0; i < nRandomCount; i++) {
nRand = random.nextInt(LengthOfRandom);
strRand += a[nRand];
}
// 返回累加後的結果
return strRand;
}
/**
* 生成其隨機的圖形
*
* @param width
* int 生成圖形的寬度
* @param height
* int 生成圖形的高度
* @param nLengthOfRandom
* int 隨機碼的個數
* @param nDisturbLineCount
* int 干擾線的條數
* @return BufferedImage
*/
public BufferedImage getRandomImage(int nWidth, int nHeight,
int nLengthOfRandom, int nDisturbLineCount)
{
// 在內存中創建圖象
BufferedImage image = new BufferedImage(nWidth, nHeight,
BufferedImage.TYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = image.getGraphics();
String strRand = "";
nLengthOfRandom = (nLengthOfRandom <= 0) ? 6 : nLengthOfRandom;
nDisturbLineCount = (nDisturbLineCount <= 0) ? 0 : nDisturbLineCount;
// 生成隨機類
Random random = new Random();
// 設定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, nWidth, nHeight);
// 設定字體
g.setFont(new Font("Times New Roman", Font.PLAIN, 16));
// 畫邊框
g.setColor(new Color(255, 255, 255));
g.drawRect(0, 0, nWidth - 1, nHeight - 1);
// 隨機產生nDisturbLineCount條干擾線,使圖象中的認證碼不易被其它程序探測到
g.setColor(getRandColor(160, 200));
for (int i = 0; i < nDisturbLineCount; i++) {
int x = random.nextInt(nWidth);
int y = random.nextInt(nHeight);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取隨機產生的認證碼(6位)
strRand = this.getRandomString(nLengthOfRandom);
// 設置其屬性randomString的值
this.strRandomString = strRand;
for (int i = 0; i < nLengthOfRandom; i++) {
// 將認證碼顯示到圖象中
g.setColor(new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), 20 + random.nextInt(110)));
// 調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成
g.drawString(strRand.substring(i, i + 1), 13 * i + 5, 14);
}
// 圖象生效
g.dispose();
return image;
}
}
⑻ (源碼分享)利用Python識別提取圖像文字(中文英文都可以)
你想了解怎麼利用程序自動識別網站驗證碼嗎?識別提取圖像文字(中文英文都可以)
分享一點簡單有用的小項目:python
源碼分享如下:
看視頻教程鏈接:(點擊識別圖像文字視頻教程鏈接)
一、首先需要安裝 Tesseract模塊及 語言包
Tesseract OCR光學字元識別
Windows系統:
安裝網站 (放在不需要許可權的純英文路徑下):
: https://digi.bib.uni-mannheim.de/tesseract/
可以下載一些語言包:
https://github.com/tesseract-ocr/
安裝完成後,如果想要在命令行中使用Tesseract,那麼應該設置環境變數。
還有一個環境變數需要設置的是,要把訓練的數據文件路徑也放到環境變數中。
在環境變數中,添加一個TESSDATA_PREFIX=C:path_to_tesseractdata eseractdata。
在Python代碼中操作tesseract。需要安裝一個庫,叫做pytesseract。通過pip的方式即可安裝:
pip install pytesseract
並且,需要讀取圖片,需要藉助一個第三方庫叫做PIL。通過pip list看下是否安裝。如果沒有安裝,通過pip的方式安裝:
pip install PIL
使用pytesseract將圖片上的文字轉換為文本文字的示例代碼如下: