Python: GetContextWebInformation для обновления элемента списка SharePoint - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь читать / записывать элементы списка SharePoint через python

Я написал ниже, что успешно читает подробности SharePoint в качестве ответа

import requests
from requests_ntlm import HttpNtlmAuth
requests.packages.urllib3.disable_warnings() # suprress all SSL warnings
url = "https://sharepoint.company.com/_api/web/lists/getbytitle('listname')/items?$top=3&$select=ID,Title,Notes" # just reading 3 columns
headers = {'accept': 'application/xml;q=0.9, */*;q=0.8'}
response = requests.get(url, headers=headers, auth=HttpNtlmAuth('domain\\username','Password'), verify=False, stream=True)

Теперь, когда я пытаюсь обновитьодин из элементов, я получаю response 403 ошибка

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}
json_data = [{ '__metadata': { 'type': 'SP.List' }, 'Notes': 'Test Note' }]
response = requests.post(url, { '__metadata': { 'type': 'SP.List' }, 'Notes': 'Test Note' }, headers = self.headers, auth=HttpNtlmAuth('domain\\username','Password'), verify=False)

Microsoft SharePoint говорит, что X-RequestDigest: form digest value должен быть отправлен в заголовках.

После прочтения статей нашел следующий код для получения form digest value:

site_url = "https://sharepoint.company.com"
login_user = 'domain\\username'
auth = HttpNtlmAuth(login_user, 'PASSWORD')
sharepoint_contextinfo_url = self.site_url + '/_api/contextinfo'
headers = {
        'accept': 'application/json;odata=verbose',
        'content-type': 'application/json;odata=verbose',
        'odata': 'verbose',
        'X-RequestForceAuthentication': 'true'
    }
r = requests.post(sharepoint_contextinfo_url, auth=auth, headers=headers, verify=False)
form_digest_value = self.r.json()['d']['GetContextWebInformation']['FormDigestValue']

Но я не получаю form_digest_value

Я пытался получить доступ кcontext info через браузер, как https://sharepoint.company.com/_api/contextinfo и получил ниже ошибку:

<?xml version="1.0" encoding="UTF-8"?>
-<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <m:code>-1, Microsoft.SharePoint.Client.ClientServiceException</m:code>
    <m:message xml:lang="en-US">The HTTP method 'GET' cannot be used to access the resource 'GetContextWebInformation'. The operation type of the resource is specified as 'Default'. Please use correct HTTP method to invoke the resource.</m:message>
</m:error>

Может кто-нибудь, пожалуйста, помогите, как получить значение дайджеста формы?Или есть какой-нибудь способ обновить элемент списка SharePoint?

Заранее спасибо!

Обновлено

После прочтения этой статьи , Я могу понять, что мы можем получить значение __REQUESTDIGEST из Page source.При обновлении страницы каждую минуту, можно увидеть значение отличается.Как я могу получить значение дайджеста запроса через Python и сохранить его хотя бы в течение 5 минут?

1 Ответ

0 голосов
/ 14 февраля 2019

Размещая ответ, может быть, он может кому-то помочь

Данные, переданные для обновления, здесь не выполняются должным образом

Итак, передано, как показано ниже:

json_data = {
    "__metadata": { "type": "SP.Data.TasksListItem" },
    "Title": "updated title from Python"
}

ипередал json_data запросам, подобным приведенным ниже:

r= requests.post(api_page, json.dumps(json_data), auth=auth, headers=update_headers, verify=False).text    

После вышеуказанных изменений код обновил Title в SharePoint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...