[Python]腾讯文档健康打卡 2022/1/17更新
1. 前置准备:
一个Python编辑器,如:pycharm
-
安装好Python并设置环境变量
Python官网
环境变量大致设置流程cmd输入[python]和[pip]验证一下环境变量配置是否成功
测试是否成功 -
pip 安装 selenium 以及 openpyxl
打开cmd输入以下命令
(记得不能挂VPN,挂了会出错)
pip install selenium
pip install openpyxl
安装Chrome谷歌浏览器
-
下载对应版本的chromedriver
阿里镜像
打开谷歌浏览器的关于 可以看见内核版本Chrome关于界面
放在Python安装目录 就环境变量那个
Python安装目录
2. 正式开始:
打开pycharm新建一个项目
新建一个Python文件
-
接下来就是代码了,主要思路就是通过方向键实现表格行列移动到目标表格:
import datetime import time from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys def get_xy(): # 获取当前坐标 a1 = driver.find_element(By.CLASS_NAME, "bar-label").text xy_str = ["", ""] for i in a1: if 'A' <= i <= 'Z': xy_str[0] += str(ord(i) - ord('A') + 1) else: xy_str[1] += i xy_int = [int(xy_str[0]), int(xy_str[1])] return xy_int def goto(goto_xy): # 去目标单元格 xy = get_xy() # 获得当前坐标 while xy != goto_xy: # 不停的移动直到到达目标位置 可能会死循环 print("目标位置", goto_xy, "> 当前位置", xy, "> ", end='') if xy[0] > goto_xy[0]: ActionChains(driver).send_keys(Keys.LEFT).perform() print('←', end='') elif xy[0] < goto_xy[0]: ActionChains(driver).send_keys(Keys.RIGHT).perform() print('→', end='') if xy[1] > goto_xy[1]: ActionChains(driver).send_keys(Keys.UP).perform() print('↑', end='') elif xy[1] < goto_xy[1]: ActionChains(driver).send_keys(Keys.DOWN).perform() print('↓', end='') xy = get_xy() print(" > 移动后位置", xy) # 自动登录网页 print() driver = webdriver.Chrome() driver.get( "填你的链接" ) # 腾讯文档的链接 # 登入账号,用快速登入的功能,前提,已经电脑qq登入了 time.sleep(3) # 等待3秒 driver.find_element(By.ID, "header-login-btn").click() driver.implicitly_wait(1) driver.find_element(By.ID, 'qq-tabs-title').click() driver.implicitly_wait(1) driver.switch_to.frame("login_frame") try: driver.find_element(By.ID, "img_out_XXXXXXXXX").click() # 这里要改成自己的QQ号 print("快捷登录成功") except: # 发生错误时 切换成 账号密码登录(未经过测试,可能无用) driver.find_element(By.ID, "switcher_plogin").click() time.sleep(1) driver.find_element(By.ID, "u").send_keys("") # qq driver.find_element(By.ID, "p").send_keys("") # 密码 driver.find_element(By.ID, "login_button").click() print("账号登录成功") driver.switch_to.parent_frame() time.sleep(3) date = datetime.datetime.now().day + 2 # 这里[2]根据实际情况修改 list_xy = [date, 27] # 要填写的单元格,会根据日期变化 [27]改成自己所在的行 list_text = ["湖北XX平安", "湖北XX平安", "湖北XX平安", "湖北XX平安"] # 因为要帮寝室的一起填所以写的连填4行健康打卡 只填一个的话只写一个文本就行 gotoXY = list_xy[0] # 目标单元格的数字坐标 goto(gotoXY) for i in range(len(list_text)): text = list_text[i] # 打卡文本信息 driver.find_element(By.CLASS_NAME, 'formula-input').click() # 选中编辑框 editor = driver.find_element(By.ID, 'alloy-simple-text-editor') # 保存编辑框元素 if text in editor.text: # 如果编辑框里包含打卡文本 print("今日以完成打卡,不再重复.") else: ActionChains(driver).key_down(Keys.CONTROL).key_down('a').perform() # 全选 editor.send_keys(text) # 填充健康打卡信息 print("完成打卡") editor.send_keys(Keys.ENTER) # 回车 time.sleep(10) # 等待10秒人工核对是否正确 driver.quit() # 退出浏览器