Как я получаю доступ к Microsoft SharePoint в своих сценариях Python
После положительных отзывов, которые я получил на свою предыдущую статью «Как я создал скрипт Python для чтения электронной почты с сервера Exchange», я решил написать немного больше о доступе к бизнес-программному обеспечению Microsoft из Python.
Я думаю, что большинство разработчиков Python считают программное обеспечение Microsoft неизбежным злом. Вот почему я придерживаюсь вселенной Microsoft и рассказываю, как подключить Python к Microsoft SharePoint.
Стек технологий
Мы увидим, как получить доступ к данным Microsoft SharePoint (версии 2010, 2013 или 2019) из скрипта на языке Python (я буду использовать версию 3.7). Передача данных будет осуществляться через уровень ODBC. Чтобы сделать это в Python, я буду использовать модуль pyodbc ver. 4.0.26.
Важно отметить, что мой скрипт использует коммерческий продукт под названием Connect Bridge, что делает возможной интеграцию Python/SharePoint. С Connect Bridge я сделал эту интеграцию с минимальными трудностями и трудностями. И я сделал это так, чтобы не испортить работу SharePoint (поверьте мне, это ОЧЕНЬ важно). Вы можете попробовать все это самостоятельно, получив бесплатную пробную версию Connect Bridge.
Connect Bridge — это интеграционная платформа, разработанная Connecting Software, которая позволяет подключать любое программное обеспечение через драйверы ODBC, драйверы JDBC или веб-службы. Архитектура платформы представлена на этой схеме клиент-сервер.
Как видно на диаграмме, вы можете использовать этот инструмент для доступа не только к данным Microsoft SharePoint, но и к данным из многих других программ. К ним относятся Microsoft Dynamics и Microsoft Exchange, и доступ может быть двунаправленным. Доступ к Microsoft Exchange из Python был именно тем, что я описал в своей предыдущей статье.
Начать скриптинг
Теперь давайте начнем скриптовую часть! Моя цель — создать сценарий Python, который обращается к экземпляру SharePoint самым простым способом. Я предполагаю, что экземпляр SharePoint уже существует. Имейте под рукой свои учетные данные для входа в SharePoint. Вот последовательность шагов, которые вам необходимо выполнить:
- Запросите бесплатную пробную версию, а затем установите Подключить мост
- Установить Питон для Windows вер. 3.7+ вместе с пиодбк модуль 4.0.26+
- Запускаем Connect Bridge Management Studio и в ней:
4.1. Используя учетные данные, упомянутые ранее, добавьте учетную запись для SharePoint (учетные записи – Добавить аккаунт).
4.2. Откройте опцию Новый запрос а затем Браузер соединений. Найдите соединитель SharePoint и разворачивайте его, пока не увидите DefaultConnection. Щелкните правой кнопкой мыши и выберите Получить строку подключения. Скопируйте строку подключения ODBC. Вы передадите его скрипту дальше.
4.3. Использовать Новый запрос возможность протестировать запрос, который будет получать данные, которые вам нужны в SharePoint. Я представлю здесь пример запроса, но это то, что вы должны изменить. После того, как вы нажали на Новый запрос вариант, откройте Браузер соединений. Найдите коннектор SharePoint и открывайте его, пока не увидите Столы вариант. Вы можете видеть, что схема содержит «таблицу» с именем Site_Pages. Мы можем создать наш запрос как
SELECT UniqueId, ContentType, Created, Modified, ContentVersion FROM Site_Pages LIMIT 20;
Этот запрос выберет первые двадцать записей из списка страниц сайта SharePoint. Обратите внимание, что похоже, что мы используем базу данных напрямую, но это не так. Connect Bridge обращается к API, а затем представляет данные, как если бы это была база данных. После того, как вы закончите писать свой запрос, скопируйте его, так как он также понадобится вам, чтобы передать его сценарию.
Руки на сценарии!
Все решение находится в одном файле сценария CBQuery.py. Вы можете просмотреть полный исходный код ниже. Если вы сосредоточитесь на строках 70-92, вы увидите суть решения. Полное описание того, как работает этот скрипт, приведено ниже.
#!/usr/local/bin/python3.7
# encoding: utf-8
'''
CBQuery -- query data from, write data to SharePoint
CBQuery is a script that allows to run SQL queries via Connect Bridge ODBC driver
@author: Ana Neto
@copyright: 2019
@contact: ana@connecting-soiftware.com
@deffield updated: 07.10.2019
'''
import sys
import os
import pyodbc
from argparse import ArgumentParser
from argparse import RawDescriptionHelpFormatter
__all__ = []
__version__ = 0.2
__date__ = '2019-10-07'
__updated__ = '2019-10-07'
DEBUG = 1
TESTRUN = 0
PROFILE = 0
class CLIError(Exception):
'''Generic exception to raise and log different fatal errors.'''
def __init__(self, msg):
super(CLIError).__init__(type(self))
self.msg = "E: %s" % msg
def __str__(self):
return self.msg
def __unicode__(self):
return self.msg
def main(argv=None): # IGNORE:C0111
'''Command line options.'''
if argv is None:
argv = sys.argv
else:
sys.argv.extend(argv)
program_name = os.path.basename(sys.argv[0])
program_version = "v%s" % __version__
program_build_date = str(__updated__)
program_version_message="%%(prog)s %s (%s)" % (program_version, program_build_date)
program_shortdesc = __import__('__main__').__doc__.split("n")[1]
program_license=""'%s
Created by Ana Neto on %s.
Licensed under the Apache License 2.0
Distributed on an "AS IS" basis without warranties
or conditions of any kind, either express or implied.
USAGE
''' % (program_shortdesc, str(__date__))
try:
# Setup argument parser
parser = ArgumentParser(description=program_license, formatter_class=RawDescriptionHelpFormatter)
parser.add_argument('connstr')
parser.add_argument('query')
# Process arguments
args = parser.parse_args()
query = args.query
connstr = args.connstr
conn = pyodbc.connect(connstr)
cursor = conn.cursor()
cursor.execute(query)
while 1:
row = None
try:
row = cursor.fetchone()
except:
print(sys.exc_info()[1])
break
if not row:
break
print(row)
except KeyboardInterrupt:
### handle keyboard interrupt ###
return 0
except:
print(sys.exc_info()[1])
#indent = len(program_name) * " "
#sys.stderr.write(program_name + ": " + repr(e) + "n")
#sys.stderr.write(indent + " for help use --help")
return 2
if __name__ == "__main__":
if TESTRUN:
import doctest
doctest.testmod()
if PROFILE:
import cProfile
import pstats
profile_filename="CBQuery_profile.txt"
cProfile.run('main()', profile_filename)
statsfile = open("profile_stats.txt", "wb")
p = pstats.Stats(profile_filename, stream=statsfile)
stats = p.strip_dirs().sort_stats('cumulative')
stats.print_stats()
statsfile.close()
sys.exit(0)
sys.exit(main())
Вот что делает скрипт:
• В строках 71–80 используется шаблон сценария pydev argparse для получения переменных connstr и query из аргументов, введенных в командной строке.
• Переменная connstr содержит строку соединения ODBC, которую я передаю в модуль pyodbc для построения соединения ODBC (хранится в переменной conn).
• Затем я открываю курсор базы данных, используя соединение, хранящееся в conn.
• Я выполняю запрос (это SQL-запрос, который я получил через параметр командной строки с именем query)
• Я циклически использую цикл while для чтения результатов из курсора построчно. Когда cursor.fetchone возвращает None, я прерываю цикл
• Я также прерываю цикл, если во время выборки ODBC возникает исключение. В этом случае я также вывожу задачу на вывод.
• Если метод fetchone завершается успешно и возвращает строку данных, я печатаю строку необработанных данных непосредственно на выходе. Обратите внимание, что это может быть любой тип вывода. Я мог бы отформатировать его как XML, JSON, CSV или любой другой формат обмена данными. Я также мог бы просто использовать объект строки необработанных данных в дальнейшем коде для выполнения пользовательских задач.
Чтобы запустить сценарий, не забудьте, что сценарий CBQuery.py принимает два позиционных аргумента командной строки: connstr и query. Вам нужно будет скопировать их из Connect Bridge Management Studio, как описано выше (пункт 4).
Можем ли мы создать список контактов SharePoint и написать запись?
Давайте теперь рассмотрим этот пример немного дальше. Допустим, мы хотим создать список контактов в SharePoint и добавить контакт в этот список. Нам нужно следовать тому же процессу, но изменить запрос, чтобы использовать «Хранимую процедуру». Опять же, эта «Хранимая процедура» не является настоящей хранимой процедурой. Фактически доступ к SharePoint будет осуществляться через API. Для этого запрос, который мы должны выполнить:
EXEC SP_CREATE_TABLE 'MyContacts', 'Created using the Connect Bridge platform', true, 'Contacts';
Запрос запускает новый список SharePoint «Мои контакты» с описанием, которое будет отображаться на панели быстрого запуска страницы SharePoint.
Чтобы завершить процедуру, нам нужно выполнить следующий запрос, чтобы обновить отражение схемы ODBC Connect Bridge схемы SharePoint. Итак, наша новая «таблица» становится видимой для клиента ODBC.
EXEC SP_UPDATE_SCHEMA;
Теперь я могу вставить контактную запись в наш список контактов.
INSERT INTO MyContacts (FirstName, LastName) VALUES ('Ana', 'Neto');
Если вы войдете в SharePoint, вы сможете увидеть эту запись и наш новый список SharePoint.
Я могу выбрать только что созданную запись, выполнив следующий запрос
SELECT FirstName,LastName FROM MyContacts
Загрузка общего документа
Для загрузки общего документа я буду использовать существующий список SharePoint «Документы» и «Хранимую процедуру» SP_INSERT_SHAREDDOCUMENT. Параметры, которые он принимает, следующие:
• данные
• имя файла
• папка на сервере (относительный путь)
• MIME-тип
• имя таблицы (для общих документов)
Мы можем вставить документ, выполнив следующий оператор:
EXEC SP_INSERT_SHAREDDOCUMENT 'Documents', 'myfile.txt', '/TestFolder/Documents', 'text/plain', 'YWJjZGVm';
Вы можете проверить наличие документа в таблице «Документы», выполнив оператор:
SELECT Id,Name FROM Documents;
Ограничения
Нет доступной клиентской библиотеки ODBC Linux (и мы не уверены, возможно ли это вообще). По этой причине использование инструмента Connect Bridge ограничено компьютерами Windows.
Вывод
Мы видели, как можно быстро получить доступ к данным SharePoint в Python с помощью Интеграционная платформа Connect Bridge. Вы также можете использовать тот же инструмент Connect Bridge для доступа к другому программному обеспечению Microsoft, такому как Dynamics или Exchange, или к другому программному обеспечению, такому как Salesforce или SAP. И если вы хотите использовать его в проекте на другом языке программирования, это тоже возможно. Например, чтобы получить данные SharePoint в коде Java с помощью Connect Bridge, вы можете прочитать мою статью «Использование Java для переноса встреч и деловых документов в SharePoint».