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

图片内容识别主体

相关推荐
weixin_448350501 小时前
十堰市数据治理:大数据治理在智慧城市中的应用探索
大数据·人工智能·自动化·智慧城市·数据治理·数据提取
G皮T3 小时前
【设计模式】入门 23 种设计模式(代码讲解)
java·设计模式·软件工程·创建型模式·行为型模式·结构型模式
是垚不是土9 小时前
Istio分布式链路监控搭建:Jaeger与Zipkin
运维·分布式·云原生·自动化·云计算·istio
Linux运维技术栈9 小时前
生产环境centos8 & Red Hat8部署ansible and 一键部署mysql两主两从ansible脚本预告
运维·数据库·mysql·自动化·ansible
spea19769 小时前
电子制造行业Top5贴片机品牌
自动化·制造·pcb工艺
追寻上飞10 小时前
【行之有效】实证软件工程研究方法
软件工程
AI原吾15 小时前
探索Python文档自动化的奥秘:`python-docx`库全解析
开发语言·python·自动化·python-docx
ForRunner12319 小时前
使用 Python 和 Selenium 解决 hCaptcha:完整指南
人工智能·爬虫·python·自动化
椰椰椰耶1 天前
【软件测试】一个简单的自动化Java程序编写
java·自动化·压力测试
_.Switch1 天前
Django中的URL配置与动态参数传递(多种方法比较)
开发语言·数据库·后端·python·django·sqlite·自动化