美文网首页
使用python进行模拟登陆学校教务系统

使用python进行模拟登陆学校教务系统

作者: 就是很皮 | 来源:发表于2018-10-01 21:44 被阅读0次
我叼你妈.jpg

许多没有意义的事情其实是只是的积累 做的很多项目没有什么实际意义 单纯好玩 以及增长自己的知识 哪怕以后用不到 我也十分喜欢这积累的过程

回归正题 这几天看了看requests的官方文档 又想到大部分网站的登陆流程大致就是post提交数据 麻烦的就是那种验证码或者是经过加密的数据 于是观察了我们学校的网站 发现它就是简单的post提交明文数据给服务器进行验证 但是学校网站是不定时关闭的 所以很烦

学校的登陆页面是由主ip重定向到一个随机的地址就是一个类似xxxx./(S(xxxx))/default.aspx 括号里面的就是随机的 昨天才发现结果导致一直给主ip发送post数据之后没有提交到真正页面 程序一直报错

  • 首先要分析学校的网站: image.png 可以看到网址就是随机的
  • 我们接着查看登陆页面:

    image.png 有一个选择框来选择身份进行登陆 先去登陆一下再开发者工具里面抓一下数据: image.png 可以看到请求通过之后跳转到了location页面
  • 再来看看提交的表单里面的内容:

    image.png 之前借鉴了一些博客对于模拟登陆的分析 前面三个的值可以在主页面里面找 后面的textbox1/2分别是账号和密码 ddl_role就是自己选择的身份 submintBtn就是点击了登陆按钮
  • 接着来寻找表单里面前三个的内容:

    image.png 发现了这三个的值接着就是要在当前页面里面提取出来 可以用正则也可以用BeautifulSoup来取 我选择后者 BeautifulSoup用法我也是自己百度来的 大概思路就是我们先找出页面里面所有input标签然后返回一个list我们把里面所有的第三个数值取出以后再放到一个list中再依次访问赋值
  • 因为这个系统比较奇怪 好像他登陆成功就会直接给你调到top.aspx页面 提示浏览器不支持 我们需要访问的页面是main.aspx 于是我们还需要把跳转成功的页面地址取出以后吧top.aspx替换成main.aspx

  • 最后我们就需要来在获取到的页面取出学生的信息来进行登陆提示了 具体实现看代码就可以了

面向对象编程还不熟 写了两份代码 一分面向过程 一份面向对象编程

面向过程:
#-*- coding:utf-8 -*-
import requests
import urllib
from bs4 import BeautifulSoup
import lxml
import time
GetMainUrl = 'http://xxx'
MainUrl=requests.get(GetMainUrl).url
SchoolUrl = MainUrl
SessIon = requests.session()
UserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
Origin = 'http://xxxx'
Host = 'xxxxx'
Connection = 'keep-alive'
Cookie = {'Cookie':'safedog-flow-item=13680E9EB27448F215B1426019ECD6E7'}
Referer = SchoolUrl
Header = {'Host':Host,'Connection':Connection
          ,'Origin':Origin,'User-Agent':UserAgent
          ,'Referer':Referer
          }
try:
   LoginIndex = SessIon.get(SchoolUrl,headers=Header,timeout = 3).content
except requests.ConnectionError:
   print u'网络异常'
else:
   Soup = BeautifulSoup(LoginIndex,"lxml")
   Input_tag = Soup.find_all('input')
   DataList = []
   for DataValue in Input_tag[:3]:
      GetData = DataValue.get('value')
      DataList.append(GetData)
   VIEWSTATE = DataList[0].strip()
   VIEWSTATEGENERATOR = DataList[1].strip()
   EVENTVALIDATION = DataList[2].strip()
   TextBox1 = raw_input('请输入学号:')
   TextBox2 =  raw_input('请输入密码:')
   ddl_role = '学生'
   submitBtn= ''
   FormData = {'__VIEWSTATE':VIEWSTATE
            ,'__VIEWSTATEGENERATOR':VIEWSTATEGENERATOR
            ,'__EVENTVALIDATION':EVENTVALIDATION
            ,'TextBox1':TextBox1
            ,'TextBox2':TextBox2
            ,'ddl_role':ddl_role
            ,'submitBtn':submitBtn
            }
   PostText = SessIon.post(SchoolUrl,headers=Header,data=FormData).url
   PostText = urllib.unquote(PostText)
   PostText = PostText.encode('utf8')
   PostRText = PostText.replace('main.aspx','top.aspx')
   IndexMainUrl = SessIon.get(PostRText,headers=Header,cookies=Cookie)
   IndexMain = IndexMainUrl.content
   IndexGetName = BeautifulSoup(IndexMain,'lxml')
   try:
      WelcomeInfo = IndexGetName.find(id='nav').td.string[:-1].strip()
      WelcomeInfo = WelcomeInfo.replace('(' + str(TextBox1) + ')','')
   except AttributeError:
      time.sleep(0.2)
      print u'获取信息出错,可能是账号或者密码输入错误'
   else:
      time.sleep(1)
      print '登陆成功\n\n' + WelcomeInfo

面向对象:

# -*- coding:utf-8 -*-
import requests
import urllib
import time
from bs4 import BeautifulSoup
import lxml


class LoginSchool:
    def __init__(self):
        self.url = 'http://xxx'
        self.UserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
        self.Headers = {'User-Agent': self.UserAgent}
        self.KeepConnect = requests.session()

    def StartLogin(self):
        try:
            RealUrl = requests.get(self.url, headers=self.Headers).url
            MainContent = self.KeepConnect.get(RealUrl, headers=self.Headers, timeout=3).content
            GetContent = BeautifulSoup(MainContent, 'lxml')
            FindInput_tag = GetContent.find_all('input')
            InfoList = []
            for Value in FindInput_tag[:3]:
                GetValue = Value.get('value')
                InfoList.append(GetValue)
            PostData0 = InfoList[0].strip()
            PostData1 = InfoList[1].strip()
            PostData2 = InfoList[2].strip()
            StudentNum = raw_input('请输入学号:')
            TextBox1 = StudentNum
            StudentPwd = raw_input('请输入密码:')
            TextBox2 = StudentPwd
            ddl_role = '学生'
            submitBtn = ''
            PostDataForm = {'__VIEWSTATE': PostData0, '__VIEWSTATEGENERATOR': PostData1, '__EVENTVALIDATION': PostData2, 'TextBox1': TextBox1, 'TextBox2': TextBox2, 'ddl_role': ddl_role, 'submitBtn': submitBtn
                            }
            GetLoginUrl = self.KeepConnect.post(
                RealUrl, headers=self.Headers, data=PostDataForm).url
            ChangeUrlToStr = urllib.unquote(GetLoginUrl)
            StrLoginUrl = ChangeUrlToStr.encode('utf8')
            LoginUrl = StrLoginUrl.replace('main.aspx', 'top.aspx')
            StudentHtml = self.KeepConnect.get(
                LoginUrl, headers=self.Headers).content
            GetStudentInfo = BeautifulSoup(StudentHtml, 'lxml')
        except requests.ConnectionError:
            print u'网络异常'
        else:
            try:
                WelcomeInfo = GetStudentInfo.find(
                    id='nav').td.string[:-1].strip()
                WelcomeInfo = WelcomeInfo.replace(
                    '(' + str(TextBox1) + ')', '')
            except AttributeError:
                time.sleep(0.2)
                print u'获取信息出错,可能是账号或者密码输入错误'
            else:
                time.sleep(1)
                print '登陆成功\n\n' + WelcomeInfo


LoginSchool = LoginSchool()
LoginSchool.StartLogin()

相关文章

网友评论

      本文标题:使用python进行模拟登陆学校教务系统

      本文链接:https://www.haomeiwen.com/subject/inznoftx.html