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

代码:

这里用的超级鹰的打码平台,要去超级鹰下载对应的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. MySQL基础篇(2)数据类型

    MySQL提供了多种数据类型,主要包括数值型.字符串类型.日期和时间类型. 1.数值类型 整数类型:TINYINT(1字节).SMALLINT(2字节).MEDIUMINT(3字节).INT(INTE ...

  2. FastReport快速实现条形码,二维码面单打印

    一.什么是FastReport? FastReport是功能齐全的报表控件,使开发者可以快速并高效地为·NET/VCL/COM/ActiveX应用程序添加报表支持. FastReport有很多产品,如 ...

  3. django-模板之extends(三)

    /book/base.html <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  4. django-URL匹配(二)

    1.新建django项目 django-admin startproject newwebsite 2.建立app 在newwebsite目录下:python manage.py startapp b ...

  5. 死磕 java线程系列之线程池深入解析——未来任务执行流程

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普 ...

  6. 框架搭建与EF常用基类实现

    前两篇简单谈了一些.Net Core的优势以及机构设计的一些思路,这一篇开始,我们将从零开始搭建架构,底层我们将采用EF来访问数据库,所以这篇我们将贴一下EF常用操作的基类. 简单介绍下一些类库将要实 ...

  7. 全排列函数(next_permutation())

    平常需要全排列的时候,一般都是dfs然后字符串匹配啥的……今天看题解的时候突然发现了这个神器. next_permutation()函数在c++的algorithm库里,作用是传入一个数组,输出这个数 ...

  8. 【POJ3208】Apocalypse Someday

    Description 666号被认为是神秘的"野兽之数",在所有以启示录为主题的大片中都是一个被广泛使用的数字.但是,这个数字666不能总是在脚本中使用,所以应该使用1666这样 ...

  9. [考试反思]1013csp-s模拟测试71:徘徊

    分差好大...但是从排名上看也许还可以接受? 不算太炸 但是这个还是算了吧... 其实状态不是很好. T1不会,打的搜索,想到一个剪枝但是感觉没什么用,所以没打. 考后打上,85了...打上另一个就9 ...

  10. Docker实战总结

    >>> 目录 <<< Docker简介 Docker优势 Docker基本概念 Docker安装使用 Docker常用命令 Docker镜像构建 Docker本地仓 ...