前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mac上破解微博登录四宫格

mac上破解微博登录四宫格

作者头像
松鼠先生
发布于 2022-02-22 06:53:39
发布于 2022-02-22 06:53:39
57900
代码可运行
举报
运行总次数:0
代码可运行

按照崔大佬的书目录,最终是做成一个分布式的爬虫,用框架爬取所有的微博.So,我就按着步骤来,从代理池,cookies池,到最后的crapy框架.

首先,分析一下微博四宫格验证码,它长下面这个样子哈.那么一共有4*6=24中验证码.一种方法是从图像处理的方式来做,但是有个问题

上面这个图里面,我姑且称为4->3->2->1形验证码.那么1->2->3->4形验证码是不是跟这个验证码非常的想象呢?是的.他们只有中间的三个箭头方向相反,其他一模一样.

所以如果采用图像处理算法来做,必须非常的精确才能做到啊.那么我们就采用第二种方法,对比法.只有24种验证码,那么把所有的验证码都保存在文件夹里面.然后登陆的时候把验证码按固定的位置截屏和本地保存的验证码逐一对比,设置一个阈值(0.98),这样,就可以精确的找出当前的验证码.再把本地24种验证码的图片名字都存储1432.png这种类型,对比成果后提取名字前的数字,然后做成list就可以用selenium的ActionChains模块拖动.模拟人拖动验证码登录了.

需要的库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ActionChainsfrom PIL import Image
import time
from io import BytesIO
from os.path import abspath, dirname
from os import listdir

这里我用了无头的Chrome(),平时调试用的是有头的.哈哈哈.最后试用了一下无头的,也能成功.

账号密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USERNAME = 'username'
PASSWORD = 'password'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TEMPLATES_FOLDER = dirname(abspath('__file__')) + '/templates/'

username你得换成你自己的账号,password同理,你的密码.TEMPLATES_FOLEDER是你保存24种验证码的图片的文件.

创造类,并初始化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class WeiboCookies(object):
    def __init__(self, username=USERNAME, password=PASSWORD):
        self.url = 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F&sudaref=m.weibo.cn'
        self.username = USERNAME
        self.password = PASSWORD
        self.browser = self.init_browser()
        #self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser, 20)

有头Chrome就是注释掉那一行,如果要用有头的把注释取消,然后把上面那一行注释.(下面的代码是无头的初始化,如果要有头那前面操作然后下面的代码可以不用写):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def init_browser(self):
        options = webdriver.ChromeOptions()
        options.add_argument('--headless')
        self.browser = webdriver.Chrome(options = options)
        return self.browser

打开登录界面,并输入账号密码点击登录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def open(self):
        self.browser.get(self.url)
        username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginName')))
        password = self.wait.until(EC.presence_of_element_located((By.ID, 'loginPassword')))
        submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginAction')))
        username.send_keys(self.username)
        password.send_keys(self.password)
        time.sleep(1)
        submit.click()

密码错误或者直接登录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def password_error(self):
        try:
            return WebDriverWait(self.browser, 5).until(
            EC.text_to_be_present_in_element((By.ID, 'errorMsy'),'用户名或密码错误'))
        except TimeoutException:
            return False

    def login_successfully(self):
        try:
            return bool(WebDriverWait(self.browser, 5).until(
            EC.presence_of_element_located((By.CLASS_NAME, 'lite-iconf'))))
        except TimeoutException:
            return False   

回到之前,登录之后有三种状态,一是直接登录成功,二是账号密码错误,三是验证码.微博点击登录之后,一般是出现验证码,滑动之后判断有没有账号密码出错.

处理验证码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_position(self):
        try:
            img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'patt-shadow')))
        except TimeoutException as e:
            print('验证码未出现')
            self.open()
        time.sleep(2)
        location = img.location
        size = img.size
        top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width']
        return (top,bottom,left,right)

    def get_screenshot(self):
        screenshot = self.browser.get_screenshot_as_png()
        screenshot = Image.open(BytesIO(screenshot))
        return screenshot

    def get_image(self, name='captcha.png'):
        top, bottom, left, right = self.get_position()
        screenshot = self.get_screenshot()
        captcha = screenshot.crop((left,top,right,bottom))
        captcha.save(name)
        return captcha

    def is_pixel_equal(self, image1, image2, x, y):
        pixel1 = image1.load()[x,y]
        pixel2 = image2.load()[x,y]
        threshold = 20
        if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold  and abs(pixel1[2] - pixel2[2]) < threshold:
            return True
        else:
            return False

    def same_image(self, image, template):
        threshold = 0.98
        count = 0
        for x in range(image.width):
            for y in range(image.height):
                if self.is_pixel_equal(image, template, x, y):
                    count += 1
        result = float(count) / (image.width * image.height)
        if result > threshold:
            print('成功匹配')
            return True
        return False

    def detect_image(self, image):
        for template_name in listdir(TEMPLATES_FOLDER):
            print('正在匹配', template_name)
            if template_name == '.DS_Store':
                continue
            template = Image.open(TEMPLATES_FOLDER + template_name)
            if self.same_image(image, template):
                numbers = [int(number) for number in list(template_name.split('.')[0])]
                print('拖动顺序', numbers)
                return numbers

    def move(self, numbers):
        try:
            circles = self.browser.find_elements_by_css_selector('.patt-wrap .patt-circ')
            dx = dy = 0
            for index in range(4):
                circle = circles[numbers[index] - 1]
                if index == 0:
                    ActionChains(self.browser).move_to_element_with_offset(circle, circle.size['width'] / 2, circle.size['height'] / 2) \
                        .click_and_hold().perform()
                else:
                    times = 30
                    for i in range(times):
                        print(dx,dy)
                        ActionChains(self.browser).move_by_offset(dx / times, dy / times).perform()
                        time.sleep(1 / times)
                if index == 3:
                    ActionChains(self.browser).release().perform()

                else:
                    dx = circles[numbers[index + 1] - 1].location['x'] - circle.location['x']
                    dy = circles[numbers[index + 1] - 1].location['y'] - circle.location['y']
        except:
            print('滑动失败,重来')
            self.main() 

上面get_position()是获取验证码位置的,用于截屏之后提取目标图片.get_screenshot()是用来截屏的.get_image()是用来得到四宫格图像的.is_pixel_queal()是用来判定两幅图像里面的像素点一样不,循环两幅图的所以像素点就可以得到有多少像素点相同,用于判定最后图像是不是相同.detect_image()是登录时候得到验证码后将验证码和本地的所以24张验证码做对比,最后得到相同的验证码.move()是得到验证码顺序之后,用selenium滑动验证码.

得到cookies

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_cookies(self):
        return self.browser.get_cookies()

登录成功之后获取cookies

程序主要流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.open()
        if self.password_error():
            return {
                'status': 2,
                'content': '用户名或密码错误'
            }
        if self.login_successfully():
            cookies = self.get_cookies()
            return {
                'status': 1,
                'content': cookies
            }
        image = self.get_image('captcha.png')
        numbers = self.detect_image(image)
        self.move(numbers)
        if self.login_successfully():
            cookies = self.get_cookies()
            return{
                'status': 1,
                'content': cookies
            }
        else:
            return{
                'status': 3,
                'content': '登录失败'
            }

有三种状态,2是密码错误,1是登录成功,3是登录失败,就是验证码滑动不对.

用例子示范

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == '__main__':
    weibocookies = WeiboCookies()
    t = weibocookies.main()
    print(t)

总结

mac上如果阈值设定为0.99,将匹配不上,0.98刚刚能匹配出来,太低也不行.

mac上本地存储24个验证码的时候文件夹里面有个.DS_Store的必须要跳过它,不然会失败.Windows上没必要.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python+Selenium爬虫:豆瓣登录反反爬策略解析
1. 引言 在当今互联网时代,数据抓取(爬虫)技术广泛应用于数据分析、市场调研、自动化测试等领域。然而,许多网站采用动态加载技术(如Ajax、React、Vue.js等框架)来渲染页面,传统的requests库无法直接获取动态生成的内容。这时,Selenium成为解决动态页面爬取的重要工具。 豆瓣作为一个典型的动态加载网站,其登录页面涉及表单提交、动态验证码、Ajax请求等复杂交互。本文将通过Python + Selenium,详细介绍如何模拟登录豆瓣,并处理动态加载的登录页面。
小白学大数据
2025/05/14
1270
[428]极验验证码识别
很多网站的登陆都有验证码一项,而极验的方案就是应用的非常普遍。更多的场景是在反爬虫的对抗中,极客验证码更是首选。本次目标则是用程序来识别并通过极验验证码的验证。本次使用的是Python库是selenium库,Chrome浏览器,并配置好ChromeDriver。极验验证码官网为:https://auth.geetest.com/login/。它是一个专注于提供验证安全的系统,主要验证方式是拖动滑块拼合图像。若图像完全拼合,则验证成功,即表单成功提交,否则需要重新验证,如图所示:
周小董
2022/04/13
1.9K0
[428]极验验证码识别
新版滑动验证码
今天的主角是滑动验证码,现在有很多网站使用了极验验证码来智能反爬虫,其中有一种是滑动验证码,具体来说就是拖动滑块来拼合图像,若图像完全拼合,则验证成功。下图是B站的登录验证码,便是采用了极验的滑动验证码,一起来看看如何破解吧!
老肥码码码
2020/01/17
4.8K0
新版滑动验证码
Python之极验滑动验证码的识别(教程+案例)
1 滑动验证码的识别介绍 本节目标:用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作:本次案例我们使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 了解极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/ 验证方式为拖动滑块拼合图像,若图像完全拼合,则验证成功,否则需要重新验证,如图所示: image.png 接下来
Python知识大全
2020/02/13
3.4K3
Python之极验滑动验证码的识别(教程+案例)
滑动宫格验证码都给碰上了?没事儿,看完此文分分钟拿下!
本节我们将介绍新浪微博宫格验证码的识别。微博宫格验证码是一种新型交互式验证码,每个宫格之间会有一条指示连线,指示了应该的滑动轨迹。我们要按照滑动轨迹依次从起始宫格滑动到终止宫格,才可以完成验证,如下图
崔庆才
2018/06/25
7680
What?废柴, 模拟登陆,代码控制滑动验证真的很难吗?Are you kidding???
在前边的python接口自动化的时候,我们由于博客园的登录机制的改变,没有用博客园的登录测试接口。那么博客园现在变成了滑动验证登录,而且现在绝大多数的登录都变成这种滑动验证和验证码的登录验证机制。我们真的没有其他办法解决这种验证机制的登录了吗?真的是束手无策了吗?答案是:NO,今天宏哥教你如何用代码来模拟鼠标滑动,最终验证成功后,最后成功登录。那么怎么做了,思路了???
北京-宏哥
2020/05/20
1.6K0
验证码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
云雀叫了一整天
2019/09/29
2.7K0
验证码
Python爬虫之点触验证码的识别
可能你对这个名字比较陌生,但是肯定见过类似的验证码,比如 12306 就是典型的点触验证码。
仲君Johnny
2024/02/23
6751
Python爬虫之点触验证码的识别
爬虫进阶教程:极验(GEETEST)验证码破解教程
原文链接及原作者:爬虫进阶教程:极验(GEETEST)验证码破解教程 | Jack Cui
圆方圆PYTHON学院
2018/12/24
7.3K0
爬虫进阶教程:极验(GEETEST)验证码破解教程
Selenium自动登录淘宝,我无意间发现了登录漏洞!
这篇文章是一个很好的学习例子,作者能够在学习过程中,不断发现、不断总结,并且能够坚持不懈。
Python进阶者
2020/09/14
2.1K0
Selenium自动登录淘宝,我无意间发现了登录漏洞!
爬虫项目:破解极验滑动验证码
一 介绍     一些网站会在正常的账号密码认证之外加一些验证码,以此来明确地区分人/机行为,从一定程度上达到反爬的效果,对于简单的校验码Tesserocr就可以搞定,如下     但一些网站加入了滑
用户1214487
2018/01/24
5.5K0
爬虫项目:破解极验滑动验证码
今年,我只赚了一点点
登录之后,我们就可以用保存身份信息的 Cookie,获取我们想要的各种数据:股票信息、基金信息等。
Jack_Cui
2022/12/22
6030
今年,我只赚了一点点
Selenium+dddocr轻松解决Web自动化验证码识别
dddocr是一个基于深度学习的OCR(Optical Character Recognition,光学字符识别)库,用于识别图片中的文字。它可以识别各种类型的文字,包括印刷体、手写体、表格、条形码等。dddocr库使用了深度卷积神经网络(CNN)和循环神经网络(RNN)等先进的模型,具有较高的准确性和稳定性。
测试开发技术
2023/09/12
1.9K0
Selenium+dddocr轻松解决Web自动化验证码识别
Python 破解极验滑动验证码
以上图片是最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/。
测试开发社区
2019/09/20
2.7K0
Python 破解极验滑动验证码
自动滑块验证码识别_滑块验证码原理
有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展。而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所有网站的注册页面都会用到验证码技术。其实验证码的英文为 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),翻译成中文就是全自动区分计算机和人类的公开图灵测试,它是一种可以区分用户是计算机还是人的测试,只要能通过 CAPTCHA 测试,该用户就可以被认为是人类。由此也可知道激活成功教程滑块验证码的关键即是让计算机更好的模拟人的行为,这也是激活成功教程的难点所在。(注:本文18年所作,仅作参考)
全栈程序员站长
2022/11/18
3.8K0
自动滑块验证码识别_滑块验证码原理
Python3爬虫实战【点触验证码】 — 模拟登陆bilibili
在开始之前,需要先注册一个超级鹰账号并申请一个软件ID,注册页面链接为:https://www.chaojiying.com/user/reg/,注册完成后需要在后台添加一个软件ID,进行充值获得积分,一般充一块钱就可以了。
Python研究者
2020/09/28
6370
Python3爬虫实战【点触验证码】 — 模拟登陆bilibili
python + selenium 爬虫模拟登录破解无原图滑动验证码
爬虫模拟登录破解无原图滑动验证码: https://www.cnblogs.com/98WDJ/p/11050559.html
forxtz
2020/10/10
2.4K0
python + selenium 爬虫模拟登录破解无原图滑动验证码
HCaptcha 的模拟点击破解方案来了!
这是「进击的Coder」的第 634 篇技术分享 作者:崔庆才 前面的文章我们介绍过 ReCaptcha 的模拟点击破解教程,但除了 ReCaptcha,还有另外和 ReCapacha 验证流程很相似的验证码,叫做 HCaptcha。 ReCaptcha 是谷歌家的,因为某些原因,咱们国内是无法使用 ReCaptcha 的,所以有时候 HCaptcha 也成了一些国际性网站的比较好的选择。 那今天我们就来了解下 HCaptcha 和它的模拟点击破解流程。 HCaptcha 我们首先看看 HCaptcha
崔庆才
2022/06/01
4.5K1
HCaptcha 的模拟点击破解方案来了!
Python爬虫之极验滑动验证码的识别
上节我们了解了可以直接利用 tesserocr 来识别简单的图形验证码。近几年出现了一些新型验证码,其中比较有代表性的就是极验验证码,它需要拖动拼合滑块才可以完成验证,相对图形验证码来说识别难度上升了几个等级。本节将讲解极验验证码的识别过程。
仲君Johnny
2024/02/22
8950
Python爬虫之极验滑动验证码的识别
selenium自动登录某宝
使用selenium登录某宝,套路也很一样,今天就给大家简单的讲哈,只供学习交流哈。
Python知识大全
2020/02/13
1K0
selenium自动登录某宝
推荐阅读
相关推荐
Python+Selenium爬虫:豆瓣登录反反爬策略解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验