如何用Python自动访问无密码验证的外部公司SharePoint Excel文件?
方法1:Selenium模拟浏览器交互
这是适配你「邮箱+验证码」登录流程的最直接方案,通过模拟手动浏览器操作完成登录和文件访问:
安装依赖
先安装Selenium及对应浏览器驱动(以Chrome为例):pip install selenium确保ChromeDriver版本与本地Chrome浏览器匹配,可将驱动放入系统PATH或在代码中指定路径。
核心代码示例
模拟打开文件链接、输入邮箱、等待验证码输入,完成登录后读取Excel内容:from selenium import webdriver from selenium.webdriver.common.by import By import time import pandas as pd # 初始化Chrome浏览器 driver = webdriver.Chrome() try: # 打开目标Excel文件链接 driver.get("https://[Another Company].sharepoint.com/:x:/r/personal/[name of person]/_layouts/15/Doc.aspx?sourcedoc=%7B17AB449A-DCF4-471F-8129-11798DCDF24B%7D&file=2%20-%20Consulta%20Popular%202023-abr_2023.xlsx&action=default&mobileredirect=true") # 输入你的邮箱并提交 email_input = driver.find_element(By.ID, "i0116") email_input.send_keys("your-email@example.com") driver.find_element(By.ID, "idSIButton9").click() time.sleep(2) # 暂停30秒,手动输入邮箱收到的验证码并完成登录 print("请在30秒内输入邮箱验证码并完成登录操作") time.sleep(30) # 登录完成后,可点击下载按钮保存文件,再用pandas读取 # 示例:定位下载按钮(需根据实际页面调整XPATH) # download_btn = driver.find_element(By.XPATH, "//button[@aria-label='下载']") # download_btn.click() # time.sleep(5) # 读取已下载的Excel文件 df = pd.read_excel("2 - Consulta Popular 2023-abr_2023.xlsx") print(df.head()) finally: # 关闭浏览器 driver.quit()注意:页面元素的ID或XPATH可能随网站更新变化,需用浏览器开发者工具实时检查调整。
方法2:Microsoft Graph API(需对方公司配合)
如果对方SharePoint管理员同意,可通过Azure AD应用的设备代码流实现无密码授权,无需模拟浏览器:
前置条件
- 对方管理员在Azure AD中注册应用,授予
Files.Read权限(针对OneDrive/SharePoint文件) - 获取应用的
CLIENT_ID,以及目标文件的Graph API访问路径(可由对方提供或从文件链接转换)
- 对方管理员在Azure AD中注册应用,授予
核心代码示例
from azure.identity import DeviceCodeCredential from msgraph.core import GraphClient import pandas as pd from io import BytesIO # 替换为对方提供的应用ID CLIENT_ID = "your-client-id" # 目标文件的Graph API访问路径 FILE_GRAPH_PATH = "/users/[user-id]/drive/items/[file-id]/content" # 初始化设备代码凭证 credential = DeviceCodeCredential(client_id=CLIENT_ID) client = GraphClient(credential=credential) # 获取文件内容并读取 response = client.get(FILE_GRAPH_PATH) if response.status_code == 200: excel_data = BytesIO(response.content) df = pd.read_excel(excel_data) print(df.head())优势:无需模拟浏览器,稳定性更高;劣势:必须依赖对方公司完成Azure AD应用配置,流程相对复杂。
关键注意事项
- 验证码处理:邮箱验证码无法自动读取(除非你有邮箱API权限),Selenium方案需手动完成验证码输入步骤。
- 权限验证:确保共享文件夹已正确授予你访问权限,手动登录后能正常打开文件,否则自动化会失败。
- 元素定位:Selenium代码中的元素选择器需根据实际页面实时调整,避免因网站更新导致代码失效。
内容的提问来源于stack exchange,提问作者Wilian
相关产品推荐
相关产品推荐

