0 序言
最近在学逆向破解, 感觉自己小有成就,于是向两年前的一个签到网站发起了总攻
文章也征得网站管理员同意
1 验证码的类型
我所知道的验证码有三种
-
第一种(超级普通验证码)
没打广告(极验)
你只需要点一下的,这种就是增加一点点难度,点击一下,看看你是不是个人
-
第二种(输入字符)
这种的话,老网站会看到,但是我觉得这个挺丑的,也不太好用,体验性很差
-
第三种 (滑动验证码)
这种如果做的简单,模拟鼠标滑动基本就过去了,这种体验性还说的过去吧,看你是不是个正常的人类
-
第四种(滑块验证码)
滑动式(自己写的,咳咳)
项目地址 : https://gitee.com/Whatarey_admin/captcha_-python (欢迎大家来点star)
这种相对来说, 有了点趣味,更容易让人接受
我也挺喜欢这种验证码的
-
第五种(点触验证码)
点触验证码,这种的安全性稍微好一些,但是体验性下来了
-
第六种(智能验证码)
随机切换
就好比机验的智能验证,一下是点一下就成功,还有些点一下来一个二次滑动,这种验证码出现不随机,验证码什么类型的都有,调试也难
但是对于大佬,还是一句话的事情,只要把前面四种验证码都了解了一下,基本有跟没有没区别
2 破解验证码的思路
第一种
没啥, click 一下就行了
第二种
otc 识别一下就行了 ,百度上很多
第三种
滑动
这种需要模拟浏览器操作, 忽快忽慢, 不能太快, 我这个 也没怎么弄, 但是也成功了 (前期的jq22 网站就是这个)
第四种
这种需要把图片截取下来,然后识别缺口图的位置 (我这也是理论,没有实际用到,但是肯定是这样没毛病的) 一般的 都是一张大图,一张小图
还有种比较高级的
大家请打开极验 https://www.geetest.com/Sensebot 然后F12,咳咳,不好意思,看到他们的招聘了
真的是,不放张小姐姐照片,我们会去?
极验的有三张图片,并且图片不是 合并的
不像我做的这个(瞬间感觉自己做的好菜)
这种的话,我直接图片另存为,也别搞那些花里花俏的
第五种
其实跟上面的第二种验证码类似,也是需要识别,但是在识别的是否,需要加上坐标点击
而识别他的位置,这才是他的核心,这种验证码,看了很多种都是需要借助第三方平台(超级鹰是一个)但是本着能白嫖就白嫖的机会,我是鄙视的(花钱的东西干着没意思)这也为本文埋下了伏笔
还有这方法就是自己做模型,机器学习(呜呜呜,我不会,好难啊),至少市面上这种看起来破解难度比较大,成本也比较高,用户体验度没有第三,第四种好
第六种
差不多了,前五种都会了,还怕个锤子,直接干就行了
3 破解
咳咳,现在在进入主题了,让我说一下废话
3.1 初窥网站接口
大家都知道,我是后端嘛,在js动画这方面,我的确比较菜逼,所以需要做一些精美动画,脱离前端,我就只能找模板了,这不找到了一个,但是有些好看的资源是收费的
3个,不贵, 我的305 还是存了几年,其中20个还是把bug告诉站长了,赠送我的20个(呜呜呜呜,我好难,应该自己在白嫖一些)
于是 我看了下获取来源,呵呵,简单呀,
签到说明:连续签到3天以上,每天签到都会获得1个币.
而网站第一个版本的签到是这样的
瞬间我就美丽了
恰逢那段时间 对 selenium
感兴趣
于是仔细分离了他的代码
首先需要登录,等于可以选择多种登录方式, 我选择了qq(注意,qq登录在初期几次,很容易出来滑动验证码,后面就没有了,这里我是出来验证码就重新登录,后面就没这个问题了)
之后就进去个人中心
然后签到
伪代码
driver = webdriver.Chrome(
options=options, executable_path="C:chromedriver.exe")
driver.get(self.url)
driver.find_element_by_xpath(
'//div[@id="navbar"]/ul/li[8]/a').click() # 确定
time.sleep(5)
driver.find_element_by_xpath(
'//div[@class="d3f modal-body tcck2"]/a[@class="qq"]').click() # 找到使用密码登录
driver.switch_to.frame('ptlogin_iframe') # 找到一个框架名称
driver.find_element_by_id('switcher_plogin').click() # 找到使用密码登录
driver.find_element_by_id('u').clear() # 第一个是请输入你的账号
driver.find_element_by_id('u').send_keys('')
driver.find_element_by_id('p').clear()
driver.find_element_by_id('p').send_keys('密码')
driver.find_element_by_id('login_button').click() # 确定
logging.info("登录验证已结束")
for x in range(20):
time.sleep(1)
print("等待进入Myhome页面 倒计时: %d s" % int(20-x))
logging.info("等待进入Myhome页面 倒计时: %d s" % int(20-x))
myhomeurl = driver.find_element_by_xpath(
"//div[@id='navbar']/ul/li[8]/div[@class='myhome']/a").get_attribute("href")
driver.get(myhomeurl) # 打开新页面
driver.switch_to_window(driver.window_handles[-1])
logging.info("成功进入Myhome y页面...")
try:
for x in range(10):
time.sleep(1)
print("点击签到按钮 倒计时: %d s" % int(10-x))
logging.info("点击签到按钮 倒计时: %d s" % int(10-x))
driver.find_element_by_xpath('//a[contains(text(),"签到")]').click()
try:
eee = driver.find_element_by_xpath(
"//div[@id='zt']/div[3]/div[1]/div[1]/div[2]/iframe").get_attribute("src")
driver.get(eee)
logging.info("进入签到页面完毕...")
当然,这样子 这个网站 用到了很多iframe,前期了花费了点时间
试了几遍,ok 可以,于是挂在我的服务器上运行
但是试了几天,发现没有通知我情况咋样,于是把email 给接上去了
3.2 签到升级
突然有一天, 发送的邮箱一直提醒失败,然后上服务器,一看,我x(口吐芬芳),白嫖还没几天, 就就就给发现了?
咳咳, 行吧, 我在续上命,于是乎, 研究了一上午
也解决了
伪代码
driver.get(url``=``url)
# 开始查找滑块
button ``=` `driver.find_element_by_xpath(``'//div[@class="ui-slider-btn init ui-slider-no-select"]'``)
action ``=` `ActionChains(driver)
action.click_and_hold(button).perform()
action.reset_actions()
action.move_by_offset(``333``, ``0``).release().perform()
action.click_and_hold()
3.3 签到再次升级
过了一阵子, 突然发现 又tn升级了
我我我我我 ...破不了了
于是乎,时间大概就定格在2019年~~~
4 长进了
咳咳,时间快进到2021年 (自己也很久没弄Python 了,前几天有个兄弟问我以前不是搞过python嘛,这里有个单,爬虫的,你把数据爬过来就行,于是乎,又重新拾起了Python)
回顾了原来写的几篇文章,大致又熟悉了个流程,于是,直接盘她,这个单的程序也写好了,然后突然突然又想到了Jq22这个验证码
4.1 念念不忘,必有回响
NetWork请求如下
页面图如下
页面结构如下
按钮结构如下
<input type="submit" name="Button1" value="已签到" id="Button1" disabled="disabled" class="btn btn-success qdbut huise" OnClick="return jsFunction()" />
页面js 如下
code
$("#Button1").attr("disabled", "disabled");
var aaa = 0;
$('#mpanel5').pointsVerify({
defaultNum: 4,
checkNum: 2,
vSpace: 5,
imgName: ['yz1.png', 'yz2.png'],
imgSize: {
'300px',
height: '150px',
},
barSize: {
'300px',
height: '40px',
},
ready: function () {
},
success: function () {
aaa = 1;
$("#Button1").removeAttr("disabled");
},
error: function () {
return false;
}
});
function jsFunction() {
if (aaa == 1) {
return true;
} else {
return false;
}
}
</script>
看着这段代码,我顿时感觉,好像能做点什么
<input type="submit" name="Button1" value="已签到" id="Button1" class="btn btn-success qdbut huise" OnClick="return jsFunction()" />
嗯嗯嗯,后面的思路也是来自此处
我就直接 放最终代码了
总结
在这里, 我还是没能破解点触验证码, 这个的确非常的棘手, 大家都在说超级鹰, 最近我找到了一个百度的otc 识别文字返回坐标的,但是他这个识别率太低了,会被干扰
在这里,代码就不分享了,这里只做一个技术交流,让你们看看效果,咳咳(我没白嫖,你们有啥要下载的东西,我也可以帮你们下载)
群链接丢这里,大家看着办