我的笔记


嘉兴考试培训网智慧学习小助手

普通版

import requests
import bs4

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

# 获取登录信息
while True:
    username = input('请输入您的账号:')
    password = input('请输入您的密码:')

    #获得cookies
    url='http://m.jxkp.net/User/LoginCheck'
    data={
        'Uname': username,
        'Password': password,
        }
    login=requests.post(url,headers=headers,data=data)
    cookies=login.cookies
    if len(str(cookies)) > 100:
        break
    else:
        print('账号或密码错误')

while True:
    # number_list = '传统文化的保护传承与发展'
    number_list = input('请输入课程名:')

    # 找到相应的课程详情页
    url = 'http://m.jxkp.net/Zy/Kcs'
    res = requests.get(url,headers=headers)
    soup = bs4.BeautifulSoup(res.text,'html.parser')
    items = soup.find_all(class_='kc-item-wraplink')
    flag = False
    for item in items:
        alt = item.find('img')['alt']
        if alt == number_list:
            flag = True
            href = 'http://m.jxkp.net' + item['href']
            res = requests.get(href,headers=headers)
            soup = bs4.BeautifulSoup(res.text,'html.parser')
            items = soup.find_all(class_='kj-link')
            course_number = []
            for i in items:
                course_number.append(i['href'][-3:])
            break
    else:
        print('没有找到该课程,请重新输入课程名')
    if flag:
        break

count = 1
for j in course_number:
    #用cookies登陆
    for i in range(60,2401,60):
        url_2='http://m.jxkp.net/Person/UpdateKjLog'
        data = {
            't':str(i),
            'kjid':str(j),
            }
        res=requests.post(url_2,cookies=cookies,headers=headers,data=data)

        print(f'正在刷第{count}个视频,',i//60%483*'>',f'进度{round(i/2400*100,2)}%',end='\r')
    count += 1
    print()

极速版

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton,  QPlainTextEdit,QMessageBox,QLineEdit,QLabel
import requests
import bs4
from PySide6.QtCore import QThread, Signal, Slot, Qt 
import sys  
import time
from PySide6.QtGui import  QIcon

# 定义一个工作线程类  
class WorkerThread(QThread):  
    # 定义一个信号,用于在操作完成时发送结果  
    result_ready = Signal(str)  
  
    def __init__(self, course_number, cookies):  
        super().__init__()  
        # 存储传递进来的参数  
        self.course_number = course_number  
        self.cookies = cookies  

    def run(self):  
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
        url_2='http://m.jxkp.net/Person/UpdateKjLog'
        count = 1
        for j in self.course_number:
            progress_bar_count = 0
            for i in range(60,660,60):
                data = {
                    't':str(i),
                    'kjid':str(j),
                    }
                try:
                    requests.post(url_2,cookies=self.cookies,headers=headers,data=data)
                    progress_bar = '>' * int(progress_bar_count)  # 假设进度条长度为20个字符
                    # text = f'智慧小助手正在帮您学习第{count}个视频' 
                    text = f'智慧小助手正在帮您学习第{count}个视频,{progress_bar},进度{round(i/600*100,2)}%' 
                    # 使用信号发送结果  
                    self.result_ready.emit(text)  
                    progress_bar_count += 1
                except:
                    print('发生错误,跳过')
            count += 1
        # text = f'智慧小助手正在帮您学习第{count}个视频' 
        text = '智慧小助手已经帮您学习了所有课时,好用的话给个好评吧' 
        # 使用信号发送结果  
        self.result_ready.emit(text)  

class Stats(QMainWindow):
    def __init__(self):  
        super().__init__()  
        self.initUI()  

    def initUI(self):
        # 窗体设置
        self.window = QMainWindow()
        self.window.resize(500, 400)
        self.window.move(300, 300)
        self.window.setWindowTitle('嘉兴考试培训网智慧小助手')

        # 作者信息 
        self.author = QLabel(self.window)
        self.author.setText('作者:别问太多')
        # 手动设置QLabel的位置到右下角  
        self.author.move(self.window.width() - self.author.width() - 10,  
        self.window.height() - self.author.height() - 10) 
        # 用户名输入框
        self.username = QLineEdit(self.window)
        self.username.setPlaceholderText("请输入用户名")
        self.username.move(10, 25)
        self.username.resize(200,30)
        # 密码输入框
        self.password = QLineEdit(self.window)
        self.password.setPlaceholderText("请输入密码")
        self.password.setEchoMode(QLineEdit.Password)  # 设置密码输入模式
        self.password.move(10, 60)
        self.password.resize(200,30)
        # 课程名输入框
        self.course_name = QLineEdit(self.window)
        self.course_name.setPlaceholderText("请输入课程名")
        self.course_name.move(10, 100)
        self.course_name.resize(200,30)
        # 确认按钮
        self.button = QPushButton('启动', self.window)
        self.button.move(380, 80)
        self.button.clicked.connect(self.handleCalc)
        # 输出信息区域
        self.textEdit = QPlainTextEdit(self.window)
        self.textEdit.setPlaceholderText("程序尚未启动")
        self.textEdit.move(10,150)
        self.textEdit.resize(400,200)
        self.textEdit.setEnabled(False)

    # 服务器检验
    def checkServe(self):
        url = 'https://note.xiaolily.cn/%E5%98%89%E5%85%B4%E5%88%B7%E8%AF%BE%E6%97%B6.php'
        res = requests.get(url)
        if res.text == '1':
            return True
        else:
            QMessageBox.about(self.window,'提示','作者将软件停用了')
            return False

    # 校验账号密码
    def checkPassword(self):
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
        
        # 获取登录信息
        username = self.username.text()
        password = self.password.text()

        #获得cookies
        url='http://m.jxkp.net/User/LoginCheck'
        data={
            'Uname': username,
            'Password': password,
            }
        login=requests.post(url,headers=headers,data=data)
        self.cookies=login.cookies
        if len(str(self.cookies)) > 100:
            return True
        else:
            QMessageBox.about(self.window,'提示','账号或密码错误,请重新输入')
            return False

    # 获取课程信息
    def checkCourse(self):
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
        course_name = self.course_name.text()

        # 找到相应的课程详情页
        url = 'http://m.jxkp.net/Zy/Kcs'
        res = requests.get(url,headers=headers)
        soup = bs4.BeautifulSoup(res.text,'html.parser')
        items = soup.find_all(class_='kc-item-wraplink')
        flag = False
        for item in items:
            alt = item.find('img')['alt']
            if alt == course_name:
                flag = True
                href = 'http://m.jxkp.net' + item['href']
                res = requests.get(href,headers=headers)
                soup = bs4.BeautifulSoup(res.text,'html.parser')
                items = soup.find_all(class_='kj-link')
                self.course_number = []
                for i in items:
                    self.course_number.append(i['href'][-3:])
                break
        else:
            QMessageBox.about(self.window,'提示','找不到该课程名,请重新输入')
            return False
        if flag:
            return True

    # 开始学习视频
    def studyVideo(self):
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
        url_2='http://m.jxkp.net/Person/UpdateKjLog'
        count = 1
        for j in self.course_number:
            for i in range(60,2401,60):
                data = {
                    't':str(i),
                    'kjid':str(j),
                    }
                requests.post(url_2,cookies=self.cookies,headers=headers,data=data)
                text = f'智慧小助手正在帮您学习第{count}个视频' 
                self.textEdit.setPlainText(text)  
                break
            count += 1
            print()

    # 确定按钮点击事件
    def handleCalc(self):
        # 服务器检验
        if self.checkServe() == False:
            return False
        # 检查账号密码
        if self.checkPassword() == False:
            return False
        # 检查课程信息
        if self.checkCourse() == False:
            return False
        # self.studyVideo()
        self.start_single_task()

    # 开始学习视频
    def start_single_task(self):  
        # 创建工作线程实例,并传递参数  
        self.worker_thread = WorkerThread(self.course_number, self.cookies)  
        # 连接工作线程的result_ready信号到主窗口的槽函数  
        self.worker_thread.result_ready.connect(self.on_result_ready)  
        # 启动工作线程  
        self.worker_thread.start()   

    @Slot(str)  
    def on_result_ready(self, result):  
        # 在GUI线程中安全地更新文本编辑框的内容  
        self.textEdit.setPlainText(result)     

# 主程序  
if __name__ == "__main__":  
    app = QApplication(sys.argv)  
    # 加载 icon
    app.setWindowIcon(QIcon('favicon.ico'))
    stats = Stats()  
    stats.window.show()  
    sys.exit(app.exec())

嘉兴考试培训网智慧考试小助手

1.2

from selenium import  webdriver # 从selenium库中调用webdriver模块
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
import requests
import warnings  

# 服务器检验
def checkServer():
    while True:
        password = input('请输入使用使用码(如果没有请联系作者领取):')
        url = 'https://xiaolily.cn/jx_exam.php'
        params = {
            'password':password
        }
        # 完全信任网站的ssl证书
        res = requests.get(url,params=params,verify=False)
        if res.text == '1':
            return password
        else:
            print(res.text)
            continue

# 使用邀请码
def jx_exam_use(password):
    url = 'https://xiaolily.cn/jx_exam_use.php'
    params = {
        'password':password
    }
    # 完全信任网站的ssl证书
    res = requests.get(url,params=params,verify=False)
    if res.text == '1':
        print('使用码已核销,感谢您的使用')

# AI回答
def AI_answer(content):
    content = content + '(请使用中文回答)'
    url = "http://xiaolily.tpddns.cn:5678/AI_my_chat.php"
    params = {
        'user_input': content,
        'password':'zhaoguodong'
    }
    res = requests.get(url,params=params)
    res_json = res.json()
    answer = res_json['message']['content']
    return answer

# 获得新打开窗口的句柄
def get_current_window(driver):
    # 获取当前所有窗口句柄  
    all_window_handles = driver.window_handles  
    
    # 获取当前窗口句柄  
    current_window_handle = driver.current_window_handle  
    
    # 寻找新打开的标签页的句柄  
    new_window_handle = None  
    for handle in all_window_handles:  
        if handle != current_window_handle:  
            new_window_handle = handle  
            break  
    
    # 切换到新标签页  
    if new_window_handle:  
        driver.switch_to.window(new_window_handle)  
    else:  
        print("无法打开句柄")

# 获得&#x...;形式的Unicode编码(不用)
def to_html_entities(text):  
    # 遍历字符串中的每个字符  
    for char in text:  
        # 获取字符的Unicode编码  
        unicode_code = ord(char)  
        # 将Unicode编码转换为十六进制字符串,并确保至少四位  
        hex_code = "{:04x}".format(unicode_code)  
        # 创建HTML实体字符串  
        html_entity = "&#x{};".format(hex_code)  
        # 将HTML实体添加到结果列表中  
        yield html_entity 

# 主函数
def main():
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')  # 可选项,用于在 Linux 上启动 Chrome
    chrome_options.add_argument('--disable-dev-shm-usage')  # 可选项,用于在 Linux 上启动 Chrome
    chrome_options.add_argument('--headless')  # 可选项,无头模式
    chrome_options.add_argument('--disable-gpu')  # 可选项,禁用 GPU
    driver = webdriver.Chrome(options=chrome_options)
    # 忽略所有警告  
    warnings.filterwarnings("ignore")  
    # 校验使用码
    password = checkServer()
    # 登录
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
    while True:
        username_input = input('请输入账号:')
        password_input = input('请输入密码:')

        #获得cookies
        url='http://m.jxkp.net/User/LoginCheck'
        data={
            'Uname': username_input,
            'Password': password_input,
            }
        login=requests.post(url,headers=headers,data=data)
        cookies=login.cookies
        if len(str(cookies)) > 100:
            break
        else:
            print('账号或密码错误')
    
    print('正在尝试登录平台,请稍等,大概需要15秒')
    driver.get('http://m.jxkp.net/User/Login?ReturnUrl=%2FUser') # 访问页面
    # 账号
    username = driver.find_element(By.ID,'Uname')
    username.send_keys(username_input) 
    # 密码
    username = driver.find_element(By.ID,'Password')
    username.send_keys(password_input) 
    # 登录按钮
    login_button = driver.find_element(By.CLASS_NAME,'button')
    login_button.click()
    print('已成功登录平台')
    time.sleep(3)
    
    # 找到并进入考试页面
    flag = False
    while True:
        course_name = input('请输入课程名(例如全面解读数字经济):')
        driver.get('http://m.jxkp.net/Person/ExamList') 
        tag_elements = driver.find_elements(By.CLASS_NAME,'kc-list-row')
        # 找到对应的课程  
        for element in tag_elements:  
            if course_name in element.text:  
                # 考试按钮
                exam_button = element.find_element(By.LINK_TEXT,'参加考试')
                exam_button.click() # 点击【提交】按钮 
                flag = True
                break
        
        if flag == True:
            break
        else:
            print('找不到参加考试按钮,可能原因')
            print('1、没有这门课程')
            print('2、课时没刷完不能考试')
            print('3、已经达到了最大考试次数')
            print('请重新输入课程名或者退出程序')

    # get_current_window(driver)
    print('已成功进入考试页面,小助手即将开始作答')
    time.sleep(3)
    try:
        # 所有的题目,q-title
        timu_list = driver.find_elements(By.CLASS_NAME,'q-title')
    except:
        print('本门课已经考过试了,不能再次考试')
        input('按回车退出')
        return
    # 所有的选项,ans
    ans_list = driver.find_elements(By.CLASS_NAME,'ans')
    ans_list_text = [] # 纯文字的ans
    ans_group = ''# 一组回答,包含ABCD
    input_type_list = ['单选题:']
    for ans in ans_list:
        # 要找到input单选框上的type属性(radio单选框,checkbox多选框)
        input_type = ans.find_element(By.TAG_NAME,'input').get_attribute('type')
        if input_type == 'radio':
            input_type = '单选题:' 
        else:
            input_type = '多选题:'
        # 如果遇到A选项,先把当前这一组ABCD加到列表,然后清空,把这一次的A加进去(除了第一次)
        if ans_group != '' and 'A' in ans.text:
            ans_list_text.append(ans_group)
            ans_group = ''
            # ans_group += input_type  # 在题目前面加上多选题
            input_type_list.append(input_type)  
            ans_group += ans.text
        else:
            ans_group += ans.text

    # 遍历每个q-title元素 
    for timu,ans,input_type in zip(timu_list,ans_list_text,input_type_list):
        timu_and_ans = input_type + timu.text + ans
        answer = AI_answer(timu_and_ans)
        print(timu.text)
        print(answer)

    # 核验使用码
    print(password)
    jx_exam_use(password)
    input('按下回车退出程序:')


main()

校验使用码

<?php
include_once 'conn.php';

// 固定的随机字符串列表  
$fixedRandomStrings = [  
    "5w6n", "3h2q", "7t8p", "d4r3", "g9s2", "a1z8", "e5u7", "k6o9", "f2d1", "h7c4",  
    "p0e3", "j8s5", "n4v7", "r1t8", "s0d9", "c5b2", "l6h3", "q3f0", "t7g4", "u2j1",  
    "w8k5", "y9n6", "z4p7", "0e7s", "1f8t", "2g9u", "3h0v", "4i1w", "5j2x", "6k3y",  
    "7l4z", "8m5a", "9n6b", "ao7c", "bp8d", "cq9e", "dr0f", "es1g", "ft2h", "gu3i",  
    "hv4j", "iw5k", "jx6l", "ky7m", "lz8n", "ma9o", "nb0p", "oc1q", "pd2r", "qe3s",  
    "rf4t", "sg5u", "th6v", "ui7w", "vj8x", "wk9y", "xl0z", "ym1a", "zn2b", "ao3c",  
    "bp4d", "cq5e" 
];  

$password = $_GET['password'];   
  
// 检查用户输入是否在固定字符串列表中  
if (in_array($password, $fixedRandomStrings)) {
    // 判断邀请码是否用过了
    $sql = "select * from jx_exam where `password` = '$password'";
    $result = mysqli_query($conn,$sql); 
    $num = mysqli_num_rows($result);
    if($num){
        echo "邀请码已经被用过了"; 
        exit();
    }else{
        echo '1';
        exit();
    }
} else {  
    echo "邀请码错误"; 
    exit; 
}  
?>

核销使用码

<?php
include_once 'conn.php';

$password = $_GET['password'];  

// 使用邀请码
$sql = "insert into jx_exam(`password`) values ('$password')";
$result = mysqli_query($conn,$sql);
if($result){
    echo "1"; 
    exit();
} else{
    echo "0"; 
    exit();
} 
?>

文章作者: 打工码农
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 打工码农 !
  目录