Почему скрипт Python для загрузки .xlsx из Sharepoint не работает только для некоторых URL? - PullRequest
4 голосов
/ 18 апреля 2019

Использование 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.
...