网银的密码输入控件是通过直接读键盘设备IO获取的输入。需要使用驱动级的键盘模拟输入技术才能输进去。
一个是WinIO,肯定能实现,我已测试过,WinIO怎么用可以百度一下,有很多资料。
另外一个是虚拟键盘驱动,网上有个DD虚拟键盘http://www.ddxoft.com/,就是这样实现的,这个DD虚拟键盘分免费版和收费版,免费版有广告,会改IE主页,(而且不知道有没有后门),收费版的使用费为500元一台电脑一年。
也可以自行用WDK开发一个虚拟键盘驱动
# _*_ coding:UTF-8 _*_
import win32api
import win32con
import win32gui
from ctypes import *
import time
VK_CODE = {
'backspace':0x08,
'tab':0x09,
'clear':0x0C,
'enter':0x0D,
'shift':0x10,
'ctrl':0x11,
'alt':0x12,
'pause':0x13,
'caps_lock':0x14,
'esc':0x1B,
'spacebar':0x20,
'page_up':0x21,
'page_down':0x22,
'end':0x23,
'home':0x24,
'left_arrow':0x25,
'up_arrow':0x26,
'right_arrow':0x27,
'down_arrow':0x28,
'select':0x29,
'print':0x2A,
'execute':0x2B,
'print_screen':0x2C,
'ins':0x2D,
'del':0x2E,
'help':0x2F,
'0':0x30,
'1':0x31,
'2':0x32,
'3':0x33,
'4':0x34,
'5':0x35,
'6':0x36,
'7':0x37,
'8':0x38,
'9':0x39,
'a':0x41,
'b':0x42,
'c':0x43,
'd':0x44,
'e':0x45,
'f':0x46,
'g':0x47,
'h':0x48,
'i':0x49,
'j':0x4A,
'k':0x4B,
'l':0x4C,
'm':0x4D,
'n':0x4E,
'o':0x4F,
'p':0x50,
'q':0x51,
'r':0x52,
's':0x53,
't':0x54,
'u':0x55,
'v':0x56,
'w':0x57,
'x':0x58,
'y':0x59,
'z':0x5A,
'numpad_0':0x60,
'numpad_1':0x61,
'numpad_2':0x62,
'numpad_3':0x63,
'numpad_4':0x64,
'numpad_5':0x65,
'numpad_6':0x66,
'numpad_7':0x67,
'numpad_8':0x68,
'numpad_9':0x69,
'multiply_key':0x6A,
'add_key':0x6B,
'separator_key':0x6C,
'subtract_key':0x6D,
'decimal_key':0x6E,
'divide_key':0x6F,
'F1':0x70,
'F2':0x71,
'F3':0x72,
'F4':0x73,
'F5':0x74,
'F6':0x75,
'F7':0x76,
'F8':0x77,
'F9':0x78,
'F10':0x79,
'F11':0x7A,
'F12':0x7B,
'F13':0x7C,
'F14':0x7D,
'F15':0x7E,
'F16':0x7F,
'F17':0x80,
'F18':0x81,
'F19':0x82,
'F20':0x83,
'F21':0x84,
'F22':0x85,
'F23':0x86,
'F24':0x87,
'num_lock':0x90,
'scroll_lock':0x91,
'left_shift':0xA0,
'right_shift ':0xA1,
'left_control':0xA2,
'right_control':0xA3,
'left_menu':0xA4,
'right_menu':0xA5,
'browser_back':0xA6,
'browser_forward':0xA7,
'browser_refresh':0xA8,
'browser_stop':0xA9,
'browser_search':0xAA,
'browser_favorites':0xAB,
'browser_start_and_home':0xAC,
'volume_mute':0xAD,
'volume_Down':0xAE,
'volume_up':0xAF,
'next_track':0xB0,
'previous_track':0xB1,
'stop_media':0xB2,
'play/pause_media':0xB3,
'start_mail':0xB4,
'select_media':0xB5,
'start_application_1':0xB6,
'start_application_2':0xB7,
'attn_key':0xF6,
'crsel_key':0xF7,
'exsel_key':0xF8,
'play_key':0xFA,
'zoom_key':0xFB,
'clear_key':0xFE,
'+':0xBB,
',':0xBC,
'-':0xBD,
'.':0xBE,
'/':0xBF,
';':0xBA,
'[':0xDB,
'\\':0xDC,
']':0xDD,
"'":0xDE,
'`':0xC0}
class POINT(Structure):
_fields_ = [("x", c_ulong),("y", c_ulong)]
def get_mouse_point():
po = POINT()
windll.user32.GetCursorPos(byref(po))
return int(po.x), int(po.y)
def mouse_click(x=None,y=None):
if not x is None and not y is None:
mouse_move(x,y)
time.sleep(0.05)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
def mouse_dclick(x=None,y=None):
if not x is None and not y is None:
mouse_move(x,y)
time.sleep(0.05)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
def mouse_move(x,y):
windll.user32.SetCursorPos(x, y)
def key_input(str=''):
for c in str:
win32api.keybd_event(VK_CODE[c],0,0,0)
win32api.keybd_event(VK_CODE[c],0,win32con.KEYEVENTF_KEYUP,0)
time.sleep(0.01)
if __name__ == "__main__":
mouse_click(1024,470)
str = 'hello'
key_input(str)
rabird.winio下载地址:https://pypi.python.org/pypi/rabird.winio
1.本程序需要电脑有ps2键盘和鼠标的驱动,笔记本电脑一般有ps2
2.程序需要在电脑的测试模式下运行,开启测试模式方法bcdedit.exe /set TESTSIGNING ON
3.执行程序要求以管理员身份运行
import rabird.winio
import time
import atexit
# KeyBoard Commands
# Command port
KBC_KEY_CMD = 0x64
# Data port
KBC_KEY_DATA = 0x60
__winio = None
def __get_winio():
global __winio
if __winio is None:
__winio = rabird.winio.WinIO()
def __clear_winio():
global __winio
__winio = None
atexit.register(__clear_winio)
return __winio
def wait_for_buffer_empty():
'''
Wait keyboard buffer empty
'''
winio = __get_winio()
dwRegVal = 0x02
while (dwRegVal & 0x02):
dwRegVal = winio.get_port_byte(KBC_KEY_CMD)
def key_down(scancode):
winio = __get_winio()
wait_for_buffer_empty()
winio.set_port_byte(KBC_KEY_CMD, 0xd2)
wait_for_buffer_empty()
winio.set_port_byte(KBC_KEY_DATA, scancode)
def key_up(scancode):
winio = __get_winio()
wait_for_buffer_empty()
winio.set_port_byte( KBC_KEY_CMD, 0xd2)
wait_for_buffer_empty()
winio.set_port_byte( KBC_KEY_DATA, scancode | 0x80)
def key_press(scancode, press_time = 0.2):
key_down( scancode )
time.sleep( press_time )
key_up( scancode )
# Press 'A' key
# Scancodes references : https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
#key_press(0x1E)
VK_CODE = {
'1': 0x02,
'2': 0x03,
'3': 0x04,
'4': 0x05,
'5': 0x06,
'6': 0x07,
'7': 0x08,
'8': 0x09,
'9': 0x0A,
'0': 0x0B,
'a': 0x1E,
'b': 0x30,
'c': 0x2E,
'd': 0x20,
'e': 0x12,
'f': 0x21,
'g': 0x22,
'h': 0x23,
'i': 0x17,
'j': 0x24,
'k': 0x25,
'l': 0x26,
'm': 0x32,
'n': 0x31,
'o': 0x18,
'p': 0x19,
'q': 0x10,
'r': 0x13,
's': 0x1F,
't': 0x14,
'u': 0x16,
'v': 0x2F,
'w': 0x11,
'x': 0x2D,
'y': 0x15,
'z': 0x2C,
# 'backspace': 0x0E,
# 'clear': 0x0C,
# 'enter': 0x0D,
# 'shift': 0x10,
# 'ctrl': 0x11,
# 'alt': 0x12,
'caps_lock': 0x3A,
'-': 0x0C,
# '=': 0x0D,
# '[': 0x1A,
# ']': 0x1B,
# '\\': 0x2B,
# ';': 0x27,
# "'": 0x28,
# '`': 0x29,
# ',':0x33,
# '.': 0x34,
# '/': 0x35,
}
def key_input(str=''):
for c in str:
try:
key_press(VK_CODE[c])
except:
key_press(0x3A)
time.sleep(0.5)
key_press(VK_CODE[c.lower()])
key_press(0x3A)
if __name__ == "__main__":
str = 'hello'
key_input(str)
# -*- coding:utf-8 -*-
import pymouse,pykeyboard,os,sys
from pymouse import *
from pykeyboard import PyKeyboard
import time
# 分别定义一个实例
#鼠标操作
m = PyMouse()
#键盘操作
k = PyKeyboard()
time.sleep(5)
'''
m.click(x,y,button,n) –鼠标点击
x,y –是坐标位置
buttong -1表示左键,2表示点击右键
n –点击次数,默认是1次,2表示双击
'''
m.click(1085,418,1,1)
'''
m.move(x,y) –鼠标移动到坐标(x,y)
x_dim, y_dim = m.screen_size() –获得屏幕尺寸
'''
m.move(1085,418)
x_dim, y_dim =m.screen_size()
'''
k.type_string(‘Hello, World!’) –模拟键盘输入字符串
k.press_key(‘H’) –模拟键盘按H键
k.release_key(‘H’) –模拟键盘松开H键
k.tap_key(“H”) –模拟点击H键
k.tap_key(‘H’,n=2,interval=5) –模拟点击H键,2次,每次间隔5秒
k.tap_key(k.function_keys[5]) –点击功能键F5
k.tap_key(k.numpad_keys[5],3) –点击小键盘5,3次
'''
k.type_string('Hello')
k.press_key('H')
k.release_key('H')
k.tap_key('H')
k.tap_key('H',n=2,interval=5)
k.tap_key(k.function_keys[5])
k.tap_key(k.numpad_keys[5],3)
'''
联合按键模拟,例如同时按alt+tab键盘
k.press_key(k.alt_key) –按住alt键
k.tap_key(k.tab_key) –点击tab键
k.release_key(k.alt_key) –松开alt键
'''
k.press_key(k.alt_key)
k.tap_key(k.tab_key)
k.release_key(k.alt_key)
地址:https://pypi.python.org/pypi/pynput
这个库让你可以控制和监控输入设备。
对于每一种输入设备,它包含一个子包来控制和监控该种输入设备:
基本用法介绍:
from pynput.mouse import Button, Controller
import time
mouse = Controller()
print(mouse.position)
time.sleep(3)
print('The current pointer position is {0}'.format(mouse.position))
#set pointer positon
mouse.position = (277, 645)
print('now we have moved it to {0}'.format(mouse.position))
#鼠标移动(x,y)个距离
mouse.move(5, -5)
print(mouse.position)
mouse.press(Button.left)
mouse.release(Button.left)
#Double click
mouse.click(Button.left, 1)
#scroll two steps down
mouse.scroll(0, 500)
监控鼠标事件 :
from pynput import mouse
def on_move(x, y ):
print('Pointer moved to {o}'.format(
(x,y)))
def on_click(x, y , button, pressed):
print('{0} at {1}'.format('Pressed' if pressed else 'Released', (x, y)))
if not pressed:
return False
def on_scroll(x, y ,dx, dy):
print('scrolled {0} at {1}'.format(
'down' if dy < 0 else 'up',
(x, y)))
while True:
with mouse.Listener( no_move = on_move,on_click = on_click,on_scroll = on_scroll) as listener:
listener.join()
键盘输入用法:
from pynput.keyboard import Key, Controller
keyboard = Controller()
#Press and release space
keyboard.press(Key.space)
keyboard.release(Key.space)
#Type a lower case A ;this will work even if no key on the physical keyboard is labelled 'A'
keyboard.press('a')
keyboard.release('a')
#Type two upper case As
keyboard.press('A')
keyboard.release('A')
# or
with keyboard .pressed(Key.shift):
keyboard.press('a')
keyboard.release('a')
#type 'hello world ' using the shortcut type method
keyboard.type('hello world')
键盘监听:
from pynput import keyboard
def on_press(key):
try:
print('alphanumeric key {0} pressed'.format(key.char))
except AttributeError:
print('special key {0} pressed'.format(key))
def on_release(key):
print('{0} released'.format(key))
if key == keyboard.Key.esc:
return False
while True:
with keyboard.Listener(
on_press = on_press,
on_release = on_release) as listener:
listener.join()