前言

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

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

准备工作

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点

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

importbase64importrequestsfrom selenium importwebdriverfrom selenium.webdriver.support.wait importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as ECfrom selenium.webdriver.common.by importByfrom selenium.webdriver importActionChainsimporttimeimportrandom#联众打码平台账号密码

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= "1"yzm_max= "1"yzm_type= "1318"tools_token= ""

#初始化

definit():#定义为全局变量,方便其他模块使用

globalurl, 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)#登录

deflogin():#打开登录页面

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)#下载 带缺口的背景图

defdownfile():#下面的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)#获取 缺口图片位置坐标

defget_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': '1'}

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)

returnint(x)#构造滑动轨迹

defget_track(distance):

track=[]

current=0

mid= distance * 3 / 4t= 0.2v=0while current

a= 2

else:

a= -3v0=v

v= v0 + a *t

move= v0 * t + 1 / 2 * a * t *t

current+=move

track.append(round(move))returntrack#模拟拖动

defmove_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 intrace:#使用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()#拖动滑块

defslide():

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自动登录灯塔党建_python 奇淫技巧之自动登录 哔哩哔哩相关推荐

  1. Python奇淫技巧之自动登录哔哩哔哩

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 昔我往矣,杨柳依依.今我来思,雨雪 ...

  2. 输入n个字符串字典序排序_30个Python奇淫技巧集

    今天小编熬夜整理了一份,内容是基础篇覆盖了字符串,列表,字典和基础序列容器.不要小看青铜篇,这份资料里面收集了很多奇淫技巧,很多小编也是第一次遇到,非常值得收藏. 下面我挑选几个给大家看一下,小编觉得 ...

  3. 【Python奇淫技巧】用pandas的read_html函数仅一行代码实现网页爬虫

    目录 一.介绍read_html()函数 二.分析爬取目标页面 三.代码讲解 四.同步视频讲解 一.介绍read_html()函数 喜欢Python编程的小伙伴你知道吗,python的pandas库除 ...

  4. 30个Python奇淫技巧集

    我们的青铜菜鸟群最近加了很多人,有不少是学生加入的,在后台的留言跟我们说,时间紧任务重,又要考研,又要学Python,而Python里面的技巧又非常多,能否整理一份技巧集给我们. 今天小编熬夜整理了一 ...

  5. 引入flag.php文件,php文件自包含的奇淫技巧

    原标题:php文件自包含的奇淫技巧 前言 刷题的时候刚好看到一个比较厉害的phpinfo的利用姿势,原理不是很懂,题目来自百度杯12月第四场Blog进阶版 以下是writeup 解题过程 注册以后 发 ...

  6. 50个Pandas的奇淫技巧:一网打尽各种索引 iloc,loc,ix,iat,at…

    数据处理,也是风控非常重要的一个环节,甚至说是模型成败的关键环节.因此,娴熟简洁的数据处理技巧,是提高建模效率和建模质量的必要能力.这里开个专题,总结下Pandas的使用方法,方便大家,也方便自己查阅 ...

  7. idea中常用的快捷键以及一些奇淫技巧 , 加快我们的开发效率

    idea中常用的快捷键以及一些奇淫技巧 , 加快我们的开发效率 !!! 知道类名查找你本地以的类 (你pom中依赖的类+你自己创建的类)------------- ctrl+shift+t 修改你创建 ...

  8. JavaScript奇淫技巧:按键精灵

    JavaScript奇淫技巧:按键精灵 按键精灵之类的自动化工具,可以解放双手,帮我们自动完成许多工作,在很多场景中,可以极大提升生产力. 本文将展示:用JavaScript实现一个"按键精 ...

  9. 【JavaScript】转载:JS高端奇淫技巧

    转自 : https://blog.csdn.net/github_38885296/article/details/91038735 感谢作者(流浪的狗和一坨屎)分享 众所周知, JavaScrip ...

  10. 50个Pandas的奇淫技巧:向量化字符串,玩转文本处理

    大家好,我是小伍哥. 数据处理,也是风控非常重要的一个环节,甚至说是模型成败的关键环节.因此,娴熟简洁的数据处理技巧,是提高建模效率和建模质量的必要能力.这里开个专题,总结下Pandas的使用方法,方 ...

最新文章

  1. windows8.1与centos7.0双系统启动项设置
  2. 第十、十一周项目-阅读程序,写出这些程序的运行结果(1)
  3. 配置FTP服务-要点总结
  4. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用
  5. 正确率 精度 召回率 错误率
  6. 推荐系统rank模块-Online Learning
  7. Python中第三方的库(library)、模块(module),包(package)的安装方法以及ImportError: No module named...
  8. as_hash ruby_Ruby中带有示例的Hash.keep_if方法
  9. 应用数仓ODBC前,这些问题你需要先了解一下
  10. php和asp渲染页面,Vue.js与 ASP.NET Core 服务端渲染功能
  11. c语言二级编程题库,计算机二级C语言编程题库(100题)
  12. CTPN算法简单解析
  13. Java API 帮助文档中英文版下载
  14. 11种职场肢体语言,你懂吗
  15. 计算机开机总要按f1键,为什么开机要按f1键?win7每次开机按f1才能进入系统怎么办...
  16. 51单片机c语言相位计,相位计.doc
  17. 【Python脚本抢红包】用Python写了一个自动抢红包工具,今年过年准备大干一场
  18. MySQL 第三章习题
  19. 分布式学习笔记001
  20. 你知不知道,天空没有想象中蓝。

热门文章

  1. cad2010多个文件并排显示_CAD2010中如何将多个文档并排显示在一个窗口里?
  2. 信号与系统公式笔记(9)——Z变换
  3. MapStruct 代码生成器
  4. 极速办公(excel)字体如何改为斜体
  5. 1块钱的路由器,10亿美金的小米网络
  6. SQL server 2008卸载后有残留及彻底卸载
  7. latex论文模板双栏
  8. 10分钟掌握运输问题(一)
  9. python 对象是什么概念
  10. WhereHows 安装