NodeJs模拟登陆正方教务

下面是“NodeJs模拟登陆正方教务”的完整攻略:

一、前置准备

在开始NodeJs模拟登陆正方教务之前,我们需要保证以下几点:

  1. 学校教务系统平台支持模拟登陆,常见的支持教务系统有“正方教务系统”、“智慧校园”等;
  2. 获取学校教务系统的账号和密码,以进行模拟登陆;
  3. 安装NodeJs开发环境和npm包管理工具,以便安装相关插件。

二、安装必要插件

模拟登陆正方教务需要用到request、cheerio、iconv-lite等插件,这些插件可以通过npm包管理工具进行安装。

具体命令如下:

npm install request cheerio iconv-lite --save

三、实现模拟登陆

实现模拟登陆正方教务主要涉及以下几个步骤:

1. 获取登陆页面

使用request插件发送请求获取登陆页面,代码示例如下:

var request = require('request');

var url = 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html';

request.get({
  url: url,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
  },
  encoding: null
}, function (err, response, body) {
  if (err) {
    console.error(err);
    return;
  }
  if (response.statusCode === 200) {
    var html = iconv.decode(body, 'GBK');
    console.log(html);
  }
});

2. 提取表单数据

从登陆页面获取到表单数据,一般是包含表单元素的html。使用cheerio插件可以轻松提取表单元素的data值,代码示例如下:

var cheerio = require('cheerio');

var $ = cheerio.load(html);
var form = $('form#fm1');

var formdata = {};
form.find('input').each(function (index, element) {
  var input = $(element);
  formdata[input.attr('name')] = input.attr('value') || '';
});

3. 发送登陆请求

将刚才提取的表单数据发送给服务器验证登陆信息,代码示例如下:

var request = require('request');
var iconv = require('iconv-lite');

var url = 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html';

var formdata = {
  'yhm': 'YourUsername',
  'mm': 'YourPassword',
  'mm': '',
};

request.post({
  url: url,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
    'Referer': 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html'
  },
  encoding: null,
  form: formdata
}, function (err, response, body) {
  if (err) {
    console.error(err);
    return;
  }
  if (response.statusCode === 200) {
    var html = iconv.decode(body, 'GBK');
    console.log(html);
  }
});

四、示例说明

下面分别通过建立session和使用jsonwebtoken的方式实现模拟登陆正方教务的过程。

1. 示例一:建立session

const request = require('request');
const cheerio = require('cheerio');
const iconv = require('iconv-lite');

let j = request.jar();

const loginOptions = {
  url: 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html',
  jar: j,
  encoding: null,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
  }
};

let courseId = '';

const user = {
  username: 'YourUsername',
  password: 'YourPassword'
};

request(loginOptions, (err, response, body) => {
  const $ = cheerio.load(iconv.decode(body, 'GBK'));
  const inputList = $('form.login-form').eq(0).find('input[type="hidden"]');
  const params = {
    yhm: user.username,
    mm: user.password,
  };
  inputList.each((i, ele) => {
    const thisEle = $(ele);
    params[thisEle.attr('name')] = thisEle.attr('value');
  });
  const options = {
    url: 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html',
    jar: j,
    encoding: null,
    headers: {
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
      'Referer': 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html'
    },
    formData: params,
  };
  request.post(options, (err, response, body) => {
    const $ = cheerio.load(iconv.decode(body, 'GBK'));
    courseId = $('a').eq(0).attr('href').split('=')[1];
    setTableList();
  });
});

2. 示例二:使用jsonwebtoken

const request = require('request');
const cheerio = require('cheerio');
const iconv = require('iconv-lite');
const jwt = require('jsonwebtoken');

const user = {
  username: 'YourUsername',
  password: 'YourPassword'
};

const options = {
  url: 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html',
  encoding: null,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
  }
};

request(options, (err, response, body) => {
  const $ = cheerio.load(iconv.decode(body, 'GBK'));
  const inputList = $('form.login-form').eq(0).find('input[type="hidden"]');
  const params = {
    yhm: user.username,
    mm: user.password,
  };
  inputList.each((i, ele) => {
    const thisEle = $(ele);
    params[thisEle.attr('name')] = thisEle.attr('value');
  });
  const rsaModulus = params.rsaModulus;
  const exponent = '10001';
  const key = new Buffer(rsaModulus, 'base64').toString();
  const password = new Buffer(params.mm).toString('base64');
  const rsa = jwt.sign({
    "sub": user.username,
    "iat": Math.floor(Date.now() / 1000) - 30,
    "exp": Math.floor(Date.now() / 1000) + (60 * 60),
  }, key, {
    algorithm: 'RS256',
    header: {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "rsa1"
    }
  });
  const options = {
    url: 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html',
    encoding: null,
    headers: {
      'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
      'Referer': 'http://your.edu.cn/jwglxt/xtgl/login_slogin.html'
    },
    form: {
      yhm: user.username,
      mm: password,
      "yzm": '',
      "mm": rsa,
    }
  };
  request.post(options);
});

以上就是NodeJs模拟登陆正方教务的完整攻略,通过上述步骤和示例代码可以成功实现登陆操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJs模拟登陆正方教务 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 如何在node环境实现“get数据解析”代码实例

    下面是“如何在node环境实现‘get数据解析’代码实例”的完整攻略: 步骤一:安装依赖 在开始之前,你需要确保已经安装了 Node.js 环境。接下来,你需要使用 npm 安装一些必要的依赖: npm install express body-parser –save 其中,express 是一个 web 框架,而 body-parser 是一个用于解析…

    node js 2023年6月8日
    00
  • JavaScript复制变量三种方法实例详解

    JavaScript复制变量三种方法实例详解 在JavaScript中,想要复制变量可能需要了解一些技巧。本文将详细讲解JavaScript中复制变量的三种方法。 1. 直接赋值 最常用的方法就是直接将变量赋值给另一个变量。 let a = 1; let b = a; 这里,变量a的值被赋给了新变量b。 如果您更改 b 的值,a 的值仍然保持不变。 实例如下…

    node js 2023年6月8日
    00
  • 前后端常见的几种鉴权方式(小结)

    前后端常见的几种鉴权方式(小结) 1. 基于Token的鉴权方式 Token(令牌)是指在Web开发中,保留客户端登录状态的一种机制。具体实现方式为:当用户使用用户名和密码进行登录后,系统生成一个特定的Token,并返回给客户端。此后客户端必须携带此Token才能访问受保护的资源。 具体流程如下: 客户端发送登录请求; 服务端验证用户信息; 登录成功后,生成…

    node js 2023年6月8日
    00
  • 如何解决uni-app编译后 vendor.js 文件过大

    解决uni-app编译后vendor.js文件过大的完整攻略如下。 问题分析 首先需要了解的是,uni-app在编译后会生成一个vendor.js文件,包含了所有npm包和uni-app框架代码。由于vendor.js包含了大量代码,导致文件过大,从而使得应用程序的启动速度变慢,影响用户体验。 解决方案 1. 使用import或require来按需加载npm…

    node js 2023年6月8日
    00
  • nodejs+socket.io实现p2p消息实时发送的项目实践

    下面是「nodejs+socket.io实现p2p消息实时发送的项目实践」的攻略。 1.背景 本项目通过搭建一个基于实时通信的 p2p 网络,实现在任意两个节点之间进行实时消息传递的功能。具体实现技术由 Node.js 和 Socket.IO 提供支持,其主要原理是在每个用户连接到服务器(Socket.IO 服务器)时,将其与其他在线用户连接起来,然后进行实…

    node js 2023年6月8日
    00
  • 一文带你了解前端包管理工具npm、yarn和pnpm

    一文带你了解前端包管理工具npm、yarn和pnpm 前言 前端包管理工具是前端开发中必不可少的工具之一,它可以帮助我们快速便捷地安装、升级、管理前端项目中的各种依赖包。本文主要介绍三种最常用的前端包管理工具npm、yarn和pnpm。 npm npm全称为Node Package Manager,是由Node.js官方提供的包管理工具。npm的特点为: 可…

    node js 2023年6月8日
    00
  • Node.js中的package.json与cnpm命令行工具介绍

    一、Node.js中的package.json 1. package.json是什么? package.json是Node.js项目必备的一个文件,用于描述项目的元信息和配置信息,如项目名称、版本、作者、依赖包等。当使用npm安装依赖包时,npm会自动查找package.json并下载所有依赖包。 2. 如何创建package.json文件? 可以使用npm…

    node js 2023年6月8日
    00
  • 从零学习node.js之搭建http服务器(二)

    下面是“从零学习node.js之搭建http服务器(二)”的完整攻略。 概述 在本文中,我们将学习如何使用Node.js搭建一个HTTP服务器。我们将使用Node.js内置的模块http来完成HTTP服务器的搭建工作,同时我们还将探讨如何处理HTTP请求、HTTP响应等相关问题。 步骤 首先,我们需要在命令行中切换到我们的项目目录,并创建一个新的文件,比如叫…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部