当前位置: 首页 > article >正文

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

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

2.主要框架

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

上面是逻辑部分主要框架

import time

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

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

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

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

3.开始内容

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

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

    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)

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

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

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

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

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

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

    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)

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

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就行了),然后就把出去今天之内以外的数据都剔除了

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

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

    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]:在筛选完成后把所有筛选过后的数据开头全部改成数字方便判断筛选分类(筛选内容页可以放在这里面我写的时候给他拆开了)。

    # 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)

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

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

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

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.完整代码

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

截图主体

"""

实现定时自动发送消息

"""

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()  # 退出程序

逻辑主体

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

图片内容识别主体


http://www.kler.cn/news/354529.html

相关文章:

  • 智能伺服,精准控制:匠芯创科技M6800系列方案助力工业升级
  • Redis——事务
  • OpenAI研究揭示ChatGPT的性别和种族偏见
  • web网页---新浪网页面
  • 12月17-19日 | 2024南京软博会,持续升级中!
  • Spring 概念汇总
  • FPGA中的亚稳态
  • 爬虫逆向-js进阶
  • gitee建立/取消关联仓库
  • 如何调大mp3文件声音?8个易学调大MP3文件声音的方法
  • 沥川的算法学习笔记:基础算法(1)----快速排序
  • json-server,跨域
  • LiveGBS流媒体平台GB/T28181常见问题-视频服务器有多个IP多个网段的时候如何配置摄像头下级平台接入多网段收流?
  • 网络原理 - HTTP/HTTPS
  • MySQL数据库增删改查基础操作(超长详解)
  • FLINK SQL时间属性
  • SpringBoot框架下的车辆管理功能开发
  • http://localhost:8080要求用户输入用户名和密码,解决方法!
  • JDK-23与JavaFX配置在IDEA中
  • 【C++】动态多态(运行时多态)