1. 程式人生 > 程式設計 >Python selenium模擬手動操作實現無人值守刷積分功能

Python selenium模擬手動操作實現無人值守刷積分功能

經常為學校的各種刷分而發愁,得知開學無望,日後還要刷課,索性自動化一次,學而不用乃愚昧 聰慧

四大模組

初始化

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,'//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,'//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,'//span[@class="tips"]')))
    elem_tishi.click()
    # 在答題中,答案在檢視提示中以紅色標記,所以首先要模擬點選檢視答案,使答案載入
    time.sleep(0.5)
    elem_answer = WebDriverWait(driver,'//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,'//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,'//div[@class="action-row"]/button')))
    elem_next.click()
    # 模擬點選確定按鈕跳轉下一題
    DaTi(driver)
  elif '填' in juje:
  
    elem_tishi = WebDriverWait(driver,'//span[@class="tips"]')))
    elem_tishi.click()
    time.sleep(0.5)
    elem_answer = WebDriverWait(driver,'//div[@class="line-feed"]')))
    time.sleep(0.5)
    if '請觀看視訊' in elem_answer.get_attribute('innerText'):
      input('手動選擇答案後無需點選確定,在此輸入回車繼續')
      elem_next = WebDriverWait(driver,'//div[@class="action-row"]/button')))
      elem_next.click()
    # 在填空題中會有觀看視訊的題目,而且檢視提示中會寫‘請觀看視訊'而不會直接給出答案,所以要人工選擇
    elem_answer = WebDriverWait(driver,'//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,'//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,'//div[@class="action-row"]/button')))
    elem_next.click()
    DaTi(driver)
  elif '判' in juje:# 同上,判斷題不會直接給出答案,所以只能手動吧
    input('手動選擇答案後無需點選確定,在此輸入回車繼續')
    elem_next = WebDriverWait(driver,'//div[@class="action-row"]/button')))
    elem_next.click()
    DaTi(driver)

結合PyQt5,最終效果圖

宣告:圖片沒有別的意思,個人感覺很歡喜,圖片轉自------百度圖片

圖片沒有別的意思

總結

到此這篇關於Python selenium模擬手動操作實現無人值守刷積分功能的文章就介紹到這了,更多相關Python selenium刷積分內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!