- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以使用 Python OneDrive SDK 将文件上传到 Microsoft SharePoint 网站的共享文档库?
This documentation 说它应该是(在第一句话中),但我无法使其工作。
我能够(使用 Azure AD)进行身份验证并上传到 OneDrive 文件夹,但在尝试上传到 SharePoint 文件夹时,我不断收到此错误:
"Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown."
我正在使用的代码返回一个带有错误的对象:
(...authentication...)
client = onedrivesdk.OneDriveClient('https://{tenant}.sharepoint.com/{site}/_api/v2.0/', auth, http)
client.item(path='/drive/special/documents').children['test.xlsx'].upload('test.xlsx')
我可以成功上传到https://{tenant}-my.sharepoint.com/_api/v2.0/
(注意后面的“-my”) {tenant}
) 并使用以下代码:
client = onedrivesdk.OneDriveClient('https://{tenant}-my.sharepoint.com/_api/v2.0/', auth, http)
returned_item = client.item(drive='me', id='root').children['test.xlsx'].upload('test.xlsx')
如何将相同的文件上传到 SharePoint 网站?
(Stack Overflow 上类似问题( 1 、 2 、 3 、 4 )的答案要么太模糊,要么建议使用不同的 API。我的问题是是否可以使用 OneDrive Python SDK,如果可以,如何做到这一点。)
<小时/>更新:这是我的完整代码和输出。 (敏感的原始数据被类似格式的乱码替换。)
import re
import onedrivesdk
from onedrivesdk.helpers.resource_discovery import ResourceDiscoveryRequest
# our domain (not the original)
redirect_uri = 'https://example.ourdomain.net/'
# our client id (not the original)
client_id = "a1234567-1ab2-1234-a123-ab1234abc123"
# our client secret (not the original)
client_secret = 'ABCaDEFGbHcd0e1I2fghJijkL3mn4M5NO67P8Qopq+r='
resource = 'https://api.office.com/discovery/'
auth_server_url = 'https://login.microsoftonline.com/common/oauth2/authorize'
auth_token_url = 'https://login.microsoftonline.com/common/oauth2/token'
http = onedrivesdk.HttpProvider()
auth = onedrivesdk.AuthProvider(http_provider=http, client_id=client_id,
auth_server_url=auth_server_url,
auth_token_url=auth_token_url)
should_authenticate_via_browser = False
try:
# Look for a saved session. If not found, we'll have to
# authenticate by opening the browser.
auth.load_session()
auth.refresh_token()
except FileNotFoundError as e:
should_authenticate_via_browser = True
pass
if should_authenticate_via_browser:
auth_url = auth.get_auth_url(redirect_uri)
code = ''
while not re.match(r'[a-zA-Z0-9_-]+', code):
# Ask for the code
print('Paste this URL into your browser, approve the app\'s access.')
print('Copy the resulting URL and paste it below.')
print(auth_url)
code = input('Paste code here: ')
# Parse code from URL if necessary
if re.match(r'.*?code=([a-zA-Z0-9_-]+).*', code):
code = re.sub(r'.*?code=([a-zA-Z0-9_-]*).*', r'\1', code)
auth.authenticate(code, redirect_uri, client_secret, resource=resource)
# If you have access to more than one service, you'll need to decide
# which ServiceInfo to use instead of just using the first one, as below.
service_info = ResourceDiscoveryRequest().get_service_info(auth.access_token)[0]
auth.redeem_refresh_token(service_info.service_resource_id)
auth.save_session() # Save session into a local file.
# Doesn't work
client = onedrivesdk.OneDriveClient(
'https://{tenant}.sharepoint.com/sites/{site}/_api/v2.0/', auth, http)
returned_item = client.item(path='/drive/special/documents')
.children['test.xlsx']
.upload('test.xlsx')
print(returned_item._prop_dict['error_description'])
# Works, uploads to OneDrive instead of SharePoint site
client2 = onedrivesdk.OneDriveClient(
'https://{tenant}-my.sharepoint.com/_api/v2.0/', auth, http)
returned_item2 = client2.item(drive='me', id='root')
.children['test.xlsx']
.upload('test.xlsx')
print(returned_item2.web_url)
输出:
Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown.
https://{tenant}-my.sharepoint.com/personal/user_domain_net/_layouts/15/WopiFrame.aspx?sourcedoc=%1ABCDE2345-67F8-9012-3G45-6H78IJKL9M01%2N&file=test.xlsx&action=default
最佳答案
在(SO 用户)sytech 的帮助下,我终于找到了解决方案。
我原来问题的答案是,使用原来的Python OneDrive SDK,不可能将文件上传到 Shared Documents
站点的 SharePoint Online
文件夹(目前写这个):当 SDK 查询 resource discovery service 时,它会删除 service_api_version
不是 v2.0
的所有服务。但是,我使用 v1.0
获取 SharePoint 服务,因此它被删除,尽管也可以使用 API v2.0 访问它。
但是,通过扩展 ResourceDiscoveryRequest
类(在 OneDrive SDK 中),我们可以为此创建一个解决方法。我设法通过以下方式上传文件:
import json
import re
import onedrivesdk
import requests
from onedrivesdk.helpers.resource_discovery import ResourceDiscoveryRequest, \
ServiceInfo
# our domain (not the original)
redirect_uri = 'https://example.ourdomain.net/'
# our client id (not the original)
client_id = "a1234567-1ab2-1234-a123-ab1234abc123"
# our client secret (not the original)
client_secret = 'ABCaDEFGbHcd0e1I2fghJijkL3mn4M5NO67P8Qopq+r='
resource = 'https://api.office.com/discovery/'
auth_server_url = 'https://login.microsoftonline.com/common/oauth2/authorize'
auth_token_url = 'https://login.microsoftonline.com/common/oauth2/token'
# our sharepoint URL (not the original)
sharepoint_base_url = 'https://{tenant}.sharepoint.com/'
# our site URL (not the original)
sharepoint_site_url = sharepoint_base_url + 'sites/{site}'
file_to_upload = 'C:/test.xlsx'
target_filename = 'test.xlsx'
class AnyVersionResourceDiscoveryRequest(ResourceDiscoveryRequest):
def get_all_service_info(self, access_token, sharepoint_base_url):
headers = {'Authorization': 'Bearer ' + access_token}
response = json.loads(requests.get(self._discovery_service_url,
headers=headers).text)
service_info_list = [ServiceInfo(x) for x in response['value']]
# Get all services, not just the ones with service_api_version 'v2.0'
# Filter only on service_resource_id
sharepoint_services = \
[si for si in service_info_list
if si.service_resource_id == sharepoint_base_url]
return sharepoint_services
http = onedrivesdk.HttpProvider()
auth = onedrivesdk.AuthProvider(http_provider=http, client_id=client_id,
auth_server_url=auth_server_url,
auth_token_url=auth_token_url)
should_authenticate_via_browser = False
try:
# Look for a saved session. If not found, we'll have to
# authenticate by opening the browser.
auth.load_session()
auth.refresh_token()
except FileNotFoundError as e:
should_authenticate_via_browser = True
pass
if should_authenticate_via_browser:
auth_url = auth.get_auth_url(redirect_uri)
code = ''
while not re.match(r'[a-zA-Z0-9_-]+', code):
# Ask for the code
print('Paste this URL into your browser, approve the app\'s access.')
print('Copy the resulting URL and paste it below.')
print(auth_url)
code = input('Paste code here: ')
# Parse code from URL if necessary
if re.match(r'.*?code=([a-zA-Z0-9_-]+).*', code):
code = re.sub(r'.*?code=([a-zA-Z0-9_-]*).*', r'\1', code)
auth.authenticate(code, redirect_uri, client_secret, resource=resource)
service_info = AnyVersionResourceDiscoveryRequest().\
get_all_service_info(auth.access_token, sharepoint_base_url)[0]
auth.redeem_refresh_token(service_info.service_resource_id)
auth.save_session()
client = onedrivesdk.OneDriveClient(sharepoint_site_url + '/_api/v2.0/',
auth, http)
# Get the drive ID of the Documents folder.
documents_drive_id = [x['id']
for x
in client.drives.get()._prop_list
if x['name'] == 'Documents'][0]
items = client.item(drive=documents_drive_id, id='root')
# Upload file
uploaded_file_info = items.children[target_filename].upload(file_to_upload)
对不同服务进行身份验证会为您提供不同的 token 。
关于python - 使用 Python OneDrive SDK 将文件上传到 MS SharePoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39981210/
我需要使用 power automate + Office 脚本从一个 Excel 工作表复制数据并粘贴(仅值)到另一个工作表 我开始使用下面链接中的答案创建流程。 Power Automate: C
我试图删除这个项目文件夹,但即使在我运行 rm -force 之后它仍然拒绝我.它向我展示了这个: is an NTFS junction point. Use the Force parameter
当我使用“知道此链接的任何人都可以查看此项目”选项在 UI 中创建共享链接时,我得到一个类似于 https://onedrive.live.com/redir?resid=XXX!YYYY&authk
(创建超链接后,我将在 OneNote 中使用它链接到我自己的 Onedrive 上的文件,仅供我使用!) 当我在线查看 Word 中的文件时,显示的 URL 是: https://onedrive.
我想在一个 rest API 调用中获取 office365 onedrive 文件夹中包含的所有文件和文件夹,有没有办法做到这一点? 最佳答案 没有特定的 API 调用来检索 Drive 的平面表示
我正在构建一个 Windows 服务,该服务使用以下方法通过 Graph API 连接到 OneDrive for Business: https://graph.microsoft.io/en-us
请允许我解释什么我在做什么以及如何我在做什么。 我在做什么? 我正在尝试使用其 REST API 将文件上传到 Onedrive来源:one drive api documentation 我正在使用
我正在尝试使用 java sdk 将文件上传到 OneDrive 特殊文件夹,但出现以下错误 错误代码:BadRequest 错误消息:使用“microsoft.graph.createUploadS
我正在尝试使用 OneDrive iOS SDK 将 OneDrive 集成到我的应用程序中。我设法做了我想做的大部分事情,但我似乎无法弄清楚如何在 OneDrive 上的文件夹(项目)中上传图像。上
Microsoft Graph 可以提供 List items shared with the signed-in user 。我想将此 REST 功能与 OneDrive file picker f
我正在尝试通过以下 URL 获取 OneDrive 访问 token https://login.live.com/oauth20_token.srf?client_id=YOUR_CLIENT_ID
我是 skydrive 的新生。然后我想在html中使用文件选择器,并从Interactive Live SDK复制演示代码。但运行结果,打开的窗口并没有直接到文件选择器页面,只是直接到我设置的red
如果我想在保存后使用打开的 Workbook 对象获取 Excel 文件的全名,但该文件已同步到 OneDrive,我会得到一个“https”地址,而不是其他程序无法解释的本地地址。 如何获取这样的文
我刚刚开始使用 OneDrive API。我有一个与 Google Drive 和 Dropbox 集成并从这些服务接收推送通知的应用程序,我希望包含 OneDrive 支持。 也许我没有在看 rig
尝试以不那么困惑的方式存储用户设置和默认保存的数据位置。 在 PC1 上, Label1.Caption := TPath.GetDocumentsPath; 向我显示 C:\Users\Mike\D
我想检查用户是否已经登录到 OneDrive,如果没有,则允许他们登录。我首先在 JS/HTML 项目中尝试过此操作。然后使用 C#/XAML 项目。 我查看了 C#/XAML OneDrive 代码
所以我制作了一个 OneDrive uploader ,它使用 Azure,目前它不适用于教育或工作场所帐户。它仅适用于普通的 Microsoft 帐户。如何让我的应用程序与其他类型的 Microso
我是 Azure 开发的新手。所以我尝试从微软文档( https://learn.microsoft.com/en-us/learn/modules/msgraph-access-file-data/
我正在尝试使用以下网址提取根文件夹中的所有文件: https://api.onedrive.com/v1.0/drive/root/children 但这也给了我同一文件夹下的所有文件夹。有没有办法只
我在引用中没有找到在 WP8.1 上使用 OneDrive SDK 创建新 OneDrive 文件夹的方法。我正在寻找一种跨设备和平台备份和同步的方法。 最佳答案 您可以使用 REST 在 OneDr
我是一名优秀的程序员,十分优秀!