python基于图片内容识别的微信自动发送信息(对其中逻辑修改一些可以改为自动化回复)

1.内容基于python日常生活问题帮助

2.主要框架

python 复制代码
import time
from datetime import datetime

import pyperclip
import win32api
import win32con
import os
import re

from Image_Content_Text_Recognition import ICTR
from screenshot import img

上面是逻辑部分主要框架

python 复制代码
import time

import numpy as np
from PIL import ImageGrab, Image
import cv2

上面部分是截图部分的框架比较简单

截图使用的是这位开发者的链接内容

微信信息发送时借鉴的这位开发者的方法

3.开始内容

整个代码的发送逻辑都是用的微信自带的快捷键,使用快捷键配合

win32api进行模拟人为按键来完成查找和发送,整体逻辑较为简单

python 复制代码
    win32api.keybd_event(17, 0, 0, 0)  # Ctrl
    win32api.keybd_event(70, 0, 0, 0)  # F
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(70, 0, win32con.KEYEVENTF_KEYUP, 0)

    # 复制需要查找的人,按回车,进入聊天输入框
    pyperclip.copy('嗨嗨嗨')  # 联系人昵称
    spam = pyperclip.paste()
    win32api.keybd_event(17, 0, 0, 0)  # Ctrl
    win32api.keybd_event(86, 0, 0, 0)  # 86→V;
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)
    time.sleep(1)
    win32api.keybd_event(13, 0, 0, 0)  # 13→Enter
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)

这一部分就是模拟按键内容

可以看到全都是利用的快捷键

接下来就是最麻烦的部分截图内容了,这一部分没有涉及到逻辑但是要调试画面截图的像素格

python 复制代码
import os
import time

import numpy as np
from PIL import ImageGrab, Image
import cv2

if __name__ == '__main__':
    img = ImageGrab.grab(bbox=(930, 240, 2000, 1000))  # bbox 定义左、上、右和下像素的4元组 px
    print(img.size[1], img.size[0])
    img = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 3)
    print(img)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # 看评论区有C友说颜色相反,于是加了这一条
    name = time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime(time.time()))+'.jpg'
    cv2.imwrite(name, img)
    # cv2.imwrite(name, img)
# img = Image.fromarray(img)
# img.save('screenshot1.jpg')
def img():
    img = ImageGrab.grab(bbox=(930, 240, 2000, 1000))  # 小屏状态比例 bbox 定义左、上、右和下像素的4元组 px
    # img = ImageGrab.grab(bbox=(420, 80, 2600, 1150))  全屏状态比例 # bbox 定义左、上、右和下像素的4元组 px
    print(img.size[1], img.size[0])
    img = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 3)
    print(img)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # 看评论区有C友说颜色相反,于是加了这一条
    name = time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime(time.time())) + '.jpg'
    cv2.imwrite(name, img)
    return name

上面就是截图部分整一块的代码这一块除了调试像素格方位以外没有其他操作

完成截图后我改写的方法会返回截图方法内部识别的数据内容

python 复制代码
    strings = img()

    ictr = ICTR(strings)  # 获取生成图片的名称通过名称找到图片进行处理
    # ictr = ICTR("2024_10_12_22_02_18.jpg")  # 获取生成图片的名称通过名称找到图片进行处理
    print(ictr)
    list1 = []
    list2 = ['5:', '6:', '7:', '4:']
    for i in ictr:
        for j in list2:
            result = fuzzy_search(j, i)
            if len(result) == 1:  # 找到今天的数据时间
                list1.append(i)
    # print(ictr)
    # print(list1)

第一个逻辑内容来了与之相搭配的还有一段逻辑代码

python 复制代码
def fuzzy_search(pattern, text):
    if len(re.findall('昨天', text, re.IGNORECASE)) == 0:
        return re.findall(pattern, text, re.IGNORECASE)  # 在文本中查找匹配模式的所有子串,不区分大小写
    else:
        return []

上面两段代码构成了一整个数据的初步筛查,剔除了日期不对的数据首先进行两次遍历循环查看是否有对应5,6,7,4这几个时间节点的数据,并在判断是提出含有昨天的数据日期(本人做的时候只考虑一天,如果要改的话把判断规则加一个and就行了),然后就把出去今天之内以外的数据都剔除了

python 复制代码
    if len(list1) > 0:
        ictr = ictr[ictr.index(list1[0]):]  # 吧筛选后的今天数据顶替掉之前的数据
    print(list1)
    print(ictr)
    list1 = []
    list2 = ['二', '2', '一', '1', '三', '3']

这一部分代码,剔除了当日数据可能为空的情况,并且设立了接下来主要的判断规则。

python 复制代码
    for i in ictr:
        for j in list2:
            print(j + "   " + i)
            if j == i[0]:
                result = i
            # result = fuzzy_search(j, i)
            if len(result) != 0:  # 把汉字转换为数字方便处理
                # print(i)
                if i[0] == '二':
                    i = '2' + i[1:]
                if i[0] == '一':
                    i = '1' + i[1:]
                if i[0] == '三':
                    i = '3' + i[1:]
                list1.append(i)
    ictr = list(set(list1))

该部分还是使用遍历来处理上面设定的判断逻辑数据,我按照我的需求需要设定的逻辑数据并不多只有6个稍微遍历,处理一下就行了。

这一部分呢主要还是把对应规则的数据给找出来,只筛选开头第一个字符 if j == i[0]:在筛选完成后把所有筛选过后的数据开头全部改成数字方便判断筛选分类(筛选内容页可以放在这里面我写的时候给他拆开了)。

python 复制代码
    # print(ictr)
    # print(" 发的受力钢筋阿斯利康都挂机立卡江苏理工就撒恐龙当家管理卡时间老顾客")
    computer_room = {  # 创建存储对象
        1: [],
        2: [],
        3: []
    }
    # print(ictr)
    for i in ictr:  # 设置优先级 2  3  1
        if i[0] == '1':
            computer_room[1].append(i[1:])
        if i[0] == '2':
            computer_room[2].append(i[1:])
        if i[0] == '3':
            computer_room[3].append(i[1:])

这一段呢主要是把数据的优先级规则设定一下,择优而选没有啥逻辑就是设计了一个对象而已,然后把数据遍历放入我们设定好的数据当中,这一段遍历可以和上面结合一下。

python 复制代码
    # print(computer_room)
    weekday = now.weekday()
    days_of_week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
    var = days_of_week[weekday]
    var2 = {  # 设置需要的规则数据组 也就是需要定的机房
        "星期一": [
            "4",
        ],
        "星期二": [],
        "星期三": [
            "6"
        ],
        "星期四": [
            "2", "4", "7",
        ],
        "星期五": [
            "2", "4", "7",
        ],
        "星期六": [
            "2", "4",
        ]
    }
    databuc = []
    sums1 = computer_room.get(2)  # 二机房
    sums2 = computer_room.get(3)  # 三机房
    sums3 = computer_room.get(1)  # 一机房
    data1 = '一机房'
    data2 = '二机房'
    data3 = '三机房'
    # print(computer_room)

    setdatas = var2.get(var)  # 找到
    # print(setdatas)
    # print(sums1)

到这一段代码基本上逻辑都结束了上面就是设计了关于每一个星期的锁定规则

python 复制代码
    deldata = []
    deldata2 = []
    for j in setdatas:
        if len(fuzzy_search(j, str(sums1))) != 0:
            # print(j + "      s")
            databuc.append(j)
        else:
            data2 += j
    # print(len(databuc))
    # print(databuc)
    for j in databuc:
        # print(j + "    " + str(sums2))
        if len(fuzzy_search(j, str(sums2))) != 0:
            # print(j + "      s")
            deldata2.append(j)
        else:
            data3 += j
    databuc = deldata2
    deldata2 = []
    for j in databuc:
        if len(fuzzy_search(j, str(sums3))) != 0:
            # print(j + "      s")
            deldata2.append(j)
        else:
            data1 += j
            # databuc.remove(j)
    # print(data1 + "   " + data2 + "   " + data3)

这一段代码就是找出了所有没有被预定的机房然后生成字符串,这部分有一点点逻辑,其中的机房可能是被预定了的但是,其他机房有可能没有被预定所以我们需要保存一下那些没有预定成功的数据对下一个机房在此进行匹配预定,当前还有一个逻辑缺陷,就是如果全部被预定了呢那这一段代码就会出现问题,但是我实际使用是不太可能出现这个问题所以我并没有优化这个规则问题。

python 复制代码
    data = ''
    databuc = deldata2
    deldata2 = []
    if len(data1[3:]) != 0:
        data += data1
    if len(data2[3:]) != 0:
        data += data2
    if len(data3[3:]) != 0:
        data += data3
    print(data)

    pyperclip.copy(data)  # 聊天的内容
    spam = pyperclip.paste()

    win32api.keybd_event(17, 0, 0, 0)  # Ctrl
    win32api.keybd_event(86, 0, 0, 0)  # 86→V
    win32api.keybd_event(86, 0,   win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(13, 0, 0, 0)
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)

最后就是把处理好的字符穿发送就OK了,唯一有点逻辑的地方就是字符串拼接了还没啥难度。

python 复制代码
def string_to_time(str_time):
    format_str = "%H:%M"
    time_obj = datetime.strptime(str_time, format_str)
    return time_obj.time()

这个就是代码的时间处理没难度csdn很多。

python 复制代码
while True:
    # print(123123)
    now = datetime.now()

    # 提取星期几,0表示周一,6表示周日

    time_now = time.strftime("%H:%M:%S", time.localtime())  # 获取当前时间
    # print(time_now)
    sent_time = '06:30:00'  # 发送时间 数据结构采用时间 **:**:**

    # if sent_time != time_now:  # 当前时间等于发送时间则执行以下程序
    if sent_time <= time_now < '06:30:02':  # 当前时间等于发送时间则执行以下程序
        def open_app(app_dir):
            os.startfile(app_dir)


        # 打开微信
        if __name__ == "__main__":
            app_dir = r'D:\Program Files\Tencent\WeChat\WeChat.exe'  # 此处为微信的绝对路径
            open_app(app_dir)
            time.sleep(1)

            # 进入微信,模拟按键Ctrl+F
        achieve()

        exit()  # 退出程序

这一段是代码的运行主题主要就是定时发送,然后我考虑到使用while 运行起来电脑压力有点大就让他一秒动一次让后把判断的规则增加了几秒让其在一分钟内完成整个处理就OK了

4.完整代码

python 复制代码
import os
import time

import numpy as np
from PIL import ImageGrab, Image
import cv2

if __name__ == '__main__':
    img = ImageGrab.grab(bbox=(930, 240, 2000, 1000))  # bbox 定义左、上、右和下像素的4元组 px
    print(img.size[1], img.size[0])
    img = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 3)
    print(img)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # 看评论区有C友说颜色相反,于是加了这一条
    name = time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime(time.time()))+'.jpg'
    cv2.imwrite(name, img)
    # cv2.imwrite(name, img)
# img = Image.fromarray(img)
# img.save('screenshot1.jpg')
def img():
    img = ImageGrab.grab(bbox=(930, 240, 2000, 1000))  # 小屏状态比例 bbox 定义左、上、右和下像素的4元组 px
    # img = ImageGrab.grab(bbox=(420, 80, 2600, 1150))  全屏状态比例 # bbox 定义左、上、右和下像素的4元组 px
    print(img.size[1], img.size[0])
    img = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 3)
    print(img)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # 看评论区有C友说颜色相反,于是加了这一条
    name = time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime(time.time())) + '.jpg'
    cv2.imwrite(name, img)
    return name

截图主体

python 复制代码
"""

实现定时自动发送消息

"""

import time
from datetime import datetime

import pyperclip
import win32api
import win32con
import os
import re

from Image_Content_Text_Recognition import ICTR
from screenshot import img


def fuzzy_search(pattern, text):
    if len(re.findall('昨天', text, re.IGNORECASE)) == 0:
        return re.findall(pattern, text, re.IGNORECASE)  # 在文本中查找匹配模式的所有子串,不区分大小写
    else:
        return []


def achieve():
    win32api.keybd_event(17, 0, 0, 0)  # Ctrl
    win32api.keybd_event(70, 0, 0, 0)  # F
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(70, 0, win32con.KEYEVENTF_KEYUP, 0)

    # 复制需要查找的人,按回车,进入聊天输入框
    pyperclip.copy('嘎嘎嘎')  # 联系人昵称
    spam = pyperclip.paste()
    win32api.keybd_event(17, 0, 0, 0)  # Ctrl
    win32api.keybd_event(86, 0, 0, 0)  # 86→V;
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)
    time.sleep(1)
    win32api.keybd_event(13, 0, 0, 0)  # 13→Enter
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)
    time.sleep(2)  # 剔除可以不需要的暂停
    strings = img()

    ictr = ICTR(strings)  # 获取生成图片的名称通过名称找到图片进行处理
    # ictr = ICTR("2024_10_12_22_02_18.jpg")  # 获取生成图片的名称通过名称找到图片进行处理
    print(ictr)
    list1 = []
    list2 = ['5:', '6:', '7:', '4:']
    for i in ictr:
        for j in list2:
            result = fuzzy_search(j, i)
            if len(result) == 1:  # 找到今天的数据时间
                list1.append(i)
    # print(ictr)
    # print(list1)
    if len(list1) > 0:
        ictr = ictr[ictr.index(list1[0]):]  # 吧筛选后的今天数据顶替掉之前的数据
    print(list1)
    print(ictr)
    list1 = []
    list2 = ['二', '2', '一', '1', '三', '3']
    # print(ictr)
    for i in ictr:
        for j in list2:
            print(j + "   " + i)
            if j == i[0]:
                result = i
            # result = fuzzy_search(j, i)
            if len(result) != 0:  # 把汉字转换为数字方便处理
                # print(i)
                if i[0] == '二':
                    i = '2' + i[1:]
                if i[0] == '一':
                    i = '1' + i[1:]
                if i[0] == '三':
                    i = '3' + i[1:]
                list1.append(i)
    ictr = list(set(list1))
    # print(ictr)
    # print(" 发的受力钢筋阿斯利康都挂机立卡江苏理工就撒恐龙当家管理卡时间老顾客")
    computer_room = {  # 创建存储对象
        1: [],
        2: [],
        3: []
    }
    # print(ictr)
    for i in ictr:  # 设置优先级 2  3  1
        if i[0] == '1':
            computer_room[1].append(i[1:])
        if i[0] == '2':
            computer_room[2].append(i[1:])
        if i[0] == '3':
            computer_room[3].append(i[1:])
    # print(computer_room)
    weekday = now.weekday()
    days_of_week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
    var = days_of_week[weekday]
    var2 = {  # 设置需要的规则数据组 也就是需要定的机房
        "星期一": [
            "4",
        ],
        "星期二": [],
        "星期三": [
            "6"
        ],
        "星期四": [
            "2", "4", "7",
        ],
        "星期五": [
            "2", "4", "7",
        ],
        "星期六": [
            "2", "4",
        ]
    }
    databuc = []
    sums1 = computer_room.get(2)  # 二机房
    sums2 = computer_room.get(3)  # 三机房
    sums3 = computer_room.get(1)  # 一机房
    data1 = '一机房'
    data2 = '二机房'
    data3 = '三机房'
    # print(computer_room)

    setdatas = var2.get(var)  # 找到
    # print(setdatas)
    # print(sums1)
    deldata = []
    deldata2 = []
    for j in setdatas:
        if len(fuzzy_search(j, str(sums1))) != 0:
            # print(j + "      s")
            databuc.append(j)
        else:
            data2 += j
    # print(len(databuc))
    # print(databuc)
    for j in databuc:
        # print(j + "    " + str(sums2))
        if len(fuzzy_search(j, str(sums2))) != 0:
            # print(j + "      s")
            deldata2.append(j)
        else:
            data3 += j
    databuc = deldata2
    deldata2 = []
    for j in databuc:
        if len(fuzzy_search(j, str(sums3))) != 0:
            # print(j + "      s")
            deldata2.append(j)
        else:
            data1 += j
            # databuc.remove(j)
    # print(data1 + "   " + data2 + "   " + data3)
    data = ''
    databuc = deldata2
    deldata2 = []
    if len(data1[3:]) != 0:
        data += data1
    if len(data2[3:]) != 0:
        data += data2
    if len(data3[3:]) != 0:
        data += data3
    print(data)

    pyperclip.copy(data)  # 聊天的内容
    spam = pyperclip.paste()

    win32api.keybd_event(17, 0, 0, 0)  # Ctrl
    win32api.keybd_event(86, 0, 0, 0)  # 86→V
    win32api.keybd_event(86, 0,   win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(13, 0, 0, 0)
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)


# time.sleep(3)  剔除可以不需要的暂停


def string_to_time(str_time):
    format_str = "%H:%M"
    time_obj = datetime.strptime(str_time, format_str)
    return time_obj.time()


while True:
    # print(123123)
    now = datetime.now()

    # 提取星期几,0表示周一,6表示周日

    time_now = time.strftime("%H:%M:%S", time.localtime())  # 获取当前时间
    # print(time_now)
    sent_time = '06:30:00'  # 发送时间 数据结构采用时间 **:**:**

    # if sent_time != time_now:  # 当前时间等于发送时间则执行以下程序
    if sent_time <= time_now < '06:30:02':  # 当前时间等于发送时间则执行以下程序
        def open_app(app_dir):
            os.startfile(app_dir)


        # 打开微信
        if __name__ == "__main__":
            app_dir = r'D:\Program Files\Tencent\WeChat\WeChat.exe'  # 此处为微信的绝对路径
            open_app(app_dir)
            time.sleep(1)

            # 进入微信,模拟按键Ctrl+F
        achieve()

        exit()  # 退出程序

逻辑主体

python 复制代码
import datetime
import time
import numpy as np
from PIL import ImageGrab, Image
import cv2

from paddleocr import PaddleOCR

# 实例化OCR模型
ocr = PaddleOCR()

# 识别图片中的文字  内容识别
def ICTR(name):
    result = ocr.ocr('E:\\Python\\pythonProject1\\'+name)
    # print('识别结果:',datetime.datetime.now())
    sstr = "D:\\图片\\文件\\" + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime(time.time())) + ".txt"
    print(sstr)
    strsc = []
    # sums = 0
    with open(sstr, 'w', encoding='utf-8') as file:
        # with open(sstr, 'w', encoding='utf-8') as file:
        for line in result:
            for word in line:
                text_line = word[-1]  # 提取出识别数据中的文字元组
                text = text_line[0]  # 从文字元组中提取文字内容
                # print("text:", text)
                file.write(text + '\n')  # 将文字内容写入文件中
                strsc.append(text)
                # print(text + '\n')
    return strsc

图片内容识别主体

相关推荐
Theodore_10223 小时前
4 软件工程——总体设计
java·开发语言·数据库·算法·java-ee·软件工程·设计
Theodore_10223 小时前
1 软件工程——概述
java·开发语言·算法·设计模式·java-ee·软件工程·个人开发
爱学测试的李木子7 小时前
从0到1搭建 Android 自动化 python+appium 环境
android·软件测试·python·测试工具·自动化
努力学习的小廉10 小时前
深入了解Linux —— make和makefile自动化构建工具
linux·服务器·自动化
shinelord明10 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
小张认为的测试10 小时前
Linux性能监控命令_nmon 安装与使用以及生成分析Excel图表
linux·服务器·测试工具·自动化·php·excel·压力测试
深圳安锐科技有限公司13 小时前
首次接触结构安全自动化监测系统,价格高吗?后期维护?
运维·自动化
TGB-Earnest13 小时前
【py脚本+logstash+es实现自动化检测工具】
大数据·elasticsearch·自动化
程序猿000001号1 天前
Selenium 深度解析:自动化浏览器操作的利器
selenium·测试工具·自动化
yaosheng_VALVE1 天前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节