python实现自动刷题

源码就是所有代码块

使用Python实现云豆网自动刷题

这些是一大佬写的我就解读一下

所有代码全是Py3

  • 在这里插入图片描述

**要有一些Python基础emmm不用太多
大体思路:

  • 控制浏览器模拟点击
  • 利用漏洞拿到正确答案
  • 填入答案

需要导入的模块

正文

导入模块

from selenium import webdriver  #控制浏览器用
import time #控制延时的
"""识图不想用下面不用导入	可以用input"""
from PIL import ImageGrab#截图用的
import pytesseract  #识别图片用的
from PIL import Image

定义几个变量为了代码的整洁

"""先定义几个变量为了代码的整洁"""
name = '123456789@suibian.com'	#这里填入你的账户
password = '123'	#这里填入你的密码
"""还要再填入一个账户因为这个是利用的漏洞 后面会说什么漏洞"""
///还写过一个完美的不用漏洞版本,以后有心情会发出来,也欢迎交流指点///
name1 = '0987654321@suibian.com'  #填入另一个账户
password = '不知道' #填入另一个密码

用selenium控制浏览器

dr = webdriver.Chrome()	#打开谷歌浏览器
dr.get('http://s.bdqn.cn/login')	#get方法打开指定网页
dr.maximize_window() #全屏打开
  • 效果图
  • 在这里插入图片描述

定义用户名 密码 并输入

dr.find_element_by_id("LoginForm_username").send_keys(name)	#用户名输入框
dr.find_element_by_id("LoginForm_password").send_keys(password)	#密码输入框
  • 效果图
  • 用id定位后面大多是xpath

找到验证码 位置输入 和点击登录按钮

"""识图部分"""
img = ImageGrab.grab(bbox=(1468, 605, 1604, 660))#截取验证码的位置
img.save('111.png')#保存截取的图片
pytesseract.pytesseract.tesseract_cmd = '这里放tesseract的位置'
w_input = pytesseract.image_to_string(Image.open('111.png'))#识别验证码并保存在w_input里
"""或者用input"""
w_input = input(请输入验证码: )
"""定位验证位置同上"""
dr.find_element_by_id("LoginForm_verifyCode").send_keys(w_input) #输入验证码
"""定位登录按钮位置并点击"""
dr.find_element_by_id("login").click()	#点击登录按钮
time.sleep(1) #给一秒时间根据你的网络好坏定
  • 效果图(按input的方式演示 //截图不懂也可以问我)
  • 在这里插入图片描述
  • 在这里插入图片描述

现在进入题库

选择课程点击云题库

dr.find_element_by_xpath('/html/body/div[2]/div/div/div/div/div/div/form/ul/li[2]/a').click()#选择课程
dr.find_element_by_xpath('/html/body/div/div/ul/li[4]').click()#进入题库
  • 效果
  • 在这里插入图片描述
  • 在这里插入图片描述

将话柄定位到最新的位置

windows = dr.window_handles  # 获取当前会话所有句柄
dr.switch_to.window(windows[-1]) #-1就是最新的标签
  • 效果(两个标签所以要获取新话柄)
  • 在这里插入图片描述

点击课程复习并进入试卷

dr.find_element_by_xpath("/html/body/div[3]/div[1]/div/div[2]/div/div[2]/span[4]/a").click()
#定位课程复习并点击
dr.find_element_by_xpath("/html/body/div[11]/div[2]/div/div/ul/li[1]/a").click()
#点击第一个 如果点击第二个改一下定位
  • 效果
  • 在这里插入图片描述
  • 在这里插入图片描述

这时候就要简单的提提那个漏洞了

  • 账号1解析到交卷地址后在账号2上交卷
  • 拿到答案再回到账号1填
  • 账号2不会计入任何记录
  • 账号1只会计入本日答题 全国排行和本班本校排行不会计入

完美的版本以后有心情在发 至于有多完美 哈哈哈


下面很多地方可以换一种方法解决为了照顾新手就只用selenium完成但还是简单提一下可以用什么:

  • 弄交卷地址 和选项可以用正则表达式
  • 点击选项可以用列表推导式 或者哈希公式
  • 这是常用的还有好多细节懒得提///想要细的找我要

进入试卷后分析交卷地址

o = dr.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/div/a[2]")	#定位到交卷地址
o = o.get_attribute("data")	#提取出来
  • 效果
  • 在这里插入图片描述

下面不想写太详细了发生了点事情没心情
想听具体思路加我吧 等有心情讲给你

用小号打开

"""注意dr和drs"""
drs= webdriver.Chrome()#用来打开小号的
drs.maximize_window()  # 全屏
drs.get("http://s.bdqn.cn/login")#打开网页
drs.find_element_by_id("LoginForm_username").send_keys(name1) #用户名
drs.find_element_by_id("LoginForm_password").send_keys(password1)#密码
wa_input = input("密码")
drs.find_element_by_id('LoginForm_verifyCode').send_keys(wa_input)#验证码
drs.find_element_by_id('login').click() #点登陆
find_element_by_xpath('//*[@id="choose-course-form"]/ul/li[2]/a').click()#新界面 就是点进题库去
drs.find_element_by_xpath("/html/body/div[1]/div/ul/li[4]/a").click() #点击云题库
drs.switch_to.window(driver.window_handles[-1])#获取新话柄
"""重复内容不再细说"""

** 和账号一登录过程是一样的不在放图**

小号打开交卷地址并交卷

time.sleep(2) #加个延时给反应时间用样按你的网速定
driver.get(o)#打开账号1的交卷地址
time.sleep(1)#延时
"""这三步是提取文字 先弄成列表 再用切片 再弄回来 .join()方法	可以用正则一步就行"""
a = driver.execute_script("return document.documentElement.outerHTML")
b = a[126:166]
c = ("".join(b))
  • 图就不弄了因为是漏洞明放出不好 看不懂代码问我

账号2进入错题界面

#可以在这里加个延时
drs.get("http://tiku.kgc.cn"+c)#进入错题界面
time.sleep(1)
drs.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/div[2]/div[2]/div[2]/ul/li[1]/a").click() #点击查看解析 #到这里就是错题界面了

不上图了太麻烦 最后直接一个效果图

  • 效果
  • 在这里插入图片描述

拿到正确答案

aa = []#创建一个空列表用于放答案
"""下面内容可以改用正则	用正则的话一行完事  为了照顾新手我用本方法想看正则写法找我要"""
#共20道题 每道题爬获取所有答案的文本格式  位置是从2往下延伸,2是第一题一直的到20题是21 for里到22的目的是为了执行下面except:
for f in range(2, 23):
  try:
    if f <= 22: #把答案爬下来 并且把生成的列表格式化为1234类型
      xx =drs.find_element_by_xpath("/html/body/div[2]/div/div[2]/div["+str(f)+"]/div[3]/label/em").text #循环f用2开始(xpath2是第一道题3是第二道以次类推)每次循环都拿到正确答案存入aa列表中
      if xx=="A": 
        aa.append("1")
      elif xx=="B":
        aa.append("2")
      elif xx=="C":
        aa.append("3")
      elif xx=="D":
        aa.append("4")
      elif xx=="A,B":
        aa.append("1,2")
      elif xx=="C,D":
        aa.append("3,4")
      elif xx=="A,C":
        aa.append("1,3")
      elif xx=="A,D":
        aa.append("1,4")
      elif xx=="B,C":
        aa.append("2,3")
      elif xx=="B,D":
        aa.append("2,4")

回到账号1将爬取的到正确答案选上

  except:
    #回到原有账号这里 开始答题
    for F in range(2, 22):  # 把所有可能性加进去
      XX = F - 2	#因为列表索引是从0开始所以要减2
      print("第" + str(XX) + "题答案获取中")
      FF = aa[XX]
      if F <= 22:
      """下面的就是千篇一律将正确答案在账号1以上选上	注意dr和drs
      可以用正则表达式拿到全部选项位置用列表推导式点上"""
        if FF == "1,2":
          dr.find_element_by_xpath("/html/body/div[2]/div/div/div[2]/div[" + str(F) + "]/ul/li[1]/pre/input").click()
          dr.find_element_by_xpath("/html/body/div[2]/div/div/div[2]/div[" + str(F) + "]/ul/li[2]/pre/input").click()
        elif FF == "3,4":
          dr.find_element_by_xpath("/html/body/div[2]/div/div/div[2]/div[" + str(F) + "]/ul/li[3]/pre/input").click()
          dr.find_element_by_xpath("/html/body/div[2]/div/div/div[2]/div[" + str(F) + "]/ul/li[4]/pre/input").click()
        elif FF == "1,3":
          dr.find_element_by_xpath("/html/body/div[2]/div/div/div[2]/div[" + str(F) + "]/ul/li[1]/pre/input").click()
          dr.find_element_by_xpath("/html/body/div[2]/div/div/div[2]/div[" + str(F) + "]/ul/li[3]/pre/input").click()
        elif FF == "1,4":
"""千篇一律,不全弄了自己写所有可能性"""
  • 在这里插入图片描述

下面交卷什么的xpath就不写了想弄的话自己填上就行

一切只做学习与交流不作任何商业用途

  • 15
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
青马易战是一款用于刷题的在线教育平台,可以帮助学生提升编程能力。Python是一门强大的编程语言,具有简单易学、功能丰富的特点,可以用来实现青马易战的自动刷题。 首先,我们可以使用Python的web自动化工具,如Selenium或Pyppeteer,来模拟用户在青马易战网站上的操作。通过编程方式,我们可以自动登录到青马易战网站,并进入题目列表页面。 接下来,我们可以使用Python的数据处理和爬虫库,如BeautifulSoup或Scrapy,来提取题目列表页面中的题目信息,包括题目名称、描述、输入输出样例等。 然后,我们可以使用Python的文本处理库,如re或pandas,来对题目信息进行清洗和解析,将题目描述和输入输出样例提取出来,并保存到相应的变量中,以便后续的处理和分析。 在获取题目信息之后,我们可以使用Python的编程能力来编写算法来解题。根据题目的要求,我们可以使用Python的各种数据结构和算法进行求解,包括字符串处理、列表操作、循环、递归、排序、搜索等。通过编写相应的函数或方法,我们可以将解题过程封装起来,以便于自动刷题。 最后,我们可以使用Python自动化测试工具,如unittest或pytest,来对编写的解题代码进行自动化测试。通过提供输入样例,我们可以自动调用解题函数,并将输出结果与预期结果进行比较,以验证解题代码的正确性。如果输出结果正确,我们可以将解题代码保存,继续下一道题的刷题流程。 通过以上步骤,就可以使用Python实现青马易战的自动刷题。这样可以大大提高刷题的效率,并帮助学生更好地学习和理解编程知识。同时,自动刷题也可以帮助学生培养解题思维和编程能力,提升竞赛的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值