1.验证码识别为什么要选择优优云?
2.什么叫源码
3.利用c#语言生成四位数字的验源码验证源验证码的代码并详细注释
4.Python OpenCV 过点击式和滑动式图形验证码的校验
5.c# 数字和英文字母的 验证码
验证码识别为什么要选择优优云?
优优云,作为全球领先的证码智能识别平台,其验证码识别服务能够显著提升软件效率,识别最高可达到倍的码识速度提升。通过集成其API和Demo,别开开发者可以轻松接入,验源码验证源网云穿源码支持超过种编程语言,证码如C、识别C++、码识C#、别开Java等,验源码验证源极大地简化了开发过程。证码 优优云关注用户体验,识别致力于解放用户在繁琐的码识手动打码上的时间,让操作更加便捷。别开它的7x小时不间断服务确保了高效性,每张验证码的平均识别时间只需0到3秒,速度之快让人印象深刻。 稳定性是快鸡源码优优云的另一大亮点,平台背后有台智能服务器和人的专业校正团队,确保识别的准确性和稳定性。更重要的是,错误码和超时码在计费上不会被扣除,使得服务费用更加精准合理。 作为中国公司的代表,优优云(UU云)始终以提供最完美的解决方案为目标,专注于为软件开发者、工作室和普通用户打造极致的验证码识别体验。无论是专业团队还是个人用户,都能在优优云这里找到满意的答案,解决验证码识别的难题。扩展资料
有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,腾讯的QQ社区),我们利用比较简易的方式实现了这个功能。什么叫源码
源程序是指未编译的文本代码。
验证码主要是栅栏源码实现为防止暴利破解,所以需要防止识别。所以验证码一般情况下为书写不正规,且有随机的背景杂点,或杂线
源代码(也称源程序),是指一系列人类可读的计算机语言指令。
在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。
作用
源代码主要功用有如下2种作用:
生成目标代码,即计算机可以识别的代码。
对软件进行说明,即对软件的编写进行说明。为数不少的初学者,甚至少数有经验的easyswoole源码分析程序员都忽视软件说明的编写,因为这部分虽然不会在生成的程序中直接显示,也不参与编译。但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。
需要指出的是,源代码的修改不能改变已经生成的目标代码。如果需要目标代码做出相应的修改,必须重新编译。
代码组合
源代码作为软件的特殊部分,可能被包含在一个或多个文件中。一个程序不必用同一种格式的源代码书写。例如,一个程序如果有C语言库的支持,那么就可以用C语言;而另一部分为了达到比较高的外汇托管源码运行效率,则可以用汇编语言编写。
较为复杂的软件,一般需要数十种甚至上百种的源代码的参与。为了降低种复杂度,必须引入一种可以描述各个源代码之间联系,并且如何正确编译的系统。在这样的背景下,修订控制系统(RCS)诞生了,并成为研发者对代码修订的必备工具之一。
还有另外一种组合:源代码的编写和编译分别在不同的平台上实现,专业术语叫做软件移植。
版权
如果按照源代码类型区分软件,通常被分为两类:自由软件和非自由软件。自由软件一般是不仅可以免费得到,而且公开源代码;相对应地,非自由软件则是不公开源代码。所有一切通过非正常手段获得非自由软件源代码的行为都将被视为非法。
质量
对于计算机而言,并不存在真正意义上的“好”的源代码;然而作为一个人,好的书写习惯将决定源代码的好坏。源代码是否具有可读性,成为好坏的重要标准。软件文档则是表明可读性的关键。
效率
虽然我们可以通过不同的语言来实现计算机的同一功能,但在执行效率上则存在不同。普遍规律是:越高级的语言,其执行效率越低。这也是为什么汇编语言生成的文件比用VB语言生成文件普遍要小的原因。
利用c#语言生成四位数字的验证码的代码并详细注释
public byte[] GetVerifyCode(string code)
{
int codeW = ;
int codeH = ;
int fontSize = ;
string chkCode = string.Empty;
//颜色列表,用于验证码、噪线、噪点
Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
//字体列表,用于验证码
string[] font = { "Times New Roman" };
//验证码的字符集,去掉了一些容易混淆的字符
char[] character = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'd', 'e', 'f', 'h', 'k', 'm', 'n', 'r', 'x', 'y', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };
Random rnd = new Random();
//生成验证码字符串
for (int i = 0; i < 4; i++)
{
chkCode += character[rnd.Next(character.Length)];
}
//写入Session、验证码加密
WebHelper.WriteSession(code, Md5.md5(chkCode.ToLower(), ));
//创建画布
Bitmap bmp = new Bitmap(codeW, codeH);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);
//画噪线
for (int i = 0; i < 3; i++)
{
int x1 = rnd.Next(codeW);
int y1 = rnd.Next(codeH);
int x2 = rnd.Next(codeW);
int y2 = rnd.Next(codeH);
Color clr = color[rnd.Next(color.Length)];
g.DrawLine(new Pen(clr), x1, y1, x2, y2);
}
//画验证码字符串
for (int i = 0; i < chkCode.Length; i++)
{
string fnt = font[rnd.Next(font.Length)];
Font ft = new Font(fnt, fontSize);
Color clr = color[rnd.Next(color.Length)];
g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * , (float)0);
}
//将验证码写入内存流,并将其以 "image/Png" 格式输出
MemoryStream ms = new MemoryStream();
try
{
bmp.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
catch (Exception)
{
return null;
}
finally
{
g.Dispose();
bmp.Dispose();
}
}
Python OpenCV 过点击式和滑动式图形验证码的校验
在近期进行App抓包的过程中,我发现该App在特定时间会弹出验证码。完成验证后,系统会提供token,此token是发起正常请求所必需的。
文章源码地址:github.com/ThinkerWen/C...
以下是验证码的截图:
弹出验证码的Response如下:
完成验证码的Request如下:
通过观察,我发现只需将验证码的点击坐标发送至完成验证码的接口,即可获取到token。因此,现在的目标是提取坐标。
观察发现,这个验证码相对简单,因为它没有图案扭曲,所以通过率较高。同时,我也回忆起之前解决滑动验证码的方法(一并展示)。
要通过验证码,首先需要将目标图案在背景上定位,找到其像素点。为此,我使用了Python的OpenCV库进行识别。
1.提取:首先,我发现目标都是黑色图案,背景为透明。当我使用cv2.imread(front_image)加载时,显示一片漆黑。即使后来我使用了保留透明通道的加载方式,结果依旧。
为了解决这个问题,我决定剥离透明通道,将目标图案透明色设置为白色,这样目标图案就自然显现了。
2.找到目标图的位置:接着,我将目标的三个图案分割出来,分别找出它们的像素位置。由于图案排列位置固定,我直接记录坐标进行像素分割。
分割后,我将目标图和背景图都转化为灰度,以防止颜色干扰。
然后进行最佳匹配。然而,匹配结果并不理想,无法准确找到所有三个目标图案,因此需要进一步优化。
3.优化匹配方案:继续观察后,我发现背景中的目标图案总是白色的,因此我决定保留背景上的白色部分,其余部分转为黑色。
为了尽可能保留完整的图案,我经过多次尝试,发现-区间的RGB颜色可以保留大部分目标图案的白色。
同时,我将黑色的目标图案反转为白色。
由于需要获取的是点击坐标,我将左上角坐标(x1,y1)进行+的偏移,以移动到图案本身上面。
经过验证,现在的识别方法可以正常通过点击验证码。
滑动验证码的解决方案与点击验证码类似,甚至现在常见的一种滑动验证码已经有了通用的代码。
看雪ID:暮至夜寒
看雪-安全社区|安全招聘|kanxue.com
本文为看雪论坛精华文章,由暮至夜寒原创,转载请注明来自看雪社区
阅读原文:
c# 数字和英文字母的 验证码
protected void Page_Load(object sender, EventArgs e)
{
VerifyCode v = new VerifyCode();
v.Length = this.length;
v.FontSize = this.fontSize;
v.Chaos = this.chaos;
v.BackgroundColor = this.backgroundColor;
v.ChaosColor = this.chaosColor;
v.CodeSerial = this.codeSerial;
v.Colors = this.colors;
v.Fonts = this.fonts;
v.Padding = this.padding;
string code = v.CreateVerifyCode(); // 取随机码
v.CreateImageOnPage(code, this.Context); // 输出
Response.Cookies.Add(new HttpCookie("vCode", code)); // 使用Cookies取验证码的值
}
//验证码长度(默认6个验证码的长度)
int length = 4;
public int Length
{
get { return length; }
set { length = value; }
}
//验证码字体大小(为了显示扭曲效果,默认像素,可以自行修改)
int fontSize = ;
public int FontSize
{
get { return fontSize; }
set { fontSize = value; }
}
//边框补(默认1像素)
int padding = 1;
public int Padding
{
get { return padding; }
set { padding = value; }
}
//是否输出燥点(默认为输出)
bool chaos = true;
public bool Chaos
{
get { return chaos; }
set { chaos = value; }
}
//输出燥点的颜色(默认灰色)
Color chaosColor = Color.LightGray;
public Color ChaosColor
{
get { return chaosColor; }
set { chaosColor = value; }
}
//自定义背景色(默认白色)
Color backgroundColor = Color.White;
public Color BackgroundColor
{
get { return backgroundColor; }
set { backgroundColor = value; }
}
//自定义随机颜色数组
Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
public Color[] Colors
{
get { return colors; }
set { colors = value; }
}
//自定义字体数组
string[] fonts = { "Arial", "Georgia" };
public string[] Fonts
{
get { return fonts; }
set { fonts = value; }
}
//自定义随机码字符串序列(使用逗号分隔)
string codeSerial = "0,1,2,3,4,5,6,7,8,9,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";//可以在此处修改你想要显示的字符
public string CodeSerial
{
get { return codeSerial; }
set { codeSerial = value; }
}
//生成校验码
public Bitmap CreateImageCode(string code)
{
int fSize = FontSize;
int fWidth = fSize + Padding;
int imageWidth = (int)(code.Length * fWidth) + 4 + Padding * 2;
int imageHeight = fSize * 2 + Padding;
System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth, imageHeight);
Graphics g = Graphics.FromImage(image);
g.Clear(BackgroundColor);
Random rand = new Random();
//给背景添加随机生成的燥点
if (this.Chaos)
{
Pen pen = new Pen(ChaosColor, 0);
int c = Length * ;
for (int i = 0; i < c; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(pen, x, y, 1, 1);
}
}
int left = 0, top = 0, top1 = 1, top2 = 1;
int n1 = (imageHeight - FontSize - Padding * 2);
int n2 = n1 / 4;
top1 = n2;
top2 = n2 * 2;
Font f;
Brush b;
int cindex, findex;
//随机字体和颜色的验证码字符
for (int i = 0; i < code.Length; i++)
{
cindex = rand.Next(Colors.Length - 1);
findex = rand.Next(Fonts.Length - 1);
f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
b = new System.Drawing.SolidBrush(Colors[cindex]);
if (i % 2 == 1)
{
top = top2;
}
else
{
top = top1;
}
left = i * fWidth;
g.DrawString(code.Substring(i, 1), f, b, left, top);
}
//画一个边框 边框颜色为Color.White
g.DrawRectangle(new Pen(Color.White, 0), 0, 0, image.Width - 1, image.Height - 1);
g.Dispose();
return image;
}
//将创建好的输出到页面
public void CreateImageOnPage(string code, HttpContext context)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
Bitmap image = this.CreateImageCode(code);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ClearContent();
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(ms.GetBuffer());
ms.Close();
ms = null;
image.Dispose();
image = null;
}
//生成随机字符码
public string CreateVerifyCode(int codeLen)
{
if (codeLen == 0)
{
codeLen = Length;
}
string[] arr = CodeSerial.Split(',');
string code = "";
int randValue = -1;
Random rand = new Random(unchecked((int)DateTime.Now.Ticks));
for (int i = 0; i < codeLen; i++)
{
randValue = rand.Next(0, arr.Length - 1);
code += arr[randValue];
}
return code;
}
public string CreateVerifyCode()
{
return CreateVerifyCode(0);
}
网上好多,你可以搜搜!
2024-11-13 15:01
2024-11-13 15:01
2024-11-13 14:39
2024-11-13 13:43
2024-11-13 13:31
2024-11-13 13:18