【老师见打系列】:我只是写了一个自动回复讨论的脚本~

news2024/11/20 3:50:24

文章目录

  • 🌟好久不见
  • ⛳️实现过程
    • 🌴老操作了兄弟们~
    • 🐢一步拿捏讨论
      • 💖美图
  • 结束语

专栏
Python零基础入门篇💥
Python网络蜘蛛💥
Python数据分析
Django基础入门宝典💥
小玩意儿💥
Web前端学习
tkinter学习笔记
Excel自动化处理

🌟好久不见

写这篇文章只是想证明一下:本博主还在呼吸😇

📢许久未更,甚是想更呐~
这段时间生活中充斥着各种事情,感觉每天都在忙忙碌碌,偶而停下疲惫的身躯,突然抬头,却不知自己身处何方,忙了这么久,到底在忙些什么呢?找不着方向,于是开始惶恐,便又不知方向的胡乱奔走……,好吧好吧,总结两个字:迷茫,再加两个字:瞎忙……
在这里插入图片描述
其实这几天一直想写博客的,想写有趣又轻松的一篇文章,但又不到写哪些内容比较好,又因还要解决各种事情,于是就搁到了现在……

在这里插入图片描述
💥直到某天,为了完成MOOC(MOOC不会没人不知道吧👀)上的回复讨论任务,我不已为然的点开了MOOC……突然 ⁉️我看到了一个进度条,那个进度条仿佛就像是深渊,脑海中突然闪出一句话,我%@#!,咳咳咳,不是不是,是一句名言:当你凝望深渊,深渊也在凝望着你……😭
(进度条是已经用代……不是,是已经用我辛勤的劳动把它拉起来的)

在这里插入图片描述

在这里插入图片描述

不知到有没有小伙伴经历过要回复几十条讨论的经历,当场看见那进度条我就……,就偷偷写脚本了😁
这个脚本花了我比较长的时间才完成的,因为调试的过程有些许麻烦……,不过最终还是解决了,想看效果如何,请往下看👇

⛳️实现过程

🌴老操作了兄弟们~

又双叒叕是Get_cookie.py了兄弟,看过我《小玩意儿》专栏文章的都能看烂了,但别说,还真好用,登录一次,一劳永逸,就靠它了~,话不多说,直接❗️ ❗️ ❗️ 上号💬
在这里插入图片描述
上码❗️ ❗️ ❗️
(记得在三十秒内登录哦~)

from selenium import webdriver
import time
import json


driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.icourse163.org/')
time.sleep(30)

dictCookies = driver.get_cookies()
jsonCookies = json.dumps(dictCookies) # 转换成字符串保存
with open('moocCookie.txt', 'w') as f:
    f.write(jsonCookies)
    print("cookies保存成功")

🐢一步拿捏讨论

以前回复讨论咱们讲究的是什么⁉️讲究的是灵活运用Ctrl C和Ctrl V,讲究的是快准狠💪
现在回复讨论咱们讲究的是什么⁉️讲究的是能不用手就不用手,讲究的是一个 automation,科技是第一生产力呀兄弟们 🤘
什么?相应模块怎么下载?pip install 模块名 就完事了兄弟~
什么?chromedriver怎么配置?看这篇文章就完事兄弟~
【Python网络蜘蛛 · 9】:selenium模块【安装和配置环境变量教程、提取数据操作、无头模式】(附操作源码)
什么?不会搞?看下图干就完事了兄弟

在这里插入图片描述

话不多说❗️ ❗️ ❗️码来❗️ ❗️ ❗️

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import json
import time

class MOOC(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://www.icourse163.org/')

    def login(self):
        #获取保存下的cookie值
        with open('moocCookie.txt', 'r', encoding='utf-8') as f:
            listCookies = json.loads(f.read())

        # 往driver里添加cookie
        for cookie in listCookies:
            cookie_dict = {
                'domain': '.icourse163.org',
                'name': cookie.get('name'),
                'value': cookie.get('value'),
                'expires': '',
                'path': '/',
                'httpOnly': False,
                'HostOnly': False,
                'Secure': False
            }
            self.driver.add_cookie(cookie_dict)

        self.driver.refresh() # 刷新页面

    # 进入课程
    def entering_the_course(self):
        #等待“个人中心”元素出现
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id="j-indexNav-bar"]/div/div/div/div/div[7]/div[3]/div/div/a/span'))
        )
        self.driver.find_element(By.XPATH, '//*[@id="j-indexNav-bar"]/div/div/div/div/div[7]/div[3]/div/div/a/span').click()

        # 等待“SPOC课程12”元素出现并点击
        time.sleep(1)
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="u-selectTab-container"]/div[2]/a'))
        )
        self.driver.find_element(By.XPATH, '//div[@class="u-selectTab-container"]/div[2]/a').click()

        #等待课程元素出现,并获取元素,用户选择课程
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="course-card-wrapper"]/div/a/div/img'))
        )
        course_ele = self.driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]/div/a/div/img')
        course_name = [ele.get_attribute('alt') for ele in course_ele]

        for index, i in enumerate(course_name):
            print(index, i)
        user = int(input('请输入课程序号:'))

        course_ele[user].click()
        time.sleep(2)
        self.driver.switch_to.window(self.driver.window_handles[-1]) # 切换窗口
        time.sleep(2)
        #等待课件出现并点击
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//li[@data-name="课件"]'))
        )
        self.driver.find_element(By.XPATH, '//li[@data-name="课件"]').click()

        # 等待章节元素出现并点击
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="m-learnChapterList f-pr"]/div[@class="m-learnChapterNormal f-pr"][1]'))
        )
        # 点击章节
        self.driver.find_element(By.XPATH, '//div[@class="m-learnChapterList f-pr"]/div[@class="m-learnChapterNormal f-pr"][1]').click()
        time.sleep(0.3)
        # 点击进入视频
        self.driver.find_elements(By.XPATH, '//div[@class="sourceList"]/div[1]')[0].click()

        # 获取章节中”选择课程“的元素并点击
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located(
                (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
        )
        # 获取所有章节
        temp_chapters = self.driver.find_elements(By.XPATH, '//div[@class="f-fl j-chapter"]//div[@class="down f-bg j-list"]/div')


        # 通过循环获取到的章节元素和课程元素,进行讨论
        for chapter_index in range(len(temp_chapters)): # 循环章节
            # 获取章节中”选择课程“的元素并点击
            WebDriverWait(self.driver, 1000).until(
                EC.presence_of_element_located(
                    (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
            )
            # 获取章节选项框并点击
            self.driver.find_element(By.XPATH, '//div[@class="f-fl j-chapter"]/div[@class="u-select"]/div[1]').click()
            self.driver.find_elements(By.XPATH, '//div[@class="f-fl j-chapter"]//div[@class="down f-bg j-list"]/div')[chapter_index].click()

            # 等待课程元素出现
            WebDriverWait(self.driver, 1000).until(
                EC.presence_of_element_located(
                    (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
            )
            # 获取章节中所有课程
            course = self.driver.find_elements(By.XPATH,'//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div')
            course_names = [i.get_attribute('title') for i in course]

            for c_index in range(len(course)): # 循环课程
                WebDriverWait(self.driver, 1000).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div'))
                )
                self.driver.find_element(By.XPATH,'//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div').click()

                WebDriverWait(self.driver, 1000).until(
                    EC.presence_of_element_located(
                        (By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div'))
                )
                # 重新获取课程元素并点击
                course1 = self.driver.find_elements(By.XPATH, '//div[@class="j-breadcb f-fl"]//div[@class="f-fl j-lesson"]/div/div[2]/div')
                course1[c_index].click()
                time.sleep(2)

                try:
                    try:
                        # 获取讨论元素
                        disc = self.driver.find_element(By.XPATH, '//li[@title="讨论:讨论话题"]/span[2]')
                        if disc.is_enabled(): # 如果讨论元素存在且可以点击
                            disc.click()
                            self.discuss() # 调用讨论函数
                    except:
                        time.sleep(0.5)
                        if course_names[c_index] == '讨论区':
                            self.discuss()
                except:
                    pass


    # 讨论
    def discuss(self):
        # 等待“回复”元素出现
        WebDriverWait(self.driver, 100).until(
            EC.presence_of_element_located((By.XPATH, '//div[@class="optbar f-cb"]/a[1]/span'))
        )
        time.sleep(0.5)
        self.driver.execute_script("var q=document.documentElement.scrollTop=10000")
        time.sleep(0.5)

        try:
            content = self.driver.find_element(By.XPATH, '//div[@class="j-list"]/div/div[3]/div/div[2]/p').text
        except:
            content = self.driver.find_element(By.XPATH, '//div[@class="j-list"]/div/div[1]/div/div[2]').text

        self.driver.switch_to.frame(0)
        time.sleep(0.5)
        # 定位输入框并输入信息
        self.driver.find_element(By.XPATH, '//body[@contenteditable="true"]').send_keys(content)
        self.driver.switch_to.window(self.driver.window_handles[-1])    # 进行窗口切换
        time.sleep(1)
        # 点击发送回复
        self.driver.find_element(By.XPATH,'/html/body/div[5]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/div[2]/div[2]/div/div/div[5]/div/div[1]/div[2]/a[1]').click()

    def run(self):
        self.login()
        self.entering_the_course()

mooc = MOOC()
mooc.run()

💖美图

在这里插入图片描述

结束语

好了,以上就是今天哔哩吧啦咕噜哇啦叽里呱啦哗哗啦啦写的一篇水……呃不,勉强还看得过去的文章😛,如果喜欢,可以 点赞👍 收藏🌈 关注💖 感谢您的支持🌹
🚈下次再见💨

哦对了💡为啥每次刷网课时最小化网页后,看完一个视频它就自动暂停了❓是不是可以写一个自动刷视频的❓不管了,下次再说吧💨

peace~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022海德堡桂冠论坛(HLF)见闻录

今年9月下旬,我前往德国参加了第九届海德堡桂冠论坛。因疫情原因停摆两年后,海德堡桂冠论坛再次以线下形式举办,会场热闹非凡,作为计算机与数学界的社交盛宴当之无愧。 海德堡桂冠论坛(Heidelberg Laureate Forum, HLF…

IGV-GSAman |「功能基因组时代」的高效率科研工具

写在前面 今天周末,转眼10月份只剩一周。万万没想到,一个月下去,我还是花了不少时间在完善「GSAman」。至于为什么本来「两个小时」就干完的事情,可以干成「22天」?到底还是我对前面的版本,不太满意。当然…

Attack Lab

Attack Lab 从CMU官网下载完所需实验包后,内有官方文档以及.tar压缩包,使用tar -xvf targetk.tar解压后,得到如下文件 The fifiles in targetk include: README.txt: A fifile describing the contents of the directory ctarget: An execut…

web自动化测试框架

本文介绍web自动化测试框架 ●Base:用来对Selenium API进行二次封装。 对Selenium API进行二次封装的目的是简化一些复杂的操作,但是千万不要为了封装而封装。 封装好后,其他页面类可以集成basepage,调用这些方法。 from sele…

【iOS】—— 仿写知乎日报第一周总结

目录知乎日报第一周完成情况遇到的问题:1.线程问题:2.SDWebImage加载图片3.实现无限刷新界面4.点击主界面cell进入后的界面知乎日报第一周完成情况 在这周开始了仿写知乎日报的任务,在第一周里,我完成了主界面,以及滚…

新人入手mac折腾过程中遇到的解决方案

本文将长期更新,以记录个人的使用。 终端美化 …还没有美化完,不过推荐看这篇文章Mac终端美化指南 homebrew homebrew是Mac OS X上的强大的包管理工具,可以高效管理各种软件包,官方说法是:The missing package mana…

ArcGIS:如何新建图层组并添加数据、切换数据视图和布局视图、修改符号系统?

目录 01 如何新建图层组? 02 如何在图层组中添加数据 03 如何切换数据视图和布局视图 03 如何修改符号系统? 3.1 如何快捷的修改一下符号样式? 3.2 如何修改符号系统的色带 3.2.1 色带视图的取消 3.3 修改符号系统中的标注显示 3.4 如…

大气湍流退化图像复原技术研究及DSP实现

目录 第一章 绪论 1 1.1 研究背景 1 1.2 国内外研究现状 1 1.3 本文的研究内容 5 1.4 本文的组织结构 5 第二章 大气湍流退化图像复原技术 7 2.1 图像退化及复原数学模型概述 7 2.1.1 图像退化的数学模型 7 2.1.2 图像复原的数学模型 8 2.2 大气湍流退化图像概述 9 2.2.1 大气…

插件内存分析

rtspsrc 1. 当pipleline为rtspsrc加其他插件时,如果让其他插件卡主会发生什么事情呢?以rtspsrcfakesink为例(gst-launch-1.0.exe rtspsrc locationrtsp://xxx ! fakesink),修改fakesink的代码,让render中…

基于SSM的图书馆阅览室预约管理系统,高质量论文范例,可直接参考使用,附送源码、数据库脚本

目录 1.项目技术栈 2.适合对象 3.适合课题 4.项目功能概述 4.1 项目功能汇总 4.2 项目功能介绍 5. 高质量论文范例 6. 毕业设计撰写视频教程 6.部分运行截图 1.项目技术栈 前端必学三个基础,"HTML、CSS、JS",基本每个B/S架构项目都要…

C++【搜索二叉树】

目录 一、什么是搜索二叉树 二、搜索二叉树如何删除数据 删除的是叶子结点的情况 删除的结点下面仅有一个子节点(托孤)(要删除的结点只有一个孩子) 替换法删除 (要删除的结点有两个个孩子) 三、写一…

腾讯前辈熬夜肝了一个月整理的《Linux内核学习笔记》,啃完受益匪浅不走弯路

小编热衷于收集整理资源,记录踩坑到爬坑的过程。希望能把自己所学,实际工作中使用的技术、学习方法、心得及踩过的一些坑,记录下来。也希望想做Linux内核高级工程师的你一样,通过我的分享可以少走一些弯路,可以形成一套…

【数据结构】常见七大排序总结

目录 一、插入排序:直接插入排序【稳定排序方法】 二、插入排序:希尔排序【不稳定排序方法】 三、选择排序:直接选择排序【不稳定排序方法】 四、选择排序:堆排序【不稳定排序方法】 五、交换排序:冒泡排序【稳定…

基于单片机MC9S12XS128的两轮自平衡小车设计

目 录 1.绪论 1 1.1研究背景与意义 1 1.2两轮自平衡车的关键技术 2 1.2.1系统设计 2 1.2.2数学建模 2 1.2.3姿态检测系统 2 1.2.4控制算法 3 1.3本文主要研究目标与内容 3 1.4论文章节安排 3 2.系统原理分析 5 2.1控制系统要求分析 5 2.2平衡控制原理分析 5 2.3自平衡小车数学…

总结一下flex布局

flex布局 传统布局方案是基于盒状模型,依赖 display position float 方式来实现,灵活性较差;Flex是Flexible Box的缩写,意为”弹性布局”。Flex可以简便、完整、响应式地实现多种页面布局 CSS3 弹性盒子是一种一维的布局&…

[Spring MVC3]MyBatis详解

本章重点讲述了MyBatis映射器,对数据层进行的操作,建议本篇文章和Spring Boot的持久层相互比较来看会更加收获颇多Spring Boot持久层技术 本文需要使用到MVC第一讲的模板格式与配置情况,全部代码已经放在此博客中,Spring MVC1 目…

修改设备管理器的COM端口名称

Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class{4d36e978-e325-11ce-bfc1-08002be10318}\0001] “InfPath”“oem53.inf” “InfSection”“CH341SER_Inst.NTamd64” “ProviderName”“wch.cn” “DriverDateData”hex:00,00…

计算机算法(二)——进入计算机世界

作者介绍: 📞作者:小刘在C站 📀每天分享课堂笔记 🌹夕阳下,是最美的绽放 瑞士著名的科学家Niklaus Wirth教授曾提出:数据结构算法程序。 数据结构是程序的骨 算法是程序的灵魂。 在生活…

【 C++11 】lambda表达式

目录 1、lambda表达式的引入 2、lambda表达式 lambda表达式的语法 lambda表达式捕捉列表说明 使用lambda表达式排序自定义类型 lambda表达式的底层原理 1、lambda表达式的引入 在C98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法&…

asp.net图书馆借阅归还系统

图书管理系统既是完整的知识定位系统,又是面向未来互联网发展的信息管理模式。图书管理系统,是一套利用计算机信息网络技术,实现对引用、注释和参考图书的自动化处理和规范化管理,服务于教师,学生及各类科研人员的集成…