botkitpep 1.8
Набор модулей для создания ботов

[![Build Status](https://dev.azure.com/PepsiCoIT/Russia_Business_Service_Process_Excellence/_apis/build/status/bot_kit?branchName=main)](https://dev.azure.com/PepsiCoIT/Russia_Business_Service_Process_Excellence/_build/latest?definitionId=14979&branchName=main)
# Набор универсальных модулей для создания ботов

## Процесс установки

```
pip install git+https://PepsiCoIT@dev.azure.com/PepsiCoIT/Russia_Business_Service_Process_Excellence/_git/bot_kit
```

# Как пользоваться

## Пример кода для импорта
```
import botkitpep
```

## Пример кода sharepoint_api_connector (позволяет работать с OneDrive/Sharepoint):
```
import os
str_botid = 'b1234567'
str_botid_mail = str_botid + "@pepsico.com"
str_botid_pass = botkitpep.getbotpass(str_botid)
str_client_id = "a-b-c-d-e"
str_tennant_id = "a-b-c-d-e"
loader = botkitpep.sharepoint_api_connector(
    str_botid,
    str_botid_mail,
    str_botid_pass,
    str_client_id,
    str_tennant_id)


# Получаем список содержимого папки по паттерну
results = loader.glob(
    'https://pepsico.sharepoint.com/teams/AFHchain/Shared%20Documents/Forms/AllItems.aspx',
    'General',
    ['*.xls*'])

# Загрузить файл на Sharepoint/Onedrive
loader.uploadtoonedrive(
    'https://pepsico.sharepoint.com/teams/AFHchain/Shared%20Documents/Forms/AllItems.aspx',
    os.path.join(os.getcwd(), 'README.md'),
    '/README.md')

# Скачать файл из Sharepoint/Onedrive
loader.downloadfromonedrive(
    'https://pepsico.sharepoint.com/teams/AFHchain/Shared%20Documents/Forms/AllItems.aspx',
    os.path.join(os.getcwd(), 'README.md'),
    '/README.md')
```

## Пример кода setup_logger (создает настроенный логгер):
```
import logging
# Создаем логгер с дефолтным уровнем логов logging.INFO
logger = botkitpep.setup_logger(
    'Sellout_and_Invent',
    'Sellout_and_Invent.log')
logger.info('Iteration Start Sellout_and_Invent')

# Создаем другой логгер со своим уровнем логов
logger = botkitpep.setup_logger(
    'Sellout_and_Invent2',
    'Sellout_and_Invent2.log',
    logging.INFO)
logger.info('Iteration Start Sellout_and_Invent2')
```

## Пример кода для Exchangemailget (получение и отправка писем)
```
import datetime
str_last = '25-01-22-12-17-31'
str_server = 'outlook.office365.com'
str_strf = "%d-%m-%y-%H-%M-%S"
alterix_mail = '123@pepsico.com'
alterix_user = '123@CWWPVT'
alterix_pass = '213'
str_acc = '2134@pepsico.com'

# Дата от которой нужно получить письмо
dt_str_last = datetime.datetime.strptime(str_last, str_strf)
# Дата по которую нужно получить письмо
datetime_now = datetime.datetime.now()
rang = (dt_str_last,
        datetime_now)
# Получаем письмо (параметров на самом деле больше)
list_response = botkitpep.Exchangemailget(
    User=alterix_mail,
    Server=str_server,
    Acc=str_acc,
    Password=alterix_pass,
    # http_proxy=http,
    # https_proxy=https,
    Sender="ESSAAdvancedAnalytics@pepsico.com",
    strf=str_strf,
    date=str_last,
    rang=rang)
[flag, str_last_item, text, error, initiator, obj_item] = list_response

# obj_item.subject - тема письма
# text - текст письма
# obj_item - сам объект письма
# oflag - флаг того, что нашлось письмо, удовлетворяющее требованиям
# oinitiator - отправитель
# ostr_last_item - дата и время этого письма
# oerror - флаг наличия ошибки

# Как отправить письмо с вложениями (параметров на самом деле больше)
botkitpep.Exchangemailsend(
    to='123@pepsico.com',
    Acc=str_acc,
    User=alterix_mail,
    Password=alterix_pass,
    Subject="Flow updater",
    Server=str_server,
    Text='Privet',
    File=os.path.join(os.getcwd(), 'README.md')
    )
```

## Пример кода для Alteryx (обновление WorkFlow)
```
alteryx_user = '123@CWWPVT'
alteryx_pass = '123'
botkitpep.alteryx_updater(
    alteryx_user,
    alteryx_pass,
    '6141f085f9e538076433b37f',
    'ImageReco_PO1',
    'http://pepwap13233.cww.pep.pvt/gallery')
```

## Пример кода для запуска SAP и получения сессии
```
# Запускаем SAP
botkitpep.run_sap('b1234567', botkitpep.getbotpass('b1234567'))
# Получаем сессию SAP
session = botkitpep.CREATE_SAP_CONNECTION()
```


## Пример кода для работы с файловыми функциями
```
URL = 'https://pepsico-my.sharepoint.com/personal/b9000963_pepsico_com/_layouts/15/onedrive.aspx'

# Функция возвращает пути файлов, которые новее указанной даты
list_files = botkitpep.collecting_newer_files(
    str_path_folder,
    datetime_now)


# Функция перемещает содержимое одной папки в другую
botkitpep.move_content_folder(
    str_path_folder,
    str_dst_folder)


# Возвращает список всех файлов в выбранной папке
list_files = botkitpep.get_all_files_from_path(
    str_path)


# Функция чистит папку
botkitpep.clear_folder(
    str_path_folder)


# Функция ищет файлы в директории по паттернам
list_files = botkitpep.search_all(
    start_dir=os.getcwd(),
    patterns=["*.xls*"])


# Функция определяет кодировку файла
str_encoding = botkitpep.detect_encoding(
    str_path_to_detect_file)


# Функция для копирования нескольких файлов в директорию
botkitpep.multi_copyAndCreateDir(
    list_files_source_path,
    dstDir)

# а для копирования на Sharepoint/Onedrive
botkitpep.multi_copyAndCreateDir(
    list_local,
    list_onedrive,
    obj_loader=loader.uploadtoonedrive,
    url=URL)

# и для копирования с Sharepoint/Onedrive
botkitpep.multi_copyAndCreateDir(
    list_onedrive,
    local,
    obj_loader=loader.downloadfromonedrive,
    reverse=True,
    url=URL)

# Функция для копирования одного файла под заданным именем
botkitpep.copyAndCreateDir(
    sourcePath,
    dstDir)

# а для копирования на Sharepoint/Onedrive
botkitpep.copyAndCreateDir(
    local,
    onedrive,
    obj_loader=loader.uploadtoonedrive,
    url=URL)

# и для копирования с Sharepoint/Onedrive
botkitpep.copyAndCreateDir(
    local,
    onedrive,
    obj_loader=loader.downloadfromonedrive,
    url=URL)

# Функция для перемещения ровно одного файла
botkitpep.moveAndCreateDir(
    sourcePath,
    dstDir)
```

## Пример кода для выгрузки отчета из бобжа

```
str_user = '80194955'
str_pass = 'asdi2341{}4'
str_link_bobj = 'https://bobj.mypepsico.com'

# Создаем коннектор
conn = botkitpep.bobj_connector(
    str_user,
    str_pass,
    str_link_bobj)

# Логинимся
conn.login()

# Номер документа (вместо названия, указан в свойствах в бобже)
str_doc_id = '55133951'

# Получаем промты
dict_promts = conn.get_promts(str_doc_id)

# Здесь мы должны были редактивать промты по своему усмотрению
dict_promts = dict_promts

# Обновляем и скачиваем отчет
conn.refresh_and_get_doc(
    str_doc_id,
    dict_promts,
    os.path.join(os.getcwd(), 'report.xlsx'))

# Обязательно разлогиниваемся (прям обязательно)
conn.logout()
```

## Пример кода для выгрузки отчета SAP используя WEB SAP GUI

```
# Создаем класс для подключения к SAP WEB GUI
websap = botkitpep.websap("B9000963", botkitpep.getbotpass('B9000963'), 'Z_L_RU_OTC_TRN_BADSO', "RU")

# Открываем нужную транзакцию
session, sessiontoken, link_token = websap.opentransaction()

# Указываем необходимые параметры на селекционном экране

data = [{"post":"action/304/wnd[0]/usr/ctxtS_VKORG-LOW","content":"position=0","logic":"ignore"},
        {"post":"focus/wnd[0]/usr/ctxtS_VKORG-LOW","logic":"ignore"},
        {"content":"displaywidth=974&displayheight=1034&ua_width=946&width=946&ua_height=929&height=929&metrics=1&changed=true",
         "post":"action/302/wnd[0]"},
        {"get":"state/ur"}]
botkitpep.websap_commonlink(data, session, sessiontoken, link_token)

data = [{"content":"RU03","post":"value/wnd[0]/usr/ctxtS_VKORG-LOW"},
        {"content":"*","post":"value/wnd[0]/usr/ctxtS_VTWEG-LOW"},
        {"content":"*","post":"value/wnd[0]/usr/ctxtS_SPART-LOW"},
        {"post":"action/304/wnd[0]/usr/ctxtS_SPART-LOW","content":"position=0","logic":"ignore"},
        {"post":"focus/wnd[0]/usr/ctxtS_SPART-LOW","logic":"ignore"},
        {"post":"action/3/wnd[0]/tbar[1]/btn[8]"},
        {"get":"state/ur"}]
botkitpep.websap_commonlink(data, session, sessiontoken, link_token)

# Начинаем экспорт отчета в файл эксель
data = [{"post":"focus/wnd[0]/shellcont/shell/shellcont[0]/shell","logic":"ignore"},
        {"post":"action/4/wnd[0]/shellcont/shell/shellcont[0]/shell/tbar/dbtn&MB_EXPORT/mnu/menu&XXL"},
        {"get":"state/ur"}]
botkitpep.websap_commonlink(data, session, sessiontoken, link_token)

data = [{"post":"focus/wnd[1]/usr/radRB_OTHERS","logic":"ignore"},
        {"post":"vkey/0/ses[0]"},
        {"get":"state/ur"}]
r = botkitpep.websap_commonlink(data, session, sessiontoken, link_token)

link = r.text.split("URL:'")[1].split("'")[0]

session.post(f"http://sapp16lb.eur.pi.pvt{link}query",
             params={'SEC_SESSTOKEN': sessiontoken,
                     'RetQuery': 'Z:'})


data = [{"post": "okcode/ses[0]", "content": "=OK"},
        {"post": "vkey/0/ses[0]"},
        {"get": "state/ur"}]
r = botkitpep.websap_commonlink(data, session, sessiontoken, link_token)

link = r.text.split("URL:'")[1].split("'")[0]

session.post(f"http://sapp16lb.eur.pi.pvt{link}filesavedialog",
             params={'SEC_SESSTOKEN': sessiontoken,
                     'FileName': 'Z:\export.XLSX',
                     'FileEncoding': ''})

# Выгрузку необходимо делать в цикле, т.к. сервер делит большой отчет на части по 5 мб и на каждую часть выдает отдельную ссылку
with open("export.xlsx", "ab") as wr:

    while True:

        data = [{"post": "okcode/ses[0]",
                 "content": "=OK"},
                {"post": "vkey/0/ses[0]"},
                {"get": "state/ur"}]

        r1 = r = botkitpep.websap_commonlink(data, session, sessiontoken, link_token)

        link = r1.text.split("URL:'")[1].split("'")[0]

        r2 = session.post(f"http://sapp16lb.eur.pi.pvt{link}get",
                          params={'SEC_SESSTOKEN': sessiontoken,
                                  'updownchunkedout': '',
                                  'updownbase64in': '',
                                  'updownbase64out': ''})

        wr.write(r2.content)
        if r2.text == '':
            break
```

## Пример кода azure_blob_connector (позволяет работать с datalake):

```
str_storage_account_name = 'pepstorage'
str_storage_account_key = '8yvSd9HlKf'
str_file_system = 'pepdata'

# Создаем коннектор (он автоматически логинится)
conn = botkitpep.azure_blob_connector(
    str_storage_account_name,
    str_storage_account_key,
    str_file_system)

# Получаем список содержимого директории
# Пишем свой паттерн, он может быть вида ниже:
patterns = ['data/*.csv']
patterns = [r'data\*.csv']
patterns = ['*']
list_content_dir = conn.glob(patterns)


# Скачиваем файл
str_blob_path_to_file = 'data/inear_model_coef_report.csv'
str_local_path_to_file = r'C:\linear_model_coef_report.csv'
conn.downloadfromblob(
    str_blob_path_to_file,
    str_local_path_to_file)
    
# Загружаем файл
str_blob_path_to_file = 'data/linear_model_coef_report_.csv'
str_local_path_to_file = r'C:\linear_model_coef_report.csv'
conn.uploadtoblob(
    str_blob_path_to_file,
    str_local_path_to_file)
```

## Пример кода для использования машинного зрения

```
import glob
import os
import botkitpep
ml_module = botkitpep.detect_with_opencv_yolo
# list_class_labels - список с классами, которые нужно распознать
list_class_labels = ["DLSignature"]
# cov_yolov4.cfg - файл конфигурации модели
str_path_to_model_config = '/Users/gp/Documents/pep_data/train_yolo/cov_yolov4.cfg'
# cov_yolov4_best.weights - файл весов модели
str_path_to_model_weights = '/Users/gp/Documents/pep_data/train_yolo/cov_yolov4_best.weights'
# dir_output - директория, в которую будет сохраняться выходной файл
dir_output = os.path.join(os.getcwd(), 'test_iv')
# Тестовые данные из iv
ll = glob.glob(r'/Users/gp/Documents/pep_data/123123123/from_iv_sz/*.tif')
if not os.path.isdir(dir_output):
    os.mkdir(dir_output)
list_res_model = []
for ll_i in ll:
    print(os.path.basename(ll_i))
    str_path_to_img_input = ll_i
    str_path_to_img_output = os.path.join(
        dir_output,
        os.path.basename(ll_i[:-4] + '.jpg'))
    try:
        res_model = ml_module(
                str_path_to_img_input,
                str_path_to_img_output,
                str_path_to_model_config,
                str_path_to_model_weights,
                list_class_labels)
        list_res_model.append(res_model)
    except Exception as ex:
        print(ex)
```

## Пример кода для выгрузки отчета из SAP BI через Enterprice и прокси
```
str_link_sapbi = 'http://sapportal.eur.pi.pvt'
str_link_sapbi_essa = 'https://essabi.eur.pi.pvt'
str_path_chain_keys = os.path.join(os.getcwd(), 'chain_keys.xlsx')
str_path_bi = os.path.join(
    os.getcwd(),
    '$$$$Some_Files_From_BO$$$$',
    '_BI_ModelAudit_NEW_v2_NEW.xlsx')
proxies = {'http': 'http://157.146.255.251:8080'}
# Enterprise
str_server = '172.23.130.8'
# Создаем коннектор
logger.info('Создаем коннектор')
conn = botkitpep.sapbi_connector(
    str_botid,
    str_pass_enterprice_sap,
    str_link_sapbi,
    str_link_sapbi_essa,
    str_server,
    proxies=proxies,
    # session=session
    )
# Логинимся
logger.info('Логинимся')
conn.login_enterprice()
logger.info('Получаем промты отчета чейнов')
# Для начала получим ключ чейна. выгрузим отчет chain_keys:
# str_doc_id = '680311'
str_doc_id = '683348'
# Получаем промты
dict_promts = conn.get_promts(str_doc_id)
logger.info('Редактируем промты отчета чейнов')
# Здесь мы должны были редактивать промты по своему усмотрению
dict_promts_data = dict_promts['parameters']['parameter'][1]['answer']
dict_promts_data['values'] = {
    'condition': [{'@operator': 'Between',
                  'value': [
                      {'@id':
                       "%02.0f" % int(TrueMonthFrom) + str(TrueYearFrom)},
                      {'@id':
                       "%02.0f" % int(TrueMonthTo) + str(TrueYearTo)}]}]}
logger.info('Обновляем и скачиваем отчет отчета чейнов')
# Обновляем и скачиваем отчет
conn.refresh_and_get_doc(
    str_doc_id,
    dict_promts,
    os.path.join(os.getcwd(), 'chain_keys.xlsx'))
```

## Пример кода для выгрузки отчета из SAP BI через обычный и прокси
```
proxies = {'http': 'http://157.146.255.251:8080'}
str_link_sapbi = 'http://sapportal.eur.pi.pvt'
str_link_sapbi_essa = 'https://essabi.eur.pi.pvt'
str_path_chain_keys = os.path.join(os.getcwd(), 'chain_keys.xlsx')
str_path_bi = os.path.join(
    os.getcwd(),
    '$$$$Some_Files_From_BO$$$$',
    '_BI_ModelAudit_NEW_v2_NEW.xlsx')
# Standart
# str_server = 'PEPWAP20305.cww.pep.pvt'
str_server = '172.23.130.8'
logger.info('Создаем коннектор')
# Создаем коннектор
conn = botkitpep.sapbi_connector(
    str_botid_sap_bi,
    str_pass_gpid_sap_bi,
    str_link_sapbi,
    str_link_sapbi_essa,
    str_server,
    proxies=proxies,
    # session=session
    session=requests
    )
# Логинимся
logger.info('Логинимся')
conn.login()
logger.info('Получаем промты отчета чейнов')
# Для начала получим ключ чейна. выгрузим отчет chain_keys:
str_doc_id = '680311'
# str_doc_id = '683348'
# Получаем промты
dict_promts = conn.get_promts(str_doc_id)
logger.info('Редактируем промты отчета чейнов')
# Здесь мы должны были редактивать промты по своему усмотрению
dict_promts_data = dict_promts['parameters']['parameter'][1]['answer']
dict_promts_data['values'] = {
    'condition': [{'@operator': 'Between',
                  'value': [
                      {'@id':
                       "%02.0f" % int(TrueMonthFrom) + str(TrueYearFrom)},
                      {'@id':
                       "%02.0f" % int(TrueMonthTo) + str(TrueYearTo)}]}]}
logger.info('Обновляем и скачиваем отчет отчета чейнов')
# Обновляем и скачиваем отчет
conn.refresh_and_get_doc(
    str_doc_id,
    dict_promts,
    os.path.join(os.getcwd(), 'chain_keys.xlsx'))
```

## Пример кода для выгрузки данных из iSales
```
conn = botkitpep.set_conn_string(
    server='sqlanalyst2.cww.pep.pvt',
    db_name='ISales2_RUS',
    username=user_isales,
    password=password_isales
    )
dax_string = '''mdx/dax - код'''
df = botkitpep.get_DAX(
    connection_string=conn,
    dax_string=dax_string)
```