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)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值