如何通过Python中的REST API访问SharePoint网站?

29

我在本地 VM 中的 SharePoint 2013 上有以下网站:

http://win-5a8pp4v402g/sharepoint_test/site_1/

当我从浏览器访问它时,会提示我输入用户名和密码,然后正常工作。但是我正在尝试使用 Python 中的 REST API 进行相同操作。我正在使用 requests 库,这是我的代码:

import requests
from requests.auth import HTTPBasicAuth


USERNAME = "Administrator"

PASSWORD = "password"

response = requests.get("http://win-5a8pp4v402g/sharepoint_test/site_1/", auth=HTTPBasicAuth(USERNAME, PASSWORD))

print response.status_code

然而,我收到了 401 错误。我不明白,我错过了什么?

注意:我遵循了这篇文章 http://tech.bool.se/using-python-to-request-data-from-sharepoint-via-rest/

4个回答

43

你的SharePoint网站可能使用不同的身份验证方案。可以通过检查Firebug或Chrome开发工具中的网络流量来进行确认。

幸运的是,Requests库支持多种身份验证选项:http://docs.python-requests.org/en/latest/user/authentication/

例如,我需要访问的其中一个网络使用NTLM身份验证。在安装了 requests-ntml 插件后,我能够使用类似于以下代码的方式访问该网站:

import requests
from requests_ntlm import HttpNtlmAuth

requests.get("http://sharepoint-site.com", auth=HttpNtlmAuth('DOMAIN\\USERNAME','PASSWORD'))

它运行得非常好。HttpNtlmAuth(uid,pwd)是解决问题的方法。这是为了内部共享点而需要此代码。感谢分享。 - Doogle
6
我在内网和互联网上收到<Response [403]>。有任何解决方法吗?谢谢。 - user3867743
以防某人的公司已经锁定了NTLM:还有一种选项是使用requests_negotiate_sspi包。请参阅此链接,了解这些选项的概述。 - Stephan

4
以下是一个使用Python调用SharePoint 2016 REST API创建站点的示例。
import requests,json,urllib
from requests_ntlm import HttpNtlmAuth

root_url = "https://sharepoint.mycompany.com"
headers = {'accept': "application/json;odata=verbose","content-type": "application/json;odata=verbose"}
##"DOMAIN\username",password 
auth = HttpNtlmAuth("MYCOMPANY"+"\\"+"UserName",'Password')


def getToken():
    contextinfo_api = root_url+"/_api/contextinfo"
    response = requests.post(contextinfo_api, auth=auth,headers=headers)
    response =  json.loads(response.text)
    digest_value = response['d']['GetContextWebInformation']['FormDigestValue']
    return digest_value

def createSite(title,url,desc):
    create_api = root_url+"/_api/web/webinfos/add"
    payload = {'parameters': {
            '__metadata':  {'type': 'SP.WebInfoCreationInformation' },
            'Url': url,
            'Title': title,
            'Description': desc,
            'Language':1033,
            'WebTemplate':'STS#0',
            'UseUniquePermissions':True}
        }
    response = requests.post(create_api, auth=auth,headers=headers,data=json.dumps(payload))
    return json.loads(response.text)

headers['X-RequestDigest']=getToken()
print createSite("Human Resources","hr","Sample Description")

1
我正在获取headers['X-RequestDigest']=getToken(),错误信息如下:KeyError: 'd',这是在公司网络内测试的结果。 - user3867743

1

我今天发现了这个选项。问题是:通过Python库输入凭据是否存在安全风险? - Branden Keck
1
与任何其他开源库一样。如果您审计代码并认真处理密码,则足够安全。 - ndemou

-1

401响应是身份验证错误...

这意味着你的三个变量中有一个是不正确的:url、user、pass请求认证文档

你的URL看起来不完整。


是的,我知道这是一个访问被拒绝的错误。关键是我已经验证了URL、用户名和密码都是正确的。 - Indradhanush Gupta
没问题。这是一个SharePoint网站。我已经在/etc/hosts文件中添加了该条目,以指向本地VM的IP地址。 无论如何,为了清晰起见,我已经更新了URL。 - Indradhanush Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接