最近直播答题app很热门,由于之前看过跳一跳的python脚本(非常棒),于是也想写一个答题的脚本。

  1. https://github.com/huanmsf/cai

思路:

1、截图

2、文字识别,提取问题和选项(分割后识别准确性会提高)

3、爬取网页数据,根据规则匹配选项

4、根据选项自动点击屏幕该位置(应该循环点击,防止刚好切换到西瓜妹)

5、重复前面步骤

存在的问题:

1、答题时间有限,如果爬去的链接多了,还没解析完时间就到了。爬取的少就缺少分析数据,结果不靠谱。

2、问题和选项需要提取关键字匹配

3、可能要试试其他搜索引擎(百度垃圾信息严重影响正确率)

目录:

  1. ├── baidu.py
  2. ├── cai.png
  3. ├── main.py
  4. ├── need
  5.    └── chi_sim.traineddata
  6. ├── README
  7. └── screenshot.py

main.py:

  1. from screenshot import pull_screenshot
  2. import time, urllib.request, baidu, os
  3.  
  4. try:
  5. import Image
  6. except ImportError:
  7. from PIL import Image, ImageDraw
  8.  
  9. import pytesseract
  10.  
  11. # 屏幕顶端到问题的距离/屏幕高度,随分辨率变化(默认1920*1080)
  12. top_off_c = 0.15
  13. # 问题高度
  14. que_h = 300
  15. # 答案高度
  16. ans_h = 170
  17.  
  18. # 左右偏移量
  19. l_r_off = 40
  20.  
  21. # 问题过滤器
  22. que_filter = ['.', ' ']
  23.  
  24. # 答案过滤器
  25. ans_filter = ["《", "》", ' ']
  26.  
  27. # 问题列表
  28. que_list = []
  29.  
  30. # 选项坐标
  31. point_A = (0, 0, 0, 0)
  32. point_B = (0, 0, 0, 0)
  33. point_C = (0, 0, 0, 0)
  34.  
  35. # 辅助找到文字区域
  36. def draw():
  37. img = Image.open('cai.png')
  38. w, h = img.size
  39. draw = ImageDraw.Draw(img)
  40. draw.line((40, h * 0.15, w - 40, h * 0.15), fill="red")
  41. draw.line((40, h * 0.15 + 300, w - 40, h * 0.15 + 300), fill="red")
  42.  
  43. draw.line((40, h * 0.15 + 470, w * 0.7, h * 0.15 + 470), fill="red")
  44. draw.line((40, h * 0.15 + 640, w * 0.7, h * 0.15 + 640), fill="red")
  45. draw.line((40, h * 0.15 + 810, w * 0.7, h * 0.15 + 810), fill="red")
  46.  
  47. img.show()
  48.  
  49. def click(point):
  50. # img = Image.open('cai.png')
  51. # w, h = img.size
  52. # draw = ImageDraw.Draw(img)
  53. # draw.arc(point, 0, 360, fill="red")
  54. # img.show()
  55. cmd = 'adb shell input swipe {x1} {y1} {x2} {y2} {duration}'.format(
  56. x1=point[0],
  57. y1=point[1],
  58. x2=point[2],
  59. y2=point[3],
  60. duration=1
  61. )
  62. os.system(cmd)
  63.  
  64. def main():
  65. while True:
  66.  
  67. print(">>>>>>")
  68. pull_screenshot()
  69. img = Image.open('cai.png')
  70. img = img.convert('L')
  71. w, h = img.size
  72. img_q = img.crop((l_r_off, h * top_off_c, w - l_r_off, h * top_off_c + que_h))
  73. img_a = img.crop((l_r_off, h * top_off_c + que_h, w * 0.7, h * top_off_c + que_h + ans_h))
  74. img_b = img.crop((l_r_off, h * top_off_c + que_h + ans_h, w * 0.7, h * top_off_c + que_h + ans_h * 2))
  75. img_c = img.crop((l_r_off, h * top_off_c + que_h + ans_h * 2, w * 0.7, h * top_off_c + que_h + ans_h * 3))
  76.  
  77. point_A = (w / 3 - 20, h * top_off_c + que_h + ans_h / 2 - 20, w / 3, h * top_off_c + que_h + ans_h / 2)
  78. point_B = (w / 3 - 20, h * top_off_c + que_h + ans_h / 2 * 3 - 20, w / 3, h * top_off_c + que_h + ans_h / 2 * 3)
  79. point_C = (w / 3 - 20, h * top_off_c + que_h + ans_h / 2 * 5 - 20, w / 3, h * top_off_c + que_h + ans_h / 2 * 5)
  80.  
  81. # need 下的chi文件 复制到/usr/share/tesseract-ocr/4.00/
  82. question = pytesseract.image_to_string(img_q, lang='chi_sim')
  83. ans_a = pytesseract.image_to_string(img_a, lang='chi_sim')
  84. ans_b = pytesseract.image_to_string(img_b, lang='chi_sim')
  85. ans_c = pytesseract.image_to_string(img_c, lang='chi_sim')
  86. ans = ["1", "1", "1"]
  87. for f in que_filter:
  88. question = question.strip().replace(f, "")
  89.  
  90. for f in ans_filter:
  91. ans_a = ans_a.strip().replace(f, "")
  92. ans_b = ans_b.strip().replace(f, "")
  93. ans_c = ans_c.strip().replace(f, "")
  94.  
  95. ans[0] = ans_a
  96. ans[1] = ans_b
  97. ans[2] = ans_c
  98.  
  99. for a in ans:
  100. if not a.strip():
  101. ind = ans.index(a)
  102. ans[ind] = "&*&"
  103.  
  104. print(question)
  105. print(ans)
  106.  
  107. if que_list.__contains__(question):
  108. continue
  109.  
  110. index = baidu.search(question, ans)
  111. # 选第1,2,3个
  112. if index == 0:
  113. click(point_A)
  114. elif index == 1:
  115. click(point_B)
  116. else:
  117. click(point_C)
  118.  
  119. print("index" + str(index))
  120. que_list.append(question)
  121.  
  122. if __name__ == '__main__':
  123. main()

baidu.py:

  1. # -*- coding:utf-8 -*-
  2.  
  3. import urllib, time, re
  4.  
  5. import lxml.etree as etree
  6.  
  7. # 答案积分规则
  8. """
  9. 某个答案首次出现在一篇文章中+10,再次+3
  10. """
  11.  
  12. def search(question, ans):
  13. cont = {}
  14. q_url = "http://www.baidu.com/s?word=" + urllib.parse.quote(question)
  15. top_page = getdata(q_url)
  16. selector = etree.HTML(top_page)
  17. url_list = selector.xpath('//h3[@class]/a[@data-click]/@href')[0:5]
  18. for url_item in url_list:
  19. if not url_item.startswith('http'):
  20. continue
  21. print(url_item)
  22. sub_page = getdata(url_item)
  23. selector = etree.HTML(sub_page)
  24. try:
  25. content_list = selector.xpath('//div/text()|//span/text()|//p/text()')
  26. except:
  27. return 0
  28. ans_tmp_list = []
  29. for con in content_list:
  30. if con.strip():
  31. for a in ans:
  32. if a in con:
  33. if ans_tmp_list.__contains__(a):
  34. if a in cont.keys():
  35. cont[a] += 3
  36. else:
  37. cont[a] = 3
  38. else:
  39. if a in cont.keys():
  40. cont[a] += 10
  41. else:
  42. cont[a] = 10
  43. ans_tmp_list.append(a)
  44.  
  45. print(con)
  46.  
  47. print(cont)
  48. if not cont:
  49. return 0
  50. else:
  51. l = sorted(cont.items(), key=lambda x: x[1], reverse=True)
  52. return ans.index(l[0][0])
  53.  
  54. def getdata(url):
  55. req = urllib.request.Request(url)
  56. try:
  57. response = urllib.request.urlopen(req)
  58. except:
  59. return " "
  60. top_page = ""
  61. try:
  62. top_page = response.read().decode("utf-8", 'ignore')
  63. except:
  64. pass
  65. # print(top_page)
  66. return top_page

screenshot.py:

  1. # -*- coding: utf-8 -*-
  2. """
  3. 手机屏幕截图的代码(参考跳一跳外挂源码)
  4. """
  5. import subprocess
  6. import os
  7. import sys
  8. from PIL import Image
  9.  
  10. SCREENSHOT_WAY = 3
  11.  
  12. def pull_screenshot():
  13. global SCREENSHOT_WAY
  14. if 1 <= SCREENSHOT_WAY <= 3:
  15. process = subprocess.Popen(
  16. 'adb shell screencap -p',
  17. shell=True, stdout=subprocess.PIPE)
  18. binary_screenshot = process.stdout.read()
  19. if SCREENSHOT_WAY == 2:
  20. binary_screenshot = binary_screenshot.replace(b'\r\n', b'\n')
  21. elif SCREENSHOT_WAY == 1:
  22. binary_screenshot = binary_screenshot.replace(b'\r\r\n', b'\n')
  23. f = open('cai.png', 'wb')
  24. f.write(binary_screenshot)
  25. f.close()
  26. elif SCREENSHOT_WAY == 0:
  27. os.system('adb shell screencap -p /sdcard/cai.png')
  28. os.system('adb pull /sdcard/cai.png .')
  1. 文字识别
  2. sudo pip3 install pytesseract
  3. sudo apt-get install tesseract-ocr

初级版本效果:

题外话:

最近在浏览FB站看到

冲顶大会辅助揭秘:王思聪撒的币,还是要靠技术来捡

文中提到可以提前10秒得到题目(不知是否属实),由于访问权限不能看,如有知道怎么搞的请留言交流下,谢谢

python答题辅助的更多相关文章

  1. OJ python答题结果"返回非零"

    最近在OJ上用python答题,偶尔会遇到结果“放回非零”的情况(Non-zero Exit Code) 总结了以下,目前知道的是这些: 1. 在python2中用了input(),或在python3 ...

  2. Ocr答题辅助神器 OcrAnswerer4.x,通过百度OCR识别手机文字,支持屏幕窗口截图和ADB安卓截图,支持四十个直播App,可保存题库

    http://www.cnblogs.com/Charltsing/p/OcrAnswerer.html 联系qq:564955427 最新版为v4.1版,开放一定概率的八窗口体验功能,请截图体验(多 ...

  3. python辅助开发模块(非官方)如pil,mysqldb,openpyxl,xlrd,xlwd

    官方文档 只是支持win32, 不支持win64 所以很麻烦 民间高人,集中做了一堆辅助库,下载后,用python安装目录下的scripts中,pip和easy_install就可以安装了 pytho ...

  4. 第一章 Python 基础

    1. 为什么学习 Python? 答题路线:a.python的优点,b.python的应用领域广 具体: 优点 1.python语法非常优雅,简单易学 2.免费开源 3.跨平台,可以自由移植 4.可扩 ...

  5. python leetcode 1

    开始刷 leetcode, 简单笔记下自己的答案, 目标十一结束之前搞定所有题目. 提高一个要求, 所有的答案执行效率必须要超过 90% 的 python 答题者. 1. Two Sum. class ...

  6. Python垃圾回收机制

    引用计数Python默认的垃圾收集机制是“引用计数”,每个对象维护了一个ob_ref字段.它的优点是机制简单,当新的引用指向该对象时,引用计数 引用计数 Python默认的垃圾收集机制是“引用计数”, ...

  7. 史上最全最强Charles截取手机https协议数据包教程(附上利用此技术制作最近微信比较火的头脑王者辅助外挂)!

    纯原创,思路也是本人花了半个小时整理出来的,整个完成花费了本人半天时间,由于不才刚大学毕业,所以有的编码方面可能不入大牛们的眼,敬请原谅!如有转载请附上本地址,谢谢! 最近微信朋友圈刚刚被跳一跳血洗, ...

  8. Python的垃圾回收机制(引用计数+标记清除+分代回收)

    一.写在前面: 我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念.在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyOb ...

  9. python之MRO和垃圾回收机制

    一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...

随机推荐

  1. CodeForces1065F 树形dp

    http://codeforces.com/problemset/problem/1065/F 你有一棵带有n个结点的树,根是结点1.有一个标记,最初在根结点处.你可以将标记移动到其他结点处.假设标记 ...

  2. 利用salt搭建hadoop集群

    自动化工具有很多..今天总结一下salt安装hadoop 步骤,学习过程. 1,机器列表 hosts文件    只需要将namenode的两台机器上配置 ,不解释了. 2.salt-master在10 ...

  3. Java Web之验证码

    今天来模拟一下验证码,我们需要三个文件,两个Servlet,一个jsp 直接贴代码吧 RandomCodeServlet:主要负责生产验证码 package com.vae.RandomCode; i ...

  4. JavaScript深度克隆(递归)

    今天在深度理解JQuery源码时,剖析extend时: jQuery.extend = jQuery.fn.extend = function() { //... } 感觉该方法的一部分功能与深度克隆 ...

  5. HDU - 6304(2018 Multi-University Training Contest 1) Chiaki Sequence Revisited(数学+思维)

    http://acm.hdu.edu.cn/showproblem.php?pid=6304 题意 给出一个数列的定义,a[1]=a[2]=1,a[n]=a[n-a[n-1]]+a[n-1-a[n-2 ...

  6. hdu 2815 Mod Tree (exBSGS)

    http://acm.hdu.edu.cn/showproblem.php?pid=2815 //解 K^D ≡ N mod P #include<map> #include<cma ...

  7. tedu训练营day02

    1.Linux命令 1.关机.重启 关机 :init 0 重启 :init 6 2.rm 1.rm -rf 文件/目录 r :递归删除文件夹内的子文件夹 f :强制删除,force 2.练习 1.在用 ...

  8. VS2019预览版发布了

     VS2019正式版已发布:https://www.cnblogs.com/zhaogaojian/p/10648904.html 1.点击下载https://visualstudio.microso ...

  9. Hero Patterns - 聚合各种 SVG 背景纹理素材的网站

    Hero Patterns 是一个聚合了各种 SVG 背景纹理素材的网站,提供的多样的素材可以给你的网站带去特色. SVG 是一种分辨率无关的图形(矢量图形).这意味着它在任何类型的屏幕都不会遭受任何 ...

  10. java mongoTemplate的group统计

    @Service public class MongoCountServiceImpl implements MongoCountService { @Autowired private MongoT ...