声明:只是用来学习,请不要使用非法用途,责任自负

虽然最近疫情总是反反复复,

但还是有许多小伙伴后台私信我有没有可以抢课的方法,

于是这个教程就来了

不过咱该说的还是说,别整违法的事情!

工具

使用python 3.6版本,安装如下库:

  • 安装win32api
    -pip3 install pywin32
  • 安装PIL
    -pip install Pillow
  • 安装pyautogui
    -pip install pyautogui
  • 安装numpy
    -pip install numpy
  • 安装cv2
    -pip install opencv-python
  • 安装matplotlib
    -pip install matplotlib

使用SPY查看相关窗口标题, 类名。
此标题唯一, 故可以以此来查找相关窗口


得到窗口句柄

    window_title = '课件学习 - Google Chrome' #python学习裙:660193417##screen_width = win32api.GetSystemMetrics(0)screen_height = win32api.GetSystemMetrics(1) hwnd = win32gui.FindWindow(win32con.NULL,window_title) if hwnd == 0 :error_exit('%s not found' % window_title)exit()else:print('hwnd = %x'%(hwnd))window_left,window_top,window_right,window_bottom = win32gui.GetWindowRect(hwnd)

主循环

原理:

主要通信截图屏幕的图片,

然后通过模板图像与之比较,

如果出现我们需要的场景,

那么得到对应的位置坐标,

然后自动调用点击功能,

从而实现自动化操作。

那么这里主要使用opencv的两个算法,
一个是图像相似度打分算法,
另一个是图像搜索算法。

 while True:grab_image = snapshot.grab_screen(deal_left,deal_top,deal_right,deal_bottom)#grab_image.show()grab_image.save(r'.\tmp_output\full_screen.png')#big pic size = 1936x1056full_screen_w = 1936full_screen_h = 1056pixel_core_x = 877.0pixel_core_y = 25.0deal_left = window_left #window_left + kejian_x / full_screen_w * window_width - 100deal_top = window_top + pixel_core_y / full_screen_h * window_height - 20deal_right = window_left + window_width#window_left + kejian_x / full_screen_w * window_width + 150    deal_bottom = window_top + pixel_core_y / full_screen_h * window_height + 20grab_image = snapshot.grab_screen(deal_left,deal_top,deal_right,deal_bottom)search_pic = r'.\tmp_output\search_kejianxuexi.png' grab_image.save(search_pic)#find kejian_temtemplate_pic = r'.\template\kejian_tem.png'num, w, h, pos_list = match.lookup_pos(template_pic, search_pic)left = 0top = 0find_kejian_flag = 0no_voice_flag = 0if num == 1:left = pos_list[0][0]top = pos_list[0][1]find_kejian_flag = 1else:print('==========warning search_kejianxuexi = ' + str(num))find_kejian_flag = 0if find_kejian_flag:img_rgb = cv2.imread(search_pic)img_rgb = img_rgb[top:top + h, left:left + w + 80, :]  # h, w, ccompare_pic = r'.\tmp_output\kejianxuexi_compare.png'cv2.imwrite(compare_pic, img_rgb)temp_voice = r'.\template\kejianhua_tem_voice.png'temp_no_voice = r'.\template\kejianhua_tem_no_voice.png'no_voice_flag = match.score_pic(compare_pic, temp_voice, temp_no_voice)if no_voice_flag:print('===============find no_voice_flag')find_question_flag = find_question()if find_question_flag:#secondtime.sleep(5)find_daan()time.sleep(5)find_quding()find_chongbo_flag = find_chong_bo()if find_question_flag and find_chongbo_flag:print('========>find_chongbo_flag and  find_chongbo_flag')exit()if find_chongbo_flag:weikaishi()         else:print('===============every thing is ok')time.sleep(2) #exit(0)

图像相似度打分算法

那么如何判断一张被PS过的图片是否与另一张图片本质上相同呢?

比较简单、易用的解决方案是采用感知哈希算法(Perceptual Hash Algorithm)。

感知哈希算法是一类算法的总称,
包括aHash、pHash、dHash。

顾名思义,感知哈希不是以严格的方式计算Hash值,
而是以更加相对的方式计算哈希值,因为“相似”与否,
就是一种相对的判定。

aHash:平均值哈希。速度比较快,但是常常不太精确。
pHash:感知哈希。精确度比较高,但是速度方面较差一些。
dHash:差异值哈希。Amazing!精确度较高,且速度也非常快。因此我就选择了dHash作为我图片判重的def

pHash(imgfile):"""get image pHash value"""#加载并调整图片为32x32灰度图片img=cv2.imread(imgfile, 0) img=cv2.resize(img,(64,64),interpolation=cv2.INTER_CUBIC)#创建二维列表h, w = img.shape[:2]vis0 = np.zeros((h,w), np.float32)vis0[:h,:w] = img       #填充数据#二维Dct变换vis1 = cv2.dct(cv2.dct(vis0))#cv.SaveImage('a.jpg',cv.fromarray(vis0)) #保存图片vis1.resize(32,32)#把二维list变成一维listimg_list=(vis1.tolist())print('----------')sum(img_list)#计算均值avg = sum(img_list)/(len(img_list)*1.0)print('----------')avg_list = ['0' if i<avg else '1' for i in img_list]#得到哈希值return ''.join(['%x' % int(''.join(avg_list[x:x+4]),2) for x in range(0,32*32,4)])def hammingDist(s1, s2):assert len(s1) == len(s2)return sum([ch1 != ch2 for ch1, ch2 in zip(s1, s2)])def aHash(img):#缩放为8*8img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)#转换为灰度图gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#s为像素和初值为0,hash_str为hash值初值为''s=0hash_str=''#遍历累加求像素和for i in range(8):for j in range(8):s=s+gray[i,j]#求平均灰度avg=s/64#灰度大于平均值为1相反为0生成图片的hash值for i in range(8):for j in range(8):if gray[i,j]>avg:hash_str=hash_str+'1'else:hash_str=hash_str+'0'return hash_strdef cmpHash(hash1,hash2):n=0#hash长度不同则返回-1代表传参出错if len(hash1)!=len(hash2):return -1#遍历判断for i in range(len(hash1)):#不相等则n计数+1,n最终为相似度if hash1[i]!=hash2[i]:n=n+1return 1 - n / 64def score_pic(compare_pic, temp_voice, temp_no_voice):#HASH1=pHash(compare_pic)#HASH2=pHash(temp_voice)#out_score = 1 - hammingDist(HASH1,HASH2)*1. / (32*32/4)img1 = cv2.imread(compare_pic)img2 = cv2.imread(temp_voice)img3 = cv2.imread(temp_no_voice)#time1 = time.time()hash1 = aHash(img1)hash2 = aHash(img2)voice_score = cmpHash(hash1, hash2)hash1 = aHash(img1)hash3 = aHash(img3)no_voice_score = cmpHash(hash1, hash3)no_voice_flag = 0#print(str(voice_score) + '=>' + str(no_voice_score))if no_voice_score >= voice_score:no_voice_flag = 1else:no_voice_flag = 0return no_voice_flag

图像搜索算法

使用res= cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)

def lookup_pos(template_pic, search_pic):img_rgb = cv2.imread(search_pic)img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)img = img_gray#print(img.shape)template = cv2.imread(template_pic,0)w, h = template.shape[::-1]res = cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)threshold = 0.95loc = np.where( res >= threshold)num = 0left = 0top = 0pos_list = []for pt in zip(*loc[::-1]):cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)left = pt[0]top = pt[1]pos_list.append(pt)num = num + 1res = res*256cv2.imwrite(r'.\tmp_output\out.png', img_rgb)cv2.imwrite(r'.\tmp_output\res.png', res)return num, w, h, pos_list

其实上课是一件美事,

只是你们自己还不知道…

今天的文章就到这里啦~

我是小熊猫,咱下篇文章再见啦(✿◡‿◡)

计算机专业必备:用python实现自动shua课,简直不要太爽相关推荐

  1. 计算机专业必备的英语词汇,计算机专业必备英语词汇

    ★以下是无忧考网英文写作翻译频道为大家整理的<计算机专业必备英语词汇>,供大家参考.更多内容请看本站写作翻译频道. ·CPU:中央处理器Central Processing Unit ·C ...

  2. 计算机专业留学条件,美国留学申请计算机专业必备条件介绍

    美国留学申请计算机专业必备条件介绍 对于美国的任何专业,每个学校都有不同的偏好,有些学校看重GPA,有些学校看重GRE,有的学校只看研究经历是否match.计算机科学专业同样如此,解决这个问题,最好的 ...

  3. 1【计算机专业必备基础知识】《计算机体系结构基础》(胡伟武)速读笔记(上篇)“这位同学,请描述一下PPT完成翻页时电脑软硬件是如何协作的?”

    前言 在学习计算机的这几年,一直有些很基础的问题困扰着我,C++.Java照写,但总感觉没有底气.本科学过操作系统.数据结构.微机原理.数字电路,(不知是不是因为我给忘干净了还是咋的,)平时遇到学术道 ...

  4. 计算机专业必备电子书单

    计算机类的书籍那么贵,作为一个几个小时看完一本书且机不离身的程序员,天天买纸质书是不可能的了,所以对电子书的需求量还是挺多的.为了方便广大的小伙伴也能方便找到对应的电子书,我花费洪荒之力从各个搜索网站 ...

  5. 计算机专业必备电脑软件,你们的电脑桌面都有哪些必备的办公软件?

    ​每个人的电脑都会因为自己的使用习惯,也会因为工作.专业的区别,安装各种各样的软件,学习的.工作的.娱乐的等,抛开专业性不说,每个人都能必备的软件有哪些呢?这里给大家推荐几款桌面必备软件,都是大浪淘沙 ...

  6. 计算机专业必备的英语词汇加音标,计算机专业带音标英语

    <电脑专业英语> 1.file [fail]n. 文件:v. 保存文件 http://doc.xuehai.netmand [km:nd]n. 命令,指令 http://doc.xueha ...

  7. 稳住别被惊艳了哦!!!IT行业计算机专业——必备100个网站

    文章目录:一:学习视屏二:中文网三:博客社区四:源码五:项目管理六:前段框架七:后端框架 一:学习视频 哔哩哔哩 尚硅谷 我要自学网 我爱自学网 人人自学网 21互联远程教育网 学领未来 视频中心·网 ...

  8. Python毕业设计论文计算机专业毕业论文基于Python实现的作业查重系统[包运行成功]

  9. 用Python实现自动刷王者荣耀金币,这简直不要太爽了

    相信有很多小伙伴都喜欢玩王者荣耀吧,王者里边有很多英雄购买都是需要金币的,并且金币还可以抽奖.今天,你就可以实现王者的金币自由了,我把王者刷金币的教程分享给大家,记得学起来. 一.原理 我想,游戏的脚 ...

最新文章

  1. Thonny开发环境中显示数据曲线
  2. javascript的函数定义的区别
  3. 【PyTorch】eval() ==>主要是针对某些在train和predict两个阶段会有不同参数的层,比如Dropout层和BN层
  4. django-多对多关系
  5. github可以刷星吗_GitHub 没有 star,该写进简历里吗?
  6. php 内网全部ip,如何ping局域网内所有IP
  7. DirectX Redistributable 多国语言安装版
  8. 知道python网课答案_分析最近的一个网课答案查询2.0
  9. python局域网监控系统_python 实现局域网监控
  10. 编程计算1至50中是7倍数的数值之和
  11. 查看Win7的真实版本号方法
  12. react Hook useEffect()
  13. 设计一个圆形的类即Circle类。
  14. 谭浩强C语言学习day1
  15. 计算机碎片整理,计算机磁盘碎片整理
  16. 求质数(Prime Number 素数)的方法——厄拉多塞筛法
  17. 用css编写一个简单的旋转魔方
  18. 分享精美电脑主题壁纸09-01整理更新分享!
  19. SQL Server中已满事务日志原因的检测
  20. 怀化学院1901班灭霸组项目设计博文

热门文章

  1. 记录基于MXCube,使用STM32F103RCT6 ADC多通道采集 的学习经验
  2. 系统集成项目管理工程师历年考题
  3. 建立PXC Percona 5.7 遇到的问题汇总
  4. 杰里之 定时器捕获(timer_cap.c) 使用注意事项【篇】
  5. 使用minitab18 做单因子方差分析达到算法指标之间多重比较的目的(One way ANOVA, Multiple comparison)
  6. H3C MPLS BGP实验 新华三杯拆解
  7. Safari下载东西太慢怎么办?
  8. Linux配置IP地址的方法
  9. 网页版女朋友表白告白代码,可轻松定制表白内容、认识时间等,html爱心表白代码
  10. 如何利用 Python + Selenium 自动化快速截图