auto_login

每次电脑连接校园网都需要输入密码。甚至有时电脑无法自动弹出上网登录界面。因而希望做一个脚本来实现自动登录。

校园网上网原理

设备模仿目标服务器向客户端发送HTTP Redirect,将客户浏览器重定向到一个预先指定的Web服务器。在这个Web服务器的页面上,用户输入账号密码等信息,后台认证通过后,该服务器会向前述设备发送认证通过消息,该设备会建立认证通过表项。下一次客户Internet(不仅仅HTTP,所有)请求过来的时候,查表找到表项后,正常转发。客户即可正常上网了。

相关知识

  • request库

    • Python中可以实现简单的HTTP的模块

    • 基本GET请求

      1
      2
      3
      4
      5
      import requests

      response = requests.get("http://httpbin.org/get")
      # text输出文本内容
      print(response.text)
  • POST请求和GET请求

    • GET请求和POST请求区别在于前者通常是通过url地址,而后者常见的则是form表单请求
  • Tkinter库

    • Python中可以实现简单窗口视窗设计的模块

    • 创建并显示视窗基本写法

      1
      2
      3
      import tkinter as tk  # 在代码里面导入库,起一个别名,以后代码里面就用这个别名
      root = tk.Tk() # 这个库里面有Tk()这个方法,这个方法的作用就是创建一个窗口
      root.mainloop() # 加上这一句,就可以看见窗口了,循环显示窗口

解决方案

安徽大学校园网登录方式为GET请求。IP会随着位置的不同而可能重新分配。

  • 方案一

    • 将下列代码写入html文件并加入开机自启动计划中。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=, initial-scale=1.0">
      <title>Document</title>
      </head>
      <body>
      <script>
      onload = function(){
      window.open("url", "_self") # url为请求网址
      }
      </script>
      </body>
      </html>
    • 不足:

      • 无法识别当前IP地址,不适用于因为校园内地理位置的改变而改变IP地址的情况。
      • 仅开机时html文件会运行,仅适用于电脑开机时连接校园网情况,不满足连接WiFi时自动输入账号密码的实际需求。
  • 方案二

    • python代码如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      import requests
      import socket
      import re
      import tkinter as tk
      from tkinter import font


      def login(ip, url_cmcc, url):

      url = re.sub(r'\d+\.\d+\.\d+\.\d+&', ip + '&', url, 1)
      url_cmcc = re.sub(r'\d+\.\d+\.\d+\.\d+&', ip + '&', url_cmcc, 1)
      res_cmcc = requests.get(url_cmcc)
      if '"msg":""' in res_cmcc.text:
      res = requests.get(url)
      login_gui(ip, res.text, 0)
      else:
      login_gui(ip, res_cmcc.text, 1)


      def get_ip():
      try:
      s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      s.connect(('8.8.8.8', 80))
      ip = s.getsockname()[0]
      finally:
      s.close()
      return ip


      def login_gui(ip, text, model):

      if model == 1:
      mod = 'cmcc登录'
      else:
      mod = '普通登录'

      root = tk.Tk()
      root.title('校园网登录')
      var = tk.StringVar()
      if '"msg":""' in text:
      var.set('当前设备已登录\nip地址:%s\n%s' % (ip, mod))
      elif r'\u8ba4\u8bc1\u6210\u529f' in text:
      var.set('登录成功\nip地址:%s\n%s' % (ip, mod))
      elif 'bGRhcCBhdXRoIGVycm9y' in text:
      var.set('密码错误\nip地址:%s\n%s' % (ip, mod))
      elif 'aW51c2UsIGxvZ2luIGFnYWluL' in text:
      var.set('其他设备已登录\nip地址:%s\n%s' % (ip, mod))
      else:
      var.set('您可能欠费停机\nip地址:%s\n%s' % (ip, mod))
      lab = tk.Label(root, textvariable=var, font=('Courier', 15), width=20, height=20)
      lab.pack() # 把标签置入root界面布局
      root.geometry("300x200+600+300") # 将窗口移动到新位置(宽度为400,高度为300,上边距为100,左边距为100)
      root.mainloop()


      def main():
      url_cmcc = ''
      url = ''
      ip = get_ip()
      login(ip, url_cmcc, url)


      if __name__ == '__main__':
      main()
    • 可以改进的地方:

      • 可设置自动获取url来保存各个位置的wlan_ac_ip进而便捷地在校园任何地方都能自动连接校园网

      • 可以进一步完善代码关于账号和密码输入部分以便于校园内同学使用

    • 可利用pyinstaller对文件进行打包

      • pyinstaller -F -w main.py

拓展