Python小工具
简介
前两个星期在进行学习的时候发现Py写小工具效果非常好,于是花了点时间顺带着学习了一下py,也尝试着使用已经学习的py知识进行了一个两个小工具的开发。下面是我开发的成果。
代码部分
代码一
代码作用: 本代码的作用为将脚本所在目录的文件打包(doyoutrustme)发送到对应的服务器。
注意事项: 该代码的运行效率并不高,缺少重复文件判断部分,大家如果比较注重效率或者重视脚本运行的速度的话可以尝试在此代码的基础上让脚本存储一个md5的文档(算出所有的文件的md5值),然后复制的时候进行比较,如果md5值相同,那么不需要进行复制。
import os
import shutil
import sys
import paramiko
path = sys.path[0] #返回脚本运行的当前目录
files = os.listdir(path)
#服务器相关信息
ip = "192.168.2.221"#服务器ip
port = 22#端口号
username = "root"#用户名
password = "toor"#密码
#扫描复制文件到doyoutrustme这个文件夹内
def scan_and_sort_out(filelist,now_dir):
if not os.path.exists('doyoutrustme'):
os.makedirs('doyoutrustme')
for f in filelist:
shutil.copyfile(f, now_dir + '/doyoutrustme/' + f'{f}')
else:
for f in filelist:
shutil.copyfile(f, now_dir + '/doyoutrustme/' + f'{f}')
#压缩doyoutrustme文件夹内的内容,并删除doyoutrustme文件
#暂时缺少重复文件的判断
def compression_and_delete_sort_out_file(file_path):
shutil.make_archive(file_path + '/doyoutrustme/','zip',file_path + '/doyoutrustme/')
shutil.rmtree(file_path + '/doyoutrustme/')
#发送程序运行的当前路径以及打包压缩好的文件,并删除压缩的文件
def send_compression_file(local,remote):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, port, username, password)
sftp = ssh.open_sftp()
sftp.put(local, remote)
scan_and_sort_out(files,path)
compression_and_delete_sort_out_file(path)
send_compression_file(path + '/doyoutrustme.zip','/root/Desktop/test2/' + '/doyoutrustme.zip')
os.remove(path + '/doyoutrustme.zip')
代码比较简单,也不需要太多的解释,用的几个库以及其中的函数也很容易就找到相关的文档和解释。
代码二
代码作用: 本代码的作用为将test4.xls表格内备注部分标注的文件发送到对应的QQ联系人。
表格格式:
注意事项:
1.表格的格式一定不能错,第一行一定是姓名和备注(当然换成其他的也行,程序中是从第二行开始扫描的,我这边只是为了开发的方便所以并没有根据表格中的内容进行扫描)
2.文件的路径最好是绝对路径
#库应用部分
import xlrd
import win32gui
import win32con
import win32api
import win32clipboard
from PyQt5 import QtCore, QtWidgets
import time
#函数定义部分
#选择表函数
def get_excel(user_input):
table = data.sheets()[user_input-1]
print(table)
return table
#寻找单元格内的内容
def make_message(table):
l = []
row = 1
col = 0
for nrow in range(table.nrows-1):
content = f'{table.row(row)[col+1].value}' #读取文件路径
l.append(content)
row += 1
print(l)
return l
#获得单元格内的联系人
def get_human(table):
human = []
row = 1
col = 0
for nrow in range(table.nrows-1):
human.append(table.row(row)[col].value)
row += 1
print('人员名单如下:')
print(human)
return human
#设置剪切板文本
def setText(massage):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, massage)
win32clipboard.CloseClipboard()
#复制文件到剪切板
def filesend(filepath):
app = QtWidgets.QApplication([])
data = QtCore.QMimeData()
url = QtCore.QUrl.fromLocalFile(filepath)
# QUrl.fromLocalFile(filename)的功能是使用QUrl的类函数fromLocalFile(),根据文件名filename创建一个指向此文件的QUrl对象。
data.setUrls([url])
# 设置地址列表,参数为QUrl类的列表;
app.clipboard().setMimeData(data)
# 设置剪切板的值
# clipboard = QtWidgets.QApplication.clipboard()两种写法效果一样
def ctrlV():
win32api.keybd_event(17,0,0,0) #ctrl键位码是17
win32api.keybd_event(86,0,0,0) #v键位码是86
win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) #释放按键
win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)
def scan():
hwnd_title = dict()
if num == 0:
def get_all_hwnd(hwnd, mouse):
if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})
win32gui.EnumWindows(get_all_hwnd, 0)
else:
pass
return hwnd_title
def open_windows_and_send(name_list,message_list,num):
qq_hwnd = win32gui.FindWindow('TXGuiFoundation', 'QQ')
print("捕捉到QQ主窗体的句柄为:"+str(qq_hwnd))
win32gui.ShowWindow(qq_hwnd,win32con.SW_SHOW)
print("正在打开会话窗口...\n")
time.sleep(1)
for i in name_list: #改为if更好一点
name = i
setText(name)
win32gui.SetForegroundWindow(qq_hwnd)
win32gui.SetActiveWindow(qq_hwnd)
time.sleep(0.8)
win32gui.SendMessage(qq_hwnd,770, 0, 0)
time.sleep(0.8)
win32gui.SendMessage(qq_hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) # 模拟按下回车键
win32gui.SendMessage(qq_hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0) # 模拟松开回车键
time.sleep(0.8)
win32gui.SetForegroundWindow(qq_hwnd)
win32gui.SetActiveWindow(qq_hwnd)
win32api.keybd_event(0x0D, win32api.MapVirtualKey(0x0D, 0), 0, 0)
win32api.keybd_event(0x0D, win32api.MapVirtualKey(0x0D, 0), win32con.KEYEVENTF_KEYUP, 0)
hwnd_title = scan()
for h, t in hwnd_title.items():
if t != "" and t != "QQ" and t != "小火箭通用加速":
hwnd = win32gui.FindWindow('TXGuiFoundation', t) # 获取qq窗口句柄
if hwnd != 0:
message = message_list[num]
filesend(message)
time.sleep(0.5)
win32gui.SetForegroundWindow(hwnd)
win32gui.SetActiveWindow(hwnd)
ctrlV()
time.sleep(1)
win32gui.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) # 模拟按下回车键
win32gui.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0) # 模拟松开回车键
win32api.keybd_event(0x0D, win32api.MapVirtualKey(0x0D, 0), 0, 0)
win32api.keybd_event(0x0D, win32api.MapVirtualKey(0x0D, 0), win32con.KEYEVENTF_KEYUP, 0)
num += 1
excel_path = './test4.xls'
data = xlrd.open_workbook(excel_path)
count = str(1)
for i in data.sheet_names():
print(count + '.' + i)
count = str(1 + int(count))
#选择表单操作
print('请选择要使用的表单:')
user_input = int(input())
user_use_sheet = data.sheet_names()[user_input-1]
print('你选择了' + user_use_sheet + '表格')
table = get_excel(user_input)
message = make_message(table)
human = get_human(table)
num = 0
open_windows_and_send(human,message,num)
在这个工具代码中,运用到了相当多的函数和函数库,但是绝大部分也是有对应的文档解释的,这里我给出win32这几个库的一些文档。
win32 API含义: https://www.cnblogs.com/jackcovey/archive/2007/08/11/852051.html
win32 API使用: http://www.gimoo.net/t/1809/5bb053298c7da.html
在进行操作的过程中,我意识到了一些问题,我并没有什么有效的方法能让代码一和代码二自动运行(在代码二将代码一文件发送到相应的联系人的时候,代码一并不能自动运行)。我意识到可以使用类似中断的方式进行自动调用(目前正在尝试)。
总结:
在此次的学习中最主要的就是学会了怎么去查看Py库的使用方式,顺便用这两个小工具练了一下手。