Python 自动刷青马和网课

 我比较懒,才不想自己每隔多久点一下,类似机器的操作就交给机器做吧!

 写这个自动刷课的过程也遇到过一些麻烦,我这里只是给出一中方法(还是比较傻的方法),下面以刷青马为例子:

 思路一:本来想实现自动登陆来实现(需要验证码),由于pytesseract需要的东西安装几次失败就放弃了。本来打算都用图片识别来找到需要点击的地方,pytesseract它可以用来识别简单的验证码和文字,不能就不用呗,换方法!

 思路二:,先自己登陆到青马,然后用pyautogui实现自动化点击。

 主要使用的代码:

import pyautogui
pyautogui.click(x, y)  
# 模拟点击坐标为(x,y)的地方
pyautogui.locateOnScreen(img)  
# 在屏幕上找到于 img匹配的地方(每个地方都要相同),img是图片路径
pyautogui.moveTo(X, Y + 42*i, duration=0.5)
# 把鼠标移动到(x,y)的位置 速度是 0.5
pyautogui.pixelMatchesColor(X, Y + i*42, (125, 158, 237))
# 把屏幕(x,y)的地方的RGB和给定的RGB对比,如果相同返回True,否则返回Fasle

 弄清楚上面代码的使用就可以直接上手。

 1.登陆部分跳过,直接来到个人中心,由于青马的界面位置已经固定了,我们直接获取需要点击位置的坐标(x,y),进去个人中心,有一列课程我们都需要刷完,找到第一个课程的位置。用下面方法获取鼠标位置的(x,y)和RGB。

Python 自动刷青马和网课_第1张图片

def get_xy():
    while(True):
        a = input("获取鼠标坐标信息输入:1 开始")
        if int(a) == 1:
            break
    try:
        while True:
            x, y = pyautogui.position()
            positionStr = 'X: '+str(x).rjust(4)+' Y:'+str(y).rjust(4)
            pix = pyautogui.screenshot().getpixel((x,y))   # 获取鼠标所在屏幕点的RGB颜色
            positionStr += ' RGB:('+str(pix[0]).rjust(3)+','+str(pix[1]).rjust(3)+','+str(pix[2]).rjust(3)+')'
            print(positionStr)
    except KeyboardInterrupt:                              
        print('\nDone.')

 运行后我们可以获取鼠标所在地方的信息(很有用):

 我的电脑在用win10自带的浏览器放大的前提下坐标为:x = 1450 y = 468.然后依次自增58,如果不同同理获得即可。(RGB获取还可以用QQ自带的截图ctrl+alt+A ,注意判断是否继续学习我使用的图片对比,后面用的其他方法,图片对比误差大。

pyautogui.click(x, y)测试下。进入后我们就只需要判断是否需要点击跳过休息、点击进入下一节、点击继续学习,以及这个课看完,退出本窗口回到个人中心点击进入下一节就OK了。
# coding=UTF-8
import pyautogui
import time


#  PS:在笔记本上用 win10自带的浏览器可以使用
# 获取坐标
def get_xy():
    while(True):
        a = input("获取坐标输入:1 开始")
        if int(a) == 1:
            break
    try:
        while True:
            # Get and print the mouse coordinates.
            # print("1")
            x, y = pyautogui.position()
            positionStr = 'X: '+str(x).rjust(4)+' Y:'+str(y).rjust(4)
            pix = pyautogui.screenshot().getpixel((x,y))   # 获取鼠标所在屏幕点的RGB颜色
            positionStr += ' RGB:('+str(pix[0]).rjust(3)+','+str(pix[1]).rjust(3)+','+str(pix[2]).rjust(3)+')'
            print(positionStr)                      # end='' 替换了默认的换行
    except KeyboardInterrupt:                              # 处理 Ctrl-C 按键
        print('\nDone.')


def image_click(img):
    # im = pyautogui.screenshot()  # 获取屏幕快照
    # plt.imshow(im)
    # plt.show()
    try:
        x, y = pyautogui.center(pyautogui.locateOnScreen(img))
        pyautogui.click(x, y)
        return True
    except:
        return False


def quxiao():
    time.sleep(5)
    try:
         if image_click('这里是你截取带的图片的位置'):  # 如果需要 点击继续学习
                print(end='')
         else:
            if image_click('同上g'):  # 如果需要点击继续学习 我截取了两张 怕识别出错
                    print(end='')
    except:
         print('错误001')


def look_all():
    # PS:从个人中心开始的
    x = 1450
    y = 410
    for j in range(1, 11):  # 10个任务
        y = y + 58
        pyautogui.click(x, y)
        print('正在播放'+str(j)+'个')
        time.sleep(8)
        try:
            quxiao()
            time.sleep(0.5)
            pyautogui.click(384, 13)  # 关掉青马的声音
            # print('声音关闭成功')
            n = 0
            X = 1666
            Y = 446
            counts = 0
            error = 0
            # 判断一大节课有多少个小节,就是后面用来判断这节大课是否看完了
            # 注意这里我找有多少个进度条框框,依次移动相同位置,
            for i in range(0, 7):
                pyautogui.moveTo(X, Y + 42*i, duration=0.5)
                time.sleep(0.5)
                # 边跨的位置和RGB 或前面的函数获取
                if pyautogui.pixelMatchesColor(X, Y + i*42, (125, 158, 237)) or pyautogui.pixelMatchesColor(
                    X, Y + 42*i, (158, 177, 237)) or pyautogui.pixelMatchesColor(X, Y + i*42, (95, 128, 236)):
                    counts = counts + 1
                else:
                    break
            print('一共需要播放'+str(counts))
            while True:
                n = n + 1
                if n >= 240:  # 假设一节大课2个小时,可以自行调整
                    break
                now_x = 1662  # 起始位置
                now_y = 448
                flag = False  # true 则表示这集看完
                count = 0
                # print('测试')
                i = -1
                time.sleep(3)
                # 依次判断右边进度框的情况
                while i <= counts+1:
                    i = i + 1
                    # 移动到那个点的位置
                    pyautogui.moveTo(now_x, now_y + 42 * i, duration=0.5)
                    if pyautogui.pixelMatchesColor(1573, 877, (229, 229, 229)):  # 如果弹出需要点击
                        # 发现正在播放的那条没满
                        if pyautogui.pixelMatchesColor(now_x, now_y+42*i, (194, 209, 229))\
                                or pyautogui.pixelMatchesColor(now_x, now_y+42*i, (193, 209, 229)):
                            # print('发现需要点击15min')
                            pyautogui.click(1005, 950)  # 点击取消休息
                            time.sleep(0.5)
                            pyautogui.click(995, 950)
                            break
                        else:
                            # 这节看完了 点击下一节或者跳出去  本条满了
                            if pyautogui.pixelMatchesColor(now_x, now_y+42*i, (156, 174, 228))\
                                    or pyautogui.pixelMatchesColor(now_x, now_y+42*i, (153, 173, 228)):
                                # print('需要点击下一节', str(i+1))
                                pyautogui.click(908, 950)  # 点击下一节
                                break
                            elif pyautogui.pixelMatchesColor(now_x, now_y + 42*i, (87, 122, 236))\
                                    or pyautogui.pixelMatchesColor(
                                    now_x, now_y+42*i, (159, 176, 228)):
                                #  如果不是正在播放的那条
                                #     print('发现满的:'+str(i+1))
                                    count = count + 1
                            elif pyautogui.pixelMatchesColor(now_x, now_y + 42*i, (229, 229, 229)):
                                # print('发现空白点:'+str(i+1))
                                None
                            else:
                                # 可能出现意外
                                print('点击判断错误!')
                                error = error +1
                                if error >=10:  # 连续卡了5 Min 10次意外,自动跳出,播放下一节课
                                    pyautogui.click(566, 18)  # 关闭窗口
                                    print('第' + str(j) + '个播放失败!')
                                    flag = True
                            if count == counts:  # 如果看满的课的等于我们前面记录的数量则说明看完这节大课了
                                flag = True
                    elif pyautogui.pixelMatchesColor(now_x, now_y + 42*i, (87, 122, 236)) or pyautogui.pixelMatchesColor(
                            now_x, now_y+42*i, (156, 174, 228)):
                            # print('发现满的:'+str(i+1))
                            count = count + 1
                            if counts == count:
                                flag = True
                                break
                            else:
                                continue
                    elif pyautogui.pixelMatchesColor(now_x, now_y+42*i, (168, 198, 238)):  # 正在播放,但是没有播放完
                            # print('发现自己未播放完'+str(i+1))
                            break  #
                    elif pyautogui.pixelMatchesColor(now_x, now_y+42*i, (206, 219, 239)):
                            # print('还没有播放到的地方,为空:')
                            break  #
                    elif pyautogui.pixelMatchesColor(now_x, now_y+42*i, (238, 238, 238)):
                            # print('空白点:'+str(i))  # 意料外的点
                            # time.sleep(0.5)
                            break
                if flag:
                    print(str(j)+'集播放完')
                    pyautogui.click(566, 18)  # 关闭窗口
                    time.sleep(8)
                    break
                else:
                    time.sleep(30)
        except:
            pyautogui.click(566, 18)  # 关闭窗口
            print('第'+str(j)+'个播放失败!')
            continue


if __name__ == '__main__':
    get_xy()
    look_all()

提醒:需要先进入到个人中心,可以先设置延时执行自动话点击。缺点是需要把电脑开着挂,晚上或者没用电脑的时候比较好,而且不能出现弹窗覆盖你需要判断的区域。(我被QQ弹出的新闻给破坏过!)

其他的网课也可以同理写出来。

 

你可能感兴趣的:(Python)