|
发表于 2011-1-13 13:38:16
|
显示全部楼层
不过这个防挂机制应该也是可以破解的,毕竟是可以通过trigger抓取到信息的.不像fullme什么都抓不到..
刚想了个可能不太成熟的思路,兄台或许可以试试.
大体的思路是先建立每一个地名比如图中的"衡阳"这俩字,给它一个特定的特征码,做成数据库.类似这样的
地名 - 特征码
衡阳 - 012546012501212052454542124
北京 - 210124545402554545212154545
...
然后每次接任务的时候先根据上面这种眼花缭乱图获取一个特征码,然后 特征码->数据库->返回地名.
当然这个只是流程结构,最重要的是要根据所谓的井字图获取一个呈现出来的地名对应的相对唯一的特征码,为什么只能说相对唯一?因为你也说了那些#字会随机的反色,得到的特征码必然会有所偏差,但是偏差是很小的,否则都反色了真人也认不出字来别说机器人了...这个偏差的控制可以在后面通过数值的对比来控制.
再看上面的图,两张是33列,两张是34列.(眼花,可能数错.),列数随机但好在幅度不大,这个没什么办法,分别建立33的数据库和34的数据库吧,再通过获取字段长度的函数来决定调用33还是34.
以33列的为例,比如第二张图和第三张图都是33列,然后看它每一列分别有几盏灯亮了,第二张图第一列有1个黄灯,第二列有2个黄灯,第三列6个......得到一串数字126326674503(10)...一共33个数,后面没数了,眼花;第三张图得到的数字是127326674513(10)...
两个数字不尽相同但是差距很小,相对位数上的差值正负2,且大多数都是相同的.这当然不是巧合,同一个衡阳的衡嘛,又没有茴香豆的茴那么多写法.这两串数字的差距可以量化成数字,以让函数取舍根据抓取的数字串到底取用哪个地名.两串数字相对,对应的位数相减取绝对值,然后把这些绝对值相加,就可以得到一个代表这两个数字串之间差距的数字.上面这两个数字串的差别换成数字就是1+2+1=4,如果你设定误差上限是5,就可以判定这两个特征码属于"吻合"范畴了.
如果不是衡阳的衡字,会不会得到跟这个字串相同或相近的特征码?不能说没有,几率微乎其微,跟中500W有的一拼,忽略.
为什么取每列的灯数做特征码而不是每行?因为每列只写一个字而每行写两个字,而这两个字的相对位置包括相对高度和间距都是变的,没法作为参照.
然后就是怎么获取这个数字串的问题了.其实这个对于特征码的对比取舍来说倒是比较容易解决的.可以建立一个非颜色触发和两个颜色触发.非颜色触发也就是普通触发那个,match= 整个一行##########,点下"保持有效性",用来获取行数,因为是一个接一个地触发的,建议用数组变量,比如如果是mush客户端,在准备抓取内容的时候赋值一个变量比如"行号"=0; ArrayCreate(行号) 然后触发内容可以这样:行号 = 行号+1,ArrayCreate(行号).
这样一来每一行########## 出现,tri就会新建一个名称为行号(1/2/3....)的数组,内容是空的,用来存储0或者1.
然后两个颜色触发就用#这个符号做触发,一个是灰色的#,一个是黄色的#,同样是循环触发,还是用数组变量.先定义一个变量"列号"=0,每触发一次列号+1,然后ArraySet(行号,列号,开关) 列号加到列宽时清零数组,开始新一行.开关那里,灰色#的触发里就是"0",黄色#的触发里就是"1".
这样第一行##########扫过之后,我们得到一个名称为"1"的数组,里面有33个键值对,应该是这种结构
序 1 2 3 4 5 6 7 8 9.....
值 1 0 0 1 0 1 0 0 1.....
第N行###########过后得到一个名为"N"的数组,33个键值对跟上面结构一样.
最后一行过后,就有了17个数组,每个数组里面33对值,用ArrayGet("1","5")这样的方式可以获知第一行的第五列的值,这样很容易可以把所有列的第一行相加,第二行相加......最后就可以得到一个类似序列号一样的东西了,就是前面126326674503(10)...这种样子的.写进数据库里头,每次用触发抓取的特征码跟数据库里面的特征码相对照就可以了.
这是理想的状态,这种相加的方式可以解决地名字在#号图内上下浮动的问题,因为不管上浮下移,投影是不变的;但是不能解决字水平移动的情况,更烦的是"衡阳"这两个字是互相独立的,所以我现在能想到的办法只有把#字图从中间竖直地一分为二,再丢弃接头部分的一到两列,用剩下的来获取数据.
总之我个人意见,如果地名总是两个字,还有办法解,如果地名有可能是3到4个字,那用我上面说的这种方法无能为力,因为字跟字之间的相对位置漂浮不定,抓不到相对唯一的特征码.
以上纯属纸上谈兵,没经过测试. |
|