最近有个朋友的需求,用油猴写了一个插件,可以看五学教育(wuxuejiaoyu.cn)的网课

湖南环境生物职业技术学院 ,就是以前的湖南生物机电学校,成人高考需要看网课,问我有没有办法.我写了一个油猴插件,一天时间差不多把网课和考试都搞完了…..油猴还真的不错,

后台使用python flask框架搭建了简易的服务器接口.

操作原理,第一次,随便选几个ABCD,先交卷,然后点击查看答案,查看答案的过程中会将所有题目和答案全部发送到后台保存,

第二次再考试就会自动匹配试卷.

以下是油猴代码

javascript;gutter:true; // ==UserScript== // @name wuxuejiaoyu查看答案 // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world!</p> <p>// @author You // @match http://learning.wuxuejiaoyu.cn/openlearning/console/<em> // @icon https://www.google.com/s2/favicons?sz=64&domain=wuxuejiaoyu.cn // @grant none // @require http://code.jquery.com/jquery-3.x-git.min.js // ==/UserScript== /</em> globals jQuery, $, waitForKeyElements */</p> <p>(function() { 'use strict'; $(document).ready(function() { console.info('进来了-查看答案');</p> <pre><code> let intvals = setTimeout(()=>{ console.info('进来了-查看答案2'); let iframeDocument=$("iframe[name='w_main']")[0].contentWindow.document; if(iframeDocument){ // console.info(iframeDocument); iframeDocument=iframeDocument.getElementById("cboxIframe").contentWindow.document; // console.info("2",iframeDocument); iframeDocument=iframeDocument.getElementById("w_lms_content").contentWindow.document; // console.info("3",iframeDocument); iframeDocument=iframeDocument.getElementById("w_lms_sco").contentWindow.document; //console.info("4",iframeDocument); //iframeDocument=$(iframeDocument).find("[name='w_right']")[0].contentWindow.document; //console.info("5",iframeDocument); var div = iframeDocument.getElementById("_block_content_exam_1") ; console.info('查看答案',div); if(div){ //console.info("取到了div") //var trs = $(div).find("*[isitem]") ; //取到了题目表格 //console.info("查看答案trs",trs); //trs = Array.from(trs); var rtab = $(div).find("tr[correctstatus]") //console.info("rtab的长度",rtab.length); rtab = Array.from(rtab); rtab.forEach((item,index)=>{ if($(item).attr("islabel")==1) return ; //如果是标题,例如选择题,就跳过 var text = "" ; let isitem =$(item).find("table[isitem]"); if(isitem.length>0){ //第一种方式 text = isitem.find("tr").first().find("td:eq(0)").text(); // console.info('第一种方式',text) } else{ //第二方式 console.info("第二种方式读取",$(item).find("td:eq(1)")); let div = $(item).find("td:eq(1)").find("div"); text = div.prop ('firstChild').nodeValue; // console.info('第2种方式',text) } // console.info("item",item); // var text = $(item).find("tr:eq(0)").find("td:eq(1)").find("table[isitem]").html(); console.info(index,text); //得到所有的选项 let contentTableTr = $(item).find("*[isitemoption]").find("tr") ; //取到了答案选项的表格 // console.info("选择题",contentTableTr.length); let urls = 'http://127.0.0.1:5000/tiku/answerAndQuestion'; let data = {}; if(contentTableTr.length>0){ let content = contentTableTr.text(); let strs = $(item).find("div:contains('参考答案')").text(); strs = strs.split('参考答案')[1]; console.info('参考答案strs',strs) let answer = strs.replace(/[^a-zA-Z]/g,'') console.info('参考答案answer',answer) data = { 'title':text, //问题标题 'content':text+' \n '+ content, //答案选项 'answer':answer, 'createTime':new Date().toLocaleString(), 'source':'wuxuejiaoyu', 'que_type':'10' //选择题 } }else{ //展开简答题的参考答案 let ack = $(item).find("a:contains('展开参考答案')") ; //console.info('a标签',ack); ack[0].click(); //简答题 let title = $(item).find("*[issubitem]").find("td").text() ; //取到了答案选项的表格 //alert('简单题'+title); let answer = $(item).text().split('参考答案')[1]; answer = answer.substr(5); console.info("简答题答案",answer); data = { 'title':title, //问题标题 'content':title, //答案选项 'answer':answer, 'createTime':new Date().toLocaleString(), 'source':'wuxuejiaoyu', 'que_type':'20' //简单题 } } $.ajax( { type: 'post', url: urls, cache: false, data: JSON.stringify(data), //将data参数值转为json格式字符串 contentType: "application/json;charset=utf-8", async:false, success:function(res){ console.info('得到的结果是',res) } } ); //window.open(queryKeyword); // } }) alert('完成答案,请刷新页面之后再重新考试'); //location.reload(); } } },10000) }) </code></pre> <p>})();</p> <pre><code> 后台python ;gutter:true;
-*- coding:utf-8 -*-
"""
www.sqjob.cn
author: liandyao
date: @date

"""
import re
from datetime import datetime

from lxml import etree
import requests

import SnowIds
import TiKu_MongoDb

import logging
logging.basicConfig(format='[%(asctime)s-%(name)s(%(levelname)s)%(filename)s:%(lineno)d]%(message)s’, level=logging.DEBUG)

logger = logging.getLogger("ROOT")

hots:mongodb服务器ip
port:端口,默认为27017
user:账号 【可选项】
pwd:密码 【可选项】

class Tiku1():
headers = {
# ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36’,
‘Referer’: ‘https://www.baidu.com/’,
‘Content-Type’: ‘text/html;charset=utf-8’,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0’,
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9′
,’Host’: ‘www.baidu.com’
,’Cookie’:’BIDUPSID=FE2D2E66C1689D888774DFF8F687BCBB; PSTM=1658233931; BD_UPN=19314753; BAIDUID=FE2D2E66C1689D888774DFF8F687BCBB:SL=0:NR=10:FG=1; H_BDCLCKID_SF_BFESS=tR-qVIK5tIK3H48k-4QEbbQH-UnLqMjw0mOZ04n-ah02DqFlMxOZXhFJyUcv5fopQ2cx-D5m3UTKsq76Wh35K5tTQP6rLtbQMnT4KKJxbp5sShOv5t5rDx_AhUJiBM7LBan7QpvIXKohJh7FM4tW3J0ZyxomtfQxtNRJ0DnjtpChbRO4-TFMjxK; BDUSS_BFESS=VxMXpmMk5uaW5DME9uOUh-REtCaXNiUldiWGpFeEZ0bU5QR3lhdzl6fnZKeFJqRUFBQUFBJCQAAAAAAAAAAAEAAABJoEgAy-rUws7eyfnKx9T4vq0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO-a7GLvmuxiR1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=36556_36461_36413_36954_36948_36165_36918_36919_36802_36789_36744_26350_36864_37022; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=fe28Yxr%2BR%2FK7QK7ySOElo6l4lFiVn6NfoIwkVHHptEd%2FiL6DdEWWFmzXEDw; BDSVRTM=0′
}

def __init__(self):
self.url = "http://www.sqjob.cn"
self.keyword=”
# site:asklib.com

# 利用百度查询https://www.baidu.com/s?wd=site: www.sqjob.cn ‘+text;
def paBaidu(self, keyword):
self.keyword=keyword
self.url = ‘https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=site:sqjob.cn ‘ + keyword
logger.info(self.url)
res = requests.get(self.url, headers=Tiku1.headers)
res.encoding = ‘utf-8’
text = res.text

html = etree.HTML(text)
question = {
"title": self.keyword,
"content": ”,
"answer": ”,
}
for i in range(1, 5):
tatxt = html.xpath(‘//*[@id="’+str(i)+’"]/div/div[1]/h3/a/em/text()’)
# 如果匹配的关键字多余0个,并且第一个关键字匹配字符大于3个.那么就成功
if (len(tatxt) > 0 and len(tatxt[0]) > 3):
logger.info(”.join(tatxt))
ahref = html.xpath(‘//*[@id="1"]/div/div[1]/h3/a/@href’)[0]
logger.info(ahref);
return self.paUrl(ahref)

return question
# //*[@id="1"]/div/div[1]/h3/a
# //*[@id="2"]/div/div[1]/h3/a

# 爬取真正的url
def paUrl(self,url):
headers = {
# ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36’,
‘Referer’: ‘https://www.baidu.com/’,
‘Content-Type’: ‘text/html;charset=utf-8’,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.77’,
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9’
, ‘Host’: ‘www.baidu.com’
}

mongodb = TiKu_MongoDb.MongoClient(‘tiku_db’)

resa = requests.get(url, headers=headers, allow_redirects=False);
# 得到网页原始地址
real_url = resa.headers[‘Location’]
if real_url.startswith(‘http’):
g_mu = real_url
logger.info(g_mu)
headers[‘Host’]=’www.sqjob.cn’
resb = requests.get(g_mu, headers=headers)
resb.encoding = ‘gb2312’
logger.info(resb.encoding)
text2= resb.text
#text2 = resb.content.decode(‘ISO-8859-1’)

html2 = etree.HTML(text2)
content = html2.xpath(‘//*[@name="description"]/@content’)[0]
logger.info(content)
description =content.replace(‘ ‘, ”).replace(‘\n’, ”).replace(‘\r’, ”)

ans = re.findall(‘(?1 :
anss = "".join(anss)
elif len(anss) == 1:
anss = anss[0]
else :
anss = ‘未知’
question={
"que_id":SnowIds.IdWorker(1,1).get_id(),
"title":self.keyword,
"content":content,
"answer":anss,
"createTime":datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’),
"source":g_mu
}
mongodb.addQuestion(question=question)
question.pop(‘_id’)
return question

return None

if __name__ == "__main__":
tk = Tiku1()
tk.paBaidu(‘在Excel的自动筛选中,所选数据表的每个标题都对应着一个 。’);

代码未全部发布,有需要可以联系

Original: https://www.cnblogs.com/machine-matrix/p/16559952.html
Author: liandyao
Title: 最近有个朋友的需求,用油猴写了一个插件,可以看五学教育(wuxuejiaoyu.cn)的网课

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592276/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 运用Spring Aop,一个注解实现日志记录

    运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视…

    Java 2023年6月8日
    087
  • synchronized锁详解

    synchronized的意义 解决了Java共享内存模型带来的线程安全问题: 如:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?(…

    Java 2023年6月16日
    072
  • netty源码学习之channelHander的组织管理

    当netty server启动时 调用bind方式 时 会开始注册serverChannel 有必要说下 pipeline.addLast 方法 它在添加一个hander的时候 会…

    Java 2023年6月5日
    079
  • UCloud 云服务内容审核 Java 版本实现

    前言 最近不少小伙伴反映上传小黄图偶尔性的异常,并且不能上传动态图片,很是苦恼!无她,鉴黄 API还没有这么智能,毕竟是自己训练的,不是那么专业!为了更好的服务广大网友,撸主决定接…

    Java 2023年5月29日
    096
  • 30个类手写Spring核心原理之AOP代码织入(5)

    本文节选自《Spring 5核心原理》 前面我们已经完成了Spring IoC、DI、MVC三大核心模块的功能,并保证了功能可用。接下来要完成Spring的另一个核心模块—AOP,…

    Java 2023年6月7日
    072
  • SpringBoot使用JSR356 Websocket使用configurator = SpringConfigurator.class自动注入Spring IOC的bean报错: Failed to find the root WebApplicationContext. Was ContextLoaderListener not used?

    笔者在springboot中使用JSR356的Websocket注解,然后各种方式尝试注入Bean,大多失效。 Spring MVC 4.x时代,推荐代码如下 经过多次尝试,还是错…

    Java 2023年5月30日
    081
  • iphone 开发学习笔记七

    本篇算是该系列最后一篇,虽不能说是很熟,但使用MonoTouch 开发的其本方法是掌握了,主要是完成当初的任务,实现地图开发包在iPhone上的实现。使用MonoTouch ,.N…

    Java 2023年5月29日
    049
  • 【特殊的阻塞队列】 java.util.concurrent.SynchronousQueue 源码分析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    070
  • 并查集优化

    并查集及其优化 并查集可以动态地连通两个点,可以非常快速判断两个点是否连通。假设存在 n 个节点,我们先将所有结点的 leader 标为自身;每次连接节点 i 和 j 时,我们可以…

    Java 2023年6月8日
    078
  • SpringBoot读取Resource下文件的几种方式

    最近在项目中涉及到Excle的导入功能,通常是我们定义完模板供用户下载,用户按照模板填写完后上传;这里待下载模板位置为resource/excelTemplate/test.xls…

    Java 2023年5月30日
    078
  • Nginx(三)-正向代理与反向代理

    原文:正向代理与反向代理的区别 正向代理中,proxy和client同属一个LAN,对server透明; 反向代理中,proxy和server同属一个LAN,对client透明。 …

    Java 2023年5月30日
    076
  • 类加载

    加载—–连接(验证—准备—解析)——初始化: 加载就是 将类的二进制字节码载入JVM中、将这个字节流代表的存…

    Java 2023年6月9日
    091
  • 初识Java

    C&C++ Java应运而生 以这样的构想进行编写 语法类似C 没有指针 没有内存管理 可移植性 面向对象 类型安全 高质量的类库 …… 可移植性 Java…

    Java 2023年6月9日
    089
  • ArrayList

    ArrayList与数组的区别: 1. 数组和ArrayList的本质区别在于前者是类型安全的,而后者是类型不安全的.2. ArrayList为了兼容所有类型对象,使用了Objec…

    Java 2023年6月6日
    076
  • git学习(一)-fork操作

    fork操作 对于某一个项目来说,如果自己不属于开发者中的一员,那么只能先fork别人的代码,然后将代码拉取到本地进行修改之后,再向原来的项目发起pull request。 for…

    Java 2023年6月7日
    063
  • 搬砖_BeanUtils的扩展

    简单描述一下: org.apache.commons.beanutils.BeanUtils只能对单个对象进行复制,如果对列表的话,就得自己遍历,所以扩展一下 import org…

    Java 2023年6月7日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球