查看原文
其他

Python | 用Python监听邻居家小姐姐的上网行为

上海小胖 Python专栏 2018-10-27




不甘现状的上海土著                                                                                  插画师 /小胖




编辑 /小胖




还记得曾经为了刷大话西游而下载了按键精灵,然后论坛上搜了各种分辨率的脚本么?

还记得春节为了刷回家的高铁票,自己写了按键精灵的脚本么?


现在python有一个神奇的库,我们不用再去模拟复杂的按键精灵了!监控鼠标、键盘,甚至是……


pynput这个库让你可以控制和监控输入设备。

对于每一种输入设备,它包含一个子包来控制和监控该种输入设备:

  • pynput.mouse:包含控制和监控鼠标或者触摸板的类。

  • pynput.keyboard:包含控制和监控键盘的类。

上面提到的子包都已被引入到pynput库中。要使用上面的子包,从pynput中引入即可。

from pynput import mouse, keyboard


接下来就跟着小胖一起来看下如何玩转鼠标和键盘吧。


控制鼠标

使用pynput.mouse控制鼠标

from pynput.mouse import Controller, Button

mouse = Controller()

# 获取当前鼠标位置
print(f'当前小胖的鼠标位置是: {mouse.position}')

# 设置鼠标位置
mouse.position = (10, 20)
print(f'现在小胖把鼠标移动到 {mouse.position}')

# 使用相对距离,移动当前鼠标
mouse.move(5, -5)

# 按下鼠标左键,释放鼠标左键
mouse.press(Button.left)
mouse.release(Button.left)

# 向下滚动2格
mouse.scroll(0, 2)

效果如图


监控鼠标事件

使用pynput.mouse.Listener监控鼠标事件

from pynput import mouse

def on_move(x, y):
   print(f'鼠标移动到坐标 {(x, y)}')

def on_click(x, y, button, pressed):
   print(f"{'按下' if pressed else '释放'} ,当前位置是: {(x, y)}")
   if not pressed:
       # 停止监听
       return False

def on_scroll(x, y, dx, dy):
   print(f"滑动鼠标, {'向下' if dy < 0 else '向上'} at {(x, y)}")

# 一直监听事件,直到鼠标释放
with mouse.Listener(
       on_move=on_move,
       on_click=on_click,
       on_scroll=on_scroll) as listener:
   listener.join()


效果如图

鼠标事件监听器是一个线程,所有的回调函数都会在独立的线程中运行。

调用pynput.mouse.Listener.stop,发起StopException异常,或者回调函数中返回False都会停止事件的监听。


控制键盘

使用pynput.keyboard.Controller控制键盘

from pynput.keyboard import Key, Controller

keyboard = Controller()

# 按下并释放空格
keyboard.press(Key.space)
keyboard.release(Key.space)

# 按下并释放小写字母a
keyboard.press('a')
keyboard.release('a')

# 2种方式输入大写A
keyboard.press('A')
keyboard.release('A')
with keyboard.pressed(Key.shift):
   keyboard.press('a')
   keyboard.release('a')

# 直接操作键盘输入Hello World
keyboard.type('Hello World')

监控键盘事件

使用pynput.keyboard.Listener监听键盘事件

from pynput import keyboard

def on_press(key):
   try:
       print(f'字母 {key.char} 被按下了')
   except AttributeError:
       print(f'特殊的键 {key} 被按下了')

def on_release(key):
   print(f'{key} 被释放了')
   if key == keyboard.Key.esc:
       # 停止监听
       return False

# 一直监听键盘事件,直到停止
with keyboard.Listener(
       on_press=on_press,
       on_release=on_release) as listener:
   listener.join()


键盘事件监听器是一个线程,所有的回调函数都会在独立的线程中运行。

调用pynput.keyboard.Listener.stop,发起StopException异常,或者回调函数中返回False都会停止事件的监听。

传递给回调函数的key参数是一个pynput.keyboard.Key类的实例。当特殊按键和普通按键一起按下时,数字字母按键的值会被放置在pynput.keyboard.KeyCode类的实例中,对于不知道的按键会返回None。


接下来就是发挥你们能力的时候了,说不定写个脚本,用exe包装一下,命名为种子收发器?哈哈哈哈,然后就可以监听起来了?


好啦,今天的内容就到这了,欢迎留言和私信我你的想法~

所有代码都已上传至github:https://github.com/MiracleYoung/exercises

我的博客: https://miracleyoung.github.io/



之前的「高级群」快要满100人了,现在准备好好做星球。以后高级群就作为星球的福利群。

星球里会有Python原创、Python小技巧、面试刷题、大厂内推、技术分享等。

目前正在做的是一个「大航海计划」:由船长发起,分为多个阶段,或招募或淘汰若干名船员,每周都会在星球做一次项目汇报。启动资金由船员众筹10元,与我无关。目标是让球友能够在星球里找到志同道合的小伙伴一起驶向新世界。

也欢迎球友提问,每天我都会回答大家的问题,方向不限。



推荐阅读:

Python | 提升Python程序性能的7个习惯,你都有吗?

2018年上半年复盘



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存