思路
- 使用Selenium,模拟操作登陆校网
- 使用Cookie,发送表单以达成登陆
场所
ZJU Haining,
Wed 20th Feb 2019
Show me the code
Cookie表单法
- 到浏览器里面找表单数据,如果你不确定Cookie的内容,可以用EditThisCookie插件看一下
- 创建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至今一直可以登陆,看了一下有效期一直到明年也是醉了。此方法若在海宁以外校区则需要重新构造表单,没有网络环境给我调试,毕竟比直接输密码连接麻烦…可以作出的提醒为:
- #紫金港网络登陆地址如下,后面baidu之类的内容不可省:
https://net.zju.edu.cn/srun_portal_pc.php?url=http://www.baidu.com&ac_id=3
- 不知为何,某次代码错误后好几天都不能连接ZJUWLAN,但是eduroam连接不受影响,所以不要尝试过度。
Selenium法
-
安装Chrome和对应的chromedriver
(其实只要是个浏览器和其对应的driver就好了,如Firefox和geckodriver) -
安装需要的包 time、os (应该是自带的) 和 selenium:
pip install selenium -i https://pypi.mirrors.ustc.edu.cn/simple
-
创建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或者创建服务的方式来是这个程序持续运行。