最近老师布置了一个作业,要求我们建立一个6位数字的gmail账号,然而我脸太黑,试了好多次都不成功,于是决定用python来写一个脚本遍历输入所有6位数。这就要求掌握使用python捕捉和模拟键盘操作了,于是我查阅了网上诸多资料,终于实现了这个功能,特此记录下来方便以后复习。

使用的python版本为:3.6.1,使用anaconda配置的python环境
参考博文

首先安装pyautogui库:

conda install -c jim-hart pyautogui

pyautogui库函数的基本介绍

PyAutoGUI使用x,y坐标,屏幕左上角坐标是(0, 0)

图像操作

获取屏幕分辨率

import pyautogui as pag
screenWidth, screenHeight = pag.size()

截屏功能

#  返回一个Pillow/PIL的Image对象
img=pag.screenshot()
img.save('foo.png')
pag.screenshot('foo.png')

获得某个坐标的像素

(r,g,b)=img.getpixel((50, 200))
# (30, 132, 153)# 判断屏幕坐标的像素是不是等于某个值
ifEqual=pag.pixelMatchesColor(50, 200, (30, 132, 153))
#True

如果你不需要截取整个屏幕,还有一个可选的region参数。你可以把截取区域的左上角XY坐标值和宽度、高度传入截取

img = pag.screenshot(region=(0, 0, 300 ,400))

在屏幕上找到按钮所在的坐标。其实很简单,首先对你要点击的按钮截个图,就叫button.png吧。然后使用locateOnScreen函数找到按钮所在的位置

pag.locateOnScreen('button.png')
# (643, 745, 70, 29)

locateOnScreen其实就是简单的颜色对比,如果有一个像素不匹配,它就会返回None。这个函数返回了匹配图形的坐标,找到中间点:

x, y = pag.center((643, 745, 70, 29))  # 获得中心点
pyautogui.click(x, y)
  • locateAllOnScreen():找到所有匹配的位置坐标。

要检查XY坐标是否在屏幕上,需要用onScreen()函数来检验,如果在屏幕上返回True:

pag.onScreen(0, 0) #True
pag.onScreen(0, -1) #False

鼠标操作

获取当前鼠标的坐标

currentMouseX, currentMouseY = pag.position()

鼠标点击

pag.click()

使用click()函数发送虚拟鼠标点击,默认情况下在鼠标所在的位置点击左键。函数原型:

pag.click(x=cur_x, y=cur_y, button='left')

x,y是要点击的位置,默认是鼠标当前位置
button是要点击的按键,有三个可选值:‘left’, ‘middle’, ‘right’

每个按键按下和松开两个事件可以分开处理:

pag.mouseDown(x=moveToX, y=moveToY, button='left')
pag.mouseUp(x=moveToX, y=moveToY, button='left')

双击

pag.doubleClick()

右击

pag.rightClick()

中击

pag.middleClick()

鼠标移动

pag.moveTo(x,y,duration) #  绝对坐标
pag.moveRel(x,y,duration) # 相对坐标

鼠标拖拽
注意:duration时间不能太短,拖动太快有些系统会吃不消

pag.dragTo(x,y,duration)
pag.dragRel(x,y,duration)

多次点击
可以设置clicks参数,还有interval参数可以设置每次单击之间的时间间隔。例如:

#  双击左键
pyautogui.click(clicks=2)
#  两次单击之间停留0.25秒
pyautogui.click(clicks=2, interval=0.25)
#  三击右键
pyautogui.click(button='right', clicks=2, interval=0.25)

滚轮
使用函数scroll(),它只接受一个整数。如果值为正往上滚,值为负往下滚。

pag.scroll(200)

缓动/渐变(Tween / Easing)函数
缓动/渐变函数的作用是让光标的移动更炫。如果你不需要用到的话,你可以忽略这些
缓动/渐变函数可以改变光标移动过程的速度和方向。通常鼠标是匀速直线运动,这就是线性缓动/渐变函数。PyAutoGUI有30种缓动/渐变函数,可以通过pyautogui.ease*?查看。其中,pyautogui.easeInQuad()函数可以用于moveTo(),moveRel(),dragTo()和dragRel()函数,光标移动呈现先慢后快的效果,整个过程的时间还是和原来一样。而pyautogui.easeOutQuad函数的效果相反:光标开始移动很快,然后慢慢减速。pyautogui.easeOutElastic是弹簧效果,首先越过终点,然后再反弹回来。例如:

#  开始很慢,不断加速
pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad)
#  开始很快,不断减速
pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad)
#  开始和结束都快,中间比较慢
pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad)
#  一步一徘徊前进
pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce)
#  徘徊幅度更大,甚至超过起点和终点
pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)

键盘操作

输入字符串

pag.typewrite('Hello world')

上面的字符串是一次输入,为了唬人可以延迟输入

pag.typewrite('Hello world!', 0.25)

PyAutoGUI键盘表:

字符串 代表按键
‘enter’(或‘return’ 或 ‘\n’) 回车
‘esc’ ESC键
‘shiftleft’, ‘shiftright’ 左右SHIFT键
‘altleft’, ‘altright’ 左右ALT键
‘ctrlleft’, ‘ctrlright’ 左右CTRL键
‘tab’ (‘\t’) TAB键
‘backspace’, ‘delete’ BACKSPACE 、DELETE键
‘pageup’, ‘pagedown’ PAGE UP 和 PAGE DOWN键
‘home’, ‘end’ HOME 和 END键
‘up’, ‘down’, ‘left’,‘right’ 箭头键
‘f1’, ‘f2’, ‘f3’…. F1…….F12键
‘volumemute’, ‘volumedown’,‘volumeup’ 有些键盘没有
‘pause’ PAUSE键
‘capslock’, ‘numlock’,‘scrolllock’ CAPS LOCK, NUM LOCK, 和 SCROLLLOCK 键
‘insert’ INS或INSERT键
‘printscreen’ PRTSC 或 PRINT SCREEN键
‘winleft’, ‘winright’ Win键
‘command’ Mac OS X command键
  • keyDown():按下某个键
  • keyUp():松开某个键
  • press():一次完整的击键,前面两个函数的组合。
  • hotkey(‘ctrl’,’c’):热键函数

消息弹窗函数

pyautogui.alert('这个消息弹窗是文字+OK按钮')
pyautogui.confirm('这个消息弹窗是文字+OK+Cancel按钮')
pyautogui.prompt('这个消息弹窗是让用户输入字符串,单击OK')
#返回用户输入的字符串,如果用户什么都不输入,则返回None

保护措施(Fail-Safes)

Python移动鼠标、点击键盘非常快,有可以导致其他应用出现问题。在这种情况下,程序可能会失控(即使是按照你的意思执行的),那时就需要中断。如果鼠标还在自动操作,就很难在程序窗口关闭它。

为了能够及时中断,PyAutoGUI提供了一个保护措施。当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,PyAutoGUI函数就会产生pyautogui.FailSafeException异常。如果失控了,需要中断PyAutoGUI函数,就把鼠标光标在屏幕左上角。要禁用这个特性,就把FAILSAFE设置成False

pag.FAILSAFE = False

通过把pyautogui.PAUSE设置成float或int时间(秒),可以为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。在函数循环执行的时候,这样做可以让PyAutoGUI运行的慢一点,非常有用。例如:

pag.PAUSE = 2.5
pag.moveTo(100,100);
pag.click()

寻找6位数gmail邮箱

经过一晚上的奋战,终于找到了一个6位数的gmail邮箱名,成功把作业提交了,脚本代码如下

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 23 00:23:10 2017@author: WangTong
"""import pyautogui as pag
import timepag.FAILSAFE = True
output=open('C:\\Users\\WangTong\\Desktop\\寻找gmail\\output.txt','w+')
pag.moveTo(100,800)
pag.scroll(100)
pag.moveTo(500,1720)#右移
pag.dragTo(1000,1720,0.5)
try:for num in range(800000,1000000):flag=Truepag.moveTo(1057,754)#移动到选择用户名窗口pag.click()pag.hotkey('ctrl','a')pag.press('delete')pag.typewrite(str(num))pag.moveTo(800,754)#移动到选择用户名窗口pag.click()time.sleep(1)img = pag.screenshot(region=(540, 440, 10,1))for i in range(1,10):(r,g,b)=img.getpixel((i,0))if g<100:flag=False# 出现了红框,说明该用户名已经有人用了breakif flag:#之前可能是网速较慢,延时5s再判断一次flag=Truepag.click()time.sleep(5)img = pag.screenshot(region=(540, 440, 10,1))for i in range(1,10):(r,g,b)=img.getpixel((i,0))if g<100:flag=Falsebreakif flag:#这个密码可以使用,但也存在google挂掉的情况,无论如何,先注册试试pag.moveTo(1057,870)#设置密码pag.click()pag.hotkey('ctrl','a')pag.press('delete')pag.typewrite('dasdhasiduha')pag.moveTo(1057,990)#确认密码pag.click()pag.hotkey('ctrl','a')pag.press('delete')pag.typewrite('dasdhasiduha')pag.moveTo(1450,1680)#下一步pag.click()pag.moveTo(920,1520)#按键pag.click()pag.moveTo(1250,1580)#我同意pag.click()time.sleep(4)img = pag.screenshot(region=(160, 450, 1 ,1))(r,g,b)=img.getpixel((0, 0))#可以(74, 140, 246)#不可以(255, 255, 255)if r<150:#注册失败print(num,'可以')pag.moveTo(40,100)#返回上一层pag.click()time.sleep(1)pag.scroll(100)pag.moveTo(500,1720)#右移pag.dragTo(1000,1720,0.5)output.write(str(num)+':Ok')output.write('\n')else:#注册成功print(num,'不可以')pag.scroll(100)pag.moveTo(500,1720)#右移pag.dragTo(1000,1720,0.5)output.write(str(num)+':No')
except:print('error')
finally:output.close()

总体思路就是遍历所有6位数用户名,如果该用户名已经被人注册了,用户名输入框会变成红色提示,如果没有被人注册,就是灰色输入框,所以我就依靠输入框的像素值来判断该用户名是否可以使用。不过有时候会因为网速问题加上gmail注册界面的一些莫名其妙的问题,一个账号明明已经被人注册了,但是输入进去之后不会有任何提示,必须要点击下一步才能提示你已经被人注册了,所以我就把完整的注册流程给模拟了一边,并且找了注册成功和注册失败界面中的某一个不一样的像素点作为区分,如果注册失败了,界面不会跳转,只要继续循环过程即可,如果注册成功了,为了保险起见,我将这个可以注册的账号输出的output.txt文件里,然后返回上一个界面继续尝试下一个数字。不过要注意的一点就是,无论注册成功还是失败,界面的位置都会变化,这个时候一定要将界面调整到右上角,不然之前设定的像素点坐标就错了。最后我跑了一个中午,找到了两个可以使用的数字,第一个不知道因为什么原因已经被人注册了但是误判为没有被注册,但是第二个数字可以使用,于是我的作业就完成了。

Ps:好多同学随手一试就找到了一个可以使用的用户名,我用脚本试了两千多个数字才找到一个,这就是欧皇和非酋的区别了吧/(ㄒoㄒ)/~~

python 捕捉和模拟鼠标键盘操作相关推荐

  1. python截图工具和模拟鼠标键盘_python PyAutoGUI 模拟鼠标键盘操作和截屏功能

    简介 一款跨平台/无依赖的自动化测试工具,目测只能控制鼠标/键盘/获取屏幕尺寸/弹出消息框/截屏. 安装 pip install pyautogui 鼠标键盘控制 >>> impor ...

  2. PyMouse模拟鼠标键盘操作

    PyMouse模拟鼠标键盘操作 使用PyMouse实现模拟鼠标键盘操作 -----解决方案1 1)安装[pyMouse]( https://pypi.org/project/PyMouse/) 2)安 ...

  3. C# 模拟 鼠标 键盘操作

    C# 模拟 鼠标 键盘操作 转载于:https://www.cnblogs.com/macT/p/10208222.html

  4. 模拟鼠标键盘操作,含硬件模拟技术。[转]

    模拟鼠标键盘操作,含硬件模拟技术. 键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就 ...

  5. 效率提升:使用AppleScript模拟鼠标键盘操作制作自动化工具

    文章目录 前言 AppleScript的实践应用 实践:还原修饰键默认设置 AppleScript基础知识 1.基本模块 语法 变量和属性 类型转换 运算符 List(数组) Record(键值对) ...

  6. python模拟按键包_今天玩点啥:利用python之PyUserInput实现模拟鼠标键盘操作,抢红包?聊天?自动下载?...

    一.PyUserInput安装 python3.5的PyMouse和PyKeyboard模块都集成到了PyUserInput模块中.在python3.5中,直接安装PyUserInput模块即可 Py ...

  7. python模拟鼠标键盘操作_人生苦短我用Python——模拟鼠标点击和键盘输入的操作...

    通过Python可以模拟鼠标点击和键盘输入的操作,进而可以实现一些比较有趣的功能,例如游戏挂机.自动发消息等. 本文以自动发消息为例,实现该功能,通过该代码可以自动往QQ.微信发送任意内容.首先考虑想 ...

  8. python模拟鼠标键盘操作_python3实现复制粘贴 Python-模拟鼠标键盘动作 | 猴头客

    1. 安装pyperclip pip install pyperclip 使用方法 复制 pyperclip.copy("hello world") 粘贴 pyperclip.pa ...

  9. python PyAutoGUI 模拟鼠标键盘操作和截屏

    简介 一款跨平台/无依赖的自动化测试工具,目测只能控制鼠标/键盘/获取屏幕尺寸/弹出消息框/截屏. 安装 pip install pyautogui 鼠标键盘控制 >>> impor ...

  10. selenium webdriver模拟鼠标键盘操作

    在测试使用Selenium webdriver测试WEB系统的时候,用到了模拟鼠标.键盘的一些输入操作. 1.鼠标的左键点击.双击.拖拽.右键点击等: 2.键盘的回车.回退.空格.ctrl.alt.s ...

最新文章

  1. 2021 年 6 月程序员工资统计,平均 15052 元
  2. 我依然坚持建议你开始写博客 | 写给我的 2017
  3. 江计算机科学与技术,计算机科学与技术
  4. pp模块生产策略组-对于零部件计划策略
  5. 秒杀系统设计的 5 个要点:前端三板斧+后端两条路
  6. 【渝粤题库】广东开放大学 个人与团队管理 形成性考核
  7. linux stat文件,Linux stat命令:显示文件或文件系统的详细信息
  8. 基于云端的通用权限管理系统,SAAS服务,基于SAAS的权限管理,基于SAAS的单点登录SSO,企业单点登录,企业系统监控,企业授权认证中心...
  9. 创建一个MDK工程模板
  10. 设置Listview行高--小技巧
  11. Windows Phone 开发【MSDN参考文档 目录】
  12. 【测试面试题每日一刷】22道接口测试面试题,附答案
  13. Verilog 实现四选一选择器
  14. Python 一个好用到爆炸的IP端口扫描工具类
  15. jacob实现ppt转图片时存在的问题
  16. 是女人,请进来学学拍照姿势!
  17. 操作系统的名字的读音
  18. windows下查看和关闭端口
  19. DecimalFormat的用法介绍 --转载
  20. 关于网络重置后无法联网的解决办法

热门文章

  1. flash AS3常用公式
  2. fnv1 java_笔记本热键驱动_笔记本万能fn键驱动 v1.1 通用版-126g驱动网
  3. Invalid argument: Subshape must have computed start >= end since stride is negative, but is 0 and 2
  4. 格式化代码_格式化代码是什么意思​
  5. 计算机桌面蓝字,教你电脑桌面图标有蓝色阴影怎么去掉
  6. acdream 1401 Lempel-Ziv Compression
  7. 计算机情绪识别属于什么方向,情绪识别
  8. python-selenium学习笔记:利用ec模块的定位方法,登陆百度并验证是否登陆成功
  9. html邮件签名生成器,签名生成器
  10. webpack中vender的抽离