青骄第二课堂禁毒知识辅助脚本

又是让学生学禁毒。城里学校都是发给家长让家长做。我们学校就安排给电脑老师。没辙,就带学生在信息课上做呗。但总有漏网之鱼,只好写个脚本来完善一下。人不多那就随便写写算了,能跑就行。

先是用 python -m playwright codegen -o out.py --target python -b ff 用PlayWright自带录制工具。录制一遍登录。然后再用开发者工具直接把提交考试的那个post信息找出来,合在一起就完成了。

中间还是好多坑:

  1. 首先用 chromium 接口死活登录不上,最后用了 firefox 才顺利登录。
  2. 登录的时候有个阿里云的无验证码验证,也就是滑条。一开始还不出现。10几个人后就开始出现了。然后很简单几行代码找到坐标,滑动一下就可以了。10几个人后阿里云的ai可能发现滑动太平滑了,又要点击验证。只好再制作个滑动路径,使得每次的滑动路径都不一样。总算跑完了那100多人。速度就奇慢了,完成就好。懒得优化了。反正我完成了,哈哈。
  3. 上次写那个青少年普法做了件脱裤子放屁的事情。还把cookie转到requests里再进行刷。其实完全可以直接用 page.request.post() 就好了。真是多此一举。

找一个文本文件放入用户名姓名和密码,注意要另存为utf-8编码格式。保存为 s.csv 放在同目录下。

用户名1,密码1
用户名2,密码2
用户名3,密码3
……

直接上代码:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2023-11-15 19:18:10
# @Author  : Xzap (xzap@163.com)
# @Link    : https://xzap.gitee.io
# @Version : $Id$

from playwright.sync_api import Playwright, sync_playwright, expect
import time
import re
import random

with open("s.csv","r", encoding="utf-8") as f:
    s1 = f.read().split("\n")
s = [i.split(",") for i in s1]

def make_tracks(num):
    num2 = num + random.randint(-10,10)
    a = random.randint(5,10)
    a2 = num2 // a
    a3 = []
    for i in range(a):
        a3.append(random.randint(a2-30,a2+30))
    cha = num2 - sum(a3)
    a3[-1] = a3[-1] + cha
    return a3

def cancel_request(route,request):
    route.abort()

def login(context, user, passwd):
    page = context.new_page()
    page.route(re.compile(r"(\.png)|(\.jpg)"),cancel_request) # 不加载图片
    page.goto("https://www.2-class.com/")
    rt = re.search('reqtoken:"(.*?)"',  page.content()).group(1)
    # print (rt)
    page.get_by_role("button", name="登 录").click()
    page.get_by_placeholder("请输入登录账号").click()
    page.get_by_placeholder("请输入登录账号").fill(user)
    page.get_by_placeholder("请输入密码").click()
    page.get_by_placeholder("请输入密码").fill(passwd)
    page.get_by_label("自动登录").check()
    page.get_by_role("button", name="确 定").click()
    # page.pause()
    time.sleep(3)
    try :
        cc = page.locator("#nc_1_nocaptcha")
        if cc.count() > 0: 
            slider =  page.locator("#nc_1_n1z").bounding_box()
            # print(slider)
            page.mouse.move(x=int(slider['x']), y=slider['y']+slider['height']/2)
            page.mouse.down()        
            page.wait_for_timeout(100)
            tracks = make_tracks(400)
            xc = 0
            for track in tracks :
                xc += track
                page.mouse.move(x=int(slider['x']) + xc, y=slider['y'] + slider['height'] / 2 + random.randint(-3,3),steps=random.randint(5,10))
                page.wait_for_timeout(random.randint(2,6)*10)
            page.mouse.up()
    except:
        print ("No slider!")
    page.get_by_role("button", name="我的课程").click()
    time.sleep(2)

    # 五年级第一课
    page.goto("https://www.2-class.com/courses/1575")
    data = {"courseId":1575,"reqtoken":rt}
    page.request.post(url="https://www.2-class.com/api/course/addCoursePlayPV",data=data)
    page.goto("https://www.2-class.com/courses/exams/1575")
    data = {"courseId":"1575","examCommitReqDataList":[{"examId":1,"answer":0},{"examId":2,"answer":2},{"examId":3,"answer":2},{"examId":4,"answer":3},{"examId":5,"answer":"0,1,2,3"}],"exam":"course","reqtoken":rt}
    page.request.post(url="https://www.2-class.com/api/exam/commit", data=data)
    page.goto("https://www.2-class.com/drugControlClassroom/courses")

    # 五年级第二课
    page.goto("https://www.2-class.com/courses/1576")
    data = {"courseId":1576,"reqtoken":rt}
    page.request.post(url="https://www.2-class.com/api/course/addCoursePlayPV",data=data)
    page.goto("https://www.2-class.com/courses/exams/1576")
    data = {"courseId":"1576","examCommitReqDataList":[{"examId":1,"answer":2},{"examId":2,"answer":3},{"examId":3,"answer":1},{"examId":4,"answer":1},{"examId":5,"answer":"0,2"}],"exam":"course","reqtoken":rt}
    page.request.post(url="https://www.2-class.com/api/exam/commit", data=data)
    page.goto("https://www.2-class.com/drugControlClassroom/courses")   

    # 六年级第一课
    # page.goto("https://www.2-class.com/courses/1577")
    # data = {"courseId":1577,"reqtoken":rt}
    # page.request.post(url="https://www.2-class.com/api/course/addCoursePlayPV",data=data)
    # page.goto("https://www.2-class.com/courses/exams/1577")
    # data ={"courseId":"1577","examCommitReqDataList":[{"examId":1,"answer":3},{"examId":2,"answer":1},{"examId":3,"answer":3},{"examId":4,"answer":0},{"examId":5,"answer":"0,1,2"}],"exam":"course","reqtoken":rt}
    # page.request.post(url="https://www.2-class.com/api/exam/commit", data=data)
    # page.goto("https://www.2-class.com/drugControlClassroom/courses")

    # 六年级第二课
    # page.goto("https://www.2-class.com/courses/1578")
    # data = {"courseId":1578,"reqtoken":rt}
    # page.request.post(url="https://www.2-class.com/api/course/addCoursePlayPV",data=data)
    # page.goto("https://www.2-class.com/courses/exams/1578")
    # data = {"courseId":"1578","examCommitReqDataList":[{"examId":1,"answer":0},{"examId":2,"answer":1},{"examId":3,"answer":0},{"examId":4,"answer":3},{"examId":5,"answer":"0,1,3"}],"exam":"course","reqtoken":rt}
    # page.request.post(url="https://www.2-class.com/api/exam/commit", data=data)
    # page.goto("https://www.2-class.com/drugControlClassroom/courses") 


    page.goto("https://www.2-class.com/api/user/logout")
    time.sleep(1)
    page.close()

def run(playwright: Playwright) -> None:
    browser = playwright.firefox.launch(headless=False)
    context = browser.new_context()
    alln = len(s)
    for num,i in enumerate(s):
        print ("="*50)
        print (i[0])
        print (f"{num+1}/{alln}")
        login(context, i[0],i[1])
    # ---------------------
    context.close()
    browser.close()
with sync_playwright() as playwright:
    run(playwright)