狂自私

导航

获取给定区域内的符合颜色值的第一个和最后一个坐标

from PIL import ImageGrab
import pyautogui
import time
import pyperclip
import numpy
def 获取给定区域内的符合颜色值的第一个和最后一个坐标(left_x:int,left_y:int,right_x:int,right_y:int,color_r:int,color_g:int,color_b:int)->list:
    '''
    注意,本函数直接截取当前屏幕的全屏画面,然后再根据给定范围来查询。
    left_x,left_y:给定区域内的左上角坐标
    right_x,right_y:给定区域内的右下角坐标
    color_r,color_g,color_b:以RGB模式表示的颜色值的R/G/B值
    返回list,若是没有找到,将返回[(-1,-1),(-1,-1)]
    '''
    key_name = "{}|{}|{}".format(color_r,color_g,color_b)
    color_dict={key_name:[]}
    pim = ImageGrab.grab()
    im = numpy.array(pim)
    y,x = numpy.where(numpy.all(im==[color_r,color_g,color_b],axis=2))
    result_xy =zip(x,y)
    result_xy_list = [(x_,y_) for x_,y_ in result_xy if (x_>=left_x and x_ <=right_x)and(y_>=left_y and y_<=right_y)]
    # print(len(result_xy_list))
    if(len(result_xy_list)>0):
        return [result_xy_list[0],result_xy_list[-1]]
    #下面的方法比较慢,但是不是不能用
    # for x in range(left_x,right_x):
    #     for y in range(left_y,right_y):
    #         color = pim.getpixel((x,y))
    #         color_key = "{}|{}|{}".format(color[0],color[1],color[2])
    #         if(color_key==key_name):
    #             color_dict[color_key].append((x,y))
    # color_dict[key_name].sort(key=lambda x:(x[1]))
    # if(len(color_dict[key_name])>0):
    #     return [color_dict[key_name][0],color_dict[key_name][-1]]
    else:
        return [(-1,-1),(-1,-1)];

def main():
    # 屏幕分辨率为3200*1800
    # 浏览器关闭垂直标签,处于右半边屏幕
    
    #移动鼠标到空白处:2246,127 ,然后左键单击一下。
    pyautogui.click(x=2246,y=127)
    pyautogui.hotkey('ctrl', 's')
    time.sleep(2)
    pyautogui.press('enter')
    time.sleep(0.2)
    pyautogui.hotkey('alt', 'y')
    time.sleep(2)
    pyautogui.hotkey('ctrl', 'home')
    #移动鼠标到空白处:2246,127,然后左键单击一下,避免浏览器下载窗口弹出的影响
    pyautogui.click(x=2246,y=127)
    #移动到指定点,然后按下鼠标左键;复制标题
    pyautogui.moveTo(x=1965,y=397)
    pyautogui.mouseDown()
    time.sleep(1)
    pyautogui.moveTo(x=3175,y=397)
    pyautogui.mouseUp()
    pyautogui.hotkey('ctrl', 'c')
    print("已保存:{}".format(pyperclip.paste()))
    pyautogui.hotkey('ctrl', 'f')
    time.sleep(0.2)
    pyautogui.hotkey('ctrl', 'v')
    time.sleep(1)
    pyautogui.hotkey('ctrl', 'end')
    time.sleep(0.2)
    point_xy=None
    found_num=0
    while True:
        point_xy  = 获取给定区域内的符合颜色值的第一个和最后一个坐标(1605,100,1954,1530,255,255,0)
        if(point_xy[0][0]==-1):
            point_xy  = 获取给定区域内的符合颜色值的第一个和最后一个坐标(1605,100,1954,1530,255,150,50)
            if(point_xy[0][0]==-1):
                if found_num >=10:
                    input("没有找到对应位置,请处理。处理完成请随意在控制台输入一个字符。")
                    found_num = 0
            else:
                break
        else:
            break
        if(found_num % 4 == 0):
            #向下概率更大
            pyautogui.click(x=1940,y=195)
        else:
            pyautogui.click(x=1940,y=1590)
            # time.sleep(0.2)
            # pyautogui.click(x=1940,y=1590)
        found_num += 1
    #一行文字的高度是17,然后再向右便宜24像素
    click_point_x = point_xy[0][0] + 24
    click_point_y = point_xy[1][1] + 17
    print("点击({},{})".format(click_point_x,click_point_y))
    pyautogui.click(x=click_point_x,y=click_point_y)
    time.sleep(2) 
if __name__ == "__main__":
    # print(获取给定区域内的符合颜色值的第一个和最后一个坐标(1605,341,1954,1513,255,255,0))
    while True:
        main()
        time.sleep(2)

 

posted on 2024-04-29 21:18  狂自私  阅读(2)  评论(0编辑  收藏  举报