记得以前微博是用的宫格验证码,现在宫格已经被弃用了,用的是滑块验证码和 点触验证码,每天登陆的第一次基本用的是滑块,继续登录就都用的是点触验证码。所以滑块验证码不写,感兴趣的可以补上。

代码:

这里用的超级鹰的打码平台,要去超级鹰下载对应的API,并按提示修改,顺便购买一些题分,很便宜。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from PIL import Image
from io import BytesIO
from selenium.webdriver import ActionChains
import time
from requests import Session
from weibo.chaojiying import Chaojiying_Client
from selenium.common.exceptions import TimeoutException
from weibo.crack import Crack EMAIL='1819241****'#微博账号
PASSWORD='*******'#微博密码
# 超级鹰用户名,密码,软件id,验证码类型
CHAOJIYING_USERNAME='1819241****'
CHAOJIYING_PASSWORD='********'
CHAOJIYING_SOFT_ID=902020
CHAOJIYING_KIND=9004
class weibo_click():
def __init__(self,username,password):
self.url = "https://passport.weibo.cn/signin/login"
self.email = username
self.password = password
self.browser = webdriver.Chrome()
# self.get=self
self.wait = WebDriverWait(self.browser, 15)
self.chaojiying = Chaojiying_Client(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def open(self):
email = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input#loginName")))
password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input#loginPassword")))
email.send_keys(self.email)
time.sleep(2)
password.send_keys(self.password)
time.sleep(2)
def login(self):
submit = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.btn")))
submit.click()
# time.sleep(1)
# print("登陆成功!")
def get_geetest_button(self):
button = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.geetest_radar_tip")))
button.click()
def go(self):
self.browser.get(self.url)
self.browser.maximize_window()
self.open()
time.sleep(1)
self.login()
# self.get_geetest_button() def get_screenshot(self): # 截图功能
screenshot = self.browser.get_screenshot_as_png()
screenshot = Image.open(BytesIO(screenshot))
return screenshot
def get_position(self):
'''
获取点触验证码位置
:return: 点触验证码位置元组
'''
img=self.get_weibo_element()
# img =self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, "geetest_item_img ")))
time.sleep(1)
location = img.location
size = img.size
print(location)
print(size)
top, bottom, left, right = location["y"], location["y"] + size["height"], location["x"], \
location["x"] + size["width"]
return (top, bottom, left, right)
def click_image(self):
'''
点触验证码截图
:return: 点触验证码对象
'''
top, bottom, left, right = self.get_position()
print("验证码位置", top, bottom, left, right)
screenshot = self.get_screenshot()
# screenshot.show()
print('大图尺寸,', screenshot.size)
captcha = screenshot.crop((833, 200, 1252, 632)) # crop方法是Image里的截图方法 先后顺序有规定(左,上,右,下)
captcha.save('bbb.png')
# captcha.show()
print('小图尺寸,', captcha.size)
# img = Image.open(name)
(x, y) = captcha.size
x_s = 334
y_s = round(y * x_s / x)
out_img = captcha.resize((x_s, y_s), Image.ANTIALIAS)
out_img.save('ccc.png')
# out_img.show()
return out_img
def result(self):
image = self.click_image()
bytes_array = BytesIO()
image.save(bytes_array, format='PNG')
# 识别验证码
result = self.chaojiying.PostPic(bytes_array.getvalue(), CHAOJIYING_KIND)
return result
def get_points(self, captcha_result):
'''
解析识别结果
:param captcha_result: 识别结果
:return: 转化后的结果
'''
groups = captcha_result.get('pic_str').split('|')
locations = [[int(number) for number in group.split(',')] for group in groups]
print(locations)
return locations
def get_weibo_element(self):
'''
获取点触验证码对象
:return: 图片对象
'''
element = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, "geetest_item_img ")))
return element
def weibo_click_words(self,locations):
'''
点击验证码图片
:param locations: 点击位置
:return: None
'''
for location in locations:
print(location)
ActionChains(self.browser).move_to_element_with_offset(self.get_weibo_element(),location[0],location[1]).click().perform()
time.sleep(1) def confirm(self):
push=self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.geetest_commit_tip")))
push.click()
def main(self):
print('点触验证码的验证')
while True:
captcha_result = self.result()
locations = self.get_points(captcha_result)
self.weibo_click_words(locations)
button = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.geetest_commit_tip")))
button.click()
if self.login_successfully():
break
else:
continue def password_error(self):
"""
判断是否密码错误
:return:
"""
try:
return WebDriverWait(self.browser, 5).until(
EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误'))
except TimeoutException:
return False def login_successfully(self):
"""
判断是否登录成功
:return:
"""
try:
return bool(
WebDriverWait(self.browser, 5).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.m-text-cut"))))
except TimeoutException:
return False def get_cookies(self):
"""
获取Cookies
:return:
"""
return self.browser.get_cookies() def man(self):
"""
破解入口
:return:
"""
self.go()
# 验证账号和密码
if self.password_error():
return {
'status': 2,
'content': '用户名或密码错误'
} # 账号密码没错就获取图片对象
self.get_geetest_button()
self.main()
# 判断是否登录成功
if self.login_successfully():
cookies = self.get_cookies()
print('cookies',cookies)
return {
'status': 1,
'content': cookies
}
else:
return {
'status': 3,
'content': '登录失败'
} if __name__=="__main__":
result=weibo_click(EMAIL,PASSWORD).man()
print(result.get('status'))

微博验证码的识别并登录获取cookies的更多相关文章

  1. httpwebrequest 模拟登录 获取cookies 以前的代码,记录备忘!

    2个类,一个基类,一个构建头信息调用类 关于如何获取到post中的内容,你之需要用http抓包工具把你与目标网站的请求信息抓下来后,打开分析下按照抓下来的包中的数 据进行构建就行了 using Sys ...

  2. 终极利器!利用appium和mitmproxy登录获取cookies

    环境搭建 参考我之前写的https://www.cnblogs.com/c-x-a/p/9163221.html appium 代码start_appium.py # -*- coding: utf- ...

  3. python自动化登录获取图片登录验证码

    主要记录一下:图片验证码1.获取登录界面的图片2.获取验证码位置3.在登录页面截取验证码保存4.调用百度api识别(目前准确率较高的识别图片api)本次登录的系统页面,可以看到图片验证码的位置登录页面 ...

  4. python接口自动化测试七:获取登录的Cookies,并关联到下一个请求

    获取登录的cookies:loginCookies = r.cookies 把获取到的cookies传入请求:cookies=loginCookies 此方法需每一次都调用登录方法,并且每一次发送请求 ...

  5. python接口自动化测试七:获取登录的Cookies

    python接口自动化测试七:获取登录的Cookies,并关联到下一个请求   获取登录的cookies:loginCookies = r.cookies 把获取到的cookies传入请求:cooki ...

  6. Python爬虫学习笔记之微信宫格验证码的识别(存在问题)

    本节我们将介绍新浪微博宫格验证码的识别.微博宫格验证码是一种新型交互式验证码,每个宫格之间会有一条 指示连线,指示了应该的滑动轨迹.我们要按照滑动轨迹依次从起始宫格滑动到终止宫格,才可以完成验证,如 ...

  7. 用selenium获取cookies

    前言:由于登录反爬措施的越来越麻烦,甚至出现了12306这种看图识物的无敌验证码,我只能说,我选择死亡.这就衍生出了使用selenium来获取获取cookies. 实例:获取qq空间cookies,亲 ...

  8. 爬虫(十二):图形验证码的识别、滑动验证码的识别(B站滑动验证码)

    1. 验证码识别 随着爬虫的发展,越来越多的网站开始采用各种各样的措施来反爬虫,其中一个措施便是使用验证码.随着技术的发展,验证码也越来越花里胡哨的了.最开始就是几个数字随机组成的图像验证码,后来加入 ...

  9. python实现对简单的运算型验证码的识别【不使用OpenCV】

    最近在写我们学校的教务系统的手机版,在前端用户执行绑定操作后,服务器将执行登录,但在登录过程中,教务系统中有个运算型的验证码,大致是这个样子的: 下面我们开始实现这个验证码的识别. 1.图片读取 从网 ...

随机推荐

  1. C# 添加、修改、删除Excel图表数据标签

    图表中,图表数据标签以数据化形式表现图表中的特定数据,可增强图表的可读性.我们可以对图表添加数据标签,也可以对已有的数据标签进行修改或者删除,下面将通过C#代码形式来实现. 使用工具:Spire.XL ...

  2. beanfactory中单例bean的初始化过程(一)

    Date 10.06 pm Point 完成beanfactory中单例bean的初始化 beanFactory.preInstantiateSingletons() 拿到所有的bean定义信息(在 ...

  3. Linux常用命令及示例(全)

    NO 分类 PS1 命令名 用法及参数 功能注解1 显示目录信息 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件 # ls ls -l或ll 列出当前目录下文件的详细信息 # l ...

  4. python pyinstaller 打包exe报错

    今天用python 使用pyinstaller打包exe出现错误 环境pyqt5 + python3.6 在导入pyqt5包之前加上如下代码 import sysimport osif hasattr ...

  5. redis面试题及答案

    1. Redis有哪些数据结构? 2. 使用过Redis分布式锁么,它是什么回事? 3. 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? ...

  6. IntelliJ IDEA 配置Maven仓库

    1. 下载Maven 官方地址:http://maven.apache.org/download.cgi 2. 修改本地仓库路径 3. 设置环境变量 MAVEN_HOME: E:\DevelopEnv ...

  7. Android 禁止截屏、录屏 — 解决PopupWindow无法禁止录屏问题

    项目开发中,为了用户信息的安全,会有禁止页面被截屏.录屏的需求. 这类资料,在网上有很多,一般都是通过设置Activity的Flag解决,如: //禁止页面被截屏.录屏 getWindow().add ...

  8. windows服务参考

    dll文件 aaclient.dll 何时何地都可以访问客户端 accessibilitycpl.dll 轻松访问控制面板 acledit.dll 访问控制列表编辑器 aclui.dll 安全描述符编 ...

  9. shell 队列实现线程并发控制

    需求:并发检测1000台web服务器状态(或者并发为1000台web服务器分发文件等)如何用shell实现? 方案一:(这应该是大多数人都第一时间想到的方法吧) 思路:一个for循环1000次,顺序执 ...

  10. 【模板】prufer序列

    如何构造一个prufer序列? 我们给一棵无根树的节点编上号,每次找到一个编号最小的度为1节点,删除它,并输出与它连接的点的编号,直到只剩下两个节点. 这样,我们就构造出来了一个prufer序列. 通 ...