Office365-rest-python-client: рдореИрдВ рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рдкрд░ рдлрд╛рдЗрд▓ рдХреИрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЬреБрд▓ре░ 2017  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vgrem/Office365-REST-Python-Client

рдореИрдВ рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рдкрд░ рдПрдХ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реВрдВ?

def upload_file(ctx, listTitle, path):
    list_obj = ctx.web.lists.get_by_title(listTitle)
    folder = list_obj.root_folder
    ctx.load(folder)
    ctx.execute_query()

    files = folder.files
    with open(path, 'rb') as f:
        content = f.read()
        file_creation_information = FileCreationInformation()
        file_creation_information.overwrite = True
        file_creation_information.url = path
        file_creation_information.content = content
        file_new = files.add(file_creation_information)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@benpolinsky рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЕрдВрддрддрдГ рдпрд╣ рдХрд╛рдо рдорд┐рд▓ рдЧрдпрд╛ред рдореБрдЭреЗ рдкрд╣рд▓реЗ рдлреЙрд░реНрдо рдХреЛ рдкрдЪрд╛рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реБрдИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext
from office365.runtime.utilities.request_options import RequestOptions

from office365.sharepoint.file_creation_information import FileCreationInformation
from settings import settings
import requests
import os
from os.path import basename


ctx_auth = AuthenticationContext(url=settings['url'])
if ctx_auth.acquire_token_for_user(username=settings['username'], password=settings['password']):
    upload_binary_file("c:\temp\myfile.txt",ctx_auth)

def upload_binary_file(file_path, ctx_auth):
    """Attempt to upload a binary file to SharePoint"""

    base_url = settings['url']
    folder_url = "MyFolder"
    file_name = basename(file_path)
    files_url ="{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/Files/add(url='{2}', overwrite=true)"
    full_url = files_url.format(base_url, folder_url, file_name)

    options = RequestOptions(settings['url'])
    context = ClientContext(settings['url'], ctx_auth)
    context.request_form_digest()

    options.set_header('Accept', 'application/json; odata=verbose')
    options.set_header('Content-Type', 'application/octet-stream')
    options.set_header('Content-Length', str(os.path.getsize(file_path)))
    options.set_header('X-RequestDigest', context.contextWebInformation.form_digest_value)
    options.method = 'POST'

    with open(file_path, 'rb') as outfile:

        # instead of executing the query directly, we'll try to go around
        # and set the json data explicitly

        context.authenticate_request(options)

        data = requests.post(url=full_url, data=outfile, headers=options.headers, auth=options.auth)

        if data.status_code == 200:
            # our file has uploaded successfully
            # let's return the URL
            base_site = data.json()['d']['Properties']['__deferred']['uri'].split("/sites")[0]
            relative_url = data.json()['d']['ServerRelativeUrl'].replace(' ', '%20')

            return base_site + relative_url
        else:
            return data.json()['error']

рд╕рднреА 10 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ ClientRequest class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред

   def upload_binary_file(self, file):
        """Attempt to upload a binary file to SharePoint"""

        folder_url = "folder_to_upload_to"
        text_file = basename(file.name)
        full_url = "{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/Files/add(url='{2}', overwrite=true)".format(self.base_url, folder_url, text_file)
        options = RequestOptions(full_url)
        context = ClientContext(full_url, self.ctx_auth)
        options.set_header('Accept', 'application/json; odata=verbose')
        options.set_header('Content-Type', 'application/octet-stream')
        options.set_header('Content-Length', str(os.path.getsize(file.name)))
        options.set_header('X-RequestDigest', YOUR_FORM_DIGEST)
        options.method = 'POST'
        file_name = file.name        
        with open(file_name, 'rb') as outfile:

            # instead of executing the query directly, we'll try to go around
            # and set the json data explicitly

            context.authenticate_request(options)

            data = requests.post(url=full_url, data=outfile, headers=options.headers, auth=options.auth)
            if data.status_code == 200:
                # our file has uploaded successfully
                # let's return the URL
                base_site = data.json()['d']['Properties']['__deferred']['uri'].split("/sites")[0]
                relative_url = data.json()['d']['ServerRelativeUrl'].replace(' ', '%20')

                return base_site + relative_url
            else:
                return "Log Failed to Upload" 

@benpolinsky рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЕрдВрддрддрдГ рдпрд╣ рдХрд╛рдо рдорд┐рд▓ рдЧрдпрд╛ред рдореБрдЭреЗ рдкрд╣рд▓реЗ рдлреЙрд░реНрдо рдХреЛ рдкрдЪрд╛рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реБрдИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext
from office365.runtime.utilities.request_options import RequestOptions

from office365.sharepoint.file_creation_information import FileCreationInformation
from settings import settings
import requests
import os
from os.path import basename


ctx_auth = AuthenticationContext(url=settings['url'])
if ctx_auth.acquire_token_for_user(username=settings['username'], password=settings['password']):
    upload_binary_file("c:\temp\myfile.txt",ctx_auth)

def upload_binary_file(file_path, ctx_auth):
    """Attempt to upload a binary file to SharePoint"""

    base_url = settings['url']
    folder_url = "MyFolder"
    file_name = basename(file_path)
    files_url ="{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/Files/add(url='{2}', overwrite=true)"
    full_url = files_url.format(base_url, folder_url, file_name)

    options = RequestOptions(settings['url'])
    context = ClientContext(settings['url'], ctx_auth)
    context.request_form_digest()

    options.set_header('Accept', 'application/json; odata=verbose')
    options.set_header('Content-Type', 'application/octet-stream')
    options.set_header('Content-Length', str(os.path.getsize(file_path)))
    options.set_header('X-RequestDigest', context.contextWebInformation.form_digest_value)
    options.method = 'POST'

    with open(file_path, 'rb') as outfile:

        # instead of executing the query directly, we'll try to go around
        # and set the json data explicitly

        context.authenticate_request(options)

        data = requests.post(url=full_url, data=outfile, headers=options.headers, auth=options.auth)

        if data.status_code == 200:
            # our file has uploaded successfully
            # let's return the URL
            base_site = data.json()['d']['Properties']['__deferred']['uri'].split("/sites")[0]
            relative_url = data.json()['d']['ServerRelativeUrl'].replace(' ', '%20')

            return base_site + relative_url
        else:
            return data.json()['error']

рдореИрдВ рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреАрдЖрдИ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред

@attibalazs рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣рд╛рдБ рдЕрдЯрдХ рдЧрдпрд╛:

рдлрд╝рд╛рдЗрд▓ "C:\Python27\lib\site-packages\office365\runtime\auth\saml_token_provider.py", рд▓рд╛рдЗрди 65, get_authentication_cookie рдореЗрдВ
рд╡рд╛рдкрд╕реА 'FedAuth=' + self.FedAuth + '; rtFa=' + self.rtFa
рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: 'str' рдФрд░ 'noneType' рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдПрд╕рдкреА рдСрдирд▓рд╛рдЗрди рдпреВрдЖрд░рдПрд▓, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдИрдбреА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реАрдХреНрд░реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА?

рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @attibalazs ред рд╡реЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдерд╛ред

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ.. рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб [email protected] рдЬреИрд╕реЗ рд╕рдВрдЧрдарди рдЦрд╛рддреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ [email protected] рдЬреИрд╕рд╛ рдЙрдЪрд┐рдд Office365 рдЦрд╛рддрд╛

рдирдорд╕реНрддреЗ, рдореИрдВрдиреЗ @attibalazs рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рддрдм рддрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛:
data = requests.post(url=full_url, data=outfile, headers=options.headers, auth=options.auth)

рдореБрдЭреЗ 403 рдХрд╛ рджрд░реНрдЬрд╛ рдорд┐рд▓рд╛ рд╣реИред рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рдЦрд╛рддрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреБрдЫ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?

@attibalazs
рдПрдкреАрдЖрдИ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рд╕реНрдерд┐рддрд┐ = ctx_auth.acquire_token_for_app () рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрдЬрд╛рдп = ctx_auth.acquire_token_for_user (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб)
рдФрд░ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдкрд╛рдЗрдк рдЗрдВрд╕реНрдЯрд╛рд▓ -рдпреВ рд╕рд░реНрдЯрд┐рдлрд╝рд┐рдХреЗрдЯ

рд╣реИрд▓реЛ, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рдпреЛрдЬрди рдЬреЛрдбрд╝реЗ рд╣реИрдВ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

рдореИрдВ рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рдкрд░ рдПрдХ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реВрдВ?

```
рдбреАрдИрдПрдлрд╝ рдЕрдкрд▓реЛрдб_рдлрд╛рдЗрд▓ (рд╕реАрдЯреАрдПрдХреНрд╕, рд╕реВрдЪреА рд╢реАрд░реНрд╖рдХ, рдкрде):
list_obj = ctx.web.lists.get_by_title(listTitle)
рдлрд╝реЛрд▓реНрдбрд░ = list_obj.root_folder
ctx.load (рдлрд╝реЛрд▓реНрдбрд░)
ctx.execute_query ()

files = folder.files
    ctx.load(files)
    ctx.execute_query()
with open(path, 'rb') as f:
    content = f.read()
    file_creation_information = FileCreationInformation()
    file_creation_information.overwrite = True
       file_creation_information.url = os.path.basename(path)
    file_creation_information.content = content
    file_new = files.add(file_creation_information)
       ctx.load(files)
       ctx.execute_query()

рдЕрднрд┐рд╡рд╛рджрди,

рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:

SharePoint рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

#read a local file
path = "../tests/data/SharePoint User Guide.docx"
with open(path, 'rb') as content_file:
    file_content = content_file.read()

#upload it into Documents library
target_folder = context.web.lists.get_by_title("Documents").rootFolder
info = FileCreationInformation()
info.content = file_content
info.url = os.path.basename(path)
info.overwrite = True
target_file = target_folder.files.add(info)
context.execute_query()

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдлрд╝рд╛рдЗрд▓ 2 рдПрдордмреА рд╕реЗ рдмрдбрд╝реА рд╣реИ рддреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

ctx = ClientContext(site_url, ctx_auth)
size_1Mb = 1000000
local_path = "./data/big_buck_bunny.mp4"
target_url = "/Shared Documents"
result_file = ctx.web.get_folder_by_server_relative_url(target_url).files.create_upload_session(local_path, size_1Mb, print_upload_progress)
ctx.execute_query()
print('File {0} has been uploaded successfully'.format(result_file.properties['ServerRelativeUrl']))

рдХрд╣рд╛рдВ рд╣реИ

def print_upload_progress(offset):
    print("Uploaded '{0}' bytes...".format(offset))

рдпрджрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдЕрдкрд▓реЛрдб рдЕрдиреБрд░реЛрдз рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ @attibalazs рдФрд░ @benpolinsky рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рд╡рд╛рджрд┐рдо

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

liuliqiu picture liuliqiu  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bobbydurrett picture bobbydurrett  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

spurthikaribasaiah picture spurthikaribasaiah  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

oktorok picture oktorok  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pobs93 picture pobs93  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ