前言

一般从终端登录mysql是怎么操作的。

(这里的终端是指pycharm下面的终端,不是指cmd,当然,二者也就路径不一样)

过程是这样的。

1,点击终端

2,在鼠标的光标后写mysql -u root -p(也可以写其他登陆者)

3,点enter键

4,输入密码

5 ,点enter

搞事情

我不想用手,我希望鼠标和键盘自己动。很明显,python有这种控制控制鼠标和键盘的第三方库

比如selenium、playwright等的自动化工具,在网页就可以控制鼠标和键盘,但这里不是在网页

pass

pynput也可以控制鼠标和键盘,但并不是很好用,可以的。

我力推pyautogui来控制鼠标键盘。哈哈哈哈哈,都是第三方库,没有可以pip一下

操作

其实我很早就有这个想法,以前也实现了,但是有个巨大的问题。

pycharm的终端并不是固定的,是会变换的,你终端的位置不同

比如

pyautogui.leftClick(x,y)
# 这个代码意思左击,位置在x,y
# 如果你锁定终端的位置,比如(500,981)
# 一次可以,今天可以,明天可以
# 也许后天就不行,终端位置变了

遇到这个问题,也很简单呀,再次锁定终端的位置

pyautogui.position()
# 这个可以锁定
# 知道位置,改一下x,y

但终究有---时效性。不是长久之策。

解决办法

在运行之前,截屏,经过某种手段,得到此时终端所在的位置。我想到用图像识别,识别终端,得到它的位置。

写爬虫经常就会遇到,需要识别验证码,简单的验证码,识别数字,英文之类的简单验证码,简单的

pytessertact,或者ddddocr,就可以搞定。难点的一般用打码平台来识别。

对于终端的位置,肯定也是可以的,但每次运行都是要钱的,虽然很便宜,不推荐。

用ddddor,好像已经改版了许多,点选验证码都能识别了,我并不是很了解。。。。

不说废话了。。。,没有可以pip一下,(好像要安装许多东西),直接上代码

正文

对终端的截屏,看




windows server mysql终端 终端登陆mysql_Powered by 金山文档


(下面这段代码的目的----识别并点击终端)

from paddleocr import PaddleOCR
import cv2 as cv
import numpy as np
import pyautogui
# 导包
img = pyautogui.screenshot(region=[0,950, 600, 50])  
# [0,950,600,50] 代表 x,y,宽,高
img = cv.cvtColor(np.asarray(img), cv.COLOR_RGB2BGR)
# 这步是截屏,参考了大佬的博客,修改通道顺序,opencv不一样。
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
# 初始化 use_angle_cls是否加载分类模型,lang 语言
thresh,img=cv.threshold(img,70,255,cv.THRESH_BINARY)
# 二值化,返回阈值和二值化后的图片
# 不二值化,识别有误差
# 二值化后感觉很好。哈哈哈哈
result = ocr.ocr(img=img)[0][-1][0]
# 取的-1,代表最后一个元素,看图,终端是不是在最后,如果在其他位置,看着取。
# 如果这样写   result = ocr.ocr(img=img)
# 返回的result是个数组,数组里面还有数组,。。。有4层,离谱
# 最里面有5个元素,4个列表,一个元组,4个列表分别代表字体的逆时针的四个坐标,元组里面有识别的内容、准确度
# 而这样就取了最后一个列表(终端)的4个坐标
# result 4个坐标
# 看 [[485.0, 26.0], [515.0, 26.0], [515.0, 41.0], [485.0, 41.0]]
p1=result[0]
p3=result[2]
p4=result[3]
x=int((p3[0]+p4[0])/2)
# 截屏x=0.看截屏[]
# x是指的整个屏幕下的坐标,取了中间,减小误差,取int
y=int((p1[1]+p4[1])/2)+950
#  950 是截屏的时候的y的位置
pyautogui.leftClick(x,y)
# 得到(x,y)=(500 983)
# 可以点击
# 哈哈哈哈哈哈哈哈哈

看一下二值化后的照片


windows server mysql终端 终端登陆mysql_pycharm_02


看一下识别后的结果,用for循环打印一下

”“”
[[[52.0, 27.0], [86.0, 27.0], [86.0, 41.0], [52.0, 41.0]], ('运行', 0.9966387748718262)]
[[[131.0, 27.0], [220.0, 27.0], [220.0, 40.0], [131.0, 40.0]], ('Python软件包', 0.9266456961631775)]
[[[245.0, 25.0], [308.0, 27.0], [307.0, 41.0], [245.0, 39.0]], (' TODO', 0.9500144124031067)]
[[[353.0, 27.0], [440.0, 27.0], [440.0, 40.0], [353.0, 40.0]], ('Python 控制台', 0.9459636807441711)]
[[[485.0, 26.0], [515.0, 26.0], [515.0, 41.0], [485.0, 41.0]], ('终端', 0.9898760318756104)]
“”“
# 可以的

识别了终端,点击一下,后面登录mysql,就很简单

pyautogui可以完成。

封装一下

源码

from paddleocr import PaddleOCR
import cv2 as cv
import numpy as np
import pyautogui as k
class lazy:
    def __init__(self, a=False, pos: int = None):
        self.posi=(500, 981)
# 默认等于这个位置,如果终端改变了,再修改a=True,pos=?
        if a:
            self.posi=self.change_pos(pos)
        k.leftClick(self.posi)
    def change_pos(self, pos: int):
        img = k.screenshot(region=[0, 950, 600, 50])  # 分别代表:左上角坐标,宽高
        img = cv.cvtColor(np.asarray(img), cv.COLOR_RGB2BGR)
        ocr = PaddleOCR(use_angle_cls=True, lang="ch")
        thresh, img = cv.threshold(img, 70, 255, cv.THRESH_BINARY)
        result = ocr.ocr(img=img)[0][pos][0]
        print(result)
        p1 = result[0]
        p3 = result[2]
        p4 = result[3]
        x = int((p3[0] + p4[0]) / 2)
        y = int((p1[1] + p4[1]) / 2) + 950
        return x,y
    def write(self,text):
        k.typewrite(f'{text}')
    def mysql(self,name='luffy',pasword=123456):
        self.write(f'mysql -u {name} -p')
        k.hotkey('enter')
        self.write(f'{pasword}')
        k.hotkey('enter')
        self.write('system cls;')
        k.hotkey('enter')

实现

看下过程


windows server mysql终端 终端登陆mysql_pycharm_03


速度很快的,一下就登录了,哈哈哈哈哈

把终端的位置给改了,看看

😃😃😃😃😃


windows server mysql终端 终端登陆mysql_pycharm_04


需要识别,还是比较慢的