Python自动化登录office_online并获取cookie
一、安装selenium库和火狐浏览器及驱动
使用selenium需要先下载对应版本的浏览器驱动,并配置路径,安装selenium库很简单,在命令窗口使用下面的命令:
pip install selenium
而驱动的部署方式在Windows和Linux有点不一样。
1、Windows系统安装火狐浏览器和驱动
首先通过下面的下载地址安装火狐浏览器:
http://www.firefox.com.cn/download/
接着通过下面的下载地址,下载对应系统版本的浏览器驱动,火狐浏览器对应驱动是 geckodriver :
https://github.com/mozilla/geckodriver/releases
最后将解压后的 getckodriver.exe 添加到 Path 环境变量中
如果不想添加到环境变量中,还可以在创建 firefox 驱动实例的时候指定 geckodirver 的位置:
webdriver.Firefox(executable_path="E:/Downloads/geckodriver/geckodriver.exe")
2、Linux系统安装火狐浏览器和驱动
安装 firefox 浏览器
首先通过下面的火狐浏览器下载地址中找到linux版本的链接,并复制:
http://www.firefox.com.cn/download/
接着使用wget命令下载linux版本的火狐浏览器,例如:
wget https://download-ssl.firefox.com.cn/releases/firefox/106.0/zh-CN/Firefox-latest-x86_64.tar.bz2
然后使用下面的命令解压得到 Firefox-latest-x86_64.tar:
bunzip2 -d Firefox-latest-x86_64.tar.bz2
最后通过tar命令解压,例如:
tar -xvf Firefox-latest-x86_64.tar
安装火狐浏览器驱动
首先通过下面的下载地址中找到linux版本驱动的链接,并复制,火狐浏览器对应驱动是 geckodriver,浏览器和驱动对应关系-查看地址 :
https://github.com/mozilla/geckodriver/releases
接着使用wget命令下载linux版本的火狐浏览器驱动,例如:
wget https://github.com/mozilla/geckodriver/releases/download/v0.29.1/geckodriver-v0.29.1-linux64.tar.gz
最后通过tar命令解压,并将解压后的geckodriver 存放至 /usr/local/bin/ 路径下即可
tar -zxvf geckodriver-v0.29.1-linux64.tar.gz
cp geckodriver /usr/local/bin/
二、编写自动化登录的python脚本
1、在windows系统
可以先在Windows系统调试,先导入所需的python库,配置引用驱动的路径,打开网页。
我这边用的是公司的,需根据自己的情况,换成自己公司或者个人的
from selenium import webdriver
#用于引用驱动的路径
from selenium.webdriver.chrome.service import Service
#指定火狐驱动的路径
s=Service("D:/Program_Files/Anaconda3/geckodriver.exe")
# 调用火狐浏览器打开1个标签页
driver =webdriver.Firefox(service=s)
# 等待3秒,确保标签页已打开
driver.implicitly_wait(3)
#打开指定网页,我这边用的是公司的
driver.get('https://xxxxx0-my.sharepoint.com/personal/chenhm21_xxxxx_com/_layouts/15/onedrive.aspx')
# 等待3秒,确保网页已完成渲染
time.sleep(3)
按F12进入开发者模式,然后点去左上角的“选取页面中的元素”或者按组合键:Ctrl+Shift+C;然后将鼠标移动至,需要锁定的元素位置,查看元素的ID或者其它属性值。(建议优先选择ID)
可以看出输入账号的文本框对应ID为"i0116"
通过同样的方式也可以得知下一步按钮对应的ID为:“idSIButton9”,于是输入账号对应的Python代码就可以知道。
#输入账号
driver.find_element(by='id',value="i0116").send_keys("chenhm21@xxxxx.com")
#点击下一步按钮
driver.find_element(by='id',value="idSIButton9").click()
#等待3秒,确保网页已跳转下一页面,并完成渲染
time.sleep(3)
同理,接着完成输入密码、点击验证、输入手机验证码以及保持登录状态等步骤
#输入密码
driver.find_element(by='id',value="i0118").send_keys("这里填写对应账号的密码")
driver.find_element(by='id',value="idSIButton9").click()
time.sleep(3)
#确定通过手机短信验证
driver.find_element(by='id',value="idDiv_SAOTCS_Proofs").click()
#配置验证码,填入手机短信收到的验证码
yanzhengma=input('请输入验证码:')
#输入验证码
driver.find_element(by='id',value="idTxtBx_SAOTCC_OTC").send_keys(yanzhengma)
#点击验证
driver.find_element(by='id',value="idSubmit_SAOTCC_Continue").click()
#选择是否保持登录状态
##打勾,选择保持
driver.find_element(by='id',value="KmsiCheckboxField").click()
##点击下一步
driver.find_element(by='id',value="idSIButton9").click()
至此就成功进入到我们要打开的网页,即office_online的Excel个人主界面,这个时候我们就可以获取网页的cookie并保存
import os
#获取cookie
cookie=driver.get_cookies()
cookieValue=''
for item in cookie:
cookieValue += item['name'] + '=' + item['value'] + ';'
#保存cookie
print(cookieValue)
#将cookie保存到指定路径的文件中
os.system("""echo '%s' >D:/铭专用/cookies.txt"""%(cookieValue))
若是需要定时获取,我们可以再借助循环和时间等待来实现,完整的代码如下:
from selenium import webdriver
import time
import datetime
#用于引用驱动的路径
from selenium.webdriver.chrome.service import Service
#用于构建网页的扫描机制
import selenium.webdriver.support.ui as ui
import os
#通过By定位来调用网页的元素
from selenium.webdriver.common.by import By
#指定火狐驱动的路径
s=Service("D:/Program_Files/Anaconda3/geckodriver.exe")
# 调用火狐浏览器打开1个标签页
driver =webdriver.Firefox(service=s)
# 等待3秒,确保标签页已打开
driver.implicitly_wait(3)
#打开指定网页
driver.get('https://xxxxx0-my.sharepoint.com/personal/chenhm21_xxxxx_com/_layouts/15/onedrive.aspx')
# 等待3秒,确保网页已完成渲染
time.sleep(3)
#配置扫描机制,N秒内每隔500毫秒扫描1次页面变化
wait = ui.WebDriverWait(driver,30)
#输入账号
##调用扫描机制,来锁定网页中的元素,直至找到或者扫描时间耗尽
driver.find_element(by='id',value="i0116").send_keys("这里填写对应账号")
driver.find_element(by='id',value="idSIButton9").click()
time.sleep(3)
#输入密码
driver.find_element(by='id',value="i0118").send_keys("这里填写对应账号的密码")
driver.find_element(by='id',value="idSIButton9").click()
time.sleep(3)
try:
#确定通过手机短信验证
driver.find_element(by='id',value="idDiv_SAOTCS_Proofs").click()
#配置验证码
yanzhengma=input('请输入验证码:')
#输入验证码
driver.find_element(by='id',value="idTxtBx_SAOTCC_OTC").send_keys(yanzhengma)
#点击验证
driver.find_element(by='id',value="idSubmit_SAOTCC_Continue").click()
except Exception as e:
print("失败原因",e)
print("没有进入验证")
pass
#选择是否保持登录状态
try:
##打勾,选择保持
driver.find_element(by='id',value="KmsiCheckboxField").click()
##点击下一步
driver.find_element(by='id',value="idSIButton9").click()
except Exception as e:
print("失败原因",e)
print("没有进入登录选项界面")
#定时更新和获取,确保cookie可用
def update_sleep_time():
#更新时间列表,小时分钟
hous_list=[100,1100,2100]
count=0
hm=datetime.datetime.now().hour*100+datetime.datetime.now().minute
for h in hous_list:
count+=1
if h>hm:
n=datetime.datetime.now().hour*3600 + datetime.datetime.now().minute*60 + datetime.datetime.now().second
s=max(h*36 - n,5)
return s
break
elif count==len(hous_list):
n=datetime.datetime.now().hour*3600 + datetime.datetime.now().minute*60 + datetime.datetime.now().second
s=max(hous_list[0]*36 + 24*3600 - n,5)
return s
else:
continue
#定时循环获取cookie并保存
while True:
#获取cookie
cookie=driver.get_cookies()
cookieValue=''
for item in cookie:
cookieValue += item['name'] + '=' + item['value'] + ';'
#保存cookie
print(cookieValue)
#将cookie保存到指定路径的文件中
os.system("""echo '%s' >D:/铭专用/cookies.txt"""%(cookieValue))
#根据配置好的时间列表,获取需等待时间
t=update_sleep_time()
print("等待%s秒后刷新页面"%(t))
time.sleep(t)
#刷新页面
driver.refresh()
#等待足够的时间,确保网页已全部渲染
time.sleep(12)
2、在Linux系统
在Linux系统,要注意先配置浏览器的参数,设置无痕浏览。另外考虑到调试时无法看到网页,且正式运行时可能存在服务器渲染网页的不稳定,我们引入了网页扫描机制。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
#用于构建网页的扫描机制
import selenium.webdriver.support.ui as ui
,linux版,应使用无痕浏览器
profile.add_argument("-headless")
#网页最大化
profile.add_argument("--kiosk")
profile.add_argument('--no-sandbox')
profile.add_argument('--disable-dev-shm-usage')
profile.add_argument('--disable-gpu')
#指定火狐浏览器驱动的路径
s=Service(r"/data/app/seleniumdriver/geckodriver")
#调用火狐浏览器打开1个标签页
driver =webdriver.Firefox(service=s,options=profile)
#等待3秒,确保标签页已打开
driver.implicitly_wait(5)
#打开指定网页
driver.get('https://xxxxx0-my.sharepoint.com/personal/chenhm21_xxxxx_com/_layouts/15/onedrive.aspx')
#等待3秒,确保网页已完成渲染
time.sleep(3)
#配置扫描机制,N秒内每隔500毫秒扫描1次页面变化
wait = ui.WebDriverWait(driver,30)
其它地方和在Windows系统相差不大,完整的代码如下:
from selenium import webdriver
import time
#用于引用驱动的路径
from selenium.webdriver.chrome.service import Service
import datetime
#用于构建网页的扫描机制
import selenium.webdriver.support.ui as ui
import os
#通过By定位来调用网页的元素
from selenium.webdriver.common.by import By
#配置浏览器的参数
profile = webdriver.FirefoxOptions()
#设置无痕,linux版,应使用无痕浏览器
profile.add_argument("-headless")
#网页最大化
profile.add_argument("--kiosk")
profile.add_argument('--no-sandbox')
profile.add_argument('--disable-dev-shm-usage')
profile.add_argument('--disable-gpu')
#指定火狐浏览器驱动的路径
s=Service(r"/data/app/seleniumdriver/geckodriver")
#调用火狐浏览器打开1个标签页
driver =webdriver.Firefox(service=s,options=profile)
#等待3秒,确保标签页已打开
driver.implicitly_wait(5)
#打开指定网页
driver.get('https://xxxxx0-my.sharepoint.com/personal/chenhm21_xxxxx_com/_layouts/15/onedrive.aspx')
#等待3秒,确保网页已完成渲染
time.sleep(3)
#配置扫描机制,N秒内每隔500毫秒扫描1次页面变化
wait = ui.WebDriverWait(driver,30)
#输入账号
print("准备输入")
##调用扫描机制,来锁定网页中的元素,直至找到或者扫描时间耗尽
d1=wait.until(lambda driver: driver.find_element(by='id',value="i0116"))
##在锁定元素中输入信息
d1.send_keys("这里填写对应账号")
d2=wait.until(lambda driver: driver.find_element(by='id',value="idSIButton9"))
##点击指定元素
driver.execute_script("arguments[0].click();",d2)
print("已输入账号")
##等待3秒,确保网页已跳转下一页面,并完成渲染
time.sleep(3)
#输入密码
d3=wait.until(lambda driver: driver.find_element(by='id',value="i0118"))
d3.send_keys("这里填写对应账号的密码")
d4=wait.until(lambda driver: driver.find_element(by='id',value="idSIButton9"))
driver.execute_script("arguments[0].click();",d4)
print("开始登录")
print(datetime.datetime.now())
time.sleep(5)
print(datetime.datetime.now())
#确定通过手机短信验证
##调用扫描机制,来锁定网页中的元素,直至找到或者扫描时间耗尽;通过class name来锁定元素
d5=wait.until(lambda driver: driver.find_element(by=By.CLASS_NAME,value="table"))
print(datetime.datetime.now())
print("点击手机短信验证")
driver.execute_script("arguments[0].click();",d5)
print(datetime.datetime.now())
##将当前页面保存成图片
driver.get_screenshot_as_file('tp.png')
#配置验证码,填入手机短信收到的验证码
yanzhengma=input('请输入验证码:')
#输入验证码
d6=wait.until(lambda driver: driver.find_element(by='id',value="idTxtBx_SAOTCC_OTC"))
d6.send_keys(yanzhengma)
#点击验证
d7=wait.until(lambda driver: driver.find_element(by='id',value="idSubmit_SAOTCC_Continue"))
driver.execute_script("arguments[0].click();",d7)
print("已验证")
time.sleep(3)
#选择是否保持登录状态
try:
##打勾,选择保持
d8=wait.until(lambda driver: driver.find_element(by='id',value="KmsiCheckboxField"))
driver.execute_script("arguments[0].click();",d8)
print("选择保存默认登录")
##点击下一步
d9=wait.until(lambda driver: driver.find_element(by='id',value="idSIButton9"))
driver.execute_script("arguments[0].click();",d9)
print("点击确认")
time.sleep(12)
except Exception as e:
print("失败原因",e)
print("没有进入登录选项界面")
pass
#定时更新和获取,确保cookie可用
def update_sleep_time():
#更新时间列表,小时分钟
hous_list=[100,1100,2100]
count=0
hm=datetime.datetime.now().hour*100+datetime.datetime.now().minute
for h in hous_list:
count+=1
if h>hm:
n=datetime.datetime.now().hour*3600 + datetime.datetime.now().minute*60 + datetime.datetime.now().second
s=max(h*36 - n,5)
return s
break
elif count==len(hous_list):
n=datetime.datetime.now().hour*3600 + datetime.datetime.now().minute*60 + datetime.datetime.now().second
s=max(hous_list[0]*36 + 24*3600 - n,5)
return s
else:
continue
#定时循环获取cookie并保存
while True:
#获取cookie
cookie=driver.get_cookies()
cookieValue=''
for item in cookie:
cookieValue += item['name'] + '=' + item['value'] + ';'
#保存cookie
print(cookieValue)
#将cookie保存到指定路径的文件中
os.system("""echo '%s' >/data/insideJPY/chenhm21/99-ex_file/cookies"""%(cookieValue))
#根据配置好的时间列表,获取需等待时间
t=update_sleep_time()
print("等待%s秒后刷新页面"%(t))
time.sleep(t)
#刷新页面
driver.refresh()
#等待足够的时间,确保网页已全部渲染
time.sleep(12)