def handler_ftp_type_msg ( xml : str ) :
"""
разбирает входящее сообщение на наличие данных необходимых для забора файлов с ftp сервера
"""
res = [ ]
try :
xml_processed = re .sub ( r'\n ' , '' , xml )
#выделяем группу ключей MessagePrimaryContent
xml_data_part1 = re .findall ( r'<[a-zA-Z]{0,2}[0-9]{0,1}[:]?MessagePrimaryContent>.*<\/ [a-zA-Z]{0,2}[0-9]{0,1}[:]?MessagePrimaryContent>' , xml_processed) [ 0 ]
#выделяем группу ключей FSAttachmentsList
xml_data_part2 = re .findall ( r'<[a-zA-z]{0,2}[0-9]{0,1}[:]?FSAttachmentsList>.*<\/ [a-zA-z]{0,2}[0-9]{0,1}[:]?FSAttachmentsList>' , xml_processed) [ 0 ]
res = { "files_count" :re .findall ( r'<FilesCount>(.*)<\/ FilesCount>' , xml_data_part1) [ 0 ] , #общее количество файлов в отправке
"total_size" :re .findall ( r'<TotalSize>(.*)<\/ TotalSize>' , xml_data_part1) [ 0 ] , #размер всего файла отправки
"id_msg" :re .findall ( r'<ID>([a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}).zip[.]?[0-9]{0,3}<\/ ID>' , xml_data_part1) [ 0 ] , #единый id отправки
"CRCCheckSum" :re .findall ( r'<CRCCheckSum>(.*)<\/ CRCCheckSum>' , xml_data_part1) [ 0 ] , #контрольная сумма (не ясно единого файла или конкретной отправки)
"number" : re .findall ( r'<Number>(.*)<\/ Number>' , xml_data_part1) [ 0 ] , #порядковый номер файла в отправке
"size" :re .findall ( r'<Size>(.*)<\/ Size>' , xml_data_part1) [ 0 ] , #размер передаваемого файла в даннм сообщении
"uuid" : re .findall ( r'<[a-zA-z]{0,2}[0-9]{0,1}[:]?uuid>([0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12})<\/ [a-zA-z]{0,2}[0-9]{0,1}[:]?uuid>' , xml_data_part2) [ 0 ] , #уникальный id всей отправки (не только этого сообщения)
"user_name" : re .findall ( r'<[a-zA-Z]{0,2}[0-9]{0,1}[:]?UserName>(.*)<\/ [a-zA-Z]{0,2}[0-9]{0,1}[:]?UserName>' , xml_data_part2) [ 0 ] , #логин учетной записи ftp сервера
"password" :re .findall ( r'<[a-zA-Z]{0,2}[0-9]{0,1}[:]?Password>(.*)<\/ [a-zA-Z]{0,2}[0-9]{0,1}[:]?Password>' , xml_data_part2) [ 0 ] , #пароль учетной записи ftp сервера
"file_name" :re .findall ( r'<[a-zA-Z]{0,2}[0-9]{0,1}[:]?FileName>(.*)<\/ [a-zA-Z]{0,2}[0-9]{0,1}[:]?FileName>' , xml_data_part2) [ 0 ] #имя скачиваемого файла
}
except Exception as e:
logging .debug ( 'handler_ftp_type_msg () - сообщение не содержит данных учетных записей для связи с ftp сервером ' )
return res
def handler_merge_ids_msg( xml : str ) :
"""
Разбирает входящее XML-сообщение, содержащее единственный блок с Ids,
и возвращает словарь с ключом "ids", содержащим список идентификаторов.
Ожидаемый формат XML:
<Ids>
<id>12345678-1234-1234-1234-123456789012</id>
<id>abcdefab-cdef-abcd-efab-cdefabcdefab</id>
</Ids>
"""
ids_list = [ ]
try :
# Удаляем символы новой строки для упрощения поиска
xml_processed = re .sub ( r'\n ' , '' , xml )
# Выделяем блок с тегами <Ids>...</Ids>
xml_data = re .findall ( r'<ids>.*<\/ ids>' , xml_processed, re .IGNORECASE ) [ 0 ]
# Извлекаем содержимое всех тегов <id>...</id> внутри блока <Ids>
ids_list = re .findall ( r'<id>(.*?)<\/ id>' , xml_data, re .IGNORECASE )
except Exception as e:
logging .debug ( "handler_merge_ids_msg() - сообщение не содержит корректных данных для Ids: %s" , str ( e) )
return ids_list
ZGVmIGhhbmRsZXJfZnRwX3R5cGVfbXNnICAoeG1sOiBzdHIpOgogICAgIiIiCiAgICDRgNCw0LfQsdC40YDQsNC10YIg0LLRhdC+0LTRj9GJ0LXQtSDRgdC+0L7QsdGJ0LXQvdC40LUg0L3QsCDQvdCw0LvQuNGH0LjQtSDQtNCw0L3QvdGL0YUg0L3QtdC+0LHRhdC+0LTQuNC80YvRhSDQtNC70Y8g0LfQsNCx0L7RgNCwINGE0LDQudC70L7QsiDRgSBmdHAg0YHQtdGA0LLQtdGA0LAKICAgICIiIgogICAgcmVzID0gW10KICAgIHRyeToKICAgICAgICB4bWxfcHJvY2Vzc2VkID0gcmUuc3ViKHInXG4nLCAnJywgeG1sKQogICAgICAgICPQstGL0LTQtdC70Y/QtdC8INCz0YDRg9C/0L/RgyDQutC70Y7Rh9C10LkgTWVzc2FnZVByaW1hcnlDb250ZW50CiAgICAgICAgeG1sX2RhdGFfcGFydDEgPSByZS5maW5kYWxsKHInPFthLXpBLVpdezAsMn1bMC05XXswLDF9WzpdP01lc3NhZ2VQcmltYXJ5Q29udGVudD4uKjxcL1thLXpBLVpdezAsMn1bMC05XXswLDF9WzpdP01lc3NhZ2VQcmltYXJ5Q29udGVudD4nLCB4bWxfcHJvY2Vzc2VkKVswXQogICAgICAgICPQstGL0LTQtdC70Y/QtdC8INCz0YDRg9C/0L/RgyDQutC70Y7Rh9C10LkgRlNBdHRhY2htZW50c0xpc3QKICAgICAgICB4bWxfZGF0YV9wYXJ0MiA9IHJlLmZpbmRhbGwocic8W2EtekEtel17MCwyfVswLTldezAsMX1bOl0/RlNBdHRhY2htZW50c0xpc3Q+Lio8XC9bYS16QS16XXswLDJ9WzAtOV17MCwxfVs6XT9GU0F0dGFjaG1lbnRzTGlzdD4nLCB4bWxfcHJvY2Vzc2VkKVswXQoKICAgICAgICByZXMgPSB7ImZpbGVzX2NvdW50IjpyZS5maW5kYWxsKHInPEZpbGVzQ291bnQ+KC4qKTxcL0ZpbGVzQ291bnQ+JywgeG1sX2RhdGFfcGFydDEpWzBdLCAj0L7QsdGJ0LXQtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRhNCw0LnQu9C+0LIg0LIg0L7RgtC/0YDQsNCy0LrQtQogICAgICAgICAgICAgICAidG90YWxfc2l6ZSI6cmUuZmluZGFsbChyJzxUb3RhbFNpemU+KC4qKTxcL1RvdGFsU2l6ZT4nLCB4bWxfZGF0YV9wYXJ0MSlbMF0sICPRgNCw0LfQvNC10YAg0LLRgdC10LPQviDRhNCw0LnQu9CwINC+0YLQv9GA0LDQstC60LgKICAgICAgICAgICAgICAgImlkX21zZyI6cmUuZmluZGFsbChyJzxJRD4oW2EtekEtWjAtOV17OH0tW2EtekEtWjAtOV17NH0tW2EtekEtWjAtOV17NH0tW2EtekEtWjAtOV17NH0tW2EtekEtWjAtOV17MTJ9KS56aXBbLl0/WzAtOV17MCwzfTxcL0lEPicsIHhtbF9kYXRhX3BhcnQxKVswXSwgI9C10LTQuNC90YvQuSBpZCDQvtGC0L/RgNCw0LLQutC4CiAgICAgICAgICAgICAgICJDUkNDaGVja1N1bSI6cmUuZmluZGFsbChyJzxDUkNDaGVja1N1bT4oLiopPFwvQ1JDQ2hlY2tTdW0+Jyx4bWxfZGF0YV9wYXJ0MSlbMF0sICPQutC+0L3RgtGA0L7Qu9GM0L3QsNGPINGB0YPQvNC80LAgKNC90LUg0Y/RgdC90L4g0LXQtNC40L3QvtCz0L4g0YTQsNC50LvQsCDQuNC70Lgg0LrQvtC90LrRgNC10YLQvdC+0Lkg0L7RgtC/0YDQsNCy0LrQuCkKICAgICAgICAgICAgICAgIm51bWJlciI6IHJlLmZpbmRhbGwocic8TnVtYmVyPiguKik8XC9OdW1iZXI+Jyx4bWxfZGF0YV9wYXJ0MSlbMF0sICPQv9C+0YDRj9C00LrQvtCy0YvQuSDQvdC+0LzQtdGAINGE0LDQudC70LAg0LIg0L7RgtC/0YDQsNCy0LrQtQogICAgICAgICAgICAgICAic2l6ZSI6cmUuZmluZGFsbChyJzxTaXplPiguKik8XC9TaXplPicseG1sX2RhdGFfcGFydDEpWzBdLCAj0YDQsNC30LzQtdGAINC/0LXRgNC10LTQsNCy0LDQtdC80L7Qs9C+INGE0LDQudC70LAg0LIg0LTQsNC90L3QvCDRgdC+0L7QsdGJ0LXQvdC40LgKICAgICAgICAgICAgICAgInV1aWQiOiByZS5maW5kYWxsKHInPFthLXpBLXpdezAsMn1bMC05XXswLDF9WzpdP3V1aWQ+KFswLTlhLXpdezh9LVswLTlhLXpdezR9LVswLTlhLXpdezR9LVswLTlhLXpdezR9LVswLTlhLXpdezEyfSk8XC9bYS16QS16XXswLDJ9WzAtOV17MCwxfVs6XT91dWlkPicseG1sX2RhdGFfcGFydDIpWzBdLCAj0YPQvdC40LrQsNC70YzQvdGL0LkgaWQg0LLRgdC10Lkg0L7RgtC/0YDQsNCy0LrQuCAo0L3QtSDRgtC+0LvRjNC60L4g0Y3RgtC+0LPQviDRgdC+0L7QsdGJ0LXQvdC40Y8pCiAgICAgICAgICAgICAgICJ1c2VyX25hbWUiOiByZS5maW5kYWxsKHInPFthLXpBLVpdezAsMn1bMC05XXswLDF9WzpdP1VzZXJOYW1lPiguKik8XC9bYS16QS1aXXswLDJ9WzAtOV17MCwxfVs6XT9Vc2VyTmFtZT4nLCB4bWxfZGF0YV9wYXJ0MilbMF0sICPQu9C+0LPQuNC9INGD0YfQtdGC0L3QvtC5INC30LDQv9C40YHQuCBmdHAg0YHQtdGA0LLQtdGA0LAKICAgICAgICAgICAgICAgInBhc3N3b3JkIjpyZS5maW5kYWxsKHInPFthLXpBLVpdezAsMn1bMC05XXswLDF9WzpdP1Bhc3N3b3JkPiguKik8XC9bYS16QS1aXXswLDJ9WzAtOV17MCwxfVs6XT9QYXNzd29yZD4nLCB4bWxfZGF0YV9wYXJ0MilbMF0sICPQv9Cw0YDQvtC70Ywg0YPRh9C10YLQvdC+0Lkg0LfQsNC/0LjRgdC4IGZ0cCDRgdC10YDQstC10YDQsAogICAgICAgICAgICAgICAiZmlsZV9uYW1lIjpyZS5maW5kYWxsKHInPFthLXpBLVpdezAsMn1bMC05XXswLDF9WzpdP0ZpbGVOYW1lPiguKik8XC9bYS16QS1aXXswLDJ9WzAtOV17MCwxfVs6XT9GaWxlTmFtZT4nLCB4bWxfZGF0YV9wYXJ0MilbMF0gI9C40LzRjyDRgdC60LDRh9C40LLQsNC10LzQvtCz0L4g0YTQsNC50LvQsAogICAgICAgICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nZ2luZy5kZWJ1ZygnaGFuZGxlcl9mdHBfdHlwZV9tc2cgKCkgLSDRgdC+0L7QsdGJ0LXQvdC40LUg0L3QtSDRgdC+0LTQtdGA0LbQuNGCINC00LDQvdC90YvRhSDRg9GH0LXRgtC90YvRhSDQt9Cw0L/QuNGB0LXQuSDQtNC70Y8g0YHQstGP0LfQuCDRgSBmdHAg0YHQtdGA0LLQtdGA0L7QvCAnKQogICAgcmV0dXJuIHJlcwoKZGVmIGhhbmRsZXJfbWVyZ2VfaWRzX21zZyh4bWw6IHN0cik6CiAgICAiIiIKICAgINCg0LDQt9Cx0LjRgNCw0LXRgiDQstGF0L7QtNGP0YnQtdC1IFhNTC3RgdC+0L7QsdGJ0LXQvdC40LUsINGB0L7QtNC10YDQttCw0YnQtdC1INC10LTQuNC90YHRgtCy0LXQvdC90YvQuSDQsdC70L7QuiDRgSBJZHMsCiAgICDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDRgdC70L7QstCw0YDRjCDRgSDQutC70Y7Rh9C+0LwgImlkcyIsINGB0L7QtNC10YDQttCw0YnQuNC8INGB0L/QuNGB0L7QuiDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNC+0LIuCgogICAg0J7QttC40LTQsNC10LzRi9C5INGE0L7RgNC80LDRgiBYTUw6CiAgICA8SWRzPgogICAgICA8aWQ+MTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5MDEyPC9pZD4KICAgICAgPGlkPmFiY2RlZmFiLWNkZWYtYWJjZC1lZmFiLWNkZWZhYmNkZWZhYjwvaWQ+CiAgICA8L0lkcz4KICAgICIiIgogICAgaWRzX2xpc3QgPSBbXQogICAgdHJ5OgogICAgICAgICMg0KPQtNCw0LvRj9C10Lwg0YHQuNC80LLQvtC70Ysg0L3QvtCy0L7QuSDRgdGC0YDQvtC60Lgg0LTQu9GPINGD0L/RgNC+0YnQtdC90LjRjyDQv9C+0LjRgdC60LAKICAgICAgICB4bWxfcHJvY2Vzc2VkID0gcmUuc3ViKHInXG4nLCAnJywgeG1sKQogICAgICAgICMg0JLRi9C00LXQu9GP0LXQvCDQsdC70L7QuiDRgSDRgtC10LPQsNC80LggPElkcz4uLi48L0lkcz4KICAgICAgICB4bWxfZGF0YSA9IHJlLmZpbmRhbGwocic8aWRzPi4qPFwvaWRzPicsIHhtbF9wcm9jZXNzZWQsIHJlLklHTk9SRUNBU0UpWzBdCiAgICAgICAgIyDQmNC30LLQu9C10LrQsNC10Lwg0YHQvtC00LXRgNC20LjQvNC+0LUg0LLRgdC10YUg0YLQtdCz0L7QsiA8aWQ+Li4uPC9pZD4g0LLQvdGD0YLRgNC4INCx0LvQvtC60LAgPElkcz4KICAgICAgICBpZHNfbGlzdCA9IHJlLmZpbmRhbGwocic8aWQ+KC4qPyk8XC9pZD4nLCB4bWxfZGF0YSwgcmUuSUdOT1JFQ0FTRSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dnaW5nLmRlYnVnKCJoYW5kbGVyX21lcmdlX2lkc19tc2coKSAtINGB0L7QvtCx0YnQtdC90LjQtSDQvdC1INGB0L7QtNC10YDQttC40YIg0LrQvtGA0YDQtdC60YLQvdGL0YUg0LTQsNC90L3Ri9GFINC00LvRjyBJZHM6ICVzIiwgc3RyKGUpKQogICAgcmV0dXJuIGlkc19saXN0