前言

  嘿,各位小伙伴好呀,今天要带来点什么干货呢,就从我的实际开发中来给大家带来一个案例吧,如何自动登录 哔哩哔哩

接到老大通知,让我自动写一个自动登录 哔哩哔哩 的脚本,我当然是二话不说直接开怼,咱们的准则是啥,生死看淡,不服就干,干就完了,然而,现实总是被无情打脸,但是不管怎样,终究算是干过它了,下面我们来一一讲解,如何自动登录 哔哩哔哩

准备工作

  chromedriver:浏览器驱动,可以理解为一个没有界面的chrome浏览器

  selenium:用于模拟人对浏览器进行点击、输出、拖拽等操作,就相当于是个人在使用浏览器,也常常用来应付反爬虫措施

开始进行

  哔哩哔哩登录URL:https://passport.bilibili.com/login

  点击登录如下,自动登录blbl最难的一点就是,拖动滑块,对准缺口,正是这一个问题,让我掉了好几根头发,跟上我的脚步,能少踩一个一个坑是一个坑

  可能看到这,稍微会点技术的小伙伴都知道,其实我们根本要解决的问题,就是缺口获取缺口的位置,但是要怎么获取这个缺口的位置呢

  这尼玛,canvas是个啥,其实当时我和你们想法一样,其实呢,这个canvas是个画布,可不是图片,这咋办,这不是图片怎么办呢

  再说,我怎么知道哪个是带缺口图的canvas,经过多次测试,终于算是弄清楚了哪个是背景图,哪个是滑块,我来给大家标注一下

  So,问题又来了,我怎么获取这里面的图片呢,上图!!!

  我们先在游览器前端控制台,通过js代码,选中带缺口的标签,因为是类选中,所以需要取0下标,通过 toDataURL("image/png") 方法,将canvas将里面的图片转为base64位图片,转成base64位图片有啥用呢,来,我们赋值这么这么长的一段base64地址,复制到游览器中

  看到了没,我们梦寐已久带缺口的图片

  下一步怎么办呢,当时我的想法是,如法炮制,获取滑块的的图片,通过opencv模板对比,获取缺口位置,事实证明,我又被打脸,我们来看一下滑块图片张啥样

  是不是看着没什么问题,我们来保存本地试一下

  看出来了没,其实除了滑块以外,其他位置为透明区域,如果有透明区域,是不能通过opencv 模板对比的,这咋办,如果在用opencv处理图像,就是个累活了

  本着能懒就懒得原则,直接上第三方平台吧

  本文使用的第三方平台 联众:https://www.jsdati.com/

  这个平台还是比较贴心的,还有qq客服,有问题我们还可以问qq客服,暖心

  图像类型ID 1318为滑块验证码,只需要把带有缺口的图片上传到此网站就好

  各位小伙伴自行去联众注册哈,价格还挺香,1元100点,滑动验证码一个2点

  具体怎么操作呢,说了这么多,我们也该上代码了

import base64
import requests
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 selenium.webdriver import ActionChains
import time
import random # 联众打码平台账号密码
api_username = "username"
api_password = "password"
file_name = "bg.png"
api_post_url = "http://v1-http-api.jsdama.com/api.php?mod=php&act=upload"
yzm_min = ""
yzm_max = ""
yzm_type = ""
tools_token = "" # 初始化
def init():
# 定义为全局变量,方便其他模块使用
global url, browser, username, password, wait
# 登录界面的url
url = 'https://passport.bilibili.com/login'
# 实例化一个chrome浏览器
browser = webdriver.Chrome(r"G:\installPage\chromedriver_win32 _78.0.3904.70\chromedriver.exe")
browser.maximize_window()
time.sleep(2)
# 用户名
username = 'qweqwe'
# 密码
password = 'asdfasdf'
# 设置等待超时
wait = WebDriverWait(browser, 20) # 登录
def login():
# 打开登录页面
browser.get(url)
# 获取用户名输入框
user = wait.until(EC.presence_of_element_located((By.ID, 'login-username')))
# 获取密码输入框
passwd = wait.until(EC.presence_of_element_located((By.ID, 'login-passwd')))
# 输入用户名
user.send_keys(username)
# 输入密码
passwd.send_keys(password) # 获取登录按钮
login_btn = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.btn.btn-login')))
# 随机延时点击
time.sleep(random.random() * 5)
login_btn.click()
time.sleep(2) # 下载 带缺口的背景图
def downfile():
# 下面的js代码根据canvas文档说明而来
JS = 'return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png")'
# 执行 JS 代码并拿到图片 base64 数据
im_info = browser.execute_script(JS) # 执行js文件得到带图片信息的图片数据
im_base64 = im_info.split(',')[1] # 拿到base64编码的图片信息
im_bytes = base64.b64decode(im_base64) # 转为bytes类型
with open('bg.png', 'wb') as f: # 保存图片到本地
f.write(im_bytes) # 获取 缺口图片位置坐标
def get_geetest_postion():
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0',
'Connection': 'keep-alive',
'Host': 'v1-http-api.jsdama.com',
'Upgrade-Insecure-Requests': ''
} files = {
'upload': (file_name, open(file_name, 'rb'), 'image/png')
} data = {
'user_name': api_username,
'user_pw': api_password,
'yzm_minlen': yzm_min,
'yzm_maxlen': yzm_max,
'yzmtype_mark': yzm_type,
'zztool_token': tools_token
}
s = requests.session()
r = s.post(api_post_url, headers=headers, data=data, files=files, verify=False)
print(r.json(), type(r.json()))
postion = r.json().get("data").get("val") # type:str
x, y = postion.split(",")
# print(x,y)
return int(x) # 构造滑动轨迹
def get_track(distance):
track = []
current = 0
mid = distance * 3 / 4
t = 0.2
v = 0
while current < distance:
if current < mid:
a = 2
else:
a = -3
v0 = v
v = v0 + a * t
move = v0 * t + 1 / 2 * a * t * t
current += move
track.append(round(move))
return track # 模拟拖动
def move_to_gap(trace):
# 得到滑块标签 slider = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.geetest_slider_button'))) ActionChains(browser).click_and_hold(slider).perform()
for x in trace:
# 使用move_by_offset()方法拖动滑块,perform()方法用于执行
ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()
# 模拟人类对准时间
time.sleep(0.1)
# 释放滑块
ActionChains(browser).pause(0.5).release().perform() # 拖动滑块
def slide():
distance = get_geetest_postion()
print('计算偏移量为:%s Px' % distance)
# 计算移动轨迹
trace = get_track(distance - 10)
# 移动滑块
move_to_gap(trace) if __name__ == '__main__':
init()
login()
downfile()
slide()

查看代码

效果展示

python 奇淫技巧之自动登录 哔哩哔哩的更多相关文章

  1. python奇淫技巧之 抽屉 自动点赞

    前言 嘿,各位小伙伴晚上好呀,今天又给大家带来干货内容啦,今天带来的是,如何自动登录抽屉,并且点赞 原计划打算,是不打算使用selenium的,但是因为要涉及点赞,所以免不了登录,但是我又被啪啪打脸了 ...

  2. Gradle更小、更快构建APP的奇淫技巧

    本文已获得原作者授权同意,翻译以及转载原文链接:Build your Android app Faster and Smaller than ever作者:Jirawatee译文链接:Gradle更小 ...

  3. ASP.NET Core 奇淫技巧之伪属性注入

    一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...

  4. 优化DP的奇淫技巧

    DP是搞OI不可不学的算法.一些丧心病狂的出题人不满足于裸的DP,一定要加上优化才能A掉. 故下面记录一些优化DP的奇淫技巧. OJ 1326 裸的状态方程很好推. f[i]=max(f[j]+sum ...

  5. 12个实用的 Javascript 奇淫技巧

    这里分享12个实用的 Javascript 奇淫技巧.JavaScript自1995年诞生以来已过去了16个年头,如今全世界无数的网页在依靠她完成各种关键任务,JavaScript曾在Tiobe发布的 ...

  6. NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC)

    NGINX的奇淫技巧 —— 5. NGINX实现金盾防火墙的功能(防CC) ARGUS 1月13日 发布 推荐 0 推荐 收藏 2 收藏,1.1k 浏览 文章整理中...... 实现思路 当服务器接收 ...

  7. NGINX的奇淫技巧 —— 3. 不同域名输出不同伺服器标识

    NGINX的奇淫技巧 —— 3. 不同域名输出不同伺服器标识 ARGUS 1月13日 发布 推荐 0 推荐 收藏 6 收藏,707 浏览 大家或许会有这种奇葩的需求...要是同一台主机上, 需要针对不 ...

  8. NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1)

    NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1) ARGUS 1月13日 发布 推荐 0 推荐 收藏 3 收藏,839 浏览 nginx的if支持=.!= 逻辑比较, 但不支持if中 & ...

  9. Zepto源码分析(二)奇淫技巧总结

    Zepto源码分析(一)核心代码分析 Zepto源码分析(二)奇淫技巧总结 目录 * 前言 * 短路操作符 * 参数重载(参数个数重载) * 参数重载(参数类型重载) * CSS操作 * 获取属性值的 ...

随机推荐

  1. 5.3 Nginx 动静分离

    Server 脚本片段 server { listen ; server_name ccserver1; #charset koi8-r; access_log logs/host.access.lo ...

  2. Ubuntu18.04 ElasticSearch7.3.2集群搭建(一)

    集群规划: Hostname Elasticsearch Kibana Marvel Marvel Client node01 √ √ √ √ node02 √ √ node03 √ √ node04 ...

  3. 吴裕雄--天生自然JAVAIO操作学习笔记:IO操作实例、Scanner、数据操作流与合并流

    import java.io.* ; public class ExecDemo01{ public static void main(String args[]) throws Exception{ ...

  4. echart 库 初始

    一.echart简介 Echarts (http://echarts.baidu.com/)是百度公司出品的,算是百度不可多得的良心之作.要彻底掌握Echarts,你需要掌握一点前端开发的知识,这些知 ...

  5. centos6或7查看端口占用及解除占用

    一.查看端口占用 netstat -lnp|grep 要查看的端口号 例如:查看占用端口7000的进程 netstat -lnp|grep 7000 二.清除占用 (1)一次性的清除占用80端口的程序 ...

  6. Docker 搭建开源 CMDB平台 之 “OpsManage”

    说明:  我一次build 完 所以images 包 有1G多   可分层build   bash 环境一层   应用程序及启动脚本(shell.sh) 一层 步骤:           1     ...

  7. Day4-T3

    原题目 吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火.昨天,吉儿无意之中得到了散 落民间几百年的珍宝——月亮之眼.吉儿深知“月亮之眼”价值连城:它是由许多珍珠相连而成的,工 匠们用金线连 ...

  8. mjpg-streamer视频服务器移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y JPEG库的移植 对于内核linux-2.6.35,不能再使用servfox,如果要使用的需要修改大量的代码.在此选用新的 ...

  9. Mysql自动备份与还原 转

    Mysql自动备份与还原 一.自动备份:将以下代码保存为*.bat批处理脚本,然后再添加Windows定时作业,如每天凌晨2点执行:set s=%date:~0,4%%date:~5,2%%date: ...

  10. jquery隐藏表格的某列

    $('#tableId tr').find('th:eq(3)').hide(); ---------------------------------------------------------- ...