如何通过 Python 中的 REST API 访问共享点站点?

Posted

技术标签:

【中文标题】如何通过 Python 中的 REST API 访问共享点站点?【英文标题】:How to access a sharepoint site via the REST API in Python? 【发布时间】:2014-01-23 14:41:40 【问题描述】:

我在本地 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/

【问题讨论】:

【参考方案1】:

您的 SharePoint 网站可能使用不同的身份验证方案。您可以通过检查 Firebug 或 Chrome 开发者工具中的网络流量来检查这一点。

幸运的是,请求库支持许多身份验证选项: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) 解决了这个问题。它用于我需要此代码的 Intranet 共享点。感谢分享。 我收到来自 Intranet 和 Internet 的 。知道如何解决吗?,谢谢 以防万一有人在他/她的公司中锁定了 NTLM:还有一个选项可以使用 requests_negotiate_sspi 包。有关选项的概述,请参阅 this link。【参考方案2】:

以下是从 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")

【讨论】:

我正在获取 headers['X-RequestDigest']=getToken() 如下:KeyError: 'd',在公司网络内测试它【参考方案3】:

您还可以使用 PyPI 中的 sharepoint 模块,自称为“从 SharePoint 中获取数据的模块和命令行实用程序”

【讨论】:

我今天找到了这个选项。问题:通过 python 库输入凭据是否存在安全风险? 与任何其他开源库相同。如果您审核代码并认真处理密码,那么您就足够安全了。【参考方案4】:

401 响应是 authentication 错误...

这会使您的三个变量之一不正确:url、user、pass。 Requests Authentication Docs

您的网址看起来不完整。

【讨论】:

是的,我知道这是一个拒绝访问错误。重点是我已经验证了url、用户名和密码是正确的。 没关系。它是一个共享点站点。我在 /etc/hosts 文件中添加了该条目以指向本地 VM 的 IP。无论如何,为了清楚起见,我已经更新了网址。

以上是关于如何通过 Python 中的 REST API 访问共享点站点?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Rest API Python 包装器和 WooCommerce Shipment Tracking 插件插入货运跟踪代码

ActiveCollab REST API 使用 Python 接收的嵌套 JSON 中的访问值 [已解决]

访问自己/自己的对象的 REST API 最佳实践

如何通过 REST API 更新 Grafana 面板中的指标值

如何通过rancher REST api将容器添加到堆栈中的服务

Flutter 中的 REST API