我比较懒,才不想自己每隔多久点一下,类似机器的操作就交给机器做吧!
写这个自动刷课的过程也遇到过一些麻烦,我这里只是给出一中方法(还是比较傻的方法),下面以刷青马为例子:
思路一:本来想实现自动登陆来实现(需要验证码),由于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。
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弹出的新闻给破坏过!)
其他的网课也可以同理写出来。