def max_apps_windows(): """判断当前是否最小化,如果是,则点击任务栏图标,实现最大化""" # 找到最大化窗口图标位置 im, bin, xrange, yrange = read_im_info('界面_已最大化窗口') # 截图,判断匹配位置 pic = get_screenshot() pic2 = to_bin_img(pic.copy(), bin) x, y = find_location(pic2, im, xrange, yrange, 'center') # 判断是否已经最大化 if x > 0 or y > 0: log.info('窗口已经最大化,无需点击') return 0 # 没有最大化,找到点击窗口图标 log.info('窗口未最大化,需要最大化窗口') im, bin, xrange, yrange = read_im_info('界面_需最大化窗口') im = cut_blank(im) pic2 = to_bin_img(pic.copy(), bin) x, y = find_location(pic2, im, xrange, yrange, 'center') if x == -1 or y == -1: log.info('没有找到最大化窗口图标,请检查是否最小化或者锁频了') return -1 else: mouse_click(x, y) log.info('点击窗口最大化 %d %d ,解锁交易界面' % (x, y))
def unlock(passwd='123456'): """判断是否需要解锁界面""" # 找到锁屏标志 im, bin, xrange, yrange = read_im_info('界面_解锁密码') # 截图,判断匹配位置 pic = get_screenshot() pic2 = to_bin_img(pic.copy(), bin) x, y = find_location(pic2, im, xrange, yrange, 'center') # 判断是否锁屏 if x == -1 or y == -1: log.info('交易界面没有锁定,无需解锁') else: log.info('交易界面锁定,需要解锁') mouse_click(x, y) keyboard_input(passwd) log.info('移动到 %d %d ,输入解锁密码' % (x, y)) # 找到确认按钮 im, bin, xrange, yrange = read_im_info('界面_解锁确认') im = cut_blank(im) x1 = (x - 100) / pic.shape[0] if x - 100 >= 0 else 0 x2 = (x + 100) / pic.shape[0] if x + 100 <= pic.shape[0] else 1 y1 = (y - 200) / pic.shape[1] if y - 200 >= 0 else 0 y2 = (y + 200) / pic.shape[1] if y + 200 <= pic.shape[1] else 1 xrange, yrange = [x1, x2], [y1, y2] pic2 = to_bin_img(pic.copy(), bin) xc, yc = find_location(pic2, im, xrange, yrange, 'center') mouse_click(xc, yc) log.info('点击确认按钮 %d %d ,解锁交易界面' % (xc, yc)) return
def get_position_table(): """获取指定列的数据""" # 获取焦点 get_focus() # 功能键F1,转到买入选项卡 keyboard_input(function_key='F4') log.info('获取程序焦点,调出股票持仓查询页面') # 第一步是先获取屏幕截图 pic=get_screenshot() log.info('获取屏幕截图') # 获取表格下边框,防止搜索过界 info = config.pic_info['持仓_汇总'] bin = info['bin'] xrange = info['xrange'] yrange = info['yrange'] # 获取子图 file = os.path.join(config.gvariable.work_path, 'pic', '持仓_汇总.png') print(file) im = read_im(file, threshold=bin) # 因为已经是二值图,这里的阈值就没必要了 im = cut_blank(im) # 获取主图的二值图 pic2 = to_bin_img(pic.copy(), threshold=bin) # 接下来就是找到边界了 maxdown,y=find_location(pic2,im,xrange,yrange,'leftup') log.info('获取最大搜索下边界 %d'%maxdown) # 开始循环获取数字串 cols = ['持仓_证券代码', '持仓_股票余额', '持仓_可用余额', '持仓_冻结数量', '持仓_成本价', '持仓_市价', '持仓_市值'] # col=cols[0] tables=[] for col in cols: # 获取准备好的子图信息 info=config.pic_info[col] bin=info['bin'] xrange=info['xrange'] yrange=info['yrange'] # 获取子图 file=os.path.join(config.gvariable.work_path,'pic',col+'.png') im=read_im(file,threshold=bin) # 因为已经是二值图,这里的阈值就没必要了 im=cut_blank(im) # 获取主图的二值图 pic2=to_bin_img(pic.copy(),threshold=bin) # 接下来就是获取列的信息了 col_info=get_cols_pic_info(pic2,im,xrange,yrange,maxdown) tables.append(col_info) log.info('完成 %s 数据解析'%col) # 转成dataframe position=pd.DataFrame(tables,index=cols).T log.info('完成表格所有列解析\n'+str(position)) return position
def get_cols_pic_info(pic, im, xrange, yrange, maxdown=None): """对一列数字的图像解析,划分截取""" # 找到表格的最下位置,方法查找过界 xdown=pic.shape[0]*0.9 if not maxdown else maxdown # 找到子图在主图的左下角和右下角坐标 x1, y1 = find_location(pic, im, xrange, yrange, 'leftdown') y2 = y1+im.shape[1] xmax,ymax=pic.shape # 往左边找到边界 while True: y1=y1-1 if pic[x1,y1]==0 and y1<ymax: y1=y1+1 break # 往右边找到边界 while True: y2=y2+1 if pic[x1,y2]==0 and y2<ymax: y2=y2-1 break # 往下找到边界位置,并越过边界 while True: x1=x1+1 if pic[x1,y1]==0 and x1<xmax: x1=x1+1 break # 经过前面的步骤,找打了有数字表格的位置 xstart,ystart,yend=x1,y1,y2 # 下面找到xend就可以切割一个区域了 notend=True nums=[] while notend: # 往下找到分割线 x,xend=xstart,xstart while True: x=x+1 if pic[x,ystart]==0 and x < xdown: # 找到边界并且没有越界 xend=x-1 nums.append(pic[xstart: xend, y1:y2]) # 接着越过边界,找到下一个查找开始坐标 while True: x=x+1 if pic[x,y1]==1 and x<xdown: xstart=x break elif x>=xdown: break break # 既然找到了就接着开始下一行数字查找 # 如果找了很久没有找到,说明已经到头了 if x-xstart>30 or x>=xdown: notend=False break # 接下来就是解析nums数字 nums=[rec_nums(num) for num in nums] # 最后返回该列数据 return nums
def get_focus(): """获取界面焦点""" im, bin, xrange, yrange = read_im_info('界面_标题') # 截屏 pic = get_screenshot() pic = to_bin_img(pic, bin) # 查找位置 x, y = find_location(pic, im, xrange, yrange, 'center') mouse_click(x, y) log.info('点击,获取界面焦点 %d %d' % (x, y))
def get_coordinate(pic, im_name): """获取指定子图的坐标""" # 读取子图,及其config数据 file = os.path.join(config.gvariable.picpath, im_name + '.png') info = config.pic_info[im_name] bin = info['bin'] xrange = info['xrange'] yrange = info['yrange'] # 读取子图,转成二值图 im = read_im(file, info['bin']) im = cut_blank(im) # 主图也转成二值图 pic2 = to_bin_img(pic, threshold=bin) # 找到四个角坐标 x1, y1 = find_location(pic2, im, xrange, yrange, 'leftup') x2, y2 = x1 + im.shape[0], y1 + im.shape[1] return x1, x2, y1, y2
def get_app_focus(): """点击一下软件的任务栏图标,获取焦点""" # 获取图标信息 name = '界面_任务栏图标' im, bin, xrange, yrange = read_im_info(name) # 截屏 pic = get_screenshot() pic = to_bin_img(pic, bin) # 查找位置 x_ico, y_ico = find_location(pic, im, xrange, yrange, 'center') log.info('找到任务栏图标位置 %d %d' % (x_ico, y_ico)) # 接下来是鼠标点击 # 由于无法实现鼠标点击任务栏图标事件,暂时空着 # return x_ico, y_ico
def buy(symbol, price, amount): """买入股票""" # 获取焦点 get_focus() # 功能键F1,转到买入选项卡 keyboard_input(function_key='F1') log.info('获取程序焦点,调出股票买入页面') # 截图 pic = get_screenshot() # 获取 买入股票 标志坐标 im, bin, xrange, yrange = read_im_info('买入_买入页') im = cut_blank(im) pic2 = to_bin_img(pic.copy(), threshold=bin) x, y = find_location(pic2, im, xrange, yrange, 'leftup') log.info('买入股票 坐标 %d %d ' % (x, y)) # 计算其他几个标志的查找范围 high = pic.shape[0] * 0.3 width = pic.shape[1] * 0.3 x1 = (x - 10) / pic.shape[0] if x - 10 >= 0 else 0 x2 = (x + high) / pic.shape[0] if x + high <= pic.shape[0] else 1 y1 = (y - 10) / pic.shape[1] if y - 10 > 0 else 0 y2 = (y + width) / pic.shape[1] if y + width <= pic.shape[1] else 1 # 获取 证券代码,买入价格,买入数量,买入 # 证券代码 im, bin, xrange, yrange = read_im_info('买入_证券代码') im = cut_blank(im) pic2 = to_bin_img(pic.copy(), bin) x_zqdm, y_zqdm = find_location(pic2, im, [x1, x2], [y1, y2], 'center') log.info('证券代码 坐标 %d %d ' % (x_zqdm, y_zqdm)) # 买入价格 im, bin, xrange, yrange = read_im_info('买入_买入价格') im = cut_blank(im) pic2 = to_bin_img(pic.copy(), bin) x_mrjg, y_mrjg = find_location(pic2, im, [x1, x2], [y1, y2], 'center') log.info('买入价格 坐标 %d %d ' % (x_mrjg, y_mrjg)) # 买入数量 im, bin, xrange, yrange = read_im_info('买入_买入数量') im = cut_blank(im) pic2 = to_bin_img(pic.copy(), bin) x_mrsl, y_mrsl = find_location(pic2, im, [x1, x2], [y1, y2], 'center') log.info('买入数量 坐标 %d %d ' % (x_mrsl, y_mrsl)) # 买入确认 im, bin, xrange, yrange = read_im_info('买入_买入确认') im = cut_blank(im) pic2 = to_bin_img(pic.copy(), bin) x_mrqr, y_mrqr = find_location(pic2, im, [x1, x2], [y1, y2], 'center') log.info('买入确认 坐标 %d %d ' % (x_mrqr, y_mrqr)) # 重填 im, bin, xrange, yrange = read_im_info('买入_重填') im = cut_blank(im) pic2 = to_bin_img(pic.copy(), bin) x_ct, y_ct = find_location(pic2, im, [x1, x2], [y1, y2], 'center') log.info('买入重填 坐标 %d %d ' % (x_ct, y_ct)) # 下面买入股票 # 重置所有输入 mouse_click(x_ct, y_ct) # 输入代码 mouse_click(x_zqdm, y_zqdm) keyboard_input(symbol) # 输入价格 mouse_click(x_mrjg, y_mrjg) keyboard_input(str(price)) # 输入数量 mouse_click(x_mrsl, y_mrsl) keyboard_input(str(amount)) # 点击确认 mouse_click(x_mrqr, y_mrqr) log.info('买入 symbol=%s price=%f amount=%d' % (symbol, price, amount)) # 后面还有弹出确认框的确认 log.info('后面还有弹出确认框的确认, 未处理')