R语言访问企业SharePoint xlsx文件报错解决方案咨询
问题说明
需要通过R读取企业SharePoint云盘内存储的xlsx文件,目标文件原始访问地址:
https://xxxx.sharepoint.com/:x:/r/sites/cqa/xxxx/_layouts/15/doc2.aspx?sourcedoc=%7BFxxx390-B71D-4C71-B252-6E3DCA8E9FDA%7D&file=Updated%20LXXal%20Reqxxxxents%20for%20XXXXX%20XXXX%20Actixxxx.xlsx&action=default&mobileredirect=true&cid=0abe8bcd-c785-4c14-a9f3-263e8e806aa6
已尝试两种方案均失败:
- 调用
httr::GET携带账号密码发起请求,代码如下:
请求返回403权限错误,响应信息:require(httr) url <- "above url" r <- GET(url, authenticate("amit.sahoo@xxxx.com","password"))Date: 2022-04-08 13:07 Status: 403 Content-Type: text/plain; charset=utf-8 Size: 13 B - 调用
Microsoft365R::get_sharepoint_site("above url"),返回Need admin approval提示,无法完成认证。
失败原因说明
- 第一种方案失败是因为SharePoint Online基于Azure AD做身份校验,不支持HTTP Basic基础认证,直接在请求里传明文账号密码无法通过校验,所以返回403。
- 第二种方案失败是因为
Microsoft365R默认的交互登录模式申请了租户级的应用权限,大部分企业租户会限制普通用户给这类高权限应用授权,因此触发管理员审批提示;但只要你个人账号本身有目标文件的访问权限,不需要管理员审批也可以完成认证。
可行实现方案
以下方案均不需要租户管理员权限,只要你的账号能正常在浏览器打开目标文件即可使用。
方案1:Cookie认证直读(最快,不需要额外配置)
操作步骤:
- 浏览器登录企业SharePoint账号,正常打开目标xlsx的预览页面,按F12打开开发者工具,切换到「网络」面板,刷新页面,任意找一个发往
xxxx.sharepoint.com域名的请求,复制请求头中完整的Cookie字段值。 - 在文件预览页点击「下载」按钮,在网络面板里抓到
download.aspx开头的请求,复制该请求的URL作为文件直链。 - 运行以下代码读取文件:
library(httr) library(readxl) # 替换为你抓到的下载直链 download_url <- "替换为实际下载直链" # 替换为你从浏览器复制的完整Cookie值 cookie <- "替换为实际Cookie内容" # 发起请求下载文件二进制内容 resp <- GET(download_url, add_headers(Cookie = cookie)) # 写入临时文件 temp_xlsx <- tempfile(fileext = ".xlsx") writeBin(content(resp, "raw"), temp_xlsx) # 读取为data.frame result_df <- read_excel(temp_xlsx) # 删除临时文件 unlink(temp_xlsx)
注意:Cookie有固定有效期,失效后重新从浏览器复制替换即可,不需要调整其他代码。
方案2:Microsoft365R设备码登录(长期稳定,不需要反复复制Cookie)
操作步骤:
- 不要直接传入完整的文件页URL调用
get_sharepoint_site,先传入站点根地址,指定设备码认证模式:
library(Microsoft365R) library(readxl) # 站点地址填到sites/cqa层级即可 sharepoint_site <- get_sharepoint_site( site_url = "https://xxxx.sharepoint.com/sites/cqa/", auth_type = "device_code" )
- 运行代码后控制台会输出登录验证地址和设备码,在浏览器打开对应地址,输入设备码,用你的企业账号完成个人授权即可——这个流程只申请你个人账号的委托权限,不会触发租户级管理员审批要求。
- 认证完成后,定位到目标文件读取即可:
# 获取站点默认文档库 drive <- sharepoint_site$get_drive() # 替换为文件在文档库中的实际相对路径 target_file <- drive$get_item("xxxx/Updated LXXal Reqxxxxents for XXXXX XXXX Actixxxx.xlsx") # 下载到临时文件读取 temp_xlsx <- tempfile(fileext = ".xlsx") target_file$download(dest = temp_xlsx) result_df <- read_excel(temp_xlsx) unlink(temp_xlsx)
认证信息会存在本地缓存里,后续运行代码不需要重复登录。
方案3:共享链接改造法
如果不方便抓包,可以在SharePoint网页端选中目标文件,点击「共享」,生成组织内拥有查看权限的共享链接,把链接末尾的?web=1参数替换为?download=1,就得到了可直接下载的链接,后续可以结合Windows本地保存的SharePoint凭据,用curl::curl_download下载后读取,不需要手动复制Cookie。
内容的提问来源于stack exchange,提问作者amit sahoo
相关产品推荐
相关产品推荐

