Использование Python Office365-REST-Python-Client. Я написал следующую функцию Python для загрузки электронных таблиц Excel из Sharepoint (на основе ответа на Как читать файлы Excel в Интернете (Office365) в Python с помощью Work илиШкольная учетная запись? )
import sys
from urlparse import urlparse
from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext
from office365.sharepoint.file import File
xmlErrText = "<?xml version=\"1.0\" encoding=\"utf-8\"?><m:error"
def download(sourceURL, destPath, username, password):
print "Download URL: {}".format(sourceURL)
urlParts = urlparse(sourceURL)
baseURL = urlParts.scheme + "://" + urlParts.netloc
relativeURL = urlParts.path
if len(urlParts.query):
relativeURL = relativeURL + "?" + urlParts.query
ctx_auth = AuthenticationContext(baseURL)
if ctx_auth.acquire_token_for_user(username, password):
try:
ctx = ClientContext(baseURL, ctx_auth)
web = ctx.web
ctx.load(web)
ctx.execute_query()
except:
print "Failed to execute Sharepoint query (possibly bad username/password?)"
return False
print "Logged into Sharepoint: {0}".format(web.properties['Title'])
response = File.open_binary(ctx, relativeURL)
if response.content.startswith(xmlErrText):
print "ERROR response document received. Possibly permissions or wrong URL? Document content follows:\n\n{}\n".format(response.content)
return False
else:
with open(destPath, 'wb') as f:
f.write(response.content)
print "Downloaded to: {}".format(destPath)
else:
print ctx_auth.get_last_error()
return False
return True
Эта функция отлично работает для некоторых URL-адресов, но не работает для других, при неудачной печати выводится следующее содержимое документа «файл не существует» (для удобства чтения добавляются новые строки и пробелы):
<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code>
-2130575338, Microsoft.SharePoint.SPException
</m:code>
<m:message xml:lang="en-US">
The file /sites/path/to/document.xlsx does not exist.
</m:message>
</m:error>
Я знаю, что имя пользователя и пароль верны.Действительно, изменение пароля приводит к совершенно другой ошибке.
Я обнаружил, что эта ошибка может возникать, когда документ не существует или когда у него недостаточно прав для доступа к документу.
Однако, используя то же имя пользователя и пароль, я могу загрузить документ с тем же URL-адресом в веб-браузере.
Обратите внимание, что эта же функция стабильно работает для некоторых URL-адресов .xlsx в том же репозитории Sharepoint, нопостоянно терпит неудачу для некоторых других URL-адресов .xlsx в том же репозитории Sharepoint.
Мое единственное предположение состоит в том, что существуют некоторые более детальные разрешения, которыми необходимо управлять.Но я совершенно не осведомлен об этом, если они существуют.
Может кто-нибудь помочь мне разобраться, почему происходит сбой, и выяснить, как заставить его работать для всех необходимых файлов, которые я уже могу загрузить в Интернетебраузер?
Дополнительные примечания к комментариям ниже
- Сбои в некоторых некоторых URL-адресах совпадают.Успехи соответствуют другим URL.Т.е. для одного URL результат всегда один и тот же - он не приходит и не уходит.
- Файлы не были перемещены или удалены.Я могу загрузить их с помощью браузеров / ПК, которые никогда ранее не обращались к этим файлам.
- Источником URL является сам Sharepoint.Поиск в Sharepoint включает эти файлы в список результатов с URL-адресом под каждым файлом.Это URL, который я использую для каждого файла.(Для некоторых файлов скрипт работает, а для других - нет; для всех файлов браузер работает с одним и тем же URL-адресом.)
- Все URL-адреса правильно закодированы.В частности, пробелы кодируются
%20
.