Python selenium模拟手动操作实现无人值守刷积分功能


Posted in Python onMay 13, 2020

经常为学校的各种刷分而发愁,得知开学无望,日后还要刷课,索性自动化一次,学而不用乃愚昧 聪慧

四大模块

初始化

from selenium import webdriver

if __name__ == '__main__':
	driver = webdriver.Chrome()
	url = 'https://pc.xuexi.cn/points/login.html?ref=https://pc.xuexi.cn/points/my-points.html'
	driver.get(url = url)

文章有效阅读积分 + 文章时长积分

def article():
	driver.get(url='https://www.xuexi.cn/d05cad69216e688d304bb91ef3aac4c6/9a3668c13f6e303932b5e0e100fc248b.html')
	# 该网址只是众文章阅读中的其中一个类别,还有很多类别的文章供阅读,只需更换链接即可
	
  article_lis = WebDriverWait(driver,100).until(EC.presence_of_all_elements_located((By.XPATH,'//span[@style=white-space: nowrap;]')))
  # 显示等待 WebDriverWait(driver,100).until() 在这里等待,直到满足条件或等待时间超过100,即 用xpath找到符合属性style = "white-space: nowrap;" 的span节点;
  
  print('共找到%s篇文章' % len(article_lis))
  article_num = 0
  # article_num 每天有效阅读上限为6篇文章,但为确保有效时长达到12分钟,所以多出2篇
  
  for data in article_lis: # 遍历找到的文章列表进行模拟阅读
    if article_num >= 8: # 当读够8篇时跳出循环,结束文章刷分
      break
    try:
      loading_page(data)
      print('已加载', data.text)
      # 输出已刷文章,从而得出进度
      article_num += 1
    except:
      continue
      
def loading_page(element = None):
  element.click()
  ele = driver.find_element_by_xpath('//a[contains(class,"search-icon")]')
  ele.send_keys(Keys.PAGE_DOWN)
  # 模拟页面滚动。采用的方法是找到 ‘搜索' 功能按钮,不点击,直接模拟点击按键 PAGE_DOWN 
 
  time.sleep(120)
  # 每个页面停留两分钟,至少30秒。经测试,每隔30s 将会提交一个post请求,只有请求过后,有效阅读数才会 +1
  return None

 

视频有效观看积分 + 视频时长积分

driver.get(url = 'https://www.xuexi.cn/4426aa87b0b64ac671c96379a3a8bd26/db086044562a57b441c24f2af1c8e101.html#11c4o0tv7nb-5')
  # 同上,该网址只是众视频观看中的其中一个类别,还有很多类别的视频供观看,只需更换链接即可
  
  video_lis = WebDriverWait(driver,100).until(EC.presence_of_all_elements_located((By.XPATH,'//div[@style="margin: 0px auto;"]/div/div')))
  # 同上,显示等待
  
  print('共找到%s篇文章' % len(video_lis))
  video_long = 0
  # 记录已经播放的时间 
  
  video_lis_1 = []
  for data in video_lis:
    video_lis_1.append(data.get_attribute('data-link-target'))
	# 与文章不同的地方是,文章阅读是模拟点击,而视频播放获取网址,放到video_lis_1 中
  
  for url_1 in video_lis_1: # 遍历视频列表,播放视频
    if video_long >= 1080: #视频时长为18分钟,即1080秒,在播放时间超过18分后结束播放,其实也根据分钟判断,我也不知道为什么当时就用上了秒
      break
    try:
      video.get(url = url_1)
      tim_now = loading_video(driver = driver)
      video_long += tim_now*60
      # loading_video 返回的是已阅读分钟数,故*60
      print('视频播放中,已播放时长%s秒'%video_num)
    except:
      continue
      
def loading_video(driver = None):
  elem_first = WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located((By.XPATH, '//span[@class="duration"]')))
  elem_start = driver.find_element_by_xpath('//div[@class="outter"]')
  elem_start.click()
  # 打开网页后不自动播放,应该是因为是直接打开网址的原因
  # 因为在此之前我也直接通过模拟点击打开网页,结果是自动播放的,但有一点儿不符合我当时的需求,故改为打开网页的方式
  
  tim_num = (int(elem_first[0].text[0])*10 + int(elem_first[0].text[1]))
	# 目的是获取视频的总时间,只取分钟数
  if tim_num != 0: # 因为有些视频它根本不到一分钟,故加判断条件
    time.sleep(tim_num * 60)
    return tim_num
  else:
    time.sleep(60)
    # 不足一分钟,不播放也要凑够一分钟
    return 1

 

每日答题积分

def DaTi():
	driver.get(url = 'https://pc.xuexi.cn/points/exam-practice.html')
  elem_juje = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'//div[@class="q-header"]')))
  juje = elem_juje.get_attribute('innerText')
  # 在每日答题中,有三类题,判断题、选择题、填空题,所以先获取题的类别
  # 注意 特别需要注意的是 By.XPATH 和 xpath 文本获取稍有却别,By.XPATH 获取文本方式为.get_attribute('innerText')
  
  time.sleep(1) # 等待一秒,其实也无所谓,但是为防止过快操作造成电脑卡顿,还是等待一秒。
  if '选' in juje:
    elem_tishi = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, '//span[@class="tips"]')))
    elem_tishi.click()
    # 在答题中,答案在查看提示中以红色标记,所以首先要模拟点击查看答案,使答案加载
    time.sleep(0.5)
    elem_answer = WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="line-feed"]/font')))
    # 提取红色标记的文字,即答案
    time.sleep(0.5)
    # 同样没什么实际意义
    
    ans_lis = []
    for elem in elem_answer:
      ans_lis.append(elem.get_attribute('innerText'))
    # 因为选择题嘛,不一定就是单选题,所以要存放这些答案,以便于在选项中找答案
    print('得到答案')
    time.sleep(0.5)
    # 同样没什么实际意义
    
    elem_juje.click()
		# 再次模拟点击的原因是 此时 查看提示 框还处于打开状态,如果不关闭,会影响提交答案的操作
		# 模拟点击网页,关闭 查看提示 框
    time.sleep(0.5)
    
    elem_xuanxiang = WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="question"]/div[@class="q-answers"]/div[contains(@class,"q-answer")]')))
    # 获取所有的选项节点
    
    for elem in elem_xuanxiang:
      data = elem.get_attribute('innerText')[3:].replace('-','')
      print(data)
      for i in ans_lis:
        if i in data:
          elem.click()
          ans_lis.remove(i) 
          # 根据依次A -- > D 遍历答案,将两者对照进行选择与否,所以满足要求后去除该答案
          # 防止对选项多次点击造成取消选择或其他错误
          time.sleep(0.5) #防止过快操作,每次选择后等待0.5秒
          break
          
    elem_next = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH,'//div[@class="action-row"]/button')))
    elem_next.click()
    # 模拟点击确定按钮跳转下一题
    DaTi(driver)
  elif '填' in juje:
  
    elem_tishi = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'//span[@class="tips"]')))
    elem_tishi.click()
    time.sleep(0.5)
    elem_answer = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'//div[@class="line-feed"]')))
    time.sleep(0.5)
    if '请观看视频' in elem_answer.get_attribute('innerText'):
      input('手动选择答案后无需点击确定,在此输入回车继续')
      elem_next = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, '//div[@class="action-row"]/button')))
      elem_next.click()
    # 在填空题中会有观看视频的题目,而且查看提示中会写‘请观看视频'而不会直接给出答案,所以要人工选择
    elem_answer = WebDriverWait(driver,100).until(EC.presence_of_all_elements_located((By.XPATH,'//div[@class="line-feed"]/font')))
    answer = []
    time.sleep(0.5)
    for elem in elem_answer:
      answer.append(elem.get_attribute('innerText'))
		# 同样填空题中也有多个空的情况,所以将答案放在列表里
    time.sleep(1)
    elem_data = WebDriverWait(driver,100).until(EC.presence_of_all_elements_located((By.XPATH,'//input[@class="blank"]')))
    # 找到每个空
    for i in range(len(answer)):
      elem_data[i].send_keys(answer[i])
      time.sleep(0.5)
    # 通过遍历空,将对应的答案写入
    elem_data[0].click()
    time.sleep(1)
    # 模拟点击网页,因为在写完空后,不点击网页会有确定按钮为不可点的情况
    elem_next = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.XPATH,'//div[@class="action-row"]/button')))
    elem_next.click()
    DaTi(driver)
  elif '判' in juje:# 同上,判断题不会直接给出答案,所以只能手动吧
    input('手动选择答案后无需点击确定,在此输入回车继续')
    elem_next = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, '//div[@class="action-row"]/button')))
    elem_next.click()
    DaTi(driver)

 

结合PyQt5,最终效果图

声明:图片没有别的意思,个人感觉很欢喜,图片转自------百度图片

Python selenium模拟手动操作实现无人值守刷积分功能

总结

到此这篇关于Python selenium模拟手动操作实现无人值守刷积分功能的文章就介绍到这了,更多相关Python selenium刷积分内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python操作日期和时间的方法
Mar 11 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
python中正则的使用指南
Dec 04 Python
Python3 queue队列模块详细介绍
Jan 05 Python
Python模拟随机游走图形效果示例
Feb 06 Python
python实现日常记账本小程序
Mar 10 Python
多个应用共存的Django配置方法
May 30 Python
OpenCV图像颜色反转算法详解
May 13 Python
Python中py文件转换成exe可执行文件的方法
Jun 14 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
python中可以声明变量类型吗
Jun 18 Python
Python接口自动化测试的实现
Aug 28 Python
PyQt5 控件字体样式等设置的实现
May 13 #Python
Python tkinter实现简单加法计算器代码实例
May 13 #Python
Django权限设置及验证方式
May 13 #Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 #Python
django自带的权限管理Permission用法说明
May 13 #Python
Python基于jieba, wordcloud库生成中文词云
May 13 #Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 #Python
You might like
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
python看某个模块的版本方法
2018/10/16 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
中文系师范生自荐信
2013/10/01 职场文书
历史专业个人求职信范文
2013/12/07 职场文书
如何写你的创业计划书
2014/01/07 职场文书
先进党支部事迹材料
2014/01/13 职场文书
校园广播稿500字
2014/02/04 职场文书
司机职责范本
2014/03/08 职场文书
个人自荐材料
2014/05/23 职场文书
2014年教师党员公开承诺书
2014/05/28 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
升职自我推荐信范文
2015/03/25 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
导游词之河北邯郸
2019/09/12 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记