【2.0版本】青骄第二课堂知识竞赛批量满分
本帖最后由 麦米尔加弗德 于 2022-11-3 12:40 编辑对比上一个版本,现在的代码可以说是从头到脚大变样,所以我单独开了一贴,作为第二个版本,第二课堂现在已经接近尾声了,但是我最近还是在改代码,只因为我在上一个版本中发现了很多问题,自己用和给别人用真的不一样,以及我想把代码完善,做的更好。
# 环境
- windows10
- 最新版Edge浏览器
- python版本3.8.6
- 模块皆为当前版本能更新的最新版本
- requests
- openpyxl
- selenium
- webdriver_manager
# 更新内容
- [开源,点击跳转主页](https://gitee.com/dragon-dragon-ago/qingjiaos-second-class)
- python版本和selenuim版本全面升级
- 现在使用Edge浏览器
- 自动配置selenuim的驱动,不用麻烦下载
- 不用重置密码,使用xlsx进行导入(虽然不想加模块,但是没办法==)
- 遇到错误并重启自身再次运行
- 有滑动条验证,但是很难过
- 更方便的配置
- 更多的提示内容
- 更高的效率(使用了显式等待)
# 代码
~~~
import time
import json
import requests
import random
from openpyxl import Workbook, load_workbook
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service as EdgeService
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.microsoft import EdgeChromiumDriverManager
requests.packages.urllib3.disable_warnings()
# 加载用户数据
def user_data_list_parse():
user_data_list = []
book = load_workbook('账户.xlsx')
sheet = book.active
col_data = tuple(sheet.columns)
if(len(col_data) != len(col_data)):
print('账户个数和密码个数不符合,请检查后运行!')
exit(0)
for i in range(len(col_data)):
user_data_list.append(.value, col_data.value])
return user_data_list
# 滑动条事件
def slide_solution(driver):
try:
slide_btn = driver.find_element(by=By.XPATH, value='//*[@id="nc_1_n1z"]')
# 按住滑块按钮
ActionChains(driver).click_and_hold(slide_btn).perform()
# 模拟缓慢的滑动
i = 0
while i <= 420:
time.sleep(0.1)
ActionChains(driver).move_by_offset(20,0).perform()
i += 30
# 释放鼠标
ActionChains(driver).release().perform()
time.sleep(1)
except:
return 0
# 随机选择并构建题目列表
def random_list():
ran = random.sample(range(0, 39),20)
question_list = []
for i in ran:
t = question_data.split('-')
question_list.append({"questionId": t,"questionContent": t})
return question_list
#模拟登录的事件
def login(user_data):
# 点击登录按钮
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '/html/body/div/div/div/div/header/div/div/div/div/span/a')))
el = driver.find_element(By.XPATH,'/html/body/div/div/div/div/header/div/div/div/div/span/a')
el.click()
time.sleep(2)
# account
el = driver.find_element(By.XPATH,'//*[@id="account"]')
el.send_keys(user_data)
time.sleep(0.5)
# password
el = driver.find_element(By.XPATH,'//*[@id="password"]')
el.send_keys(user_data)
time.sleep(0.5)
# 登录
el = driver.find_element(By.CSS_SELECTOR,"")
el.click()
time.sleep(2)
# 如果有滑动条的话
slide_solution(driver)
#cookie和数据
cookie = ''
cookies=driver.get_cookies()
for i in cookies:
cookie = cookie + i['name'] + '=' + i['value'] + ';'
reqtoken = driver.execute_script('return window.__DATA__.reqtoken')
yi_jian_man_fen(cookie,reqtoken,user_data)
#点击退出
el = driver.find_element(By.XPATH,'//*[@id="app"]/div/div/div/header/div/div/div/div/a')
el.click()
time.sleep(1)
el = driver.find_element(By.XPATH,'//*[@id="app"]/div/div/div/header/div/div/div/div/div/ul/li/a')
driver.execute_script('arguments.click()', el)
time.sleep(1)
#开始答题
def yi_jian_man_fen(cookie,reqtoken,account):
print(account+',开始答题')
url = 'https://www.2-class.com/api/quiz/commit'
headers = {
'Cookie': cookie,
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
}
time = random.randint(100, 350)
data = {
"list": random_list(),
"time": time,
"reqtoken": reqtoken
}
result = requests.post(url=url, data=json.dumps(data), headers=headers, verify=False)
text = result.text
text = text.split(',')
text = text.split(':')
if text == '100':
text = ',满分!'
print(account,text)
if __name__ == '__main__':
# 加载题库数据
with open('题库.txt','r') as f:
question_data = f.read().split('\n')
# 加载账号数据
user_data_list = user_data_list_parse()
# selenium设置与启动
options = webdriver.EdgeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
options.add_experimental_option("prefs", prefs)
driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()), options=options)
driver.get('https://www.2-class.com/competition')
driver.maximize_window()
# 计数
count = 0
# 开始运行答题
try:
for user_data in user_data_list:
login(user_data)
count = count + 1
print('已完成'+ str(count) + '个' )
if count%35 == 0:
print('按照计划休眠30分钟')
time.sleep(1800)
print('全部完成')
except Exception as e:
wb = Workbook()
ws = wb.active
for i in user_data_list:
ws.append(i)
wb.save('账户.xlsx')
print('程序运行错误,已经保存数据\n')
print(e)
finally:
driver.quit() # 使用完, 关闭浏览器
~~~
题库.txt
~~~
3199-A
3202-D
3203-B
3171-A
3108-C
3141-A
3206-C
3176-C
3147-D
3148-A
3181-B
3217-A
3186-A
3154-C
3155-A
3123-B
3189-C
3159-D
3131-C
3163-B
2986-B
2989-C
2990-D
2959-C
2928-C
2960-A
2961-C
2897-B
2930-D
2898-B
2963-A
2932-D
2901-A
2966-D
2934-C
2904-D
2907-D
2972-C
2973-A
2912-B
~~~
# 使用说明
第一次因为会自动下驱动文件所以启动会慢一点哦
## 快速版
新建 `py文件`,代码复制粘贴,pip安装一下没有的模块
新建 `题库.txt`,数据复制粘贴
新建 `账户.xlsx`,用户名第一列,密码第二列
然后运行`.py`文件就可以了,是不是很方便
## 整合版
链接:https://pan.baidu.com/s/1GE1e39pUuOFzOu84Zwuc8w
提取码:yzbj 教学视频:xxxxxx暂时还没录
1. 下载压缩包并解压
2. 双击 `python-3.8.6.exe` 安装python3.8.6
3. 双击 `安装模块.bat` 安装所需要的的模块
4. 进入运行目录
5. 配置 `账户.xlsx`,用户名第一列,密码第二列
6. 然后运行`.py`文件就可以了,是不是很方便
滑动条验证容易不通过,所以设置了做35个账号就休息半小时,大家找个空闲时间挂着就好
# 后记
中间遇到了很多的问题和bug,最后还是改出来了==,一波三折,明年可能更新吧,今年就到此为止了。
花了很多精力和时间的,给后来人多一点借鉴
兄弟们,今年的新版写的差不多了,等一个题库哈 wsypnet 发表于 2023-11-27 08:34
老大,能不能改造下咱们的代码,能自动登录账号,登出账号,完成课时学习?
新版本弄了,但是现在每个省的都不一样...湖南省都没启动的很郁闷 兄弟们,别催了,我这个只搞竞赛
2022年全国青少年禁毒知识竞赛已于11月5日结束,2023年竞赛未开始,敬请期待吧~ 今年的基本结束了,非常感谢大神,怎么送b啊,我想送你几个虽然我也不多 就差处理勋章和等级的弹窗遮挡不能退出的问题了。直接删cookies就能解决,不用退出。 其实只要答案就可以了。要是插件模式就更完美了! 感谢!!!!!明年此时此地等你! 用插件的会不会更好 太感谢了,这个必须支持 谢谢提供 整合版的,按照顺序安装后,为什么我点了.py就闪了一下就没有下文了呢? 289228237 发表于 2022-11-2 22:30
整合版的,按照顺序安装后,为什么我点了.py就闪了一下就没有下文了呢?
右键用IDLE运行看看结果,直接运行cmd窗口问题蛮多的