Компонент Парсер Яндекс.Карт для InstantMaps (для iCMS 2*)

+29
5.68K
Приветствую

Хочу представить компонент Парсер Яндекс.Карт для InstantCMS для второй ветки InstantCMS. Добавилось много фишек по сравнению с версией под первую ветку.
Иллюстрация


Возможности:

1. Парсинг Яндекс.Карт по введенному городу и поисковому запросу (например, найти все Кафе в радиусе 10км от центра города)
2. Добавление всех рубрик, которые выдает Яндекс и привязка к ним организаций.
3. Добавление всех свойств, которые выдает Яндекс и привязка их к нужным рубрикам.
4. Использование стандартного механизма импорта InstantMaps (все добавленные объекты можно увидеть в админке InstantMaps)
5. Группировка адресов по наименованию организации.

Требования:
ioncube loader 4.4+
купленный компонент InstantMaps для второй ветки

По традиции кидаю ссылку на бесплатную версию (ниже), которую можно смело пробовать на своем домене. Версия полностью функциональная, ограничение только на количество добавляемых за раз объектов — 15 объектов. В полной версии Яндекс отдает до 1000 объектов за один раз.

Инструкция:

Скачать и установить стандартными средствами
Перейти на страницу /iparserymaps/import для работы с компонентом. Парсер работает только под администратором (в целях безопасности).

Платную версию выложу на днях, в любом случае прошу даже тех, кто хотел приобрести — сначала попробовать у себя ограниченную. Может быть появятся какие-то мысли по развитию компонента. Цены, скидки и ссылку на полную версию добавлю в пост завтра-послезавтра.

Видео презентация:

Напоследок

PS В ходе разработки у меня возник вопрос — а может есть смысл добавить поддержку и других типов контента, а не только InstantMaps? — не у всех есть этот компонент и не всем он нужен… А вот заполнить справочник организаций может пригодиться.
+1
DeeMon DeeMon 8 лет назад #
С 2Gis не планируется? В Яше не всегда информация полная и актуальная.
0
SJen SJen 8 лет назад #
А с 2Gis через официальный API и получение лицензионного ключа? - я пока не вижу других вариантов..
0
SJen SJen 8 лет назад #
Хотел предложить datacol для парсинга 2Gis - зашел на их сайт, а они уже отказались от 2GIS, наехал юридический отдел)) Так что официальное АПИ как вариант, но это не для всех подойдет..
0
DeeMon DeeMon 8 лет назад #
Хм, печально тогда... Просто по нашему городу сравнил Яшу и 2Гис, получилось, что в Яше инфо не полная (не все объекты), и примерно половина из того, что в базе не актуально по некоторым данным. Может это конечно только у нас так...
0
AndroS AndroS 8 лет назад #
В видео подробнее бы описать, как отображаются свойства рубрик, отображаются ли они, в частности, в фильтре мапса?
PS: скидки покупателям для предыдущей ветки инстанта будут?
0
SJen SJen 8 лет назад #
PS: скидки покупателям для предыдущей ветки инстанта будут?
Будут, пока не готов конкретней ответить.

В видео подробнее бы описать, как отображаются свойства рубрик, отображаются ли они, в частности, в фильтре мапса?

Свойства автоматически в фильтр не добавляются. Могу добавить в настройки флаг (добавлять-не добавлять).
Добавить их в фильтр можно вручную. Если есть двойка с мапсом - я бы предложил поставить эту версию и "потыкать".

Я решил не добавлять автоматом свойства в фильтр, потому что их получается оооочень много.. И блок фильтров превращается в мусорку. Но добавить флаг не проблема, будет. Ну и, конечно, в любом случае можно руками в админке добавлять-убирать свойства из фильтра.
0
nmsk nmsk 8 лет назад #
А как быть с дубликатами? Компонент запоминает какой объект он уже парсил и добавлял в базу?
0
nmsk nmsk 8 лет назад #
пс
Спасибо! dance
0
SJen SJen 8 лет назад #
Добавление идёт через стандартный импорт в instantmaps. То есть результат будет такой же как если бы вы загрузили в админке файлы с пересекающимися объектами.
0
nmsk nmsk 8 лет назад #
Эм.. а если у меня созданы уже рубрики, и я хочу объекты добавить именно в них, компонент всё равно будет создавать их сам? о_О
+1
SJen SJen 8 лет назад #
Если есть рубрика "кафе" и добавить нужно организацию в эту рубрику, то новая создаваться не будет. Новая создаётся при отсутствии нужной
0
nmsk nmsk 8 лет назад #
А нужная или не нужная она, определяется автоматически по названию?
0
SJen SJen 8 лет назад #
У меня два варианта было (так же как было в парсере для первой ветки)
1. вы сами указываете рубрику, в которую нужно добавлять все спарсенные организации
2. рубрики берутся из Яндекса - что он выдает, туда и постим (если есть в базе, используем нашу - если нет, создаем).
0
SJen SJen 8 лет назад #
Импорт карт так же работает - либо указываете свою, либо берется из файла.
Но я на самом деле не ограничен возможностями стандартного "импорта карт", так что если предложите еще разумные варианты, добавлю.
0
Алексей Алексей 8 лет назад #
Вопрос: населенный пункт - Город берется из базы сайта или использует свою?
к чему вопрос - откорректировал страны, города под свои нужды и естественно поменялись id.
0
SJen SJen 8 лет назад #
выбирается город из базы сайта стандартными средствами - это нужно чтобы корректно сохранить информацию в базу
если вы поменяли города - все нормально, они и будут использоваться. ID не важны
+2
Ingvarruss Ingvarruss 8 лет назад #
C каждым днем убеждаюсь в продвинутости и функциональности двойки, раз уж практически все разработчики на неё переезжают.
0
DTVRus DTVRus 8 лет назад #
с ней проще работать, отличный фреймворк smoke
+1
Ingvarruss Ingvarruss 8 лет назад #
У меня выдает ошибку при парсинге INSERT INTO cms_con_places (`title`, `content`, `teaser`, `category_id`, `import_id`, `user_id`) VALUES ('Тайна', NULL, NULL, '143', '1434400860', '8')
0
SJen SJen 8 лет назад #
Ошибку то саму напишите, это вы запрос написали - а сам текст ошибки какой? - можете ещё город-запрос написать, чтобы я у себя проверить смог.
0
SJen SJen 8 лет назад #
Погодите, а у вас InstantMaps то установлен?
0
Bambalach Bambalach 8 лет назад #
У меня тоже ошибка
Fatal error: Maximum execution time of 30 seconds exceeded in
*****system/controllers/iparserymaps/actions/process.php on line 1073742902
0
SJen SJen 8 лет назад #
Нужно увеличить время для скриптов, 30сек вашему серверу не хватает для обработки
0
Ingvarruss Ingvarruss 8 лет назад #
Город Ростов на Дону
Мапс установлен
Ошибка - Ошибка в запросе БД: Unknown column 'teaser' in 'field list' INSERT INTO cms_con_places (`title`, `content`, `teaser`, `category_id`, `import_id`, `user_id`) VALUES ('Участковый пункт полиции', NULL, NULL, '142', '1434442587', '8') Последние вызовы: insert() @ /home/r/rostovporu/public_html/system/core/model.php : 482 insert() @ /home/r/rostovporu/public_html/system/controllers/content/model.php : 1172 addContentItem() @ /home/r/rostovporu/public_html/system/controllers/places/model.php : 0 importItems() @ /home/r/rostovporu/public_html/system/controllers/iparserymaps/actions/process.php : 965 goimport() @ /home/r/rostovporu/public_html/system/controllers/iparserymaps/actions/process.php : 952 importobjects() @ /home/r/rostovporu/public_html/system/controllers/iparserymaps/actions/process.php : 686 parseYandex() @ /home/r/rostovporu/public_html/system/controllers/iparserymaps/actions/process.php : 54 run() call_user_func_array() @ /home/r/rostovporu/public_html/system/core/controller.php : 276 runExternalAction() @ /home/r/rostovporu/public_html/system/core/controller.php : 207 runAction() @ /home/r/rostovporu/public_html/system/core/core.php : 641
0
SJen SJen 8 лет назад #
Ошибка понятно, не почем так пока не могу сказать.. Может версия мапса другая? - хотя вроде она одна всего для двойки.
Колонка teaser - это краткое описание для объекта.

http://prntscr.com/7hj6iq - посмотрите скрин админки, у вас не так? - может вы сами удалили это поле? - оно есть по умолчанию, но удалить его можно руками из админки.
0
SJen SJen 8 лет назад #
Если удалили, то его можно создать и ошибки не будет
0
qwest qwest 8 лет назад #
Может просто в тип контента парсить?
0
SJen SJen 8 лет назад #
Как именно?

В карты заводится Название, список адресов (может быть 1, а может быть и 10). Контакты, для каждого адреса свои.

Как именно это загонять в тип контент? - все кучей в виде текста?
0
qwest qwest 8 лет назад #
Создать новый тип контента создать набор полей подходящий под парсер. И парсить в эти поля. А карту парсить например в дополнение тип поля карта кто то делал для двойки.
0
SJen SJen 8 лет назад #
А в какое поле можно парсить список адресов с неизвестным заранее количеством элементов?

Ну в принципе вариант, разработать свой компонент на основе типа контента (или просто тип контента, если стандартных свойств хватит).
0
qwest qwest 8 лет назад #
Очень было бы не плохо не нужно было бы покупать два компонента.
0
Remarkus Remarkus 8 лет назад #
Красота. Ждем полную версию по разумной цене.
0
Ingvarruss Ingvarruss 8 лет назад #
Огромное спасибо. Да, поля не было. Теперь все отлично.
Вопрос немного не по теме, но парсится все с указанием сайтов и получаются все прямые ссылки, как исправить подскажите кто нибудь?
+1
SJen SJen 8 лет назад #
Да, я тоже заметил такую штуку в InstantMaps smile

Тут дело не в том, как парсится - а в том, как это выводится в шаблоне. То есть нужно править шаблон.

Надеюсь, меня не сильно побьют за выкладывание кода шаблона платного компонента. Но я совсем чуть-чуть.
Откройте файл /templates/default/controllers/places/contacts.tpl.php.
Найдите строку
Код PHP:
  1. <li class="url"><a href="<?php echo $href; ?>" target="_blank"><?php html($contacts['url']); ?></a></li>
и поменяйте на
Код PHP:
  1. <li class="url"><a href="/redirect?url=<?php echo urlencode($href); ?>" target="_blank"><?php html($contacts['url']); ?></a></li>
Это добавит вывод внешней ссылки через редирект
+1
ermakover ermakover 8 лет назад #
Полезное дополнение, спасибо. Да и за компонент спасибо огромное. Пока что попробую на бесплатной версии. Уж больно много у меня создалось категорий по запросу: "Кафе".
+3
SJen SJen 8 лет назад #
ermakover, ресторан, столовая, пиццерия - там много связанных. Я добавлю настройку, чтобы рубрики не создавались, а публикация шла в заданную только.
0
ermakover ermakover 8 лет назад #
SJen, это было бы хорошо с настройкой парсинга для рубрик, но вообще, моё субъективное мнение, что кое-какую работу нужно и можно ручками делать, чтобы не получилось совсем уже точной копии Яндекс каталога. И СЕО для рубрик вручную прописывать.
+1
Ingvarruss Ingvarruss 8 лет назад #
SJen +++
+1
Ingvarruss Ingvarruss 8 лет назад #
И крайний момент хотел бы уточнить. В новой версии яндекс карт вообще не вижу структурирования рубрик, вернее я вообще не могу найти их, только через поиск. Мож я не там смотрю?
+2
Ingvarruss Ingvarruss 8 лет назад #
Я конечно со многим здесь встречался, но за что минусы то?
+2
PIN PIN 8 лет назад #
так лучше? ;)
Олег Васильевич я Олег Васильевич я 8 лет назад #
Комментарий удален
Олег Васильевич я Олег Васильевич я 8 лет назад #
Комментарий удален
0
Максим Максим 8 лет назад #
Полезный компонент. Хотелось бы поинтересоваться у разработчика для импорта используется API компонента InstantMaops или свой?
0
SJen SJen 8 лет назад #
Категории и свойства свойства создаются и привязываются друг к другу у меня. Из модели компонента InstantMaps используется только метод "Импорт", который загоняет объекты и адреса в базу данных. Но API это громко сказано, там нет АПИ как такового..
0
ermakover ermakover 8 лет назад #
У меня вот что обнаружилось.
Вчера установил бесплатный парсер и спарсил 15 организаций.
Сегодня вообще не парсит.
Нажимаешь "Парсить!" - картинка прогресса вообще не отображается, вместо неё отображается значок отсутствия картинки, потому что файла такого нет.
Но дело не в картинке,а том, что не парсит. Может быть, в бесплатной версии всего 15 объектов можно спарсить и всё?
0
ermakover ermakover 8 лет назад #
Откатил сайт назад до установки, установил заново. Попробовал парсить - глухо висит. А вчера работало. Это у меня одного так?
0
SJen SJen 8 лет назад #
Проверю как доберусь до компьютера..
Ограничение 15 - это на один запрос. Запросов можно делать неограниченное количество.
0
Ramin Ramin 8 лет назад #
По тестил и выходит с ограничением если два раза парсить "Кафе" то спарсятся одни и те же компании
0
SJen SJen 8 лет назад #
Логично, не правда ли?)) Если два-три-пять раз вбивать в Яндекс один и тот же запрос - результат будет одинаковым - компонент же с Яндексом общается, тот и отвечает одним и тем же.

Я имел ввиду, что "15" - это не какой-то глобальный лимит, который заблокирует компонент. 15 - это ограничение на один запрос. А запросов разных можно делать сколько угодно.
0
ermakover ermakover 8 лет назад #
Разобрался с проблемой. Оказалось при восстановлении сайта у провайдера база данных восстанавливалась, а файлы оставались теми же. Раньше такого не бывало, поэтому на такое погрешить не мог пока не заметил, что в файловом менеджере файлы за сегодняшнюю дату, хотя делал восстановление на два дня назад. Похоже провайдера нужно менять.
А так всё заработало. Извините за ложную информацию.
0
SJen SJen 8 лет назад #
Отлично, что все решилось
0
Ramin Ramin 8 лет назад #
Парсер создает только категории? Или его как то можно настроить что бы создовал и под категории?
0
SJen SJen 8 лет назад #
Предложите как это должно выглядеть.
Создавать категории внутри какой-то, которую выберет админ в настройках?
0
ermakover ermakover 8 лет назад #
Вот ещё вопрос такой. Допустим я спарсил два запроса "кафе" и "детский клуб" и у меня образовалось уже 32 категории.
А если я теперь эти категории сделаю подкатегориями, парсер их увидит, чтобы поместить туда новые объекты. Или же лучше уже напарсить объектов по любым возможным запросам, а потом уже по окончании работы всё это упорядочить в категории и подкатегории?
0
ermakover ermakover 8 лет назад #
И со свойствами получается непонятка.
Вроде как в объектах они есть, но фильтрами они не обрабатываются.
То есть обрабатываются, если пользователь в строковом поле пишет слово "есть" или "нет".
Но пользователь может об этом и не догадаться.

Хотя всё это мелочи по сравнению с тем с какой скоростью парсятся объекты laugh
+1
SJen SJen 8 лет назад #
ermakover:
А если я теперь эти категории сделаю подкатегориями, парсер их увидит, чтобы поместить туда новые объекты.

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

То есть обрабатываются, если пользователь в строковом поле пишет слово "есть" или "нет".
Есть такая нехорошая штука, о которой я не написал.. с которой столкнулся при импорте.

У Яндекса у некоторых свойств тип "список", например у свойства "Кухня". Значение этого свойства - список из нескольких элементов, например "русская", "китайская", "европейская". В текущей версии инстанта нельзя в типе контента указать список значений. Можно выбрать только одно значение. Поэтому я загоняю этот список в строку.

Еще момент - если искать по свойству "кухня" и вбивать часть фразы, например "русс", то ничего не найдется - надо вводить целиком "русская", как в объекте записано.. Это работа стандартного фильтра.

Эти моменты, конечно, решатся в будущем, но пока так.
+1
ermakover ermakover 8 лет назад #
Всё-таки мне кажется нужно давать возможность пользователю как-то парсить в определённую пользователем категорию, потому что я сегодня напарсил категорий больше, чем объектов.
Стал из них делать подкатегории, стали появляться сбои и баги - к сожалению структура категорий Инстанта2 пока ещё не слишком совершенна.
Да и для провинциального города большое количество взаимоповторяющих категорий и подкатегорий - это не есть хорошо.
Либо нужно изначально сделать всю структуру категорий и подкатегорий и уже потом начинать парсить, убирая лишнее.
+2
Ramin Ramin 8 лет назад #
Вот допустим у яндекса уже есть свои категории и под категории (https://old.maps.yandex.ru/?where=&ll=55.983161%2C54.738437&spn=0.352249%2C0.112237&z=12&l=map). По чему бы не сделать так что бы парся он сразу брал их. А то при большем парсенге организаций создается слишком много категорий.
Или дать возможность пользователям выбирать перед парсингом те категории куда будут парсится организации
+1
SJen SJen 8 лет назад #
Вот допустим у яндекса уже есть свои категории
Так Яндекс любезно их отдает и парсер съедает и создает как раз их. Просто фишка в том, что один объект может находиться в нескольких категориях.

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

Или дать возможность пользователям выбирать перед парсингом те категории куда будут парсится организации
Согласен, да будет так.
0
ermakover ermakover 8 лет назад #
К сожалению, получается так, что парсер именно "придумывает" рубрики. Причём в единственном числе, хотя в у Яндекса везде множественное число. Видимо берёт название из категории объекта, где характеристика объекта дана в единственном числе. Вот результат по запросу: "кафе".

Создана рубрика Кафе
Создана рубрика Пиццерия
Создана рубрика Ресторан
Создана рубрика Ночной клуб
Создана рубрика Бильярдный клуб
Создана рубрика Булочная
Создана рубрика Кондитерская
Создана рубрика Суши-бар
Создана рубрика Доставка еды и обедов
Создана рубрика Караоке-клуб
Создана рубрика Банкетный зал
Создана рубрика Кейтеринг

В принципе и это не криминал. Спарсил и переместил объекты куда нужно, а ненужные категории удалил.
0
SJen SJen 8 лет назад #
Не придумывает..
Яндекс их так отдает.

Видимо берёт название из категории объекта
Согласен, там и берет - больше неоткуда..
0
ermakover ermakover 8 лет назад #
Спасибо за ссылку, я вчера искал этот список категорий, но на новой карте его нет. Я полагаю разумней будет сразу создать его копию на сайте, а потом уже парсить, чтобы потом не мучатся с категориями и подкатегориями.
0
SJen SJen 8 лет назад #
ermakover:
моё субъективное мнение, что кое-какую работу нужно и можно ручками делать, чтобы не получилось совсем уже точной копии Яндекс каталога.

ermakover:
Я полагаю разумней будет сразу создать его копию на сайте

laugh
0
ermakover ermakover 8 лет назад #
Дело в том, что я так и делаю.
Сначала закрываю от индексирования категории каталога или доски объявлений, "заимствую" их, наполняю, а потом начинается трудная и муторная работа по переименованию категорий и подкатегорий в близкие по смыслу значения и написанию СЕО для каждой категории.
0
Ramin Ramin 8 лет назад #
Просто у яндекса категории и подкатегории, а компанент к сожалению создает только категории первого уровня в результате получается огромное количество не структурированных категорий!
0
SJen SJen 8 лет назад #
Парсер парсит организации, только их, только по запросу. Рубрики там выводятся без иерархии - поэтому и создаются без иерархии. Новая версия уже в пути)
0
Ramin Ramin 8 лет назад #
Спасибо за ссылку, я вчера искал этот список категорий, но на новой карте его нет. Я полагаю разумней будет сразу создать его копию на сайте, а потом уже парсить, чтобы потом не мучатся с категориями и подкатегориями.
Отпишись после того как по пробуешь)
0
ermakover ermakover 8 лет назад #
Нет, к сожалению, данный способ тоже не подходит по причине того, что допустим - мы парсим объекты, создаются категории. Много как мы знаем. И допустим я из спарсенной категории "Кафе" перенёс все объекты в категорию "Кафе, рестораны, бары", а остальные категории удалил. И вот объекты, которые есть в двух или более категориях тоже удаляются. И удаляются так же и из категории "Кафе, рестораны, бары".
Это тоже недоработка движка.
Потому что вот у меня есть проект на Престашоп и там при удалении категории задаётся вопрос - удалить товары из категории полностью или оставить их в других категориях.
Так что выход один - ждать от SJen возможности парсить в заранее созданные категории.
0
SJen SJen 8 лет назад #
Так что выход один - ждать от SJen возможности парсить в заранее созданные категории.

готово, попробуйте.
+1
Гарри Гарри 8 лет назад #
Интересует 2 момента:

1. Не удобно, что свойства создаются с условием, что они должны быть обязательно заполнены. Это не удобно при редактирование объектов, к пустым свойствам надо что-то приписывать иначе не дает сохранить.
2. И не понятно, что происходит с удаленными объектами(которые не подходят для сайта) при повторном парсенге?
0
ermakover ermakover 8 лет назад #
Парсер очень хороший, разработчику спасибо.
Для тех, кто будет использовать небольшая информация. При парсинге адреса объектов берутся, естественно, из Яндекс карт но вот формат адреса у всех получается разный.
То есть один и тот же адрес после парсинга может быть написан по-разному, например: улица Мира, Мира улица, Мира ул., Мира.
В результате объекты с одинаковым адресом не объединяются в один, а залезают друг на друга.
И из-под верхнего нижний никак не достать.
Вариант лечения я нашёл только один - утвердить для себя формат адреса, к примеру вид-название ( улица Мира) или название-вид (Ярославское шоссе) и править все объекты вручную.
0
evgen evgen 7 лет назад #
Не могу понять скачал, установил и вот такое - записей 0. Да и сайт по https, пока не отключишь защиту в браузере ничего не происходит
Завершен импорт #1482795135 - открыть в админке
Ограниченная версия.
Купить полную версию можно, обратившить к SJen или написать запрос на sutuny@gmail.com

Всего обработано записей: 0.
0
AndroS AndroS 7 лет назад #
За что забанили автора?
0
lezginka.ru lezginka.ru 7 лет назад #
AndroS, о каком авторе идет речь ?
0
AndroS AndroS 7 лет назад #
об SJen
+3
Fuze Fuze 7 лет назад #
За что забанили автора?
Забанили не автора, а того, кто завладел его аккаунтом. А завладел его аккаунтом один наш давний юзер. Ужасно непонятливый и считающий что все вокруг дураки smile
А сам автор давно ни с кем не выходит на связь. Его сайты также все скомпрометированы, поэтому тем, кто общается с якобы SJen, рекомендую прервать все контакты, это мошенник, а не сам SJen.
0
Старый балбес Старый балбес 7 лет назад #
Забанили не автора, а того, кто завладел его аккаунтом. А завладел его аккаунтом один наш давний юзер.
Я тоже давно считаю что кто то завладел моим аккаунтом .Он не такой как я, он иногда хороший, а иногда еще тот фрукт!
0
Старый балбес Старый балбес 7 лет назад #
Так поставим точку! Нет этой разработки!
0
Sergey Necr Sergey Necr 7 лет назад #
Есть возможность парсить в свой тип контента созданный через админку инстанта?
0
Старый балбес Старый балбес 7 лет назад #
ИТОГО!
Забанили не автора, а того, кто завладел его аккаунтом. А завладел его аккаунтом один наш давний юзер. Ужасно непонятливый и считающий что все вокруг дураки smile А сам автор давно ни с кем не выходит на связь. Его сайты также все скомпрометированы, поэтому тем, кто общается с якобы SJen, рекомендую прервать все контакты, это мошенник, а не сам SJen.
0
Старый балбес Старый балбес 7 лет назад #
А у меня есть интерес, как данная разработка кодированная ioncube может быть иметь место в сути , не оспаривая права на открытый код , покрытый лицензией GNU самими разработчиками. Instantcms, Ведь всем понятно что любой код , который не может самостоятельно работать не в рамках лицензированного программного обеспечения заявленной разработчиком как система с открытым кодом , то любой закодированный код , нарушает право лицензии GPL, и не может быть предоставлен как разработка не нарушающая лицензионные правила.

Еще от автора

Обновление компонента "Мне нравится"
Приветствую. Закончил версию с исправлением ошибок и багов, всем пользователям обновление выслано на электронку.
Обновление компонента  "Каталог дополнений в админку"
Приветствую. Обновление самого популярного аддона из официального каталога дополнений.
Обновленный парсер Яндекс.Карт
Приветствую Изменения довольно значительны, поэтому имеет смысл оформить их отдельным постом.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.