name: metravel-travel-article description: >- Статьи-путешествия metravel.by из папок с фото (по годам): SEO-статьи с точками на карте, обложкой, галереей; правка существующих статей. Триггеры: «сделай статьи из папки <год>», «залей фото к статье», «путеводитель по городу».
metravel-travel-article
Движок и регламент для публикации путешествий на metravel.by.
Принципы (ОБЯЗАТЕЛЬНО)
- Не дублировать. Перед созданием получи список уже существующих путешествий
за этот год и пропусти совпадения:
GET https://metravel.by/api/travels/?where={"publish":1,"moderation":1,"year":"<YEAR>"}&perPage=100Сопоставь по смыслу (одно реальное путешествие может быть разбито на несколько статей — например Хорватия). Не создавай повтор. - Цель текста — польза + память. Статья должна (а) реально помочь тому, кто
собирается посетить место, и (б) сохранить личную память о поездке. Тёплый
живой тон + конкретика.
2a. Пиши как человек, без шаблонных заголовков. НЕ используй секции
«Вступление», «Что увидели», «Как прошло», «Итог», «Точки», «Описание» —
это выдаёт генерацию. Начинай сразу с живого абзаца-крючка (без заголовка),
заканчивай абзацем-выводом (без заголовка). Заголовки — только осмысленные и
естественные: по названиям мест («Вавельский замок», «Костёл Святой Троицы»,
«Прогулка по Казимежу») или по теме («Что посмотреть», «Как добраться»,
«Практическая информация», «Маршрут в цифрах»). Для путеводителей по городу
заголовки = названия достопримечательностей. Не дублируй заголовок статьи в теле.
2c. Опирайся на точки-достопримечательности
travelAddress[]изGET /api/travels/{id}/(address/categoryName/coord/travelImageThumbUrl) — это объекты, на которых сфокусирована статья (название, тип, координаты, фото). По каждому значимому добавляй полезную и интересную достоверную инфо о месте (история, легенды, топонимика, год/стиль постройки, чем известно, практика), привязывая её к соответствующему объекту/фото в теле. 2b. При исправлении/дописывании — вставляй ПО КОНТЕКСТУ, а не валом в конец. Сначала прочитай тело и сопоставь новый текст с существующими разделами/фото. Справку об объекте (история, легенды, топонимика) ставь ИНЛАЙН рядом с его заголовком и фото, а не отдельным дублирующим<h2>в хвосте — иначе текст отрывается от своих фото и появляются два заголовка об одном объекте. В конец выноси только финальное и не дублирующее: «Маршрут в цифрах», «Практическая информация», «Что рядом». Для контекстной перестановки правь полное тело через безопасный редакторscripts/seo-edit.js --id <ID> --desc-file full.html(бэкап + верификация + авто-откат), а не сырым append. - Города — это путеводитель. Если поездка про город (Краков, Варшава, и т.п.), пиши полноценный путеводитель: добавляй ВСЁ, что стоит посмотреть, опираясь на рейтинги (TripAdvisor, Google Maps top sights), а не только на свои фото. Сгруппируй по районам/темам, добавь практику по ключевым объектам.
- Правильные названия. Определяй место точно (по GPS + содержимому фото +
веб-проверке). Не угадывай наобум (пример ошибки: озеро Сосина ≠ Гродек).
Если не уверен — пометь
[уточнить]и проверь поиском. - Практическая информация:
- Замки/музеи/парки/аттракционы → часы работы, цены, офсайт. Бери из веб-поиска, помечай «актуально на <год>, уточняйте на офсайте». Не выдумывай цифры.
- Тропы/походы → «Маршрут в цифрах» из GPS-трека фото: длина (≈, нижняя оценка
по точкам), перепад высот (мин–макс, надёжно), высшая точка, время в пути.
5b. У каждой точки — категория (тип места). Точка без категории недопустима.
Тип задаётся id из справочника
categoryTravelAddress(Замок=43, Костёл=150, Озеро=84, Гора=26, Музей=76, Площадь=187, Водопад=20, Город=184 и т.д. —facets). Движок проставляет категорию автоматически по названию точки (point_categories), но проверяй адекватность; для непонятных — Город(184). 5c. Никогда не упоминай источник данных. В тексте НЕ должно быть «по GPS», «из фото», «по EXIF», «по точкам съёмки», «по кластеру», «по аэрокадрам» — это выдаёт генерацию. Цифры маршрута подавай просто как факт («около 5 км», «перепад ~460 м»). Движок (strip_meta) вычищает такие фразы на upsert.
- Обложку выбирай ВИЗУАЛЬНО — это обязательный шаг. Авто-обложка движка — лишь
черновик, её почти всегда нужно заменить. После заливки фото просмотри глазами
(Read) 5–8 кадров-кандидатов из папки (равномерно по съёмке) и выбери самый
«открыточный»: достопримечательность, пейзаж, общий вид места, узнаваемый кадр.
Установи:
python scripts/metravel_publish.py cover <id> "<файл>". На обложку НИКОГДА не ставь: еду/рестораны/кафе, селфи и крупные планы людей, интерьеры/квартиры/хостелы/номера, машины, рекламные щиты и вывески, домашних животных, таблички, случайные бытовые кадры. Если в папке смешаны «домашние» кадры (большая поездка с папкой ДОМ) — отбирай фото только по GPS-кластеру места. Галерея — тоже без мусора; лишние кадры убирайDELETE /api/gallery/{imageId}/. Фото к точкам подбираются по GPS-близости (движок делает это сам). - Что пропускать: папки «Дом/ДОМ», домашние события (Рождество, Новый год, шашлыки), ТЦ, и чисто бытовые кадры. Однодневные поездки берём, если это место, а не дом.
- Черновики, не публикация. Создавай как
publish=false, moderation=false. Публикацию/модерацию включает пользователь.
Авторизация
Скрипт берёт токен из METRAVEL_TOKEN (env) или ~/.metravel_token. Токен — это
сессионный токен залогиненного пользователя metravel.by (DRF Token), используется
только к metravel.by. В код/гит токен не коммитить. Получение: пользователь даёт
токен, либо берётся из браузера (DevTools → Application → Local Storage → userToken).
Процесс
- Обзор папки года (внешний диск, напр.
/Volumes/.../НАШИ ФОТКИ/<YEAR>): перечисли месяцы → подпапки → число фото/видео. Отбрось «Дом»/события. - Дедуп против сайта (см. принцип 1).
- Точки из EXIF: вытащи GPS из фото, кластеризуй в места (
scripts/exif_points.pyиз истории, или PIL). Координаты идут в раздел «Точки для карты». - Напиши markdown-черновик (формат ниже). Храни вне гита, напр.
~/metravel-content/<YEAR>/NN-slug.md. - Создай/обнови статью:
python scripts/metravel_publish.py upsert <draft.md> [--id <id>] --year <YEAR>(при--idточки сохраняют свои id — фото к точкам не теряются). - Залей фото:
python scripts/metravel_publish.py photos <id> "<folder>" [...] [--gallery N](обложка + галерея + фото к точкам по GPS). Для нестандартной обложки:python scripts/metravel_publish.py cover <id> "<file>". - Вставь фото в текст описания (не только галерея!):
python scripts/metravel_publish.py descimg <id>— вставляет в текст ФОТО К ТОЧКАМ (релевантные месту, о котором речь; где заголовок = название точки, ставится её фото), НЕ дублируя кадры из галереи. Идемпотентно. Поэтому у точек должны быть фото — сначалаphotos, потомdescimg. В описании не должно быть «только текст». - Проверь GET-ом: точки (с категориями), страны, галерея, обложка, фото в тексте.
Формат markdown-черновика
---
title: "SEO-заголовок (≤200 симв., с ключевыми словами и местом)"
country: Польша # или "Польша, Чехия" — маппинг в id внутри скрипта
region: Регион / город
date: YYYY-MM-DD
categories: [Поход, Хайкинг, Тур выходного дня, Самостоятельное путешествие]
---
# Заголовок
## Вступление
...
## Маршрут по точкам / Что посмотреть
...
## Практическая информация # часы/цены (музеи) или «Маршрут в цифрах» (походы)
...
## Итог
---
## Фото для загрузки # заметки, не идёт в описание
## Точки для карты # таблица: | Название | lat, lng |
| Вавель | 50.04821, 19.93145 |
Всё, что после --- перед ## Фото, попадает в описание (HTML). Блоки «Фото» и
«Точки для карты» в описание НЕ идут (точки уходят как координаты в карту).
Справочники
python scripts/metravel_publish.py facets — актуальные id категорий и стран.
Базовые: категории Поход=2, Хайкинг=21, Треккинг=22, Тур выходного дня=19,
Самостоятельное=20, Автопутешествие=6, Сплав=4, Веломаршрут=24, Велопоход=7.
Страны: Польша=160, Словакия=184, Чехия=215.
API-справка (на случай ручной работы)
- Список:
GET /api/travels/?where={...}&perPage=100(cookie или Token). - Деталь:
GET /api/travels/<id>/. - Создать/обновить:
PUT /api/travels/upsert/(Token).id:null= создать,id:<n>= обновить. Обязательны многие поля (см. скрипт): transports/month/ complexity/companions/over_nights_stay/thumbs200ForCollectionArr/ travelImageThumbUrlArr/travelImageAddress = []; minus/plus/recommendation/ youtube_link = "draft_placeholder". Точки =coordsMeTravel:[{id,lat,lng, address,country,categories,image}]. - Фото:
POST /api/upload(multipart) поляfile,collection,id. collection:travelMainImage(обложка, id=travel),gallery(id=travel),description(в текст, id=travel),travelImageAddress(фото точки, id=точки). - Кураторство галереи:
DELETE /api/gallery/{imageId}/— удалить плохой кадр из галереи (id картинки из ответа upload или из travel.gallery[].id);POST|PATCH /api/gallery/reorder/— порядок. Используй, чтобы убрать неудачные снимки (еда, ТЦ, случайное) из галереи. - Полная OpenAPI-схема бэкенда (90 endpoints):
http://192.168.50.36/api/schema/(ReDoc:/api/schema/redoc/). Создания категорий точек (categoryTravelAddress) в API НЕТ — это фиксированный справочник (админка Django). Подбирай из существующих 200+ типов; новый тип добавляется только в админке бэкенда.