灌水脚本--基于LAScript

答应某人做个QQ空间自动灌水的脚本
基本上的功能都有了,可惜还是差了一点点,一直都没有拿出来。
QQ验证码的样本实在太多,该死的图片比较又不是很聪明,4个图片往往只能辨别出2,3个,甚至一个都认不出来。有空的时候自己去写个图片识别的来

不管怎样,还是先把这些脚本给整理出来了,期待有朝一日出来新的图片比较API,让该死的QQ验证码见鬼去吧

----------------------------------------------------获取图片-----------------------------------------------------------------------
getImg= function()
local ele=wb:getEle("temp");--这是模拟程序web界面上的一个节点,用来显示程序运行过程的相关信息
tab={wb:eleImages()}; --枚举web页所有图片

img=image.new();
for i,tele in ipairs(tab) do
if tele:id()=='idtimage' then --获取指定id的图片
tele:exec("Copy"); --拷贝
img:getClipBD() ;--从粘贴板获取
end
end;
img:Crop(1,2,37,18);--修剪图片。查看下载下来的图片,不断微调。 每个验证码图片这个参数可能不同。
img2,img3,img4,img5=img:split(1,4); --分割图片

img:paint(100,100,40,20); --屏幕显示图片
img2:paint(100,120,10,20);
img3:paint(120,120,10,20);
img4:paint(140,120,10,20);
img5:paint(160,120,10,20);
img:save("c:\\temp\\temp.png");--把图片保存到本地
ele:setAttribute("value","已从指定网址得到图像");--在web界面上显示提示信息。
ele:setAttribute("value","拆分并保存图像已经完成");--在web界面上显示提示信息
return img;
end;

------------------------------得到样本图片并保存在数据岛的函数------------------------------------------------------------------
sampleImg=function()
--遍历图片目录,读取样本图片
local tkey={};
win.enumProc = function(dir,filename)
if(not dir)then
tkey[string.sub(filename,9,10)]=string.sub(filename,9,14); --文件名形如c:\test\1a.jpg
end;
return nStop();
end;
win.enumDir("c:\\test\\","*.jpg") --显示该目录*.jpg文件
--k参数为键,v参数表示值 一个典型的tkeyle迭代器回调函数
loadtkey = function(k,v)
local img = image.new();
img:load("C:\\test\\"..k..".jpg");
assert(img:ok(),"C:\\test\\"..k..".jpg".."\n不是有效的图片");

img:bpp(1);
img:bpp(24);
--通过上面两句,轻松去掉验证码上的杂色杂点

img:Crop( 0 , 0 , 9 , 16);--修剪单个字符
img:median(2);--中值滤波进一步去杂点

tkey[k]= string.encode( img:getBytes("*.jpg") , "");
--因为转换到字符串还是二进制,所以用base64进行编码
image.del(img);
end;

--遍历表tkey的所有元素,调用loadtkey加载图片文件
for k,v in pairs(tkey) do
loadtkey(k,v);
end;

--把所有图片保存到数据岛,
ape:saveTable(tkey,"验证码样本")
end;
----------------------------------------------把界面写入web窗体的函数-------------------------------------------------------
write= function()
html = [[
<html>
<head>
<meta http-equiv="Content-Type" c>
<title>form</title>
</head>
<script> LAScript=external;;</script>
<body>
<form name="form1" method="post" action="">
<div id="userdata" style="display:none"></div><br><br>

<INPUT id="loadstring" type="button" value="从指定网址得到图像"><img id="idtimage" src="http://verify.qq.com/getimage?0.9075894487369346">
<br>
<br>
<INPUT id="loadstring" type="button" value="保存样本图片到数据岛">
<br>
<br>
<INPUT id="loadstring" type="button" value="开始校验图片">
<br>
<br>
这里显示程序运行过程相关信息:
<input id="temp" type="text" width="100">
</form>
</body>
</html>
]]
wb:go("about:blank");
delay(100)
wb:wait("about")
wb:write(html);
wb:setTitle(true);
wb:setScroll(true);
delay(1000)
wb:wait("")
wb:show(true);
end;
--------------------------------------------------------------------------------------------------------------------
local timg = {}; --这是一个图像数组,用来储存还原后的验证码样本的图片数据
--必须进行一个转换,因为codekey里面只是base64编码的普通字符串,而timg 将是真正的图片对象(二进制数据)

---------------------------------还原到图片对象--------------------------------------------------------------
toImage = function(k,v)
local img = image.new();
local str = string.decode( v ,"");--首先进行base64解码,将纯文本转换为二进制数据
img:setBytes( str ,"*.jpg");--将二进制数据还原为图像
timg[k] = img;
end;
---------------------------------转换图片验证码到字符串的函数-----------------------------------------
function ImgToString(img)
function test(imgX) --test是一个被包含在函数中的内部函数
sleep(0);
local limit = (60 * 20) + (60 * 20); --最小相似度 local关键字声明为局部变量
local chr = "A"; --读取的字符


--testimg是一个被包含在函数中的内部函数,作为table.foreach的回调函数,k参数表示键,v参数表示值
testimg = function(k,v)
--调用image.testXX()函数得出相似度,类似的函数还有image.testX() image.test()
local n = imgX:testXX(timg[k]); --就是这个“图片比较”太垃圾,不然就没有问题了,55555
if(n<limit)then --比较最小相似度
limit = n;
chr = k.."";
end;
end;

--遍历timg表,并调用testimg函数
for k,v in pairs(timg) do
testimg(k,v);
end;
return string.left(chr,1); --返回读取到的字符串首字符(如果每个字符有多个样本)
end;

--修剪图片
--image.Crop(img, 1 ,2 , 37 ,18 )
img:bpp(1);
img:bpp(24);
--上面的过程必须与下载样本时的代码完全一致。

--使用split函数分割图片
local img2,img3,img4,img5 = img:split(1,4);
win.messagePrint("正在检测图片,请稍候....");
return test(img2)..test(img3)..test(img4)..test(img5);
end;
-----------------------------------输出辨认结果-------------------------------------------
function showresult(str)
--下面我们把验证码的每个字符都转换为大写,并控制键盘顺序按键
code1 = string.upper( string.sub(str,1,1) );
code2 = string.upper( string.sub(str,2,2) );
code3 = string.upper( string.sub(str,3,3) );
code4 = string.upper( string.sub(str,4,4) );
win.consoleOpen()
print(code1);
print(code2);
print(code3);
print(code4);
end

-----------------------------------主调用-----------------------------------------------
wb=web.new();
write();--构建页面
sampleImg();--读取图片样本
tkey = ape:loadTable("验证码样本");
for k,v in pairs(tkey) do --验证样本
toImage(k,v); --转换为图像
end;
img = getImg();--读取图片
showresult(ImgToString(img));
AAuto语言以LAScript脚本语言为基础并基于更为通用的C系语法打造的新一代编程语言,主要面向小型轻量快速开发应用,专用于模拟自动化、web自动化、自动化测试、机器人程序开发 AAuto是世界上首个完美支持静态类型的动态语言,首个完美支持API、REMOTE CALL API、静态回调函数等的新型动态语言。 AAuto广泛吸收各种语言中的优秀语法特性,易学易用、支持快速开发,你几乎可以将任何主流编程语言中的代码作很少的修改就可以在AAuto中更稳定快速的执行。 功能特点: 1、支持一键编译发布为标准PE格式的EXE文件,生成的的EXE为百分百纯净绿色软件,无需制作安装程序。 可选直接编译成byte code二进制字节码(无法从EXE中还原源代码、完全不具可读性的二进制指令码)发布的EXE可独立发布、随处运行、不依赖任何外部程序。 所有引用文件在发布时可选发布为硬盘文件,也可选发布编译为exe资源并生成独立exe程序。无需修改任何代码。一键发布,随处运行。 2、完整支持原生静态语言的所有数据类型、自定义类型(struct),以及所有API函数、c/c 代码百分百的可对应转换为AAuto代码。 首创支持Remote Call API函数,一句代码直接声明位于外部EXE中的函数。 无需任何复杂技术,在外部运行的EXE进程中任意执行代码,与编写本地代码无任何区别。 3、使用$操作符,可将任意的外部代码、文本文件、二进制文件直接包含在代码内部,以编译生成EXE以后,文件即被静态链接到exe中,不再需要外部文件 4、支持可视化windows 窗体设计,可视化UI库使用底层WINSDK编写,并全部开源 5、完美支持标准DLL、同时支持资源DLL、内存DLL、自动识别。智能加载 6、完美支持com编程。 7、AAuto是世界上兼容性最强的语法,无论你学过什么编程语言,在使用AAuto时都可以使用接近你原来编程风格的语法编写代码。 8、AAuto是唯一可以直接与系统底层交互的动态语言,所以也是运行速度最快的动态语言 更新日志 1、 改进 orphanWindow。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值