使用Python自动连接校网

思路

  1. 使用Selenium,模拟操作登陆校网
  2. 使用Cookie,发送表单以达成登陆

场所

ZJU Haining,
Wed 20th Feb 2019

Show me the code

Cookie表单法

  1. 到浏览器里面找表单数据,如果你不确定Cookie的内容,可以用EditThisCookie插件看一下
  2. 创建python文件:
import requests
import os
import time

post_addr="https://10.105.1.35/srun_portal_pc_en.php?url=&ac_id=12" 
post_header={
    'Host': '10.105.1.35',
    'Connection': 'keep-alive',
    'Content-Length': '130',
    'Accept': '*/*',
    'Origin': 'https://10.105.1.35',
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    'DNT': '1',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Referer': 'https://10.105.1.35/srun_portal_pc_en.php?url=&ac_id=12',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7',
    'Cookie': "隐私",
}
post_data= {'action': 'login',
            'username': '隐私',
            'password': "隐私",
            'ac_id': '12',
            'user_ip': '',
            'nas_ip': '',
            'user_mac':'',
            'url': '',
            "save_me": "1",
            'ajax':'1',
            }

def login():
    return1=os.system('ping 114.114.114.114  -c 5')
    if return1:                                             #检测网络是否连接
        print ('ping failed. Retrying...')
        try:
            requests.post(post_addr,data=post_data,headers=post_header, verify=False)
            print("form sent")
        except:
            print("form unsent")
    else:
        print ('ping ok')
    time.sleep(1000) #每1000秒检测一下网络连接,断线则重连

while True:
    login()

5.我去年的Cookie至今一直可以登陆,看了一下有效期一直到明年也是醉了。此方法若在海宁以外校区则需要重新构造表单,没有网络环境给我调试,毕竟比直接输密码连接麻烦…可以作出的提醒为:

  1. #紫金港网络登陆地址如下,后面baidu之类的内容不可省:
https://net.zju.edu.cn/srun_portal_pc.php?url=http://www.baidu.com&ac_id=3
  1. 不知为何,某次代码错误后好几天都不能连接ZJUWLAN,但是eduroam连接不受影响,所以不要尝试过度。

Selenium法

  1. 安装Chrome和对应的chromedriver
    (其实只要是个浏览器和其对应的driver就好了,如Firefox和geckodriver)

  2. 安装需要的包 time、os (应该是自带的) 和 selenium:

    pip install selenium -i https://pypi.mirrors.ustc.edu.cn/simple

  3. 创建python文件:


    import time
    import os
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('headless')
    
    def intlnet(account, password):
        driver = webdriver.Chrome(r"/usr/lib/chromium-browser/chromedriver", chrome_options=chrome_options)  # 传入浏览器对象
        print("正在连接浙江大学国际校区的Wi-Fi...")
        try:
            WebDriverWait(driver, 10)# 显式等待
        except:
            print("无法打开浏览器")
        try:
            driver = webdriver.Chrome(r"/usr/lib/chromium-browser/chromedriver", chrome_options=chrome_options)  # 传入浏览器对象
            WebDriverWait(driver, 1)  # 显式等待
            driver.get('https://10.105.1.35/srun_portal_pc_en.php?url=&ac_id=12')
            # 备注:海宁以外校区校区(如紫金港)只需把登陆网址改为 https://net.zju.edu.cn/srun_portal_pc.php?url=http://www.baidu.com&ac_id=3 即可
            time.sleep(5)
        except:
            print("网页无法打开")
        try:
            driver.find_element_by_name("username").clear()
            driver.find_element_by_name("password").clear()
            print("清空输入区...")
            driver.find_element_by_name("username").send_keys(account)
            driver.find_element_by_name("password").send_keys(password)
            print("正在输入...")
        except:
            print("无法找到账号密码html参数")
        try:
            button = driver.find_element_by_id('button')   #找到登录按钮
            time.sleep(0.1)
        except:
            print("无法找到登陆按键html参数")
        try:
            button.click()
            time.sleep(1)
            print("正在加载...")
        except:
            print("无法点击,登陆未成功")
        driver.quit()
    
    intlID = "XXX"        #输入账号
    intlpwd = "XXXX"                  #输入密码
    
    def login():
        return1=os.system('ping 114.114.114.114  -c 5')
        if return1:                                             #检测网络是否连接
            print ('ping fail')
            if "@" in str(intlID):                              #识别是否为ZJUID,因为ZJUnet不可以使用Intl ID
                intlnet(intlID,intlpwd)
            else:
                print("ZJUID已经不适用于国际校区校网登陆,请使用IntlID。")
        else:
            print ('ping ok')
        time.sleep(1000) #每1000秒检测一下网络连接,断线则重连
    
    while True:
        login()

发送IP地址到邮箱

#获取ip地址
import socket
import datetime
ip=socket.gethostbyname(socket.gethostname())

#发送文本内容
def ipnote_message():
    HASH512="******"
    now_time = nowTime=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    name_of_hardward="******"
    msg=str("设备:"+name_of_hardward+"\nip地址:"+str(ip)+"\n当前时间:"+str(now_time)+"\n\nverified via\n"+HASH512)
    return msg

#使用邮箱发送
import smtplib
from email.mime.text import MIMEText
from email.header import Header

def email(msg):
    sender = "******"
    receivers = ["******"]
    # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

    # 第三方 SMTP 服务
    mail_host="******"  #设置服务器
    mail_user="******"    #用户名
    mail_pass="******"   #口令

    # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
    message = MIMEText(msg, "plain", "utf-8")
    message["From"] = Header("ip_note", "utf-8")     # 发送者
    message["To"] =  Header("ip_note", "utf-8")          # 接收者
    subject = "获取硬件IP"
    message["Subject"] = Header(subject, "utf-8")

    smtpObj = smtplib.SMTP("outlook.office365.com",587)
    smtpObj.connect(mail_host, 587)    # 25 为 SMTP 端口号
    #TLS加密
    smtpObj.ehlo()
    smtpObj.starttls()
    smtpObj.ehlo()
    #加密结束,并登陆,Outlook需要二重认证申请授权码,不然会被当作垃圾邮件
    smtpObj.login(mail_user,mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    smtpObj.close()
    print("email sent to "+mail_user)

email(ipnote_message())

Python SMTP发送邮件
【转载】python中利用smtplib发送邮件的3中方式 普通/ssl/tls

后台运行

在Terminal里面输入nohup python3 你的python文件,然后这个文件就会一直运行下去,或者你也可以选择到rc.local或者创建服务的方式来是这个程序持续运行。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值