文章目录
- 前言
- 一、前期准备
- 二、OCR图片识别部分(可单独使用)
- 1.识别单张图片并输出
- 2.识别多张图片,并搜索你需要的段落(例如学号)
- 三、 qq的自动发送
- 四、 总体的代码实现
- 总结
前言
作为班长,提醒体温打卡是一件很内耗的事情。所以,当然是要实现自动化啦!就想到,Python有一个识别图像中文字的包,叫OCR,于是就简单做了一个,可以自动识别图片文字(我选择识别学号,这个可以自行调节)的小程序,并将未打卡的名单发送到班群,用来提醒同学。
一、前期准备
- 我使用的是conda环境,所以直接打开终端(记得关掉某些非法的东西)
conda install pytesseract
- 然后在官网下载Tesseract
- 并配置环境变量,将安装目录配置到系统path变量中
如果你用的也是坑爹的win11,打开环境变量是以下步骤:
WIN+R快捷键
输入control system - Tesseract默认是不支持中文的,如果想要识别中文需要下载Chinese-Simplified语言包,下载地址如下: https://tesseract-ocr.github.io/tessdoc/Data-Files
- 继续在conda环境下
conda install pywin32
这样基本环境就有啦
对了我用的ide是pycharm~~
二、OCR图片识别部分(可单独使用)
1.识别单张图片并输出
代码如下:
import pytesseract
from PIL import Image
# 读取图片
im = Image.open('C:/Users/LAYRA/Desktop/ALOT/2.jpg') #照片的地址
# 识别中文文字
string = pytesseract.image_to_string(im, lang='chi_sim')
print(string)
识别图片:
识别效果:
可以看到还是很棒哒
2.识别多张图片,并搜索你需要的段落(例如学号)
我们班的学号是以统一的2152005开头,所以我只需要搜索图片中学号的部门即可。
做了一个小的model,假设本班有215200501-215200504四个人,1号和4号交了图片。我需要输出的是2号和3号没交。
代码如下:
import os
import pytesseract
import re
path = 'C:/Users/LAYRA/Desktop/model/'
# 获取图片路径列表
imgs = [path + i for i in os.listdir(path)]
# 打开文件
f = open('C:/Users/LAYRA/Desktop/ALOT/text.txt', 'w+', encoding='utf-8')
# 将各个图片的路径写入text.txt文件当中
list = []
list1 = []
for i in range(215200501,215200505): #制作完整学号集合
list1.append(i)
for img in imgs:
try:
if(img.index(".png")>-1): #or (img.index(".jpg")>-1)):
#上面是指定判断照片的格式
f.write(img + '\n')
string = pytesseract.image_to_string(img, lang='chi_sim')
x = re.findall("2152005[01234][0123456789]",string)
#以上是搜索以2152005开头的数字
#list.append(int(x[0]))
a=int(x[0])
list.append(a)
except:
continue
# 关闭文件
f.close()
list.sort()
for i in range(215200501,215200505):#遍历各个图片中的学号,判断谁交了,输出没交的学号
flag = 0
for m in range(len(list)):
if i == list[m]:
flag =1
continue
if flag == 0:
print(i)
效果如下:
三、 qq的自动发送
其实就是模拟一个剪贴板复制和发送
一定一定要注意的是,setText不可以设置数字。(我也不知道为什么,大佬解释一下,这个我也报错了很久才找到出错的原因。这里感谢一下顾家成和学弟陈俊逸同学的帮忙。毕竟粗心的我是检查不出来的。
import win32gui
import win32con
import win32clipboard as w
def getText():
"""获取剪贴板文本"""
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_UNICODETEXT)
w.CloseClipboard()
return d
def setText(aString):
"""设置剪贴板文本"""
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
w.CloseClipboard()
def send_qq(to_who, msg):
"""发送qq消息
to_who:qq消息接收人
msg:需要发送的消息
"""
# 将消息写到剪贴板
setText(msg)
# 获取qq窗口句柄
qq = win32gui.FindWindow(None, to_who)
# 投递剪贴板消息到QQ窗体
win32gui.SendMessage(qq, 258, 22, 2080193)
win32gui.SendMessage(qq, 770, 0, 0)
# 模拟按下回车键
win32gui.SendMessage(qq, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(qq, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
# 测试
to_who='起飞'
msg='大家好,以后刘泽琳机器人竭诚为您的打卡保驾护航'
send_qq(to_who, msg)
效果如下:
四、 总体的代码实现
由于我们班有转专业转走和转来的同学,所以学号是很乱的,就使用了一个笨方法。
可以在班级群里,每天设置一个腾讯表格,来收集截图,并直接导出截图的打包文件。
# -*- coding: utf-8 -*-
import os
import pytesseract
import re
import win32gui
import win32con
import win32clipboard as w
def getText(): #获取剪贴板文本
w.OpenClipboard()
d = w.GetClipboardData(win32con.CF_UNICODETEXT)
w.CloseClipboard()
return d
def setText(aString): #设置剪贴板文本
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
w.CloseClipboard()
def send_qq(to_who, msg):
"""发送qq消息
to_who:qq消息接收人
msg:需要发送的消息
"""
# 将消息写到剪贴板
setText(msg)
# 获取qq窗口句柄
qq = win32gui.FindWindow(None, to_who)
# 投递剪贴板消息到QQ窗体
win32gui.SendMessage(qq, 258, 22, 2080193)
win32gui.SendMessage(qq, 770, 0, 0)
# 模拟按下回车键
win32gui.SendMessage(qq, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.SendMessage(qq, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
# 测试
to_who='nighetmare' #发消息的人/群名字
msg='刘泽琳的机器人在给您发消息啦啦啦啦啦啦@全体成员'
send_qq(to_who, msg)
# 存放文字图片的路径
path = 'C:/Users/LAYRA/Desktop/ALOT/'
# 获取图片路径列表
imgs = [path + i for i in os.listdir(path)]
# 打开文件
f = open('C:/Users/LAYRA/Desktop/ALOT/text.txt', 'w+', encoding='utf-8')
# 将各个图片的路径写入text.txt文件当中
list = []
list1 = [ #学号存放列表
'215200501',
'215200502',
'215200503',
'215200504',
'215200505',
'215200506',
'215200507',
'215200508',
'215200509',
'215200510',
'215200511',
'215200512',
'215200513',
'215200514',
'215200515',
'215200516',
'215200517',
'215200518',
'215200519',
'215200520',
'215200521',
'215200523',
'215200525',
'215200526',
'215200527',
'215200528',
'215200529',
'215200530',
'215200531',
'215200532',
'215200533',
'215200534',
'215200535',
'215200702',
'215200708'
]
l1 = list1
l2 = ['贺思曼','柯安琪','李轻轻','刘泽琳','陆佩霞','宋书雪','唐璇',"徐天娇","朱佳","柏骏宇","陈翰聪","丁楠","顾锐杰","胡逸寒","胡正洁","黄磊","姜子豪","经丰语","马晗博","瞿晔","唐源成","伍宇江","谢昊旻","谢怡林","杨亮亮","杨宇杰","乙六大","殷伟哲","勇晨骥","袁江超","岳涛","张宇","钟清骅","陈露","罗姝雯"]
dic = dict(zip(l1,l2)) #设置一个学号和姓名一一对应的字典
for img in imgs:
try:
if(img.index(".jpeg")>-1):
f.write(img + '\n')
string = pytesseract.image_to_string(img, lang='chi_sim')
#print(string)
x = re.findall("215200[57][0123][0123456789]",string) #识别学号
#list.append(int(x[0]))
a = int(x[0])
#a = x[0]
list.append(a)
except:
continue
# 关闭文件
f.close()
list.sort()
for i in [
215200501,
215200502,
215200503,
215200504,
215200505,
215200506,
215200507,
215200508,
215200509,
215200510,
215200511,
215200512,
215200513,
215200514,
215200515,
215200516,
215200517,
215200518,
215200519,
215200520,
215200521,
215200523,
215200525,
215200526,
215200527,
215200528,
215200529,
215200530,
215200531,
215200532,
215200533,
215200534,
215200535,
215200702,
215200708
]:
flag = 0
for m in range(len(list)):
if i == list[m]:
flag =1
continue
if flag == 0:
minzi = str(dic[str(i)])
print(minzi)
send_qq(to_who,minzi+"快打卡哦!") #找出每个没打卡的人的学号及姓名,并督促打卡
效果如下:
总结
以上就是今天要讲的内容,本文仅仅简单介绍了使用Python(OCR)收集体温打卡截图,并自动发消息提醒没交的人。