分类标签归档:python

使用pywintrace监控Windows进程变动


写在前面

最近突发奇想,想监控某个进程的启动和退出事件,搜了一下,有个专门的名词来描述这类事件,叫做Event Trance For Windows,简称ETW,跟Windows的事件管理器有比较大的关系。
为了快速实现这个想法,决定使用python来完成,上github搜索,发现一个名为pywintrace的项目,只要稍作修改就能实现我们的需求。

安装依赖

需要用到pywintracepsutil两个模块。

pip install pywintrace
pip install psutil

示例代码

直接拿项目中的示例,稍作修改即可(需要管理员权限执行示例代码),这里以微信作为示例:

i

Read more

匿名管道和CreateProcess在Python中的应用


写在前面

有时候需要在程序内部调用cmd执行命令,主程序需要拿到命令的输出信息,python中有以下几种方案可以实现该操作:

  1. os.popen
  2. os.system(可能无法拿到返回)
  3. subprocess

其中使用最为广泛的,应该是subprocess.Popen,本文所要介绍的内容,就是参考该库源码实现的。
为了能够动态的读取目标进程的输出,而不是等到子进程执行完毕一次性读取,所以没有使用subprocess

CreateProcess

CreateProcess是一个Windows API,该API用于创建一个新的进程,并返回新进程相关信息,可以通过自定义参数重定向目标进

Read more

JavaAccessBridge的使用


写在前面

工作中要通过自动化来操作java桌面程序,Windows的UIA只能识别顶层窗口,无法具体到内部的元素,所以无法使用,经过一番搜索,发现可以通过JavaAccessBridge来访问java中的ui组件。

相关文件

Java在某个版本后内置了JAB,可以在JDK安装目录\\include\\win32\\bridge下找到以下文件:

  1. AccessBridgeCallbacks.h (事件监听)
  2. AccessBridgeCalls.c (API)
  3. AccessBridgeCalls.h (API)
  4. AccessBridgePackages.h (数据结构)

可以在J

Read more

js获取网页echarts图表中的数据


写在前面

最近接到某网站的爬虫需求,因为客户与目标网站是通过协议获取的账号,所以不希望从接口获取数据,而网页源代码无法获取完整的canvas数据,怎么办呢,需求还是得做。

实现思路

后来发现,echarts是动态图表,当鼠标移动到某处时,会高亮该处数据,并实时更改某个div的text内容,观察network接口,没有新的请求(也不可能有),说明数据已经存储在某个js变量里了,我就去瞅了一下echarts渲染数据时使用的函数:

var chart = echarts.init(document.getElementById("map"+Id),'write',

Read more

requests处理form-data和payload类型的参数


写在前面

在使用requests发送post请求时,会遇到不同的表单类型,比较常见的是application/x-www-form-unlencoded,直接传递字典即可,有时会遇到multipart/form-data和Request Payload类型,只要做简单的处理即可。

form-data类型

import requests

def get_form_data(data:dict) -> tuple:
    data_files = []
    for key in data.keys():
        if not isinstance(data[key],list

Read more

解决Python解压Zip文件出现中文乱码


写在前面

最近有很多项目需要用到zip解压,python自带了zipfile模块,但是文件带有中文名时会出现乱码,查找资料后发现zipfile中文件名使用了cp437的编码方式,使用utf8或者gbk重新解析一下即可。

实现

import zipfile
import os,shutil
def ziptest():
    zip_file = zipfile.ZipFile('./test.zip')
    DIR = './test_zip'
    zip_list = zip_file.namelist()
    if os.path.exists

Read more

Python实现鼠标和键盘Hook


写在前面

有时需要实时监控下一次鼠标点击的动作,所以就考虑通过Hook来实现,主要原理是Windows通过消息机制来运作,在消息传递过程加上一层自己的操作,就实现了动作监听,python有现成的轮子,PyHook3,可以很方便的使用。

PyHook3

注:键盘Hook请自行研究

import pythoncom
import PyHook3 as pyHook
import ctypes

def onMouseEvent(event):
     # 监听鼠标事件
     print(dir(event))
     if not event.WindowName:
         re

Read more

Windows消息机制在python中的使用


写在前面

此问题是在不同线程之间通信时出现的,在开始下一次任务之前,要确保某个子线程已退出(后来才想到在适当地方join前述子线程就可以了),不过当时已经使用PostMessage实现了不同线程通信,在此记录一下,或许他日有用。

实现代码

import ctypes
WM_USER = 0x400
WM_PLAYER_STOP = WM_USER + 0x1
# 用于接收消息,在接收到消息之前将阻塞进程
GetMessageW = ctypes.windll.user32.GetMessageW
GetMessageW.argtypes = [ctypes.POINTER(ctypes.win

Read more

Python消息弹框的使用


写在前面

python的tkinter中有消息弹框的实现,但这个方法有一个略微让人不爽的地方,需要在调用之前声明一个tk对象(不需要mainloop)并且调用withdraw隐藏,否则会有一个意料之外的窗口弹出,实际上是tkinter帮你创建了一个tk窗口。本文介绍一下tkinter消息弹框和Windows API弹框的使用。

tkinter

from tkinter import messagebox
from tkinter import Tk
root = Tk()
root.withdraw()
# 错误弹框
messagebox.showerror(title = 'Erro

Read more

Pyinstaller打包时包含静态资源


写在前面

最近在做一个项目,交付时使用exe,但是有几个DLL依赖需要放到同级目录,被问及能不能把DLL隐藏起来,之前从没有搞过类似的事情,于是打开百度,搜索一番,还是有戏的。

打包进EXE

Pyinstaller可以使用makespec命令生成spec文件,或者在初次打包时自动生成,此时修改相应的spec文件:

# 以元组的形式写到datas列表里,第一个值为文件路径(使用反斜杠),第二个值为打包后相对exe文件的目录,'.'表示根目录
datas=[('xxx.dll','.'),('xxx.png','.')

Read more