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


在日常办公场景中,腾讯文档因其协同编辑的优势而广受青睐,但如何通过编程手段高效提取文档内容成为了一项普遍需求。遗憾的是,腾讯文档目前并未开放接口直接读取用户自建文档,而可供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 
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值