Почему PNG? Как в ЦМИК? Где ЦМИК?! Пантоны в ЦМИК? Вылеты и отступы? 4+0 или 4+4? А может 1+1?

Приветствую всех 🙌

На этой неделе вновь получил вопросы о файлах в формате PNG...

3
2
1

14 типов атак, которые должны выявлять системы лицевой биометрии

14 типов атак, которые должны выявлять системы лицевой биометрии

Системы лицевой биометрии начинают активно использоваться во множестве ситуаций: при цифровой регистрации покупателей, аутентификации доступа к веб-сервисам, разблокировке сотовых телефонов, проходе в офис или на спортивные мероприятия, и так далее.

Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

Прекратите использовать Google Translator! Создайте собственное приложение с ИИ

В современном глобализированном мире общение с людьми из разных стран и культур становится всё более важным. Однако языковые барьеры часто могут мешать эффективному общению. Хотя Google Translate стал популярным инструментом для преодоления этого разрыва, у него есть свои ограничения, особенно когда речь идёт о точном переводе длинных текстов.

Я первый в мире поговорил с нейросеть ChatGPT

Вопросы к ChatGPT

Привет. Рад познакомиться. Хочу взять у тебя интервью. Расскажи пожалуйста о себе. Что ты умеешь делать? Искусственный интеллект заменит людей? Как ты можешь помочь бизнесу? Как можно использовать искусственный интеллект в маркетинге? Как отличить общение с искусственным интеллектом от общения с людьми? Какое будущее ждет ис…

2

«Эволюция против муравьёв» сравниваем алгоритмы оптимизации

Решаем задачу о ранце. Муравьиный алгоритм или генетический лучше? Давайте разбираться.

Изображения сгенерированы при помощи ruDALL-E XL
2

Заполняем PDF файлы с использованием Python: библиотека python-pptx

Нам часто приходится заполнять шаблоны, бланки и прочие документы. Если операция повторяется постоянно, то работу нужно автоматизировать. Сегодня расскажем о создании умного шаблона, а также об автоматизации процесса его заполнения.

Это может помочь, к примеру, в автоматизации заполнения шаблонов презентаций: для ежеквартальный отчетов, высту…

6

Как найти однотипную информацию в большом количестве файлов, используя Python?

Недавно мы решали следующую задачу – необходимо найти и удалить содержащие номера карт файлы, размещенные на общем ресурсе. Если нужно было бы искали что-то, определенное и однозначное, мы могли бы воспользоваться поиском в самой операционной системе (используя стандартны поиск текста в содержимом файла). Но, как правило, поиск стандартными средств…

5

Web Parsing. Основы на Python

Рассмотрим еще один практический кейс парсинга сайтов с помощью библиотеки BeautifulSoup: что делать, если на сайте нет готовой выгрузки с данными и нет API для удобной работы, а страниц для ручного копирования очень много?

Web Parsing. Основы на Python
7
)==-1 and i.find('.xlsx.')==-1:\n open_arch(path+'/'+i) #Функция по обработке архивов\n else:\n #Если это директория, то проваливаемся в нее\n find_file(os.listdir(path+'/'+i),path+'/'+i)\n except Exception as err:\n print(err,path+'/'+i)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Теперь напишем саму функцию, которая будет обрабатывать найденные по условию файлы:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"def open_arch(path_file):\n z = zipfile.ZipFile(path_file, 'r') #открываем архив\n files=z.namelist() #получаем список файлов в архиве\n try:\n for f in files:\n if f=='xl/sharedStrings.xml':\n if re.search(pattern_card16, z.read(f))!=None or re.search(pattern_card18, z.read(f))!=None:\n list_file.write(path_file+'\\n') #Если находит совпадение, то пишем путь в файл\n #print(re.findall(pattern_card16, z.read(r))) # если вам нужно \n #print(re.findall(pattern_card18, z.read(r))) # выводить совпадения\n except Exception as err:\n print(err, files)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Определяем директорию для поиска и запускаем функцию для поиска:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"path='Y:' #указываем путь к общему ресурсу, здесь я его подцепил как диск Y: \n\nlist_file=open('list_file', 'w+') #открываем файл для записи\nfind_file(os.listdir(path), path) #запускаем обработку","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Резюме

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Наша работа сделана. Ждем, когда отработает скрипт и получим итоговый файл для анализа. Вы зададите вопрос, почему я сразу не стал удалять файлы? Потому что поиск основан на простом регулярном выражении и туда могут попасть номера заявок, договоров и т.д.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В результате нам удалось избежать ручного анализа более 154 тысяч файлов и сократить выборку более чем в 100 раз.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Я надеюсь, моя инструкция была полезна. Спасибо за внимание.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

#selectel_инструкция

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":8,"reposts":0,"views":6,"hits":2345,"reads":null,"online":0},"dateFavorite":0,"hitsCount":2345,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/dev/156704-kak-naiti-odnotipnuyu-informaciyu-v-bolshom-kolichestve-failov-ispolzuya-python","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764947375,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":true,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":235819,"name":"Разработка","description":"Сообщество разработчиков: публикации о личном опыте, выдающиеся приёмы при решении рутинных задач, полезные материалы для профессионального роста.","uri":"/dev","avatar":{"type":"image","data":{"uuid":"fef5b5fb-e488-5b7f-8445-e3a26a910b44","width":1200,"height":1200,"size":7757,"type":"png","color":"343434","hash":"04042b2b1c1000","external_service":[]}},"cover":{"type":"image","data":{"uuid":"2a214cc5-35cc-58ca-bc07-fc1c892d2101","width":960,"height":280,"size":177,"type":"png","color":"343434","hash":"","external_service":[]}},"lastModificationDate":1642411346,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"dev","isUnsubscribable":true,"badge":null,"badgeId":null,"isDonationsEnabled":false,"isOnline":false,"isPlus":false,"isUnverifiedBlogForCompanyWithoutPro":false,"isVerified":false,"isRemovedByUserRequest":false,"isFrozen":false,"isPro":false,"type":2,"subtype":"community"},"reactions":{"counters":[{"id":1,"count":5}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}},{"type":"entry","data":{"id":109368,"customUri":null,"subsiteId":447345,"title":"Web Parsing. Основы на Python","date":1582816399,"dateModified":1582816399,"blocks":[{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"

Рассмотрим еще один практический кейс парсинга сайтов с помощью библиотеки BeautifulSoup: что делать, если на сайте нет готовой выгрузки с данными и нет API для удобной работы, а страниц для ручного копирования очень много?

"}},{"type":"media","cover":true,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"e89e8872-2562-3026-edef-cc68aa7ebf3a","width":1000,"height":520,"size":214195,"type":"jpg","color":"d0cabb","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Недавно мне понадобилось получить данные с одного сайта. Готовой выгрузки с информацией на сайте нет. Данные я вижу, вот они передо мной, но не могу их выгрузить и обработать. Возник вопрос: как их получить? Немного «погуглив», я понял, что придется засучить рукава и самостоятельно парсить страницу (HTML). Какой тогда инструмент выбрать? На каком языке писать, чтобы с ним не возникло проблем? Языков программирования для данной задачи большой набор, выбор пал на Python за его большое разнообразие готовых библиотек.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Примером для разбора основ возьмем сайт с отзывами banki_ru и получим отзывы по какому-нибудь банку.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Задачу можно разбить на три этапа:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Загружаем страницу в память компьютера или в текстовый файл.","Разбираем содержимое (HTML), получаем необходимые данные (сущности).
","Сохраняем в необходимый формат, например, Excel.
"],"type":"OL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Инструменты

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Для начала нам необходимо отправлять HTTP-запросы на выбранный сайт. У Python для отправки запросов библиотек большое количество, но самые распространённые urllib/urllib2 и Requests. На мой взгляд, Requests — удобнее, примеры буду показывать на ней.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

А теперь сам процесс. Были мысли пойти по тяжелому пути и анализировать страницу на предмет объектов, содержащих нужную информацию, проводить ручной поиск и разбирать каждый объект по частям для получения необходимого результата. Но немного походив по просторам интернета, я получил ответ: BeautifulSoup – одна из наиболее популярных библиотек для парсинга. Библиотеки найдены, приступаем к самому интересному: к получению данных.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Загрузка и обработка данных

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Попробуем отправить запрос HTTP на сайт, чтобы получить первую страницу с отзывами по какому-нибудь банку и сохранить в файл, для того, чтобы убедиться, получаем ли мы нужную нам информацию.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"import requests\nfrom bs4 import BeautifulSoup\n\nbank_id = 1771062 #ID банка на сайте banki.ru\n\nurl = 'https://www.banki.ru/services/questions-answers/?id=%d&p=1' % (bank_id) # url страницы\nr = requests.get(url)\nwith open('test.html', 'w') as output_file:\n output_file.write(r.text)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

После исполнения данного скрипта получится файл text.html.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Открываем данный файл и видим, что необходимые данные получили без проблем.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Теперь очередь для разбора страницы на нужные фрагменты. Обрабатывать будем последние 10 страниц плюс добавим модуль Pandas для сохранения результата в Excel.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Подгружаем необходимые библиотеки и задаем первоначальные настройки.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"import requests\nfrom bs4 import BeautifulSoup\nimport pandas as pd\n\nbank_id = 1771062 #ID банка на сайте banki.ru\npage=1\nmax_page=10\n\nurl = 'https://www.banki.ru/services/questions-answers/?id=%d&p=%d' % (bank_id, page) # url страницы","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

На данном этапе необходимо понять, где находятся необходимые фрагменты. Изучаем разметку страницы с отзывами и определяем, какие объекты будем вытаскивать из страницы.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"a76fac78-d9cc-a54a-575d-82f12bca1bde","width":855,"height":431,"size":122695,"type":"jpg","color":"e9f0ed","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Подробно покопавшись во внутренностях страницы, мы увидим, что необходимые данные «вопросы-ответы» находятся в блоках <table class:qaBlock >, соответственно, сколько этих блоков на странице, столько и вопросов.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"result = pd.DataFrame()\n\nr = requests.get(url) #отправляем HTTP запрос и получаем результат\nsoup = BeautifulSoup(r.text) #Отправляем полученную страницу в библиотеку для парсинга\ntables=soup.find_all('table', {'class': 'qaBlock'}) #Получаем все таблицы с вопросами\nfor item in tables:\n res=parse_table(item)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Приступая к получению самих данных, я кратко расскажу о двух функциях, которые будут использованы:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Find(‘table’) – проводит поиск по странице и возвращает первый найденный объект типа ‘table’. Вы можете искать и ссылки find(‘table’) и рисунки find(‘img’). В общем, все элементы, которые изображены на странице;","find_all(‘table’) – проводит поиск по странице и возвращает все найденные объекты в виде списка
"],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

У каждой из этих функций есть методы. Я расскажу от тех, которые использовал:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["find(‘table’).text – этот метод вернет текст, находящийся в объекте;","find(‘a’).get(‘href’) – этот метод вернет значение ссылки
"],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Теперь, уже обладая этими знаниями и навыками программирования на Python, написал функцию, которая разбирает таблицу с отзывом на нужные данные. Каждые стадии кода дополнил комментариями.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"def parse_table(table):#Функция разбора таблицы с вопросом\n res = pd.DataFrame()\n\n id_question=0\n link_question=''\n date_question=''\n question=''\n who_asked=''\n who_asked_id=''\n who_asked_link=''\n who_asked_city=''\n answer=''\n \n question_tr=table.find('tr',{'class': 'question'})\n #Получаем сам вопрос\n question=question_tr.find_all('td')[1].find('div').text.replace('
','\\n').strip()\n \n widget_info=question_tr.find_all('div', {'class':'widget__info'})\n #Получаем ссылку на сам вопрос\n link_question='https://www.banki.ru'+widget_info[0].find('a').get('href').strip()\n #Получаем уникальным номер вопроса\n id_question=link_question.split('=')[1]\n\n #Получаем того кто задал вопрос\n who_asked=widget_info[1].find('a').text.strip()\n #Получаем ссылку на профиль\n who_asked_link='https://www.banki.ru'+widget_info[1].find('a').get('href').strip()\n #Получаем уникальный номер профиля\n who_asked_id=widget_info[1].find('a').get('href').strip().split('=')[1]\n\n #Получаем из какого города вопрос\n who_asked_city=widget_info[1].text.split('(')[1].split(')')[0].strip()\n \n #Получаем дату вопроса\n date_question=widget_info[1].text.split('(')[1].split(')')[1].strip()\n \n #Получаем ответ если он есть сохраняем\n answer_tr=table.find('tr',{'class': 'answer'})\n if(answer_tr!=None):\n answer=answer_tr.find_all('td')[1].find('div').text.replace('
','\\n').strip() \n \n #Пишем в таблицу и возвращаем\n res=res.append(pd.DataFrame([[id_question,link_question,question,date_question,who_asked,who_asked_id,who_asked_link,who_asked_city,answer]], columns = ['id_question','link_question','question','date_question','who_asked','who_asked_id','who_asked_city','who_asked_link','answer']), ignore_index=True)\n #print(res)\n return(res)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Функция возвращает DataFrame, который можно накапливать и экспортировать в EXCEL.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"result = pd.DataFrame()\n\nr = requests.get(url) #отправляем HTTP запрос и получаем результат\nsoup = BeautifulSoup(r.text) #Отправляем полученную страницу в библиотеку для парсинга\ntables=soup.find_all('table', {'class': 'qaBlock'}) #Получаем все таблицы с вопросами\nfor item in tables:\n res=parse_table(item)\n result=result.append(res, ignore_index=True)\n\nresult.to_excel('result.xlsx')","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Резюме

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В результате мы научились парсить web-сайты, познакомились с библиотеками Requests, BeautifulSoup, а также получили пригодные для дальнейшего анализа данные об отзывах с сайта banki.ru. А вот и сама результирующая таблица.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"737e1ffd-5d13-b70a-3839-c59421008451","width":1273,"height":372,"size":306060,"type":"jpg","color":"eef0f0","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Приобретенные навыки можно использовать для получения данных с других сайтов и получать обобщенную и структурированную информацию с бескрайних просторов Интернета.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Я надеюсь, моя статья была полезна. Спасибо за внимание.

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":7,"favorites":80,"reposts":0,"views":0,"hits":113983,"reads":null,"online":0},"dateFavorite":0,"hitsCount":113983,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id447345/109368-web-parsing-osnovy-na-python","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764947375,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":true,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764947375,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":true,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":7}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}}],"ogTitle":null,"ogDescription":null,"isAnonymized":true}};