定时自动获取腾讯企微文档的cookie

本文档介绍了如何使用Python的selenium库和火狐浏览器自动化登录企微并获取Cookie。详细步骤包括安装selenium和驱动,编写登录脚本,处理iframe以及利用JavaScript触发登录。此外,还提供了通过鼠标点击方式的替代方案。


在日常办公场景中,腾讯文档因其协同编辑的优势而广受青睐,但如何通过编程手段高效提取文档内容成为了一项普遍需求。遗憾的是,腾讯文档目前并未开放接口直接读取用户自建文档,而可供API调用生成的文档,虽支持读取,却不支持人工编辑,实用性大打折扣,陷入了两难境地。

为破解这一困局,探索利用爬虫技术成为了一条可行之路。在这场技术挑战中,核心秘钥非Cookie莫属,它如同开启信息宝库的钥匙,然而腾讯文档的Cookie有效期仅为一周左右,如何自动化地刷新并获取这一"时效宝藏",成为了攻克这一难题的重中之重。

本篇内容,正是致力于详尽记录这一探索旅程,旨在分享如何巧妙解决自动获取腾讯文档Cookie这一关键技术瓶颈的实践智慧,为渴望自动化处理文档信息的同仁们铺就一条更为顺畅的道路。

一、安装selenium库和火狐浏览器及驱动

使用selenium需要先下载对应版本的浏览器驱动,并配置路径,安装selenium库很简单,在命令窗口使用下面的命令:

pip install selenium

本次解题思路是利于浏览器自动登录的特性,所以任务需要部署在windows系统

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")

二、编写自动化登录的python脚本

前提条件:企微已经登录,这样打开网页后,才可以触发快捷登录。
先导入所需的python库,配置引用驱动的路径,打开网页。

# -*- coding: utf-8 -*-
import logging
import os
import time
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.firefox.options import Options as FirefoxOptions
import requests
import psutil
import paramiko


# 正确设置FirefoxDriver路径,路径要切换成自己的
geckodriver_path = "D:/Program_Files/Anaconda3/geckodriver.exe"
service = FirefoxService(executable_path=geckodriver_path)

# 初始化Firefox选项
firefox_options = FirefoxOptions()
driver = webdriver.Firefox(service=service, options=firefox_options)
# 设置隐式等待时间,确保页面渲染到位


driver.implicitly_wait(10)
# 打开指定URL
driver.get("https://doc.weixin.qq.com/home/recent")

按F12进入开发者模式,然后点去左上角的“选取页面中的元素”或者按组合键:Ctrl+Shift+C;然后将鼠标移动至,需要锁定的元素位置,查看元素的ID或者其它属性值。(建议优先选择ID)
在这里插入图片描述
注意点:从下面红框位置,我们看到目标元素是在第二层的iframe里面(嵌套关系),所以要先切换到第一层,再切换到第二层,如此才能锁定目标元素
第一层iframe有对应的ID,优先考虑用ID锁定,第二层没有,可以考虑用索引锁定

# 切换到第一个iframe
first_frame = driver.find_element(By.ID, "login_frame")  # 请根据实际情况修改ID
driver.switch_to.frame(first_frame)
# 切换到第二个iframe,第二个iframe是位于第一个之中,且处于第一个,因无id,可通过索引调用
driver.switch_to.frame(0)

下一步要锁定目标元素,需要注意的是,为确保目标元素处于可交互状态,我们采用等待机制,并要给与足够的时间

wait = WebDriverWait(driver, 30)
button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'van-button__content')))

在调试过程中发现,这个事件,发现通过常规的点击无效,所以采用JavaScript触发

 # 这个事件,需JavaScript代码来直接触发事件,而非使用Selenium的点击方法。
driver.execute_script("arguments[0].click();", button)

至此就借助快捷登录,进行文档主页,可以开始获取cookie
但需要注意的是,由于跳转后,上下文已经发生改变,所以先刷新网页,再读取cookie,同样的,为确保刷新完成,我们采用等待机制,当新的上下文中的某个元素可以被找到时,再读取cookie

driver.refresh()
time.sleep(5)
#待定上下文的元素出现,
wait = WebDriverWait(driver, 25).until(
      EC.element_to_be_clickable((By.ID, 'container')))
cookie = driver.get_cookies()
cookieValue = ''
for item in cookie:
    cookieValue += item['name'] + '=' + item['value'] + ';'

随后把获取到的cookieValue保存到指定的位置即可,下面就不展开解释。
需要特别说明的是,在配置任务计划程序时,安全选项一定要选择“只有在用户登录时运行”
在这里插入图片描述

附:在调试过程中,也摸索了通过鼠标点击的方式,来实现快速登录,也留下记录供参考

首先控制打开浏览器的位置和尺寸大小,这边定在右上角(左上角的鼠标自动操作一般会被系统阻止)尺寸为1000*800

firefox_options = FirefoxOptions()
driver=webdriver.Firefox(service=service, options=firefox_options)
# 先最大化窗口,然后再调整位置和大小,这有时能避免一些窗口管理器的限制
driver.maximize_window()
# 获取屏幕尺寸
screen_width, screen_height = pyautogui.size()
# 计算右上角的坐标
# 注意:最大化后再设置大小和位置可能需要稍微调整逻辑,这里直接按原定大小计算位置
position_x = screen_width - 1000
position_y = 0
# 使用Selenium API设置窗口位置
driver.set_window_position(position_x, position_y)
driver.set_window_size(1000, 800)  # 设置窗口大小,确保与预期一致
# 设置隐式等待时间,确保页面渲染到位
driver.implicitly_wait(5)
# 打开指定URL
driver.get("https://doc.weixin.qq.com/home/recent")

然后先通过pyautogui.position()得知“快捷登录”元素的屏幕位置

x, y = 2318, 535
pyautogui.click(x, y)

如此也可以进入到文档首页

三、完整代码

1、鼠标点击版

# -*- coding: utf-8 -*-
"""
Created on Wed May 29 10:30:40 2024
全部通过selenium实现,无需桌面交互
@author: chenhm21
"""
import logging
import os
import time
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.firefox.options import Options as FirefoxOptions
import requests
import psutil
import paramiko
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值