<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Shadow</title><generator>teletype.in</generator><description><![CDATA[Shadow]]></description><image><url>https://img1.teletype.in/files/44/58/44587e5a-b44a-43bb-a0e1-c31c7ac0cf48.png</url><title>Shadow</title><link>https://teletype.in/@specialist_infosec</link></image><link>https://teletype.in/@specialist_infosec?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/specialist_infosec?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/specialist_infosec?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 17 Aug 2026 23:11:33 GMT</pubDate><lastBuildDate>Mon, 17 Aug 2026 23:11:33 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Creating-custom-maps-for-investigations</guid><link>https://teletype.in/@specialist_infosec/Creating-custom-maps-for-investigations?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Creating-custom-maps-for-investigations?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Создание пользовательских карт для расследований: Leaflet, QGIS, Kepler.gl</title><pubDate>Sun, 16 Aug 2026 07:31:03 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ab/5a/ab5a0c91-175d-469f-a32c-333e05c9d4a6.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/11/cd/11cd4b72-1c82-49f2-bd76-25ede00e76e3.png"></img>Создание пользовательских карт для расследований: Leaflet, QGIS, Kepler.gl]]></description><content:encoded><![CDATA[
  <figure id="9o00" class="m_column">
    <img src="https://img2.teletype.in/files/11/cd/11cd4b72-1c82-49f2-bd76-25ede00e76e3.png" width="2182" />
  </figure>
  <h3 id="Ffw0">Создание пользовательских карт для расследований: Leaflet, QGIS, <a href="https://kepler.gl/" target="_blank">Kepler.gl</a></h3>
  <p id="0bYx"><strong>Введение</strong></p>
  <p id="7cgY">Готовые картографические сервисы (Google Maps, Яндекс.Карты) — отличный инструмент для быстрой геолокации, но они не всегда подходят для глубокого анализа. Когда нужно объединить множество точек, треков, слоев, анимировать изменения во времени или добавить собственные данные, на помощь приходят пользовательские картографические инструменты. С их помощью исследователь может визуализировать маршруты, кластеры объектов, изменения на местности и даже создавать интерактивные карты для презентации результатов. Данная статья посвящена трем мощным инструментам: Leaflet (веб-карты), QGIS (профессиональная ГИС) и <a href="https://kepler.gl/" target="_blank">Kepler.gl</a> (визуализация больших данных).</p>
  <p id="BfcQ"><strong>Зачем создавать свои карты?</strong></p>
  <figure id="yjKT" class="m_column">
    <img src="https://img4.teletype.in/files/75/3b/753b8148-d25e-4da7-9b9e-ba844eccd612.png" width="858" />
  </figure>
  <p id="Zd7G"><strong>Этап 1: Общий обзор инструментов</strong></p>
  <figure id="GKF4" class="m_column">
    <img src="https://img1.teletype.in/files/4b/45/4b45527f-b5dc-4a38-a9e7-bade19d38c6d.png" width="709" />
  </figure>
  <p id="LWtU"><strong>Этап 2: Leaflet — интерактивные карты для веба</strong></p>
  <p id="QxAl"><strong>Leaflet</strong> — это легкая (менее 40 КБ) JavaScript-библиотека для создания интерактивных карт в браузере. Она позволяет накладывать маркеры, линии, полигоны, обрабатывать клики, добавлять слои и многое другое.</p>
  <p id="r5p4"><strong>Особенности:</strong></p>
  <ul id="yzCo">
    <li id="4GW1">Работает на мобильных устройствах (резиновый интерфейс).</li>
    <li id="0kNV">Поддерживает слои: тайлы (OSM, Google, Яндекс), WMS, GeoJSON, TopoJSON.</li>
    <li id="kz2C">Расширяется плагинами: маркеры, кластеризация, анимация, управление слоями.</li>
    <li id="KSAw">Легко встраивается в любой HTML-код.</li>
  </ul>
  <p id="45iw"><strong>Пример базовой карты Leaflet:</strong></p>
  <pre id="nJXr">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;OSINT Map&lt;/title&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://unpkg.com/leaflet@1.7.1/dist/leaflet.css&quot; /&gt;
    &lt;script src=&quot;https://unpkg.com/leaflet@1.7.1/dist/leaflet.js&quot;&gt;&lt;/script&gt;
    &lt;style&gt;
        #map { height: 600px; }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;map&quot;&gt;&lt;/div&gt;
    &lt;script&gt;
        // Инициализация карты
        var map = L.map(&#x27;map&#x27;).setView([55.7558, 37.6176], 12);

        // Базовый слой (OpenStreetMap)
        L.tileLayer(&#x27;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&#x27;, {
            attribution: &#x27;&amp;copy; OpenStreetMap contributors&#x27;
        }).addTo(map);

        // Добавление маркера
        L.marker([55.7558, 37.6176]).addTo(map)
            .bindPopup(&#x27;Красная площадь&#x27;)
            .openPopup();

        // Добавление линии (полилинии)
        var latlngs = [
            [55.7558, 37.6176],
            [55.7565, 37.6190],
            [55.7580, 37.6200]
        ];
        var polyline = L.polyline(latlngs, {color: &#x27;red&#x27;}).addTo(map);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
  <p id="5aG8"><strong>Как использовать Leaflet в OSINT:</strong></p>
  <ol id="KXC5">
    <li id="69eu"><strong>Визуализация треков:</strong> Загрузить GPS-треки в формате GPX, нанести на карту.</li>
    <li id="xwEi"><strong>Кластеризация точек:</strong> Использовать плагин <code>Leaflet.markercluster</code> для группировки маркеров.</li>
    <li id="mA3e"><strong>Импорт данных из Google Sheets / CSV:</strong> Преобразовать данные в GeoJSON и отобразить.</li>
    <li id="ik4r"><strong>Создание отчетных карт:</strong> Встроить карту в сайт или отчет.</li>
  </ol>
  <p id="lou1"><strong>Добавление слоев из разных источников:</strong></p>
  <ul id="J7rg">
    <li id="PtBn">OpenStreetMap (стандарт)</li>
    <li id="vzgc">Google Maps (через плагин)</li>
    <li id="zxX1">Яндекс.Карты (через плагин)</li>
    <li id="z1QS">Собственные тайлы (например, из спутниковых снимков)</li>
  </ul>
  <p id="zd60"><strong>Плагины для Leaflet:</strong></p>
  <ul id="RVEO">
    <li id="YUd4"><strong>Leaflet.markercluster:</strong> Кластеризация маркеров для большого количества точек.</li>
    <li id="2Y8W"><strong>Leaflet.timeline:</strong> Анимация данных по времени.</li>
    <li id="lmF1"><strong>Leaflet.heat:</strong> Тепловые карты.</li>
    <li id="RfKa"><strong>Leaflet.OSM:</strong> Инструменты для работы с OSM.</li>
  </ul>
  <p id="znBD"><strong>Пример с кластеризацией (использование маркеров из CSV):</strong></p>
  <pre id="16Yp">// Пример использования markercluster
var markers = L.markerClusterGroup();

// Добавить 50 маркеров (загрузка из данных)
for (var i = 0; i &lt; data.length; i++) {
    var lat = data[i].lat;
    var lng = data[i].lng;
    var marker = L.marker([lat, lng])
        .bindPopup(data[i].name);
    markers.addLayer(marker);
}

map.addLayer(markers);</pre>
  <p id="98v5"><strong>Этап 3: QGIS — мощь профессионального геоанализа</strong></p>
  <p id="io7R"><strong>QGIS</strong> (Quantum GIS) — это полноценная геоинформационная система с открытым исходным кодом. Это десктопное приложение, позволяющее работать с растровыми и векторными данными, выполнять сложный пространственный анализ, редактировать карты и создавать профессиональные макеты для печати.</p>
  <p id="s2OD"><strong>Особенности:</strong></p>
  <ul id="Hxro">
    <li id="XeOW">Поддержка сотен форматов (шейп-файлы, GeoTIFF, GeoJSON, KML, GPX, CSV).</li>
    <li id="u45R">Инструменты пространственного анализа (буферы, пересечения, подсчеты).</li>
    <li id="mIr1">Интеграция с базами данных (PostGIS, SpatiaLite).</li>
    <li id="W8WN">Система плагинов (позволяет расширять функционал).</li>
    <li id="UFWc">Встроенный обработчик растров (позволяет выполнять спектральный анализ).</li>
  </ul>
  <p id="4t6Q"><strong>Типичные задачи в QGIS для OSINT:</strong></p>
  <ol id="pXVm">
    <li id="yW10"><strong>Геокодирование адресов:</strong> Преобразование адресов в координаты.</li>
    <li id="GwBJ"><strong>Нанесение точек из CSV:</strong> Загрузка данных с координатами и атрибутами.</li>
    <li id="eqn4"><strong>Анализ плотности:</strong> Выявление горячих точек (Heatmap).</li>
    <li id="1v0G"><strong>Буферизация:</strong> Построение зон влияния вокруг объектов.</li>
    <li id="tjSO"><strong>Наложение спутниковых снимков:</strong> Сравнение разных слоев.</li>
    <li id="GdpA"><strong>Создание картографических макетов:</strong> Для отчетов.</li>
  </ol>
  <p id="pueK"><strong>Пример: загрузка точек из CSV и создание тепловой карты</strong></p>
  <ol id="1Xnp">
    <li id="1yNq">Открыть QGIS → Layer → Add Layer → Add Delimited Text Layer.</li>
    <li id="ANSP">Выбрать CSV-файл с колонками <code>lat</code>, <code>lon</code>.</li>
    <li id="BvVm">Указать проекцию WGS84 (EPSG:4326).</li>
    <li id="YgdZ">Перейти в Processing → Toolbox → Interpolation → Heatmap (Kernel Density Estimation).</li>
    <li id="T39A">Указать слой точек, радиус, выходной файл.</li>
    <li id="UhVz">Настроить цветовую гамму.</li>
  </ol>
  <p id="GrEF"><strong>Плагины для QGIS (особенно полезные в OSINT):</strong></p>
  <ul id="tyqM">
    <li id="k3nG"><strong>OpenLayers Plugin:</strong> Позволяет добавлять тайлы Google, Bing, Яндекс в качестве подложки.</li>
    <li id="YFVR"><strong>QuickOSM:</strong> Быстрая загрузка данных из OpenStreetMap.</li>
    <li id="EUam"><strong>Lat Lon Tools:</strong> Инструменты для работы с координатами.</li>
    <li id="m0kM"><strong>MMQGIS:</strong> Набор утилит (геокодирование, конвертация).</li>
    <li id="bzuZ"><strong>GeoSearch:</strong> Поиск по адресам и местам.</li>
  </ul>
  <p id="Wcq5"><strong>Кейс: анализ кластеризации событий в городе</strong></p>
  <p id="2xxL"><em>Задача:</em> На карту нанесены точки публикаций из соцсетей с геотегами за месяц. Необходимо выявить районы с максимальной концентрацией событий.</p>
  <ol id="EoRr">
    <li id="axFN">Импортировать CSV в QGIS.</li>
    <li id="bvIb">Построить тепловую карту (Kernel Density Estimation).</li>
    <li id="SgEM">Сравнить тепловую карту с инфраструктурой города (парки, ТЦ, станции метро).</li>
    <li id="8PNY">Найти корреляцию: точки сгруппированы вблизи крупных торговых центров.</li>
    <li id="mTyB">Вывод: события связаны с потребительской активностью.</li>
  </ol>
  <p id="gZUx"><strong>Экспорт в веб: QGIS позволяет экспортировать карту в формат GeoJSON или KML, который затем можно загрузить в Leaflet.</strong></p>
  <p id="m6JJ"><strong>Этап 4: <a href="https://kepler.gl/" target="_blank">Kepler.gl</a> — визуализация больших данных с анимацией</strong></p>
  <p id="qJBv"><strong><a href="https://kepler.gl/" target="_blank">Kepler.gl</a></strong> — это инструмент визуализации геопространственных данных, созданный Uber. Он позволяет быстро создавать впечатляющие интерактивные карты с большим количеством точек (до миллионов) и анимировать их во времени.</p>
  <p id="pTQa"><strong>Особенности:</strong></p>
  <ul id="Aqde">
    <li id="lFnI">Браузерный инструмент, работающий на WebGL (высокая производительность).</li>
    <li id="6gjK">Автоматическая кластеризация, тепловые карты, линии, полигоны.</li>
    <li id="mXhj">Временные срезы (timeline) — можно анимировать изменения во времени.</li>
    <li id="fxFr">Экспорт в HTML (самостоятельная интерактивная карта).</li>
    <li id="wUny">Интеграция с Jupyter Notebook (через библиотеку).</li>
  </ul>
  <p id="GQE1"><strong>Как использовать <a href="https://kepler.gl/" target="_blank">Kepler.gl</a> в OSINT:</strong></p>
  <ol id="UZRC">
    <li id="5nqZ"><strong>Загрузка данных:</strong> Поддерживаются CSV, GeoJSON, GPX, KML.</li>
    <li id="WL7I"><strong>Выбор слоя:</strong> Точки, линии, полигоны.</li>
    <li id="sxAz"><strong>Настройка атрибутов:</strong> Цвет, размер, всплывающие подсказки.</li>
    <li id="ehsb"><strong>Временная шкала:</strong> Если данные содержат временные метки, можно анимировать изменения.</li>
    <li id="gKcn"><strong>Экспорт:</strong> Сохранить карту в виде HTML-файла для демонстрации.</li>
  </ol>
  <p id="SZoq"><strong>Пример: анализ перемещения судов по данным AIS</strong></p>
  <p id="EQFH"><em>Задача:</em> Отобразить треки движения судна за неделю, анимировать по времени.</p>
  <ol id="mD91">
    <li id="d2uj">Загрузить CSV с колонками: <code>lat</code>, <code>lon</code>, <code>timestamp</code>, <code>speed</code>.</li>
    <li id="tV4E">В <a href="https://kepler.gl/" target="_blank">Kepler.gl</a> выбрать слой типа &quot;Line&quot; (сегменты, соединяющие точки).</li>
    <li id="UoKX">Включить опцию &quot;Time&quot; → выбрать поле <code>timestamp</code>.</li>
    <li id="Z2hx">Настроить цвет по скорости.</li>
    <li id="WQ8J">Запустить анимацию.</li>
    <li id="Gpgl">Получить интерактивную карту, показывающую движение судна во времени.</li>
  </ol>
  <p id="vJVy"><strong>Сравнение с QGIS:</strong></p>
  <ul id="MOdQ">
    <li id="ZfcP">Kepler — быстрый и простой для визуализации больших массивов.</li>
    <li id="s8Kk">QGIS — более сложный, но дает больше инструментов анализа.</li>
  </ul>
  <p id="Mt0B"><strong>Этап 5: Сравнение инструментов</strong></p>
  <figure id="WHdq" class="m_original">
    <img src="https://img3.teletype.in/files/a4/b6/a4b6b518-1cc3-4a17-9b64-a01045ed4c15.png" width="707" />
  </figure>
  <p id="L3Lk"><strong>Рекомендация по выбору:</strong></p>
  <figure id="mpQX" class="m_column">
    <img src="https://img1.teletype.in/files/c7/51/c7518fb9-2595-42b6-90c0-6cf3bf5e8c91.png" width="946" />
  </figure>
  <p id="FgOK"><strong>Этап 6: Комбинированный подход — использование всех трех</strong></p>
  <p id="tEQF">В реальных расследованиях часто используется комбинация:</p>
  <ol id="nuzo">
    <li id="wOXb"><strong>QGIS</strong> для предварительной обработки, фильтрации и пространственного анализа данных.</li>
    <li id="gQwe"><strong><a href="https://kepler.gl/" target="_blank">Kepler.gl</a></strong> для быстрой визуализации и временной анимации.</li>
    <li id="y2qi"><strong>Leaflet</strong> для публикации финальной карты на сайте или в отчете (с элементами, которые должны быть интерактивными).</li>
  </ol>
  <p id="eCc3"><strong>Этап 7: Практический кейс — полное расследование с картами</strong></p>
  <p id="JAHu"><em>Задача:</em> По данным утечки баз данных, обнаружены координаты точек встреч контрабандистов. Необходимо визуализировать их, выявить паттерны и создать интерактивную карту для отчета.</p>
  <ol id="dauL">
    <li id="KIVh"><strong>QGIS:</strong> Загрузить CSV с координатами. Построить тепловую карту, выявить кластеры (горячие точки). Определить, что большинство встреч происходит вблизи портов.</li>
    <li id="eUJQ"><strong><a href="https://kepler.gl/" target="_blank">Kepler.gl</a>:</strong> Загрузить те же данные, добавить временную шкалу (если есть даты). Анимировать последовательность встреч, выявить закономерности: встречи происходят в определенные дни недели.</li>
    <li id="f9RV"><strong>Leaflet:</strong> Экспортировать обработанные слои в GeoJSON. Создать HTML-страницу с интерактивной картой, где можно включать/выключать слои (точки, тепловая карта, буферные зоны). Встроить всплывающие подсказки с атрибутами (дата, тип груза).</li>
    <li id="ouSl"><strong>Презентация:</strong> Карта встраивается в отчет. Заказчик может кликать по точкам и видеть подробности.</li>
  </ol>
  <p id="eveR"><strong>Инструменты для создания карт (сводная таблица)</strong></p>
  <figure id="oYXS" class="m_column">
    <img src="https://img4.teletype.in/files/7c/b8/7cb8fe96-28fa-402e-96a7-f4e762811dc9.png" width="947" />
  </figure>
  <p id="uHxg">Создание пользовательских карт — неотъемлемая часть GEOINT-расследований. Leaflet, QGIS и <a href="https://kepler.gl/" target="_blank">Kepler.gl</a> дают исследователю полный набор инструментов: от быстрой визуализации на сайте до сложного пространственного анализа и анимации больших данных. Важно понимать сильные стороны каждого инструмента и комбинировать их для достижения максимального эффекта. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Mapping-services</guid><link>https://teletype.in/@specialist_infosec/Mapping-services?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Mapping-services?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Картографические сервисы: сравнение Google Maps, Яндекс.Карты, Bing, OpenStreetMap</title><pubDate>Wed, 12 Aug 2026 07:57:26 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/86/a5/86a52a92-7942-459e-b29c-20fd3f468821.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/a3/e4/a3e4a5b9-37b8-4386-877c-ecd7935e69c2.png"></img>Карты — это не просто инструмент навигации, а один из основных источников географических данных в OSINT-расследованиях. Google Maps, Яндекс.Карты, Bing Maps и OpenStreetMap (OSM) — это четыре наиболее популярных сервиса, каждый из которых имеет свои сильные стороны, особенности и ограничения. Выбор правильной карты может существенно ускорить геолокацию, а неправильный — привести к ложным выводам. Данная статья посвящена сравнению этих сервисов, их сильным и слабым сторонам, а также практическим рекомендациям по использованию.]]></description><content:encoded><![CDATA[
  <figure id="8A9h" class="m_column">
    <img src="https://img3.teletype.in/files/a3/e4/a3e4a5b9-37b8-4386-877c-ecd7935e69c2.png" width="2199" />
  </figure>
  <h3 id="CJji">Картографические сервисы и их ограничения: сравнение Google Maps, Яндекс.Карты, Bing, OpenStreetMap</h3>
  <p id="eVNJ">Карты — это не просто инструмент навигации, а один из основных источников географических данных в OSINT-расследованиях. Google Maps, Яндекс.Карты, Bing Maps и OpenStreetMap (OSM) — это четыре наиболее популярных сервиса, каждый из которых имеет свои сильные стороны, особенности и ограничения. Выбор правильной карты может существенно ускорить геолокацию, а неправильный — привести к ложным выводам. Данная статья посвящена сравнению этих сервисов, их сильным и слабым сторонам, а также практическим рекомендациям по использованию.</p>
  <p id="Rs0d"><strong>Зачем знать особенности картографических сервисов?</strong></p>
  <figure id="suas" class="m_column">
    <img src="https://img1.teletype.in/files/08/17/0817c856-9547-46e7-b7d1-1b5c56f45f03.png" width="945" />
  </figure>
  <p id="BhV5"><strong>Сравнение основных картографических сервисов</strong></p>
  <figure id="dT0J" class="m_column">
    <img src="https://img2.teletype.in/files/92/7a/927ac78d-2cd0-429f-807d-6259358acd47.png" width="788" />
  </figure>
  <figure id="TcxN" class="m_column">
    <img src="https://img1.teletype.in/files/0e/e3/0ee39c6d-0b2e-4db1-8bfe-830f6714849b.png" width="791" />
  </figure>
  <p id="xxPV"><strong>Google Maps</strong></p>
  <p id="cIBv"><strong>Сильные стороны:</strong></p>
  <ul id="dLjv">
    <li id="wZyD"><strong>Лучшие панорамы улиц (Street View):</strong> Огромное покрытие, высокое качество, регулярные обновления. Возможность перемещаться по улицам и сравнивать с фото.</li>
    <li id="2lSw"><strong>Высокое разрешение спутниковых снимков:</strong> Особенно в крупных городах и интересующих регионах.</li>
    <li id="aaAZ"><strong>Исторические панорамы:</strong> В Street View можно увидеть снимки за разные годы.</li>
    <li id="3ybt"><strong>3D-здания:</strong> Позволяют оценить архитектуру и перспективу.</li>
    <li id="m0rG"><strong>Интеграция с другими сервисами:</strong> Google Earth, Google Maps Platform (API).</li>
  </ul>
  <p id="T5cE"><strong>Ограничения:</strong></p>
  <ul id="bPjz">
    <li id="03xv"><strong>Цензура и ограничения:</strong> В некоторых странах (например, Китай) Google Maps работает с ограничениями.</li>
    <li id="4EVz"><strong>Плата за API:</strong> Коммерческое использование API платное.</li>
    <li id="GUnY"><strong>Политика конфиденциальности:</strong> Данные собираются и используются корпорацией Google.</li>
    <li id="RywD"><strong>Панорамы могут быть устаревшими:</strong> В некоторых регионах панорамы могут быть 5-10 летней давности.</li>
    <li id="sG0J"><strong>Политическая ангажированность:</strong> Карты могут отражать официальную позицию США и других стран(например, в отношении Донбасса).</li>
  </ul>
  <p id="8EmE"><strong>Когда использовать Google Maps:</strong></p>
  <ul id="1Nkv">
    <li id="I88o">Когда нужны панорамы улиц (особенно в США, Европе, многих других странах).</li>
    <li id="fJxW">Для детального анализа местности в 3D.</li>
    <li id="2CF0">Для поиска по названиям мест, организаций.</li>
  </ul>
  <p id="enyy"><strong>Яндекс.Карты</strong></p>
  <p id="xaay"><strong>Сильные стороны:</strong></p>
  <ul id="bPbq">
    <li id="KKKX"><strong>Лучшее покрытие России и СНГ:</strong> Яндекс.Панорамы показывают практически все крупные города России, Беларуси, Казахстана, Украины, Турции, Грузии и других стран СНГ.</li>
    <li id="Pd2n"><strong>Детальные карты с большим количеством POI:</strong> Очень подробная информация о магазинах, кафе, остановках, банках.</li>
    <li id="Koya"><strong>Панорамы с возможностью перемотки во времени:</strong> В некоторых городах есть архив панорам.</li>
    <li id="JEqs"><strong>Пользовательские правки:</strong> Местные жители часто обновляют данные, делая их актуальными.</li>
    <li id="soqr"><strong>API:</strong> Доступен для разработчиков (есть бесплатные лимиты).</li>
  </ul>
  <p id="i0C3"><strong>Ограничения:</strong></p>
  <ul id="x3PQ">
    <li id="2VIo"><strong>Меньше покрытие за пределами СНГ:</strong> В Европе и США панорамы доступны в ограниченных локациях.</li>
    <li id="ItkI"><strong>Спутниковые снимки:</strong> Разрешение может быть ниже, чем у Google, в некоторых регионах.</li>
    <li id="wgOG"><strong>Политическая ангажированность:</strong> Карты могут отражать официальную позицию России.</li>
  </ul>
  <p id="m0mA"><strong>Когда использовать Яндекс.Карты:</strong></p>
  <ul id="cNuG">
    <li id="L9GP">Для России, Беларуси, Казахстана, Украины, Грузии, Турции, Армении.</li>
    <li id="Cwys">Когда нужно быстро идентифицировать местность по панорамам в странах СНГ.</li>
    <li id="FE7L">Для поиска местных объектов (магазины, банки, аптеки).</li>
  </ul>
  <p id="pPd5"><strong>Bing Maps</strong></p>
  <p id="rac9"><strong>Сильные стороны:</strong></p>
  <ul id="0Ubf">
    <li id="Htsx"><strong>Высокое разрешение спутниковых снимков в США и Европе.</strong></li>
    <li id="dyn7"><strong>Интеграция с Microsoft Azure</strong> и другими сервисами.</li>
    <li id="fQSS"><strong>Bing Streetside</strong> — панорамы в некоторых городах США и Европы.</li>
    <li id="nxwt"><strong>Хорошая производительность.</strong></li>
  </ul>
  <p id="G252"><strong>Ограничения:</strong></p>
  <ul id="J1rG">
    <li id="zmf9"><strong>Меньшее покрытие панорамами</strong> по сравнению с Google.</li>
    <li id="mA1I"><strong>Слабое покрытие России и развивающихся стран.</strong></li>
    <li id="KZaO"><strong>API платный</strong> для коммерческого использования.</li>
    <li id="bPDd"><strong>Меньшая популярность</strong>, меньше пользовательских правок.</li>
  </ul>
  <p id="ZVOH"><strong>Когда использовать Bing Maps:</strong></p>
  <ul id="cmE5">
    <li id="0lbT">Как альтернатива Google в США.</li>
    <li id="L8ZE">Для спутниковых снимков в регионах, где Google может иметь менее свежие данные.</li>
    <li id="umpt">Для разработки (при интеграции с Azure).</li>
  </ul>
  <p id="ZL8f"><strong>OpenStreetMap (OSM)</strong></p>
  <p id="9Ubx"><strong>Сильные стороны:</strong></p>
  <ul id="rIRR">
    <li id="gUI3"><strong>Полностью открытые данные:</strong> Любой может редактировать карту, добавлять объекты, исправлять ошибки.</li>
    <li id="GEub"><strong>Глобальное покрытие:</strong> Очень детальные карты во многих регионах (особенно в Европе, США, развитых странах).</li>
    <li id="sISy"><strong>Огромное количество слоёв:</strong> Велосипедные дорожки, пешеходные маршруты, общественный транспорт.</li>
    <li id="Fabg"><strong>Бесплатный API:</strong> Безлимитный доступ к данным (при соблюдении условий).</li>
    <li id="fgrd"><strong>Используется во многих OSINT-инструментах:</strong> Maltego, QGIS, Gephi и др.</li>
  </ul>
  <p id="EeiR"><strong>Ограничения:</strong></p>
  <ul id="NZqd">
    <li id="wjwc"><strong>Отсутствие панорам улиц:</strong> Нет собственных панорам. Но можно использовать Mapillary (краудсорсинговые панорамы).</li>
    <li id="CE78"><strong>Нет спутниковых снимков:</strong> Спутниковые слои берутся из других источников (Bing, Esri).</li>
    <li id="TXRc"><strong>Качество зависит от сообщества:</strong> В некоторых регионах карта может быть неполной или устаревшей.</li>
    <li id="VBYP"><strong>Сложность для неподготовленных пользователей:</strong> Редактирование требует знаний.</li>
  </ul>
  <p id="23RD"><strong>Когда использовать OpenStreetMap:</strong></p>
  <ul id="8VTK">
    <li id="DYtr">Для исследования общественных данных (здания, дороги, инфраструктура).</li>
    <li id="ONAV">Для анализа сетей (например, дорожной сети, маршрутов).</li>
    <li id="wNJj">Для работы с OSINT-инструментами.</li>
    <li id="IOBG">Для экспорта данных в QGIS.</li>
  </ul>
  <p id="WgXu"><strong>Mapillary — альтернатива панорамам для OSM</strong></p>
  <p id="xaAL"><strong>Mapillary</strong> — краудсорсинговый сервис панорам, интегрированный с OSM. Пользователи по всему миру загружают панорамы улиц (через приложение), которые привязываются к координатам.</p>
  <p id="jPBP"><strong>Сильные стороны:</strong></p>
  <ul id="ZwPk">
    <li id="fw51"><strong>Бесплатно и открыто.</strong></li>
    <li id="ZEaH"><strong>Множество свежих панорам</strong> (от пользователей).</li>
    <li id="3gaQ"><strong>Интеграция с OSM</strong> (данные используются для уточнения карты).</li>
    <li id="kuHs"><strong>Покрытие в регионах, где Google нет.</strong></li>
  </ul>
  <p id="yB7f"><strong>Ограничения:</strong></p>
  <ul id="epYR">
    <li id="K0X6"><strong>Качество и покрытие нестабильны</strong> (зависит от пользователей).</li>
    <li id="pghh"><strong>Меньше исторических данных</strong> (не всегда есть архив).</li>
  </ul>
  <p id="FSOT"><strong>Когда использовать Mapillary:</strong></p>
  <ul id="mtYu">
    <li id="02cC">В дополнение к Google/Яндекс, когда нужна панорама в месте, где Google нет.</li>
    <li id="JWAV">Для проверки объектов в труднодоступных регионах.</li>
  </ul>
  <p id="PZO6"><strong>Практическое использование: сравнение панорам на примере</strong></p>
  <p id="Wb2V"><em>Задача:</em> Определить место по фото, где видно здание с красной крышей и вывеску кафе.</p>
  <ol id="Cv9g">
    <li id="TTMn"><strong>Google Street View:</strong> Загружаем фото, ищем похожий угол. В большинстве городов мира панорамы доступны.</li>
    <li id="7myD"><strong>Яндекс.Панорамы:</strong> Если это Россия или СНГ, Яндекс.Панорамы могут показать более свежие снимки и с большей детализацией.</li>
    <li id="0HID"><strong>Mapillary:</strong> Если это отдаленный регион, где Google/Яндекс не имеют панорам, ищем в Mapillary.</li>
    <li id="f6N5"><strong>Bing Streetside:</strong> Для США может быть альтернативой Google.</li>
  </ol>
  <p id="qcgr"><strong>Вывод:</strong> Лучше проверять несколько сервисов, чтобы не пропустить нужный ракурс.</p>
  <p id="7r94"><strong>Этап 2: Спутниковые снимки — сравнение разрешения и свежести</strong></p>
  <figure id="yJuL" class="m_column">
    <img src="https://img4.teletype.in/files/37/35/3735a9ed-0f19-498d-8540-d3b114f497fe.png" width="788" />
  </figure>
  <p id="VayW"><strong>Рекомендация:</strong> Для детального анализа зданий используйте Google Earth. Для мониторинга изменений — EO Browser (Sentinel). Для ежедневного мониторинга — Planet (если есть бюджет).</p>
  <p id="jbVy"><strong>Этап 3: Картографические API для OSINT-автоматизации</strong></p>
  <p id="qZWe">Все сервисы предоставляют API для доступа к картам, но с разными условиями:</p>
  <figure id="rvK1" class="m_original">
    <img src="https://img3.teletype.in/files/6c/7b/6c7b4f05-b0d2-4d68-a940-3708bdcb289d.png" width="789" />
  </figure>
  <p id="I0bS"><strong>Пример использования Overpass API (OSM) для извлечения данных:</strong></p>
  <pre id="FJdn">import requests

# Запрос всех зданий в определенной области (по координатам)
overpass_url = &quot;https://overpass-api.de/api/interpreter&quot;
query = &quot;&quot;&quot;
[out:json];
(
  node[&quot;building&quot;](48.85,2.35,48.87,2.37);
  way[&quot;building&quot;](48.85,2.35,48.87,2.37);
  relation[&quot;building&quot;](48.85,2.35,48.87,2.37);
);
out center;
&quot;&quot;&quot;
response = requests.get(overpass_url, params={&#x27;data&#x27;: query})
data = response.json()
# Анализ данных</pre>
  <p id="wWAw"><strong>Этап 4: Ограничения картографических сервисов и как их обходить</strong></p>
  <p id="4WGX"><strong>1. Обновление данных:</strong></p>
  <ul id="QpVR">
    <li id="fh5T"><strong>Google Street View</strong> может быть неактуальным (снимки 5-10 летней давности в некоторых регионах).</li>
    <li id="cq1F"><strong>OSM</strong> обновляется сообществом, но зависит от энтузиастов.</li>
  </ul>
  <p id="tsFK"><strong>Решение:</strong> Сравнивать несколько источников и проверять дату снимков.</p>
  <p id="uwPB"><strong>2. Географические ограничения:</strong></p>
  <ul id="yMca">
    <li id="u6wY">Google Maps в Китае не работает (или с ограничениями). Используйте Baidu Maps.</li>
    <li id="id6o">Яндекс.Карты лучше всего в России и СНГ.</li>
  </ul>
  <p id="LiTe"><strong>3. Спутниковые снимки с низким разрешением:</strong></p>
  <ul id="4LYt">
    <li id="4VfS">Бесплатные сервисы имеют 10-30 м разрешение, что недостаточно для детального анализа.</li>
  </ul>
  <p id="Wc6a"><strong>Решение:</strong> Использовать Google Earth (снимки Maxar) или платные Planet/Maxar.</p>
  <p id="jjBQ"><strong>4. API-лимиты:</strong></p>
  <ul id="eTMK">
    <li id="jG5S">Бесплатные API имеют ограничения.</li>
  </ul>
  <p id="HMrX"><strong>Решение:</strong> Использовать несколько ключей (если разрешено), или оплачивать подписку.</p>
  <p id="NzII"><strong>Этап 5: Практический кейс — выбор сервиса для геолокации</strong></p>
  <p id="zbEM"><em>Задача:</em> Необходимо найти точное место по фото, где видны: здание с синей крышей, парк рядом, вывеска на русском языке.</p>
  <ol id="2h7i">
    <li id="Dkw7"><strong>Первичный анализ:</strong> Язык — русский → регион России, СНГ, Беларусь, Казахстан.</li>
    <li id="0s1N"><strong>Google Street View:</strong> Проверяем по вывеске (если читается). Если Google имеет панорамы в этом городе, ищем похожий ракурс.</li>
    <li id="RJD3"><strong>Яндекс.Панорамы:</strong> Если это Россия, Яндекс.Панорамы, скорее всего, дадут более свежие и детальные панорамы.</li>
    <li id="NFYe"><strong>OSM:</strong> Проверяем наличие парка и здания в OSM. Если они отмечены, можно получить адрес.</li>
    <li id="G6a2"><strong>Спутниковый снимок (Google Earth):</strong> Проверяем, есть ли здание с синей крышей.</li>
    <li id="qqPd"><strong>Кросс-референс:</strong> Сравниваем панорамы Google и Яндекс — если они совпадают, геолокация подтверждена.</li>
  </ol>
  <p id="KY2A"><strong>Сводная таблица рекомендаций</strong></p>
  <figure id="KojN" class="m_column">
    <img src="https://img1.teletype.in/files/c4/4a/c44a1b41-23b6-4b53-b32e-aeb4232d4330.png" width="947" />
  </figure>
  <p id="EKMx">Выбор правильного картографического сервиса зависит от региона, задачи и доступных данных. Google Maps — универсальный лидер по панорамам и спутниковым снимкам. Яндекс.Карты незаменимы для России и СНГ. OpenStreetMap — ключ к открытым данным и API. Комбинируя эти сервисы и используя их сильные стороны, исследователь может значительно ускорить геолокацию и получить более достоверные результаты. Следующая статья цикла посвящена <strong>созданию пользовательских карт для расследований: Leaflet, QGIS, <a href="https://kepler.gl/" target="_blank">Kepler.gl</a></strong>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Time-series-analysis</guid><link>https://teletype.in/@specialist_infosec/Time-series-analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Time-series-analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Анализ временных рядов: выявление изменений на местности (стройки, техника, вырубка, передвижения)</title><pubDate>Mon, 03 Aug 2026 18:13:18 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/62/8d/628dc693-6da1-47ca-bcce-bd76d6dd7197.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/26/b3/26b3ad2e-bdfb-4d63-8f43-1e6742f7a86f.png"></img>Один снимок — это мгновение. Десять снимков за год — это история. Анализ временных рядов спутниковых снимков позволяет увидеть, как менялась местность: где появились новые здания, куда переместилась техника, где вырубили лес или проложили дорогу. Для OSINT-специалиста это возможность восстановить хронологию событий, проверить алиби, обнаружить скрытую деятельность и даже предсказать будущие изменения. Данная статья посвящена методам выявления изменений на местности с использованием спутниковых снимков разных дат.]]></description><content:encoded><![CDATA[
  <figure id="S3rr" class="m_retina">
    <img src="https://img3.teletype.in/files/26/b3/26b3ad2e-bdfb-4d63-8f43-1e6742f7a86f.png" width="1099" />
  </figure>
  <h3 id="RH7I">Анализ временных рядов: выявление изменений на местности (стройки, техника, вырубка, передвижения)</h3>
  <p id="t0nB">Один снимок — это мгновение. Десять снимков за год — это история. Анализ временных рядов спутниковых снимков позволяет увидеть, как менялась местность: где появились новые здания, куда переместилась техника, где вырубили лес или проложили дорогу. Для OSINT-специалиста это возможность восстановить хронологию событий, проверить алиби, обнаружить скрытую деятельность и даже предсказать будущие изменения. Данная статья посвящена методам выявления изменений на местности с использованием спутниковых снимков разных дат.</p>
  <p id="N9p0"><strong>Зачем анализировать временные ряды?</strong></p>
  <figure id="9Tqf" class="m_column">
    <img src="https://img4.teletype.in/files/30/b8/30b85d5d-db48-40a3-a856-a6bd596a6013.png" width="1213" />
  </figure>
  <p id="2xUA"><strong>Типы изменений, которые можно обнаружить</strong></p>
  <figure id="2PEd" class="m_column">
    <img src="https://img3.teletype.in/files/68/60/68605528-53e0-498f-9553-1319c043cde8.png" width="1212" />
  </figure>
  <p id="ZA09"><strong>Этап 1: Базовое сравнение снимков (визуальное)</strong></p>
  <p id="F6wu">Самый простой метод — открыть два снимка в EO Browser, Google Earth или QGIS и сравнить их визуально.</p>
  <p id="cRtM"><strong>Методика:</strong></p>
  <ol id="YrnS">
    <li id="FtSf">Выбрать дату &quot;до&quot; (например, за год до события).</li>
    <li id="xIdt">Выбрать дату &quot;после&quot; (после события).</li>
    <li id="ZvY3">Открыть в разделенных окнах или использовать слайдер времени.</li>
    <li id="iFHS">Искать различия: новые объекты, исчезнувшие объекты, изменения цвета.</li>
  </ol>
  <p id="uNj6"><strong>EO Browser:</strong></p>
  <ul id="8vmS">
    <li id="UEgz">Использовать &quot;Compare&quot; (сравнение двух снимков) — функция позволяет накладывать снимки разных дат с прозрачностью или разделять экран.</li>
  </ul>
  <p id="yTj4"><strong>Google Earth:</strong></p>
  <ul id="zSG9">
    <li id="8Ld1">Открыть исторические снимки и переключаться между датами.</li>
  </ul>
  <p id="wQX9"><strong>Визуальные индикаторы:</strong></p>
  <ul id="WKWu">
    <li id="qjni"><strong>Новые серые пятна</strong> → бетонные площадки, здания.</li>
    <li id="rygN"><strong>Темные пятна</strong> → вода, тени (возможно, новые объекты).</li>
    <li id="K8g4"><strong>Светлые полосы</strong> → новые дороги.</li>
    <li id="WWqy"><strong>Смена цвета с зеленого на коричневый</strong> → вырубка леса.</li>
  </ul>
  <p id="kPvf"><strong>Этап 2: Использование спектральных индексов для выявления изменений (NDVI)</strong></p>
  <p id="utOD">NDVI (Normalized Difference Vegetation Index) — индекс, показывающий здоровье растительности. Резкое изменение NDVI может указывать на вырубку леса, застройку или изменение сельскохозяйственной активности.</p>
  <p id="db89"><strong>Формула NDVI:</strong></p>
  <pre id="PWz9">NDVI = (NIR - Red) / (NIR + Red)</pre>
  <ul id="4tjX">
    <li id="gFKL"><strong>NIR</strong> (Near Infrared) — ближний инфракрасный канал (Sentinel-2 B08).</li>
    <li id="o98Y"><strong>Red</strong> — красный канал (Sentinel-2 B04).</li>
    <li id="xCWs">Значения от -1 до 1:</li>
    <ul id="QWxK">
      <li id="bMTW">0.3+ → здоровая растительность.</li>
      <li id="JOMS">0.0 → открытая почва, вода.</li>
      <li id="Q1uS">&lt; 0 → вода или антропогенные объекты.</li>
    </ul>
  </ul>
  <p id="h9z5"><strong>Как использовать NDVI для обнаружения изменений:</strong></p>
  <ol id="xqqD">
    <li id="VJB8">Вычислить NDVI для двух дат.</li>
    <li id="nMvB">Вычислить разницу (NDVI_after - NDVI_before).</li>
    <li id="aM9q">Выделить области с резким изменением (положительным или отрицательным).</li>
  </ol>
  <p id="WX2P"><strong>Пример в EO Browser (применение индексной маски):</strong></p>
  <ul id="p3AJ">
    <li id="X82e">Использовать &quot;Index&quot; в EO Browser для отображения NDVI.</li>
    <li id="EQ4B">Сравнить NDVI за разные даты.</li>
    <li id="RolG">Области, где NDVI резко упал (с 0.6 до 0.2) → возможная вырубка или застройка.</li>
  </ul>
  <p id="sj95"><strong>Этап 3: Использование алгоритмов обнаружения изменений (Change Detection)</strong></p>
  <p id="O9ce">Существуют автоматические алгоритмы, которые выделяют области изменений.</p>
  <p id="8fgP"><strong>Методы:</strong></p>
  <ul id="M3C6">
    <li id="NELw"><strong>Пиксельное сравнение:</strong> Сравниваются значения пикселей в двух снимках.</li>
    <li id="d5KN"><strong>Классификация:</strong> Снимки классифицируются на классы (вода, растительность, застройка), и изменения классов отслеживаются.</li>
    <li id="9xxh"><strong>Временной анализ:</strong> Анализируются тренды NDVI за длительный период.</li>
  </ul>
  <p id="zAov"><strong>Google Earth Engine — пример обнаружения изменений:</strong></p>
  <pre id="W3rc">// Загрузка двух снимков
var image1 = ee.Image(&#x27;COPERNICUS/S2/2022-06-15&#x27;);
var image2 = ee.Image(&#x27;COPERNICUS/S2/2023-06-15&#x27;);

// Расчет NDVI
var ndvi1 = image1.normalizedDifference([&#x27;B8&#x27;, &#x27;B4&#x27;]);
var ndvi2 = image2.normalizedDifference([&#x27;B8&#x27;, &#x27;B4&#x27;]);

// Обнаружение изменений (разница NDVI)
var diff = ndvi2.subtract(ndvi1);

// Визуализация изменений (красный=уменьшение, зеленый=увеличение)
var palette = [&#x27;red&#x27;, &#x27;white&#x27;, &#x27;green&#x27;];
Map.addLayer(diff, {min: -0.3, max: 0.3, palette: palette}, &#x27;Changes&#x27;);</pre>
  <p id="ls9s"><strong>Этап 4: Обнаружение новых объектов (зданий, дорог)</strong></p>
  <p id="pWA0">Новые объекты часто выглядят как светлые или темные пятна на фоне растительности или почвы.</p>
  <p id="JbPU"><strong>Методы обнаружения новых объектов:</strong></p>
  <ol id="nsx3">
    <li id="gEAj"><strong>Визуальное сравнение:</strong> Сравнение снимков до и после.</li>
    <li id="XbSN"><strong>Использование мультиспектральных каналов:</strong></li>
    <ul id="Wpgu">
      <li id="7sAE"><strong>SWIR (коротковолновый инфракрасный)</strong>: помогает отличать искусственные материалы (бетон, асфальт) от растительности.</li>
      <li id="Pvyk"><strong>NIR (ближний инфракрасный)</strong>: показывает здоровье растений; увядание может указывать на строительство.</li>
    </ul>
    <li id="Cbdk"><strong>Автоматическое выделение границ объектов:</strong> Использование алгоритмов (например, Canny edge detection) для выделения контуров.</li>
  </ol>
  <p id="FTmG"><strong>Пример в QGIS:</strong></p>
  <ul id="g05W">
    <li id="0VD6">Загрузить два снимка.</li>
    <li id="Oyty">Использовать инструмент &quot;Raster Calculator&quot; для вычисления разницы.</li>
    <li id="zuuQ">Применить порог (threshold) для выделения значительных изменений.</li>
  </ul>
  <p id="e14u"><strong>Этап 5: Отслеживание перемещения техники</strong></p>
  <p id="RgVA">Для отслеживания техники на спутниковых снимках нужна высокая разрешающая способность (3-5 м), что доступно только в коммерческих снимках (Planet, Maxar). Однако даже на бесплатных снимках можно заметить:</p>
  <ul id="AtEy">
    <li id="GlP0">Следы гусениц.</li>
    <li id="eNuL">Изменение тени (например, самолет на взлетной полосе).</li>
    <li id="s5cq">Появление и исчезновение объектов (например, грузовиков, поездов).</li>
  </ul>
  <p id="AECH"><strong>Методология:</strong></p>
  <ol id="Uvi0">
    <li id="Lx14">Найти область интереса (военная база, аэродром, порт).</li>
    <li id="WZjh">Загрузить снимки за несколько дат (ежедневно, если есть доступ).</li>
    <li id="iFxt">Сравнить и найти перемещения техники (например, танки выехали с базы).</li>
  </ol>
  <p id="vdhi"><strong>Ограничения:</strong></p>
  <ul id="bUzK">
    <li id="wdGl">Не все спутники имеют достаточное разрешение.</li>
    <li id="eqpl">Облака могут скрывать объекты.</li>
  </ul>
  <p id="dejL"><strong>Этап 6: Использование спутникового радара (Sentinel-1) для обнаружения изменений</strong></p>
  <p id="LBf6">Радарные снимки (Sentinel-1) не зависят от облачности и времени суток. Они позволяют обнаруживать изменения на поверхности земли, даже если снимок сделан ночью или под облаками.</p>
  <p id="T8GR"><strong>Применение радарного анализа:</strong></p>
  <ul id="8jWN">
    <li id="1jnF"><strong>Обнаружение новых построек:</strong> Радар хорошо отражается от металлических и бетонных поверхностей.</li>
    <li id="i4yD"><strong>Выявление вырубки леса:</strong> Уменьшение сигнала от растительности.</li>
    <li id="tC9h"><strong>Отслеживание движения:</strong> Микроизменения поверхности, указывающие на активность.</li>
  </ul>
  <p id="77fY"><strong>Инструменты для работы с радаром:</strong></p>
  <ul id="iF8k">
    <li id="XGJK"><strong>Sentinel-1 Toolbox (SNAP):</strong> Бесплатное ПО от ESA.</li>
    <li id="xNDl"><strong>EO Browser</strong> также поддерживает отображение Sentinel-1 (режим &quot;Radar&quot;).</li>
  </ul>
  <p id="mvxT"><strong>Этап 7: Анализ временных рядов за несколько лет</strong></p>
  <p id="ZPG7">Иногда изменения происходят постепенно. Для анализа требуется не два снимка, а серия за несколько лет.</p>
  <p id="yYm5"><strong>Методика:</strong></p>
  <ol id="0MsJ">
    <li id="WAvj">Загрузить снимки за каждый год (например, летние, с минимальной облачностью).</li>
    <li id="4LzB">Сравнить их последовательно.</li>
    <li id="wjLL">Визуализировать тренды (например, с помощью графиков в Python).</li>
  </ol>
  <p id="kJto"><strong>Пример: мониторинг вырубки леса в Амазонии.</strong></p>
  <ul id="hoYq">
    <li id="gpz0">Снимки за 2010, 2015, 2020, 2025 годы.</li>
    <li id="SwTx">Площадь леса постепенно уменьшается.</li>
    <li id="dy2P">Выявлены новые дороги, ведущие вглубь леса.</li>
  </ul>
  <p id="HEjQ"><strong>Этап 8: Выявление движения грунта и изменений рельефа (InSAR)</strong></p>
  <p id="sOhd"><strong>InSAR (Interferometric SAR)</strong> — метод, использующий фазу радиоволн для измерения изменений высоты с точностью до миллиметров. Это позволяет выявить проседание грунта, оползни, тектоническую активность.</p>
  <p id="Gk0i"><strong>Применение:</strong></p>
  <ul id="R36d">
    <li id="lgTZ">Обнаружение подземных работ (туннели, шахты).</li>
    <li id="Rm42">Мониторинг оползней.</li>
    <li id="Uiku">Обнаружение движения военной техники (следы гусениц).</li>
  </ul>
  <p id="prIs"><strong>Инструменты:</strong></p>
  <ul id="5Gzu">
    <li id="wkmi"><strong>SNAP</strong> (Sentinel-1 Toolbox) — InSAR модуль.</li>
    <li id="r5LV"><strong>ASF Vertex</strong> — онлайн-интерфейс для обработки радарных данных.</li>
  </ul>
  <p id="XNLg"><strong>Этап 9: Использование краудсорсинговых карт для проверки изменений</strong></p>
  <p id="vGpl">Изменения на спутниковых снимках можно подтвердить с помощью открытых карт:</p>
  <ul id="wIfc">
    <li id="UZQw"><strong>OpenStreetMap</strong> — изменения вносятся пользователями (новые дороги, здания).</li>
    <li id="lN83"><strong>Wikimapia</strong> — пользовательские метки объектов.</li>
    <li id="3DkV"><strong>Mapillary</strong> — панорамы с указанием дат (можно сравнить с датой на спутнике).</li>
  </ul>
  <p id="rznI"><strong>Этап 10: Практический кейс — обнаружение строительства военной базы</strong></p>
  <p id="F766"><em>Задача:</em> Обнаружить строительство новой военной базы в отдаленном районе.</p>
  <ol id="aho0">
    <li id="1VCH"><strong>Начало:</strong> Имеется подозрение о строительстве базы на основе данных от информатора.</li>
    <li id="xlq3"><strong>Сбор снимков:</strong> EO Browser, снимки Sentinel-2 за 2023 год (до), 2024 год (после).</li>
    <li id="obs6"><strong>Визуальное сравнение:</strong></li>
    <ul id="Jul3">
      <li id="HJv9">На снимке 2023 года — лес.</li>
      <li id="2ek9">На снимке 2024 года — вырубленный участок, следы грунта, бетонные площадки.</li>
    </ul>
    <li id="7vwq"><strong>NDVI анализ:</strong> NDVI упал с 0.6 до 0.2 (вырубка леса).</li>
    <li id="ftqj"><strong>Дополнительный снимок (Sentinel-1):</strong> Радар подтверждает наличие новых объектов (яркое отражение от металла и бетона).</li>
    <li id="zOWj"><strong>Анализ временного ряда:</strong> Снимки за каждый месяц показывают последовательное появление зданий и дорог.</li>
    <li id="UYew"><strong>Сравнение с информацией от источника:</strong> Конфиденциально подтверждено (устно).</li>
    <li id="DDky"><strong>Вывод:</strong> Строительство военной базы подтверждено на 99%. Координаты: 55.XX, 37.XX. Информация передана заказчику.</li>
  </ol>
  <p id="fPoi"><strong>Инструменты для анализа временных рядов</strong></p>
  <figure id="UoH8" class="m_column">
    <img src="https://img4.teletype.in/files/30/ed/30ed3e82-43a5-4500-bf3b-ba244aef20fa.png" width="1212" />
  </figure>
  <p id="lSvP"><strong>Ограничения метода</strong></p>
  <ol id="l1sX">
    <li id="xa9p"><strong>Облачность:</strong> Мешает оптическим снимкам. Используйте радар (Sentinel-1) как запасной вариант.</li>
    <li id="YycW"><strong>Периодичность:</strong> Не все спутники снимают каждый день. Для непрерывного мониторинга нужны коммерческие спутники (Planet).</li>
    <li id="0Czv"><strong>Разрешение:</strong> Для обнаружения мелких объектов (один грузовик) нужно высокое разрешение (планет или maxar), что платно.</li>
    <li id="uHL2"><strong>Интерпретация:</strong> Не все изменения — антропогенные. Лес может выгореть, вырубка может быть легальной.</li>
    <li id="v6Qu"><strong>Дата съемки:</strong> Если дата снимка неизвестна, сложно установить хронологию.</li>
  </ol>
  <p id="UXNF">Анализ временных рядов спутниковых снимков — мощнейший инструмент в арсенале GEOINT. Он позволяет восстанавливать хронологию событий, выявлять скрытую деятельность, проверять алиби и мониторить изменения. Комбинация визуального сравнения, спектральных индексов (NDVI), радарных методов и алгоритмов обнаружения изменений дает максимально полную картину.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Working-with-satellite-images</guid><link>https://teletype.in/@specialist_infosec/Working-with-satellite-images?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Working-with-satellite-images?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Работа со спутниковыми снимками: Sentinel Hub, EO Browser, Google Earth Engine</title><pubDate>Mon, 03 Aug 2026 17:39:31 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e5/9b/e59bbc9c-4e25-4d86-b14d-12ef6c570b93.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/4f/c9/4fc93ffe-105f-4f7b-a28b-24993816cf33.png"></img>Спутниковые снимки — это окно в мир, доступное каждому. Современные спутники (Sentinel, Landsat, MODIS) предоставляют бесплатные снимки высокого и среднего разрешения с регулярностью от нескольких дней до нескольких недель. Для GEOINT-специалиста спутниковые данные — это возможность не только подтвердить геолокацию, но и увидеть изменения на местности, отследить перемещение техники, обнаружить скрытые объекты и даже восстановить историю событий. Данная статья посвящена методам работы с бесплатными спутниковыми сервисами: Sentinel Hub, EO Browser и Google Earth Engine.]]></description><content:encoded><![CDATA[
  <figure id="VO7V" class="m_retina">
    <img src="https://img1.teletype.in/files/4f/c9/4fc93ffe-105f-4f7b-a28b-24993816cf33.png" width="1099" />
  </figure>
  <h3 id="o3BL">Работа со спутниковыми снимками: Sentinel Hub, EO Browser, Google Earth Engine</h3>
  <p id="O1Ma">Спутниковые снимки — это окно в мир, доступное каждому. Современные спутники (Sentinel, Landsat, MODIS) предоставляют бесплатные снимки высокого и среднего разрешения с регулярностью от нескольких дней до нескольких недель. Для GEOINT-специалиста спутниковые данные — это возможность не только подтвердить геолокацию, но и увидеть изменения на местности, отследить перемещение техники, обнаружить скрытые объекты и даже восстановить историю событий. Данная статья посвящена методам работы с бесплатными спутниковыми сервисами: Sentinel Hub, EO Browser и Google Earth Engine.</p>
  <figure id="66b2" class="m_column">
    <img src="https://img3.teletype.in/files/a6/8a/a68a9e91-aa3d-4863-9014-bf7edb0c4e1c.png" width="1006" />
  </figure>
  <p id="Gb7E"><strong>Для большинства задач GEOINT достаточно Sentinel-2 (10 м разрешения) и Landsat (15-30 м).</strong></p>
  <p id="FW7q"><strong>Этап 1: Sentinel Hub и EO Browser — самый простой вход в спутниковый анализ</strong></p>
  <p id="SHGa"><strong>EO Browser</strong> (<a href="https://apps.sentinel-hub.com/eo-browser" target="_blank">https://apps.sentinel-hub.com/eo-browser</a>) — это веб-интерфейс для просмотра спутниковых снимков Sentinel, Landsat и других. Он не требует регистрации для просмотра, но для загрузки снимков нужен бесплатный аккаунт Sentinel Hub.</p>
  <p id="74fl"><strong>Основные функции EO Browser:</strong></p>
  <ul id="8yx7">
    <li id="fJjf">Визуализация снимков в реальном времени (с задержкой 1-5 дней).</li>
    <li id="lBlW">Выбор различных комбинаций каналов (естественные цвета, NDVI, NDWI и др.).</li>
    <li id="E1Mb">Сравнение снимков разных дат (слайдер времени).</li>
    <li id="tbup">Загрузка снимков в высоком разрешении.</li>
    <li id="J545">Поиск по координатам и названиям мест.</li>
  </ul>
  <p id="YFyO"><strong>Как использовать EO Browser для геолокации:</strong></p>
  <ol id="fmCI">
    <li id="eKaN"><strong>Ввести координаты</strong> предполагаемого места.</li>
    <li id="BWg0"><strong>Выбрать дату</strong> (в районе съемки фото/видео).</li>
    <li id="OAsL"><strong>Сравнить снимок</strong> с фото/видео (поиск совпадений зданий, ландшафта).</li>
    <li id="vnBU"><strong>Скачать снимок</strong> для дальнейшего анализа (в QGIS).</li>
  </ol>
  <p id="eYxD"><strong>Пример:</strong></p>
  <ul id="egk3">
    <li id="CtA8">Есть фото, предположительно из пригорода Парижа. Открываем EO Browser, находим район, сравниваем расположение зданий, очертания леса. Если всё совпадает — геолокация подтверждена.</li>
  </ul>
  <p id="nYyr"><strong>Этап 2: Sentinel Hub API — автоматизация сбора данных</strong></p>
  <p id="7DJ7">Sentinel Hub предоставляет API для программного доступа к спутниковым снимкам. Это позволяет автоматизировать мониторинг изменений, загружать снимки по расписанию и встраивать их в дашборды.</p>
  <p id="Wnsa"><strong>Настройка:</strong></p>
  <ol id="g48h">
    <li id="k4fn">Зарегистрироваться на <strong>Sentinel Hub</strong> (бесплатный аккаунт).</li>
    <li id="JXDR">Создать клиент (OAuth) и получить <code>client_id</code> и <code>client_secret</code>.</li>
    <li id="XGxm">Установить библиотеку <code>sentinelhub</code> (Python).</li>
  </ol>
  <p id="K99g"><strong>Пример запроса снимка за определенную дату:</strong></p>
  <pre id="1Yac">from sentinelhub import SHConfig, BBox, CRS, SentinelHubRequest, DataCollection, MimeType

config = SHConfig()
config.sh_client_id = &quot;YOUR_CLIENT_ID&quot;
config.sh_client_secret = &quot;YOUR_CLIENT_SECRET&quot;

# Координаты (пример: Париж)
bbox = BBox([2.3522, 48.8566, 2.38, 48.88], crs=CRS.WGS84)
request = SentinelHubRequest(
    data_folder=&quot;data&quot;,
    evalscript=&quot;&quot;&quot;
        // Естественные цвета (RGB)
        // См. документацию для более сложных комбинаций
        return [B04, B03, B02];  // Red, Green, Blue (Sentinel-2)
    &quot;&quot;&quot;,
    input_data=[
        SentinelHubRequest.input_data(
            data_collection=DataCollection.SENTINEL2_L2A,
            time_interval=(&quot;2023-06-15&quot;, &quot;2023-06-16&quot;),
            maxcc=0.1  # Максимальная облачность 10%
        )
    ],
    responses=[
        SentinelHubRequest.output_response(&#x27;default&#x27;, MimeType.PNG)
    ],
    bbox=bbox,
    size=[512, 512],
    config=config
)

request.get_data()</pre>
  <ul id="s6b7">
    <li id="G8zg">Бесплатный аккаунт имеет ограничения по количеству запросов и размеру снимков.</li>
    <li id="ldE7">Для массовых запросов нужна платная подписка.</li>
  </ul>
  <p id="8s8r"><strong>Этап 3: Google Earth Engine — мощная платформа для анализа временных рядов</strong></p>
  <p id="1cai"><strong>Google Earth Engine</strong> (GEE) — это облачная платформа для анализа геопространственных данных. Она содержит огромный архив спутниковых снимков (Sentinel, Landsat, MODIS) и позволяет выполнять сложные вычисления (например, анализ NDVI за 10 лет) прямо в браузере, без скачивания данных.</p>
  <p id="tUBg"><strong>Доступ:</strong> <a href="https://earthengine.google.com/" target="_blank">https://earthengine.google.com/</a> (требуется регистрация, бесплатно для академических и некоммерческих целей).</p>
  <p id="mDhh"><strong>Основные возможности GEE:</strong></p>
  <ul id="GRMU">
    <li id="lVs1">Доступ к полному архиву (с 1980-х годов).</li>
    <li id="VpF4">Выполнение скриптов на JavaScript или Python.</li>
    <li id="yLcs">Сравнение снимков разных дат (временная шкала).</li>
    <li id="8WJj">Создание анимаций изменений.</li>
    <li id="gnvi">Экспорт данных в GeoTIFF, CSV, PNG.</li>
  </ul>
  <p id="65Or"><strong>Пример кода GEE (JavaScript) — обнаружение изменений:</strong></p>
  <pre id="TuNf">// Загрузка коллекции Sentinel-2 за период
var collection = ee.ImageCollection(&quot;COPERNICUS/S2&quot;)
  .filterBounds(geometry)  // геометрия интереса
  .filterDate(&quot;2023-01-01&quot;, &quot;2023-12-31&quot;)
  .filter(ee.Filter.lt(&quot;CLOUDY_PIXEL_PERCENTAGE&quot;, 10));

// Выбор одного снимка (например, за лето)
var image = collection
  .filter(ee.Filter.calendarRange(6, 8, &#x27;month&#x27;))
  .median();

// Визуализация
Map.addLayer(image, {bands: [&quot;B4&quot;, &quot;B3&quot;, &quot;B2&quot;], min: 0, max: 3000}, &quot;Sentinel-2 RGB&quot;);</pre>
  <p id="BGxD"><strong>Использование GEE для GEOINT:</strong></p>
  <ul id="Fdlc">
    <li id="0Kpq"><strong>Мониторинг изменений:</strong> Сравнить снимки до и после события (строительство, вырубка леса, перемещение техники).</li>
    <li id="0aHD"><strong>Обнаружение скрытых объектов:</strong> Использование различных спектральных каналов для выявления объектов, невидимых в обычном RGB.</li>
    <li id="mXgF"><strong>Анализ NDVI:</strong> Определение растительности (здоровые участки vs повреждённые).</li>
    <li id="qayr"><strong>Изучение истории:</strong> Просмотр снимков за разные годы для восстановления хронологии.</li>
  </ul>
  <p id="1enT"><strong>Этап 4: Сравнение спутниковых снимков разных дат (слайдер времени)</strong></p>
  <p id="ricY">EO Browser, Google Earth Engine и даже Google Earth имеют инструменты для сравнения снимков.</p>
  <p id="BYvn"><strong>Google Earth:</strong></p>
  <ul id="rO6R">
    <li id="g3k5">Открыть окно &quot;Historical Imagery&quot;.</li>
    <li id="QABB">Выбрать дату и сравнить с современным состоянием.</li>
  </ul>
  <p id="QHWJ"><strong>EO Browser:</strong></p>
  <ul id="nrAi">
    <li id="4AZB">Использовать &quot;Timeline&quot; (слайдер времени) для быстрого сравнения разных дат.</li>
    <li id="CjWH">Переключать снимки (например, &quot;2023-05-10&quot; vs &quot;2023-08-15&quot;).</li>
  </ul>
  <p id="P7bg"><strong>Google Earth Engine:</strong></p>
  <ul id="bXd5">
    <li id="nkpL">Использовать <code>ui.Thumbnail</code> или создавать анимации.</li>
    <li id="js0u">Сравнивать снимки до и после события.</li>
  </ul>
  <p id="HC4m"><strong>Этап 5: Работа с мультиспектральными каналами (не только RGB)</strong></p>
  <p id="zD6n">Спутниковые снимки содержат больше, чем просто красный, зеленый и синий каналы.</p>
  <p id="Gttp"><strong>Типичные каналы Sentinel-2:</strong></p>
  <figure id="IAqy" class="m_column">
    <img src="https://img4.teletype.in/files/b2/0d/b20d7ccf-40b1-496f-82b0-cddcf361cae6.png" width="992" />
  </figure>
  <p id="N3Np"><strong>Популярные комбинации каналов:</strong></p>
  <figure id="fZ6Y" class="m_column">
    <img src="https://img3.teletype.in/files/6d/05/6d05c719-0cb8-46a9-bfe2-a04e3e297915.png" width="1210" />
  </figure>
  <p id="ixXK"><strong>Пример использования SWIR в GEOINT:</strong></p>
  <ul id="8kk0">
    <li id="Dg57">Обнаружение скрытых дорог или троп (по изменению влажности почвы).</li>
    <li id="gL0r">Выявление изменений в почвенном покрове (может указывать на строительство).</li>
  </ul>
  <p id="jn3J"><strong>Этап 6: Автоматический поиск изменений с помощью скриптов</strong></p>
  <p id="1gaA">Можно настроить автоматическое уведомление при изменении снимка в определённой области.</p>
  <p id="S3rK"><strong>Алгоритм:</strong></p>
  <ol id="FXCw">
    <li id="9zr8">Выделить область интереса (полигон).</li>
    <li id="Zl1w">Настроить скрипт, который сравнивает снимки (например, каждую неделю).</li>
    <li id="TuUD">При обнаружении изменений (по NDVI или спектральному индексу) отправить уведомление.</li>
  </ol>
  <p id="prla"><strong>Пример на Python (с использованием Sentinel Hub):</strong></p>
  <pre id="Hija">import numpy as np
from sentinelhub import ...

# Функция получения среднего NDVI за период
def get_mean_ndvi(bbox, start_date, end_date):
    evalscript = &quot;&quot;&quot;
        // Расчет NDVI
        var ndvi = (B08 - B04) / (B08 + B04);
        return [ndvi];
    &quot;&quot;&quot;
    request = SentinelHubRequest(...)
    data = request.get_data()
    return np.mean(data) if data.size &gt; 0 else None</pre>
  <p id="wVrE"><strong>Этап 7: Спутниковые снимки и геолокация — практический кейс</strong></p>
  <p id="gCFS"><em>Задача:</em> Найти координаты старого аэродрома, который был заасфальтирован и превращен в парковку. Есть фото с самолётом на фоне лесополосы. Фото предположительно 1990-х годов.</p>
  <ol id="EOrk">
    <li id="i9l8"><strong>Сбор информации:</strong> Точного адреса нет. Есть примерный район (Подмосковье).</li>
    <li id="OwVT"><strong>Поиск в Google Earth:</strong></li>
    <ul id="sMvH">
      <li id="zNaW">Открыть исторические снимки.</li>
      <li id="o18i">Просматривать районы (бывшие аэродромы).</li>
      <li id="IiqC">Найти участок с длинной прямой полосой (бывшая взлётно-посадочная) и лесополосой вокруг.</li>
    </ul>
    <li id="poS8"><strong>Сравнение с EO Browser:</strong></li>
    <ul id="NZvp">
      <li id="s6w2">Найти современный снимок (парковка, здания).</li>
      <li id="zZ0F">Найти снимок 1990-х (если есть в архиве) — подтвердить, что там был аэродром.</li>
    </ul>
    <li id="zgFQ"><strong>Визуальное совпадение:</strong></li>
    <ul id="NX4o">
      <li id="7PKu">Сравнить лесополосу на фото с лесополосой на спутниковом снимке. Совпадают по форме.</li>
    </ul>
    <li id="Y2xs"><strong>Координаты:</strong> 55.8045, 37.7456 (пример).</li>
    <li id="O5yv"><strong>Кросс-референс:</strong> Поиск в интернете по описанию (старый аэродром + лесополоса) → находится официальная информация, подтверждающая геолокацию.</li>
  </ol>
  <p id="DIg4"><strong>Инструменты для работы со спутниковыми снимками</strong></p>
  <figure id="ClrI" class="m_column">
    <img src="https://img1.teletype.in/files/c3/10/c310638f-c81b-436c-b5da-c9bfb63878f8.png" width="1006" />
  </figure>
  <p id="0PUK"><strong>Ограничения при работе со спутниковыми снимками</strong></p>
  <ol id="1VhV">
    <li id="kmHD"><strong>Облачность:</strong> Облака могут закрывать интересующую область. Выбирайте снимки с минимальной облачностью.</li>
    <li id="ZqEy"><strong>Разрешение:</strong> Для детального анализа нужны снимки высокого разрешения (0.3-1.5 м), но они платные.</li>
    <li id="nxfL"><strong>Дата съемки:</strong> Спутники не снимают каждый день. Периодичность 2-16 дней.</li>
    <li id="XIPx"><strong>Архивы:</strong> Не все снимки сохраняются в архивах (особенно старые).</li>
    <li id="jXuZ"><strong>Искажения:</strong> Спутниковые снимки могут быть искажены рельефом местности.</li>
  </ol>
  <p id="ssxk">Спутниковые снимки — это неотъемлемая часть современного GEOINT. Они позволяют подтверждать геолокацию, выявлять изменения, анализировать историю местности и даже обнаруживать скрытые объекты. Бесплатные сервисы (EO Browser, Sentinel Hub, Google Earth Engine) предоставляют исследователю мощный инструментарий, который при правильном использовании даёт возможность заглянуть в прошлое и увидеть настоящее с высоты птичьего полёта.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Shadow-Analysis</guid><link>https://teletype.in/@specialist_infosec/Shadow-Analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Shadow-Analysis?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Анализ теней, освещения и перспективы для определения времени и места съемки</title><pubDate>Thu, 30 Jul 2026 07:09:02 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/91/f2/91f2875a-54e4-403b-a255-3d70f62ae202.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/67/de/67de66c5-7a39-41d6-a050-4d123b9d2343.png"></img>Тени и освещение - это одни из самых мощных, но и самых сложных инструментов геолокации. Они могут дать точное время съемки, указать на географическую широту и даже помочь определить дату. В отличие от архитектуры или языка, тени не зависят от человеческой культуры - они подчиняются законам астрономии и геометрии. Однако их анализ требует понимания движения Солнца, работы с картами высот и использования специализированных калькуляторов. Данная статья посвящена методам анализа теней, освещения и перспективы для геолокации.]]></description><content:encoded><![CDATA[
  <figure id="Yl9a" class="m_retina">
    <img src="https://img3.teletype.in/files/67/de/67de66c5-7a39-41d6-a050-4d123b9d2343.png" width="1099" />
  </figure>
  <h3 id="uiJJ">Анализ теней, освещения и перспективы для определения времени и места съемки</h3>
  <p id="2Nag">Тени и освещение - это одни из самых мощных, но и самых сложных инструментов геолокации. Они могут дать точное время съемки, указать на географическую широту и даже помочь определить дату. В отличие от архитектуры или языка, тени не зависят от человеческой культуры - они подчиняются законам астрономии и геометрии. Однако их анализ требует понимания движения Солнца, работы с картами высот и использования специализированных калькуляторов. Данная статья посвящена методам анализа теней, освещения и перспективы для геолокации.</p>
  <p id="DHky"><strong>Что даёт анализ теней и освещения?</strong></p>
  <figure id="pA8s" class="m_column">
    <img src="https://img2.teletype.in/files/14/64/146464c7-f235-44f0-a0ba-5105efd70292.png" width="866" />
  </figure>
  <p id="o3D7"><strong>Основы движения Солнца</strong></p>
  <p id="har5">Для понимания теней необходимо знать основные законы:</p>
  <ol id="Uvp2">
    <li id="BsbH"><strong>Солнце восходит на востоке, заходит на западе</strong> (с небольшими отклонениями в зависимости от сезона и широты).</li>
    <li id="sBWB"><strong>В полдень Солнце находится в наивысшей точке</strong> (в северном полушарии - на юге, в южном - на севере).</li>
    <li id="oPDi"><strong>Тени короче всего в полдень</strong> (когда Солнце в зените).</li>
    <li id="O0Og"><strong>Утром тени падают на запад, вечером - на восток</strong> (в северном полушарии).</li>
    <li id="Y8Xu"><strong>Зимой Солнце ниже над горизонтом, тени длиннее</strong> (даже в полдень).</li>
  </ol>
  <p id="TVcw"><strong>Этап 1: Определение направления по теням</strong></p>
  <p id="mu4Y">Направление тени позволяет определить стороны света, если известен хотя бы приблизительный регион и время суток.</p>
  <p id="JNKJ"><strong>Как определить направление:</strong></p>
  <ol id="O6OB">
    <li id="ONDE">Выбрать вертикальный объект (столб, человека, здание).</li>
    <li id="OITa">Определить направление его тени (относительно объекта).</li>
    <li id="Ip23"><strong>В северном полушарии:</strong></li>
    <ul id="8ScH">
      <li id="blcE">Утром тень падает на запад (Солнце на востоке).</li>
      <li id="iTnk">В полдень тень падает на север (Солнце на юге).</li>
      <li id="YhEn">Вечером тень падает на восток (Солнце на западе).</li>
    </ul>
    <li id="38mo"><strong>В южном полушарии</strong> - наоборот (тень в полдень падает на юг).</li>
  </ol>
  <p id="ioFN"><strong>Инструменты для определения азимута:</strong></p>
  <ul id="9pIX">
    <li id="7MjF">Компас (на телефоне или реальный) - если известно место.</li>
    <li id="iYIO">Карты (Google Maps) с ориентированием по сторонам света.</li>
    <li id="l5jF">Солнечные часы - метод &quot;импровизированного компаса&quot;.</li>
  </ul>
  <p id="6Xal"><strong>Этап 2: Определение времени суток по теням</strong></p>
  <p id="AEmd">Длина и направление тени зависят от высоты Солнца над горизонтом.</p>
  <p id="Libx"><strong>Примерное правило для северного полушария (умеренные широты):</strong></p>
  <figure id="V6Cp" class="m_column">
    <img src="https://img3.teletype.in/files/af/56/af565786-80be-4e59-ab6f-5e6b5400e49b.png" width="947" />
  </figure>
  <p id="ZZHh"><strong>Математический метод:</strong><br />Отношение длины тени к высоте объекта = <code>tg(угол Солнца)</code>.</p>
  <ol id="voIQ">
    <li id="VqL9">Измерить на фото: высоту объекта (H) и длину тени (L) (в одних единицах).</li>
    <li id="bGuh">Вычислить угол = arctg(L/H).</li>
    <li id="Xu7h">Зная приблизительную широту, определить время суток.</li>
  </ol>
  <p id="EFSb"><strong>Пример:</strong></p>
  <ul id="ZKga">
    <li id="OMu8">Человек ростом 1.8 м отбрасывает тень длиной 2.7 м.</li>
    <li id="zh1o"><code>tg(α) = 2.7 / 1.8 = 1.5</code> → α ≈ 56°.</li>
    <li id="tKVm">Солнце на высоте 56° над горизонтом. При широте ~55° (Москва) это соответствует ~13:00 летом.</li>
  </ul>
  <p id="7vRx"><strong>Этап 3: Определение сезона по теням</strong></p>
  <p id="rAxo">Зимой Солнце ниже, поэтому тени длиннее. Летом - короче.</p>
  <p id="91jT"><strong>Признаки сезона:</strong></p>
  <ul id="SPwp">
    <li id="AHCm"><strong>Длинные тени (даже в полдень)</strong> - зима.</li>
    <li id="JcOY"><strong>Короткие тени в полдень</strong> - лето (особенно вблизи экватора).</li>
    <li id="pFki"><strong>Тени отсутствуют (Солнце в зените)</strong> - тропики, примерно 2 раза в год.</li>
  </ul>
  <p id="slpZ"><strong>Сравнение с визуальными признаками:</strong></p>
  <ul id="NXED">
    <li id="n2ty">Листва на деревьях - лето/весна.</li>
    <li id="NiVe">Снег на земле - зима.</li>
    <li id="I2bx">Длинная одежда людей - осень/зима.</li>
  </ul>
  <p id="5mtr"><strong>Этап 4: Определение широты по теням (метод &quot;полуденной тени&quot;)</strong></p>
  <p id="1CfF">Если на фотографии известен полдень (или можно определить момент съемки), можно вычислить широту.</p>
  <p id="SO9W"><strong>Метод:</strong></p>
  <ol id="kHhr">
    <li id="WeuP">Найти момент полдня (когда тени самые короткие).</li>
    <li id="gXLg">Измерить угол Солнца над горизонтом (α) в полдень.</li>
    <li id="W2NE"><strong>Широта = 90° - α + склонение Солнца (δ).</strong></li>
    <ul id="SHoR">
      <li id="o92e">Склонение Солнца (δ) = 23.5° * sin(день года). Для 21 марта и 23 сентября δ=0°, для 21 июня δ=23.5°, для 21 декабря δ=-23.5°.</li>
    </ul>
  </ol>
  <p id="klis"><strong>Упрощенно (без сложных вычислений):</strong></p>
  <ul id="zXe2">
    <li id="k6Ve"><strong>Если в полдень тени почти отсутствуют</strong> - низкие широты (близко к экватору).</li>
    <li id="whvb"><strong>Если тени очень длинные даже в полдень</strong> - высокие широты (близко к полюсам).</li>
  </ul>
  <p id="EdQk"><strong>Инструменты:</strong></p>
  <ul id="5GmB">
    <li id="0B70"><strong><a href="https://suncalc.org/" target="_blank">SunCalc.org</a></strong> - интерактивная карта с положением Солнца в любой точке мира в любое время.</li>
    <li id="vl1s"><strong><a href="https://sunearthtools.com/" target="_blank">SunEarthTools.com</a></strong> - более детальный калькулятор.</li>
    <li id="hYv6"><strong>PhotoPills</strong> (мобильное приложение) - для фотографов, показывает положение Солнца и Луны.</li>
  </ul>
  <p id="tXB8"><strong>Этап 5: Анализ перспективы и фокусного расстояния</strong></p>
  <p id="eZwl">Перспектива может помочь определить, где находилась камера и как был снят объект.</p>
  <p id="d9ts"><strong>Ключевые понятия:</strong></p>
  <ul id="JsA0">
    <li id="dKqL"><strong>Угол обзора:</strong> Широкий (16-35 мм) - большая глубина, сильные искажения; телефото (100+ мм) - сжатие перспективы.</li>
    <li id="aevJ"><strong>Точка схода:</strong> Линии параллельных объектов сходятся в одной точке (например, железнодорожные пути).</li>
    <li id="sHj9"><strong>Горизонт:</strong> Линия горизонта позволяет определить высоту точки съемки (если видно море/равнина).</li>
  </ul>
  <p id="2rVk"><strong>Как использовать:</strong></p>
  <ul id="XFZH">
    <li id="6se1"><strong>Определение высоты съемки:</strong> Если горизонт виден, можно оценить, снимали с земли или с высоты (например, с квадрокоптера, из окна многоэтажки, или с горы).</li>
    <li id="RtkC"><strong>Определение направления съемки:</strong> Если видна точка схода, можно определить, на какое направление смотрит камера (по компасу).</li>
  </ul>
  <p id="eLmV"><strong>Этап 6: Использование онлайн-калькуляторов для точного определения времени и места</strong></p>
  <p id="MN4x"><strong><a href="https://suncalc.org/" target="_blank">SunCalc.org</a></strong></p>
  <ul id="EAYl">
    <li id="uhib">Загрузить карту, выбрать место, посмотреть траекторию Солнца.</li>
    <li id="PyGE">Использовать &quot;Sun Position&quot; для конкретного времени.</li>
    <li id="da88">Визуализация теней по времени.</li>
  </ul>
  <p id="Rtem"><strong><a href="https://mooncalc.org/" target="_blank">MoonCalc.org</a></strong></p>
  <ul id="BuvX">
    <li id="Pf23">Аналогично, но для Луны.</li>
    <li id="EESd">Помогает определить дату по фазе Луны или точное время по положению Луны.</li>
  </ul>
  <p id="U5tQ"><strong>Stellarium</strong></p>
  <ul id="WU6a">
    <li id="phd2">Планетарий для определения звёздного неба.</li>
    <li id="ptfV">Если на фото видно звёзды, можно определить место и время (сложно).</li>
  </ul>
  <p id="3uMa"><strong>Этап 7: Сложный кейс — определение времени по теням на часах</strong></p>
  <p id="xj3V">Иногда на фото видно часы (на здании, на руке). Если часы показывают время, его можно использовать для привязки.</p>
  <p id="J4YH"><strong>Ограничения:</strong></p>
  <ul id="I0Vm">
    <li id="NnLH">Часы могут быть неправильно установлены.</li>
    <li id="q3ui">Летнее/зимнее время (DST).</li>
    <li id="3RjZ">Часовой пояс может отличаться от географического.</li>
  </ul>
  <p id="gway"><strong>Этап 8: Использование метеоданных для подтверждения времени</strong></p>
  <p id="Cz5u">Время съемки можно сравнить с архивными метеоданными.</p>
  <p id="sUVj"><strong>Инструменты:</strong></p>
  <ul id="qECb">
    <li id="Tsis"><strong>Weather Underground</strong> (архивы погоды по часам).</li>
    <li id="uDI9"><strong>GISMETEO</strong> (Россия, СНГ — архивы погоды).</li>
    <li id="cldw"><strong><a href="https://timeanddate.com/" target="_blank">TimeAndDate.com</a></strong> — архивы погоды, восход/закат.</li>
  </ul>
  <p id="Zhot"><strong>Что сравнивать:</strong></p>
  <ul id="Muko">
    <li id="ESd5">Облачность (если видно на фото).</li>
    <li id="0iq6">Осадки (снег, дождь).</li>
    <li id="Ffee">Температура (по одежде людей).</li>
  </ul>
  <p id="R8pT"><strong>Практический пример: определение времени по теням на фото здания</strong></p>
  <p id="46am"><em>Задача:</em> На фото здания с часами (на циферблате — 15:30). Тени падают на северо-восток. Нужно проверить, соответствует ли время.</p>
  <ol id="7Kjs">
    <li id="z09a">Известно, что часы показывают 15:30 (возможно, московское время). Здание находится в Москве (UTC+3, летом UTC+4).</li>
    <li id="N75Y">Тени падают на восток (а не на восток). В 15:30 в Москве тени должны падать на северо-восток, а в данном случае они падают на северо-запад. Несоответствие.</li>
    <li id="m61H">Гипотеза: часы переведены неправильно. Солнце: если тени падают на северо-запад, значит Солнце на юго-востоке — это утро (около 9:00). Следовательно, часы показывают 15:30, но реальное время около 9:00.</li>
    <li id="DXmK">Проверка через <a href="https://suncalc.org/" target="_blank">SunCalc.org</a> для Москвы: для 1 марта в 9:00 тени действительно падают на северо-запад.</li>
    <li id="p045">Вывод: часы на здании неправильные, или фото было сделано в другое время года (летнее/зимнее время?). В любом случае, фото сделано утром, а не днем.</li>
  </ol>
  <p id="EQKM"><strong>Инструменты и ресурсы</strong></p>
  <figure id="7QEL" class="m_column">
    <img src="https://img2.teletype.in/files/98/fa/98fae172-c4cc-45c4-bc44-f6441e681503.png" width="949" />
  </figure>
  <p id="OFka"><strong>Ограничения метода</strong></p>
  <ol id="pTnH">
    <li id="PeMX"><strong>Тени зависят от времени года:</strong> Летом солнце выше, тени короче. Зимой — длиннее. Одна и та же фотография может дать разное время в разное время года.</li>
    <li id="WHPL"><strong>Неизвестная ориентация:</strong> Если неизвестно, где север, сложно определить время.</li>
    <li id="SD5c"><strong>Искажения объектива:</strong> Широкоугольные объективы искажают перспективу и длины теней. Нужно учитывать.</li>
    <li id="V9t1"><strong>Тени могут быть от других объектов:</strong> Иногда тень падает не от основного объекта, а от рядом стоящего дерева или столба.</li>
  </ol>
  <p id="5RzI"></p>
  <p id="ypvC">Анализ теней, освещения и перспективы — это мощный, но требующий практики и знаний метод геолокации. Он позволяет не только определить место съемки, но и установить точное время, а иногда даже дату. Комбинация с другими методами (язык, архитектура, ландшафт) даёт максимально точный результат. Важно никогда не полагаться на один метод. Солнце и тени — лишь часть пазла.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Geolocation-methods-based-on-photos</guid><link>https://teletype.in/@specialist_infosec/Geolocation-methods-based-on-photos?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Geolocation-methods-based-on-photos?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Методы геолокации по фотографиям: ландшафт, архитектура, растительность, дорожные знаки</title><pubDate>Sun, 26 Jul 2026 17:09:06 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/7e/17/7e17bc42-1a04-47c7-9949-3685766252b1.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/bc/92/bc9267cd-9e12-44ff-902c-b1eebd6a5091.png"></img>Геолокация по фотографии — это искусство и наука определения места съемки на основе визуальных элементов, присутствующих на изображении. В отличие от метаданных (которые могут быть удалены или подделаны), визуальные элементы объективны: архитектура, ландшафт, дорожные знаки, растительность — это то, что можно проверить и сопоставить с известными географическими базами. Данная статья посвящена систематическому анализу визуальных признаков для геолокации.]]></description><content:encoded><![CDATA[
  <figure id="ycvY" class="m_column">
    <img src="https://img4.teletype.in/files/bc/92/bc9267cd-9e12-44ff-902c-b1eebd6a5091.png" width="2199" />
  </figure>
  <h3 id="mo9O">Методы геолокации по фотографиям: ландшафт, архитектура, растительность, дорожные знаки</h3>
  <p id="ZGPf">Геолокация по фотографии — это искусство и наука определения места съемки на основе визуальных элементов, присутствующих на изображении. В отличие от метаданных (которые могут быть удалены или подделаны), визуальные элементы объективны: архитектура, ландшафт, дорожные знаки, растительность — это то, что можно проверить и сопоставить с известными географическими базами. Данная статья посвящена систематическому анализу визуальных признаков для геолокации.</p>
  <p id="AkHp"><strong>Уровни геолокации по фотографии</strong></p>
  <figure id="Ny61" class="m_column">
    <img src="https://img3.teletype.in/files/67/55/6755f13a-15cc-4bbe-8d6e-bc4f366de76b.png" width="945" />
  </figure>
  <p id="YlYR"><strong>Пирамида геолокации</strong></p>
  <ol id="KujG">
    <li id="MOJ5"><strong>Язык и письменность</strong> - Вывески, надписи, реклама.</li>
    <li id="IUtx"><strong>Архитектура</strong> - Стиль зданий, форма крыш, строительные материалы.</li>
    <li id="6LnF"><strong>Транспорт</strong> - Типы автомобилей, номера, дорожная разметка.</li>
    <li id="ZXvH"><strong>Инфраструктура</strong> - Дорожные знаки, фонари, столбы, опоры ЛЭП.</li>
    <li id="Sr4m"><strong>Ландшафт и природа</strong> - Растительность, рельеф, водоемы.</li>
    <li id="JtvV"><strong>Погода и освещение</strong> - Солнце, тени, облака.</li>
    <li id="agu5"><strong>Специфические маркеры</strong> - Флаги, гербы, памятники, таблички.</li>
  </ol>
  <p id="mYon"><strong>Этап 1: Язык и письменность</strong></p>
  <p id="uR5t">Это самый быстрый и очевидный способ ограничить географию.</p>
  <p id="af1v"><strong>Что искать:</strong></p>
  <ul id="7ANP">
    <li id="VbUG"><strong>Текст на вывесках:</strong> Магазины, кафе, остановки, указатели.</li>
    <li id="b9rW"><strong>Язык:</strong> Русский, украинский, английский, китайский, арабский и т.д.</li>
    <li id="8yQH"><strong>Скрипт (алфавит):</strong> Кириллица, латиница, арабское письмо, иероглифы.</li>
    <li id="X8mx"><strong>Особенности орфографии:</strong> Буква «і» указывает на украинский, «ğ» - на турецкий.</li>
    <li id="Sfvp"><strong>Политика языков:</strong> Некоторые страны имеют два официальных языка - это сужает поиск.</li>
  </ul>
  <p id="4rOG"><strong>Примеры:</strong></p>
  <ul id="aHfU">
    <li id="JW4n">Надпись на украинском и кириллица - Украина.</li>
    <li id="hszr">Латиница с диакритикой (ě, š, č) - Чехия, Словакия, Польша.</li>
    <li id="7DXB">Арабский шрифт - Ближний Восток.</li>
    <li id="IWpy">Иероглифы (упрощенные) - Китай.</li>
    <li id="Mgem">Иероглифы (традиционные) - Тайвань, Гонконг.</li>
  </ul>
  <p id="aPs3"><strong>Инструменты:</strong></p>
  <ul id="bwEv">
    <li id="epyp">Google Translate (распознавание незнакомых языков по фото - Google Lens).</li>
    <li id="YbcX">База Unicode, информация о региональных языках.</li>
  </ul>
  <p id="7kaQ"><strong>Этап 2: Архитектура</strong></p>
  <p id="vvUn">Архитектурный стиль региона - один из самых надежных маркеров, так как он меняется медленно.</p>
  <p id="ru0F"><strong>Ключевые элементы архитектуры:</strong></p>
  <figure id="Vgjy" class="m_original">
    <img src="https://img4.teletype.in/files/f8/76/f876bb49-b5b1-4b6d-a769-4f85f81aa701.png" width="934" />
  </figure>
  <p id="Ji2w"><strong>Дополнительные признаки:</strong></p>
  <ul id="Jmxj">
    <li id="eaUx"><strong>Цвет фасадов</strong> (в Санкт-Петербурге - пастельные тона, в Скандинавии - яркие цвета, в Париже - бежевый камень).</li>
    <li id="jkyN"><strong>Высота зданий</strong> (в Европе редко бывают небоскребы, в Азии и США - часто).</li>
    <li id="J415"><strong>Элементы отделки</strong> (лепнина, мозаика, кафель, скульптуры).</li>
  </ul>
  <p id="Hv0k"><strong>Инструменты:</strong></p>
  <ul id="YICC">
    <li id="wzq0">Google Lens: найти похожую архитектуру в интернете.</li>
    <li id="SRhc">Базы архитектурных стилей (Wikipedia, архитектурные сайты).</li>
    <li id="r0JC">Google Images и Yandex.Images (поиск по фрагментам).</li>
  </ul>
  <p id="q53v"><strong>Этап 3: Транспорт и автомобили</strong></p>
  <p id="4FyM">Автомобили и другие транспортные средства - отличный маркер региона.</p>
  <p id="3tcc"><strong>Ключевые элементы транспорта:</strong></p>
  <figure id="Km7x" class="m_column">
    <img src="https://img3.teletype.in/files/21/88/2188b309-5fd3-4071-a5d8-127e0d4cdd50.png" width="947" />
  </figure>
  <p id="qgtK"><strong>Анализ номерных знаков:</strong></p>
  <ul id="6usx">
    <li id="xIXO"><strong>Код региона:</strong> В России и Казахстане региональный код часто включен в номер.</li>
    <li id="ZnfA"><strong>Страна:</strong> Цвет и формат номеров регулируются законодательством.</li>
    <li id="uNdH"><strong>Цвет фона:</strong></li>
    <ul id="Ni32">
      <li id="f9ZW">Белый - большинство стран.</li>
      <li id="wzrC">Желтый - Великобритания, Люксембург.</li>
      <li id="jo0b">Зеленый - некоторые коммерческие авто в странах ЕС.</li>
    </ul>
  </ul>
  <p id="SaVu"><strong>Инструменты:</strong></p>
  <ul id="8gbn">
    <li id="hdaU"><strong>PlateRecognizer</strong> (распознавание номеров по фото - платное).</li>
    <li id="uqHD"><strong>Таблицы автомобильных номеров</strong> (поисковые запросы по формату).</li>
  </ul>
  <p id="F3EG"><strong>Этап 4: Дорожные знаки и инфраструктура</strong></p>
  <p id="CQ0j">Дорожные знаки имеют национальные особенности, хотя и стандартизированы (Венская конвенция).</p>
  <p id="fd8L"><strong>Ключевые признаки дорожных знаков:</strong></p>
  <ul id="BcwB">
    <li id="JrrG"><strong>Форма:</strong> Круглые (запрещающие, предписывающие) vs треугольные (предупреждающие).</li>
    <li id="qsJt"><strong>Цвет:</strong> Красная кайма (запрет), синий фон (предписание, информация).</li>
    <li id="Zq99"><strong>Оформление:</strong> Шрифт, пиктограммы, наличие надписей на национальном языке.</li>
    <li id="KD6c"><strong>Столбы и фонари:</strong> Тип и форма фонарных столбов может указывать на страну.</li>
  </ul>
  <p id="th4a"><strong>Примеры:</strong></p>
  <ul id="yCzo">
    <li id="QlVd">В России знак «Пешеходный переход» - синий квадрат с белым треугольником. В Европе - знак с пешеходом на зебре, часто желтый фон.</li>
    <li id="rQky">В странах ЕС границы стран часто обозначаются синим щитом с желтыми звездами.</li>
  </ul>
  <p id="VX3J"><strong>Этап 5: Ландшафт и растительность</strong></p>
  <p id="AQcz">Природные особенности - одни из самых сложных, но и самых достоверных маркеров.</p>
  <figure id="AI1r" class="m_column">
    <img src="https://img1.teletype.in/files/c6/8b/c68b1682-0594-4c09-ab3e-b4d2c4c31fac.png" width="947" />
  </figure>
  <p id="f15T"><strong>Инструменты:</strong></p>
  <ul id="VhRR">
    <li id="QDMK"><strong>Google Lens</strong> (распознавание растений и деревьев).</li>
    <li id="BoaZ"><strong>iNaturalist</strong> (определение растений по фото).</li>
    <li id="ld3C"><strong>Спутниковые карты</strong> (Google Earth, Sentinel).</li>
  </ul>
  <p id="qiOa"><strong>Этап 6: Погода как маркер сезона и климата</strong></p>
  <p id="6ygl">Погода на фотографии может указывать на сезон и климатическую зону.</p>
  <figure id="QBAr" class="m_original">
    <img src="https://img3.teletype.in/files/61/f5/61f56fd5-d03d-4055-b208-772c6a5b5311.png" width="723" />
  </figure>
  <p id="IQ9x"><strong>Этап 7: Специфические маркеры (памятники, флаги, гербы)</strong></p>
  <p id="tqfW">Это самые сильные маркеры, если их удается идентифицировать.</p>
  <p id="OhRz"><strong>Что искать:</strong></p>
  <ul id="vbTH">
    <li id="yajD"><strong>Флаги:</strong> Государственный флаг часто виден на зданиях, аэродромах.</li>
    <li id="H1Ir"><strong>Гербы:</strong> На зданиях администрации, на гербовых печатях.</li>
    <li id="Wzbl"><strong>Памятники:</strong> Статуи, мемориалы, монументы.</li>
    <li id="4yT0"><strong>Вывески с названиями:</strong> Улицы, города, крупные сети магазинов.</li>
  </ul>
  <p id="Qrb5"><strong>Инструменты:</strong></p>
  <ul id="RmTd">
    <li id="TJun"><strong>Поиск по изображению (Reverse Image Search):</strong> Загружаем фото памятника в Google Images.</li>
    <li id="VGfI"><strong>Википедия:</strong> Поиск по описанию памятника.</li>
  </ul>
  <p id="3DNE"><strong>Практический пример: геолокация сложного фото</strong></p>
  <p id="DDIt"><em>Задача:</em> Определить место съемки по фотографии, где видны: здание с красной крышей, река с лодками, белая церковь с голубым куполом.</p>
  <ol id="iVcQ">
    <li id="HVEW"><strong>Язык:</strong> Надпись на здании - по-русски. - Россия или страны СНГ.</li>
    <li id="YHJc"><strong>Архитектура:</strong> Церковь с голубым куполом - православная. Белые стены, голубой купол - характерно для многих регионов, но чаще на севере России.</li>
    <li id="EQ66"><strong>Ландшафт:</strong> Река, лодки, на заднем плане лесистые холмы - северный регион.</li>
    <li id="vCRx"><strong>Поиск по фрагментам:</strong> Вывеска на здании - «Гостиница Рыбацкая». Поиск в Яндекс - есть отель с таким названием в городе Петрозаводск.</li>
    <li id="205m"><strong>Сравнение с панорамами:</strong> Яндекс.Панорамы показывают это здание на набережной Онежского озера в Петрозаводске.</li>
    <li id="4Rp2"><strong>Кросс-референс:</strong> В новостях Петрозаводска есть упоминания о реке и церкви, совпадающие по описанию.</li>
    <li id="I1Rs"><strong>Результат:</strong> Координаты: 61.79° N, 34.39° E (Петрозаводск, Россия).</li>
  </ol>
  <p id="zBeW"><strong>Этап 8: Поиск по уникальным элементам с помощью Google Lens и поисковиков</strong></p>
  <p id="38qO">Google Lens (мобильное приложение) позволяет сканировать объекты на фото и искать информацию о них. Это часто быстрее, чем вручную искать по тексту.</p>
  <p id="RcLF"><strong>Использование Google Lens:</strong></p>
  <ol id="sS7c">
    <li id="4vNE">Открыть фото в приложении Google.</li>
    <li id="5Nr9">Обвести объект (вывеску, памятник, здание).</li>
    <li id="vMuz">Посмотреть результаты поиска.</li>
  </ol>
  <p id="3qTY"><strong>Использование Yandex.Images:</strong></p>
  <ul id="iE0k">
    <li id="isKB">Загрузка фото и поиск по зданиям, вывескам, ландшафту. В русскоязычном сегменте часто точнее Google.</li>
  </ul>
  <p id="7Wgj"><strong>Этап 9: Составление карты-подсказки (Mind Map)</strong></p>
  <p id="e4Bl">Для системного анализа полезно создать карту-подсказку:</p>
  <pre id="hYUc">Фото
├── Язык → [страны]
├── Архитектура → [стиль]
├── Транспорт
│   ├── Номера → [страна/регион]
│   └── Тип машин → [эпоха / регион]
├── Ландшафт
│   ├── Растительность → [климатическая зона]
│   └── Водоемы → [регион]
├── Инфраструктура
│   ├── Столбы → [региональный стиль]
│   └── Знаки → [страна]
└── Погода → [сезон]</pre>
  <p id="0Y02"><strong>Инструментарий геолокации (сводная таблица)</strong></p>
  <figure id="6KVY" class="m_column">
    <img src="https://img2.teletype.in/files/15/a3/15a34164-0722-42c2-a98a-be3ebd345ad1.png" width="942" />
  </figure>
  <p id="pTHr"><strong>Ошибки при геолокации</strong></p>
  <figure id="Ow3u" class="m_column">
    <img src="https://img4.teletype.in/files/39/9a/399af534-eea6-4970-8edf-acbac15a0db4.png" width="945" />
  </figure>
  <p id="7wjo"></p>
  <p id="ynVP">Геолокация по фотографии — это детективная работа, требующая комбинации знаний из многих областей: географии, архитектуры, лингвистики, ботаники, культурологии. Ключевой принцип — «триангуляция»: никогда не полагаться на один признак. Комбинация языка, архитектуры, транспорта, инфраструктуры и ландшафта позволяет с высокой точностью определить место съемки даже по одному фото.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Introduction-to-GEOINT</guid><link>https://teletype.in/@specialist_infosec/Introduction-to-GEOINT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Introduction-to-GEOINT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Введение в GEOINT: география как источник разведывательных данных</title><pubDate>Tue, 21 Jul 2026 16:52:48 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/34/47/344733f0-5796-43aa-8278-7f9420dc072f.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/b6/2e/b62eb4a1-160e-4585-a486-12258a8f332e.png"></img>Введение в GEOINT: география как источник разведывательных данных]]></description><content:encoded><![CDATA[
  <figure id="seQf" class="m_column">
    <img src="https://img4.teletype.in/files/b6/2e/b62eb4a1-160e-4585-a486-12258a8f332e.png" width="2199" />
  </figure>
  <p id="23VM"><strong>Введение в GEOINT: география как источник разведывательных данных</strong></p>
  <p id="mTQR">Геопространственный OSINT (GEOINT) — это направление открытой разведки, специализирующееся на сборе, анализе и интерпретации географической информации. В отличие от других направлений OSINT, GEOINT оперирует пространственными данными: координатами, картами, спутниковыми снимками, аэрофотосъемкой, панорамами улиц и даже астронавигационными методами. Геолокация по фотографии, анализ изменений на спутниковых снимках, создание собственных интерактивных карт — всё это инструменты GEOINT, которые позволяют исследователю ответить на вопросы «Где?», «Когда?», «Что изменилось?» и «Почему именно здесь?».</p>
  <p id="IHaF"><strong>Что такое GEOINT и чем он отличается от других направлений OSINT?</strong></p>
  <p id="cDma">GEOINT (Geospatial Intelligence) — это дисциплина, которая использует географические данные для поддержки принятия решений. В контексте открытой разведки это означает:</p>
  <ol id="edLk">
    <li id="w92d"><strong>Пассивное извлечение географической информации</strong> из фотографий, видео, спутниковых снимков, карт и других открытых источников.</li>
    <li id="MgBp"><strong>Анализ пространственных взаимосвязей</strong> между объектами, событиями и местами.</li>
    <li id="BvxL"><strong>Визуализацию данных на картах</strong> для выявления закономерностей и трендов.</li>
  </ol>
  <p id="fezq">В отличие от транспортного OSINT, где акцент делается на перемещениях и логистике, GEOINT фокусируется на <strong>статической географии</strong>: место съемки, ландшафт, инфраструктура, изменения во времени.</p>
  <p id="oPcz"><strong>Почему GEOINT важен для расследований?</strong></p>
  <figure id="k6CV" class="m_column">
    <img src="https://img4.teletype.in/files/fa/f7/faf7c645-5de6-41af-b1d3-8c51eceb1cfa.png" width="942" />
  </figure>
  <p id="UE1p"><strong>Основные источники данных в GEOINT</strong></p>
  <figure id="MNIS" class="m_column">
    <img src="https://img4.teletype.in/files/7b/22/7b226aa8-0e80-4645-8c99-1e76f0b59d53.png" width="943" />
  </figure>
  <p id="AIZ5"><strong>Методологическая схема GEOINT-расследования</strong></p>
  <ol id="r3lS">
    <li id="jbPU"><strong>Обнаружение контента:</strong> Найдено фото/видео с неизвестной локацией.</li>
    <li id="IbHi"><strong>Предварительный визуальный осмотр:</strong> Анализ видимых элементов — архитектура, язык, природа, транспорт.</li>
    <li id="LsPy"><strong>Извлечение метаданных:</strong> EXIF, GPS, дата съемки (если не удалены).</li>
    <li id="S9wY"><strong>Поиск по изображению (Reverse Image Search):</strong> Проверка, не публиковалось ли уже это фото с известной геолокацией.</li>
    <li id="jmx8"><strong>Идентификация ключевых ориентиров:</strong> Уникальные объекты, которые можно найти на карте.</li>
    <li id="FhF6"><strong>Сравнение с картами и панорамами:</strong> Google Maps, Яндекс.Панорамы, Mapillary.</li>
    <li id="0P4F"><strong>Анализ теней и освещения:</strong> Определение времени суток и сезона.</li>
    <li id="fybs"><strong>Кросс-референс с другими источниками:</strong> Метеоданные, новости, соцсети.</li>
    <li id="6cKa"><strong>Формулирование вывода:</strong> Точные координаты или район съемки, степень уверенности.</li>
  </ol>
  <p id="IJaj"><strong>Ключевые навыки GEOINT-специалиста</strong></p>
  <figure id="ERlb" class="m_column">
    <img src="https://img4.teletype.in/files/38/57/3857672a-b86f-4bfc-9a89-b7793491d0eb.png" width="940" />
  </figure>
  <p id="JgYI"><strong> Юридические ограничения и ответственность в GEOINT</strong></p>
  <ul id="BosU">
    <li id="4EaD">Анализ спутниковых снимков публичных сервисов (Sentinel, Google Earth) легален.</li>
    <li id="5zWC">Использование коммерческих спутниковых снимков (Maxar, Planet) для расследований допускается, но требует лицензии.</li>
    <li id="hBkT">Геолокация частных лиц без их согласия (по фото из соцсетей) может нарушать законы о персональных данных.</li>
    <li id="zf7r">Публикация точных координат секретных объектов (военные базы, ядерные объекты и объекты стратегического назначения) может быть запрещена законодательством.</li>
  </ul>
  <p id="EdZK">GEOINT — это многогранная дисциплина, объединяющая географию, картографию, спутниковые технологии, анализ визуальных данных и методы верификации. Она позволяет исследователю не просто видеть объект, а понимать его пространственный контекст: где он находится, какова его история, что изменилось вокруг. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Technical-OSINT-cases</guid><link>https://teletype.in/@specialist_infosec/Technical-OSINT-cases?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Technical-OSINT-cases?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Кейсы технического OSINT: реальные примеры разведки перед пентестом, обнаружения забытых сервисов и выявления уязвимостей</title><pubDate>Tue, 07 Jul 2026 21:39:23 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ab/46/ab46097e-c5b9-4ef9-8607-9610376389a3.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/f8/12/f81263ff-3ff1-428a-a22e-7be2623ecadb.png"></img>Технический OSINT — это не просто набор инструментов и методик, а практическая дисциплина, которая применяется в реальных сценариях: от оценки безопасности собственной инфраструктуры до разведки конкурентов и расследования инцидентов. Теория без практики мертва. В этой заключительной статье цикла мы разберем несколько реальных кейсов (обезличенных и агрегированных) из практики технической разведки. Каждый кейс демонстрирует применение методов и инструментов, описанных в предыдущих статьях, и показывает, как пассивный сбор данных может привести к обнаружению критических уязвимостей, забытых активов и инсайтов о стратегии организации.]]></description><content:encoded><![CDATA[
  <figure id="qg1C" class="m_column">
    <img src="https://img4.teletype.in/files/f8/12/f81263ff-3ff1-428a-a22e-7be2623ecadb.png" width="2199" />
  </figure>
  <h3 id="6ObK">Кейсы технического OSINT: реальные примеры разведки перед пентестом, обнаружения забытых сервисов и выявления уязвимостей</h3>
  <p id="Ar6x">Технический OSINT — это не просто набор инструментов и методик, а практическая дисциплина, которая применяется в реальных сценариях: от оценки безопасности собственной инфраструктуры до разведки конкурентов и расследования инцидентов. Теория без практики мертва. В этой заключительной статье цикла мы разберем несколько реальных кейсов (обезличенных и агрегированных) из практики технической разведки. Каждый кейс демонстрирует применение методов и инструментов, описанных в предыдущих статьях, и показывает, как пассивный сбор данных может привести к обнаружению критических уязвимостей, забытых активов и инсайтов о стратегии организации.</p>
  <p id="WRBs"><strong>КЕЙС 1: РАЗВЕДКА ПЕРЕД ПЕНТЕСТОМ (ПЛАНОВАЯ ОЦЕНКА ИНФРАСТРУКТУРЫ)</strong></p>
  <p id="26IF"><strong>Исходные данные:</strong> Компания «Альфа» (вымышленное название) заказала внешний пентест своего интернет-периметра. У команды пентеста есть только домен <code>alpha.com</code> и разрешение на активное сканирование. Однако перед любыми активными действиями они проводят пассивную разведку, чтобы не пропустить сервисы, которые не сканируются стандартными средствами, и чтобы правильно спланировать нагрузку.</p>
  <p id="gj2x"><strong>Ход работы:</strong></p>
  <ol id="3qFy">
    <li id="Vqbd"><strong>WHOIS-анализ:</strong> <code>alpha.com</code> зарегистрирован 15 лет назад, регистратор — Namecheap. Контакты скрыты PrivacyGuard. DNS-серверы: <code>ns1.alpha.com</code>, <code>ns2.alpha.com</code>. Это указывает на то, что компания использует собственные DNS-серверы, а значит, возможно, имеет внутреннюю инфраструктуру.</li>
    <li id="m1dq"><strong>DNS-разведка (dig):</strong></li>
    <ul id="ZySp">
      <li id="6ZdV"><code>A</code> → <code>192.0.2.10</code> (основной веб-сервер).</li>
      <li id="mnir"><code>MX</code> → <code>mail.alpha.com</code> (приоритет 10), резервный <code>mx.backup.net</code> (приоритет 20).</li>
      <li id="SuOj"><code>TXT</code> → <code>v=spf1 include:spf.protection.outlook.com -all</code> → используется Office 365.</li>
      <li id="peKh"><code>NS</code> → <code>ns1.alpha.com</code>, <code>ns2.alpha.com</code>.</li>
    </ul>
    <li id="j1pn"><strong>Поиск поддоменов (crt.sh + SecurityTrails):</strong> Найдено 45 поддоменов, в том числе:</li>
    <ul id="Yv1I">
      <li id="wQJR"><code>www.alpha.com</code> (основной сайт).</li>
      <li id="ItLe"><code>mail.alpha.com</code> (почтовый сервер).</li>
      <li id="FRmF"><code>remote.alpha.com</code> (удалённый доступ, предположительно VPN).</li>
      <li id="Fvp1"><code>jenkins.alpha.com</code> (система CI/CD).</li>
      <li id="Kuxm"><code>dev.alpha.com</code> (тестовый поддомен).</li>
      <li id="W16P"><code>old.alpha.com</code> (старый сайт).</li>
    </ul>
    <li id="jEdL"><strong>Анализ SSL-сертификатов:</strong> На <code>jenkins.alpha.com</code> сертификат выдан Let&#x27;s Encrypt, истекает через 10 дней. Это указывает на то, что сервис жив и активно используется (сертификат обновляется). На <code>old.alpha.com</code> сертификат истёк год назад — возможно, сервис уже неактивен, но всё ещё доступен по IP.</li>
    <li id="vg11"><strong>Shodan/Censys по IP-адресам поддоменов:</strong></li>
    <ul id="QYpk">
      <li id="jr90"><code>192.0.2.10</code> (основной сайт) → порты 80, 443. Сканирование баннеров показало Nginx 1.18.0, PHP 7.4.33.</li>
      <li id="J3kl"><code>198.51.100.22</code> (<a href="https://jenkins.alpha.com/" target="_blank">jenkins.alpha.com</a>) → порт 8080 открыт, Jenkins 2.289.1 (уязвимая версия, подверженная CVE-2023-23897).</li>
      <li id="8d8N"><code>203.0.113.45</code> (<a href="https://mail.alpha.com/" target="_blank">mail.alpha.com</a>) → порты 25, 587, 993 (SMTP, SMTP over TLS, IMAPS).</li>
      <li id="ze9z"><code>198.51.100.88</code> (<a href="https://remote.alpha.com/" target="_blank">remote.alpha.com</a>) → порт 443 с сертификатом, но баннер похож на OpenVPN или SSL-прокси.</li>
      <li id="aXcx"><code>192.0.2.50</code> (<a href="https://dev.alpha.com/" target="_blank">dev.alpha.com</a>) → порт 22 (SSH), 80, 443. Баннер SSH: OpenSSH 7.9 (устаревший).</li>
    </ul>
    <li id="NH9i"><strong>WHOIS по IP:</strong> Все IP-адреса принадлежат <code>ALPHA-AS</code> (AS12345), зарегистрированному в RIPE. Это означает, что компания использует собственные IP-адреса и не полагается на облачных провайдеров для этих сервисов.</li>
    <li id="eToZ"><strong>Технологический стек (Wappalyzer):</strong> Основной сайт на Drupal 9.5.3 (уязвимый, CVE-2023-XXXX). Используется jQuery 3.6.0, Bootstrap 4.6. Google Analytics ID <code>UA-123456-1</code>.</li>
    <li id="HYwj"><strong>GitHub-поиск:</strong> Организация <code>alpha-org</code> имеет несколько публичных репозиториев. Один из них — <code>alpha-backend</code> — содержит файл <code>.env.example</code> с реальными паролями (не были заменены на заглушки). В коде встречается строка <code>DB_PASSWORD=AlphaDb2023</code>.</li>
  </ol>
  <p id="upJK"><strong>Итог кейса:</strong></p>
  <figure id="ohHW" class="m_column">
    <img src="https://img1.teletype.in/files/40/71/4071981f-ebfc-4412-bb32-72483070af5b.png" width="1218" />
  </figure>
  <p id="9fI3"><strong>Результат:</strong> Пентест-команда заранее составила карту активов, выявила три критических вектора атаки и спланировала нагрузку на активные сканеры так, чтобы не вызвать сбоев в работе Jenkins и почтового сервера. Обнаруженный пароль был передан клиенту до начала пентеста, что позволило избежать потенциального взлома до тестирования.</p>
  <p id="PKtT"><strong>КЕЙС 2: ОБНАРУЖЕНИЕ ЗАБЫТОГО СЕРВИСА (JENKINS С УЯЗВИМОСТЬЮ)</strong></p>
  <p id="y9Tm"><strong>Исходные данные:</strong> Сотрудник отдела безопасности компании «Бета» проводит аудит собственной инфраструктуры. Он подозревает, что в сети есть забытые сервисы, которые не отслеживаются централизованно. В компании используется домен <code>beta.ru</code>.</p>
  <p id="2z5K"><strong>Ход работы:</strong></p>
  <ol id="RxaR">
    <li id="SQOy"><strong>Поиск поддоменов через crt.sh:</strong><br />Запрос <code>%.beta.ru</code> выдает 120 сертификатов. Среди них есть <code>ci.beta.ru</code>, который не фигурирует во внутренних документах.</li>
    <li id="NGxP"><strong>Проверка доступности (DNS):</strong><br /><code>ci.beta.ru</code> резолвится в <code>192.168.1.100</code> (внутренний IP, но компания использует NAT, и этот IP доступен из интернета через публичный адрес). Это явно внутренний сервер, который был случайно опубликован во внешний DNS.</li>
    <li id="aXc0"><strong>Shodan-поиск по IP (публичному адресу):</strong><br />Порт 8080 открыт, баннер: <code>Jenkins 2.263</code>. Версия Jenkins 2.263 уязвима к CVE-2022-12345 (удалённое выполнение кода через панель управления).</li>
    <li id="kEKF"><strong>Поиск в истории DNS:</strong> SecurityTrails показывает, что <code>ci.beta.ru</code> появился 3 года назад и с тех пор не менял IP. Это подтверждает, что сервис был создан для проекта, который давно завершён, но не выведен из эксплуатации.</li>
    <li id="a8MR"><strong>Проверка сертификата:</strong> Сертификат для <code>ci.beta.ru</code> выдан Let&#x27;s Encrypt и истекает через 45 дней. Это значит, что сервис всё ещё обслуживается (автоматическое обновление сертификатов), но никто не помнит, зачем он нужен.</li>
    <li id="erQL"><strong>Анализ заголовков:</strong> HTTP-заголовки показывают <code>X-Content-Type-Options: nosniff</code>, <code>X-Frame-Options: SAMEORIGIN</code>, что хорошо, но отсутствует CSP. Сам Jenkins доступен без аутентификации (что подтверждается при открытии страницы в браузере — панель администрирования видна).</li>
  </ol>
  <p id="cOWn"><strong>Итог кейса:</strong></p>
  <ul id="A5dX">
    <li id="FqpR">Обнаружен забытый Jenkins-сервер, доступный из интернета с открытой панелью управления.</li>
    <li id="wQLi">Версия Jenkins имеет критическую уязвимость, которая позволяет выполнить произвольные команды на сервере.</li>
    <li id="47cn">Компания «Бета» немедленно закрыла доступ к сервису, ограничив его внутренней сетью, и инициировала процедуру вывода из эксплуатации.</li>
    <li id="kpht">Это предотвратило возможную компрометацию всей инфраструктуры через данный сервер.</li>
  </ul>
  <p id="YVq6"><strong>Вывод:</strong> Даже если вы не проводите активное сканирование, пассивный OSINT (crt.sh, Shodan) может выявить забытые сервисы, о которых не знает даже служба безопасности.</p>
  <p id="EW9M"><strong>КЕЙС 3: РАССЛЕДОВАНИЕ УТЕЧКИ ДАННЫХ ЧЕРЕЗ GITHUB</strong></p>
  <p id="QW1Z"><strong>Исходные данные:</strong> В СМИ появилась новость, что компания «Гамма» (домен <code>gamma.tech</code>) пострадала от утечки данных клиентов. Отдел безопасности должен выяснить, как произошла утечка и какие данные скомпрометированы.</p>
  <p id="iaOm"><strong>Ход работы:</strong></p>
  <ol id="5BN1">
    <li id="iRBW"><strong>Поиск упоминаний компании в GitHub:</strong><br />Использование GitHub Code Search с операторами: <code>&quot;gamma.tech&quot; password</code>, <code>&quot;gamma.tech&quot; api_key</code>, <code>&quot;gamma.tech&quot; secret</code>, <code>&quot;gamma.tech&quot; token</code>. Найдено 15 файлов, содержащих упоминания домена.</li>
    <li id="9Lx2"><strong>Анализ найденных файлов:</strong></li>
    <ul id="F9Qp">
      <li id="gAGu">В репозитории <code>gamma-public</code> есть файл <code>config/database.yml</code>, содержащий строку: <code>password: GammaDB2023!</code>. Этот репозиторий был публичным.</li>
      <li id="Y3EB">В другом репозитории <code>gamma-util</code> в файле <code>creds.py</code> найден AWS-ключ: <code>aws_access_key_id = &quot;AKIAXXXXXXXXXXXXXXXX&quot;</code>, <code>aws_secret_access_key = &quot;abcdefghijklmnopqrstuvwxyz1234567890&quot;</code>. Ключ действителен.</li>
    </ul>
    <li id="mPBD"><strong>Проверка активности ключей:</strong></li>
    <ul id="Pmmt">
      <li id="eqUf">Подключение к AWS CLI с найденным ключом (в безопасной изолированной среде) показывает, что ключ имеет права на чтение S3-бакетов, включая бакет <code>gamma-customer-data</code>.</li>
      <li id="43PE">Список файлов в бакете содержит дампы баз данных с именами клиентов, email-адресами, телефонными номерами и даже хэшированными паролями (но слабый алгоритм хеширования).</li>
    </ul>
    <li id="EZiA"><strong>Поиск других утечек:</strong></li>
    <ul id="V7uN">
      <li id="WBB8">Использование Dehashed и Leak-Lookup по email-адресам сотрудников показывает, что несколько сотрудников использовали корпоративные email для регистрации на сторонних сервисах, пароли от которых были скомпрометированы.</li>
      <li id="S4X0">Это позволило злоумышленникам получить доступ к внутренним репозиториям и опубликовать их.</li>
    </ul>
    <li id="oOC4"><strong>Восстановление цепочки:</strong></li>
    <ul id="lOBo">
      <li id="0utY">Один из разработчиков случайно закоммитил файл с паролями в публичный репозиторий.</li>
      <li id="keYl">Злоумышленник нашёл этот файл через поиск по <code>gamma.tech</code>.</li>
      <li id="aq6X">Используя пароль, получил доступ к базе данных и скачал её.</li>
      <li id="IfWe">Также использовал AWS-ключ для доступа к S3-бакетам.</li>
    </ul>
  </ol>
  <p id="Fqj4"><strong>Итог кейса:</strong></p>
  <ul id="Piqe">
    <li id="3PA3">Причина утечки — человеческая ошибка (публикация секретов в открытом репозитории).</li>
    <li id="oLfl">Скомпрометированы данные более 50 000 клиентов.</li>
    <li id="8idn">Компания «Гамма» немедленно:</li>
    <ul id="Vw3J">
      <li id="gDhN">Отозвала все скомпрометированные ключи и пароли.</li>
      <li id="82q6">Удалила публичные репозитории с секретами.</li>
      <li id="8SAR">Внедрила политику автоматического сканирования всех публичных репозиториев на наличие секретов с помощью TruffleHog.</li>
      <li id="4GZY">Уведомила регулятора и клиентов об утечке (в соответствии с GDPR).</li>
    </ul>
  </ul>
  <p id="p1GB"><strong>Вывод:</strong> Поиск по открытым репозиториям — обязательный элемент мониторинга безопасности. Даже одна публичная строка с паролем может привести к катастрофической утечке.</p>
  <p id="uhJT"><strong>КЕЙС 4: МОНИТОРИНГ КОНКУРЕНТА (ОБНАРУЖЕНИЕ НОВОГО ПРОДУКТА)</strong></p>
  <p id="WWDJ"><strong>Исходные данные:</strong> Компания «Дельта» хочет узнать о планах своего конкурента «Эпсилон» по запуску нового сервиса. Конкурент использует домен <code>epsilon.io</code>.</p>
  <p id="KEfC"><strong>Ход работы:</strong></p>
  <ol id="VAKW">
    <li id="Xcfx"><strong>Настройка мониторинга:</strong></li>
    <ul id="77YR">
      <li id="3hwF">CertSpotter добавлен на домен <code>epsilon.io</code> и <code>*.epsilon.io</code>.</li>
      <li id="krsi">Ежедневный скрипт проверяет crt.sh на новые сертификаты для <code>epsilon.io</code>.</li>
      <li id="wz4w"><a href="https://changedetection.io/" target="_blank">Changedetection.io</a> отслеживает главную страницу <code>epsilon.io</code> и страницу <code>/careers</code> (появление новых вакансий).</li>
    </ul>
    <li id="iLna"><strong>Обнаружение через 2 недели:</strong></li>
    <ul id="hWNP">
      <li id="xpRC">CertSpotter отправляет уведомление: новый сертификат для <code>api.epsilon.io</code>.</li>
      <li id="UTkb">Сертификат выдан Let&#x27;s Encrypt, в SAN указаны <code>api.epsilon.io</code> и <code>*.api.epsilon.io</code>.</li>
    </ul>
    <li id="Qjgf"><strong>Разведка нового поддомена:</strong></li>
    <ul id="7qym">
      <li id="AJbQ"><code>api.epsilon.io</code> разрешается в IP <code>52.0.0.123</code>.</li>
      <li id="eyOq">WHOIS показывает, что IP принадлежит AWS (AS14618).</li>
      <li id="msxH">Порт 443 открыт, баннер HTTP содержит заголовок <code>Server: AmazonS3</code>. Это указывает на статический сайт, размещённый в S3.</li>
      <li id="xysO">Порт 80 тоже открыт, редиректит на 443.</li>
      <li id="EbId">Открыт также порт 3000, на котором виден заголовок <code>X-Powered-By: Express</code>. Это указывает на Node.js-приложение.</li>
      <li id="oRHJ">Shodan показывает, что порт 3000 доступен, но баннер содержит ошибку 404.</li>
    </ul>
    <li id="hByz"><strong>Анализ контента:</strong></li>
    <ul id="BVSD">
      <li id="kCkt">Страница <code>https://api.epsilon.io</code> содержит Swagger-документацию (openapi.json). В ней перечислены эндпоинты для управления заказами, пользователями и платежами.</li>
      <li id="gga5">Это явно новый API-сервис, который ещё не анонсирован.</li>
    </ul>
    <li id="xdr1"><strong>Связь с вакансиями:</strong></li>
    <ul id="uxJ7">
      <li id="9RWs">На странице <code>/careers</code> появилась вакансия «Senior Node.js Developer» для работы над «новым облачным продуктом».</li>
      <li id="6LW6">Это подтверждает, что компания запускает новый B2B-сервис.</li>
    </ul>
  </ol>
  <p id="uT1c"><strong>Итог кейса:</strong></p>
  <ul id="bILw">
    <li id="TT5A">Компания «Дельта» узнала о запуске нового продукта конкурента за месяц до официального анонса.</li>
    <li id="XUxw">Изучив Swagger-документацию, они смогли оценить функционал и скорректировать свою стратегию.</li>
    <li id="Nmps">Информация была передана в стратегический отдел для анализа рынка.</li>
  </ul>
  <p id="2h2R"><strong>Вывод:</strong> Мониторинг новых сертификатов и поддоменов позволяет выявлять неанонсированные проекты и получать рыночное преимущество.</p>
  <p id="lTLj"><strong>КЕЙС 5: ПОИСК СКРЫТЫХ ПОДДОМЕНОВ ЧЕРЕЗ CT-ЛОГИ И WAYBACK MACHINE</strong></p>
  <p id="DfBV"><strong>Исходные данные:</strong> Исследователь безопасности ищет все возможные поддомены компании <code>zeta.space</code> для составления карты инфраструктуры. В DNS и CT-логах есть поддомены <code>www</code>, <code>mail</code>, <code>vpn</code>. Но он подозревает, что есть ещё забытые.</p>
  <p id="YhaX"><strong>Ход работы:</strong></p>
  <ol id="Mwve">
    <li id="1K3i"><strong>crt.sh (стандартный запрос):</strong> <code>%.zeta.space</code> даёт 25 результатов, включая те, что уже известны.</li>
    <li id="3try"><strong>Wayback Machine CDX API:</strong>bashcurl &quot;https://web.archive.org/cdx/search/cdx?url=zeta.space/*&amp;output=json&amp;limit=100000&quot; &gt; all_pages.jsonВ полученном списке страниц исследователь находит упоминания URL <code>staging.zeta.space</code>, <code>dev.zeta.space</code>, <code>test.zeta.space</code>, которые отсутствуют в CT-логах.</li>
    <li id="C84S"><strong>Проверка доступности:</strong></li>
    <ul id="5ZlC">
      <li id="zDc1"><code>staging.zeta.space</code> резолвится в <code>203.0.113.77</code>.</li>
      <li id="AZUl">Порт 80 открыт, на нём видна тестовая страница с ошибкой PHP.</li>
      <li id="Qks6">Порт 443 закрыт (сертификата нет).</li>
    </ul>
    <li id="54Xy"><strong>Анализ контента на Wayback Machine:</strong></li>
    <ul id="Weiz">
      <li id="j4oV">Сохранённая копия <code>staging.zeta.space</code> от 2 лет назад содержит полную структуру каталогов: <code>/admin</code>, <code>/backup</code>, <code>/old</code>. В папке <code>/backup</code> лежит файл <code>db_backup_2022.sql</code>.</li>
    </ul>
    <li id="74dJ"><strong>Поиск по файлу в Wayback Machine:</strong></li>
    <ul id="iJO0">
      <li id="Kmb9">Исследователь скачивает <code>db_backup_2022.sql</code> (через архивную ссылку) и находит в нём email-адреса сотрудников, включая адреса IT-отдела.</li>
    </ul>
    <li id="JDmD"><strong>Использование email для дальнейшей разведки:</strong></li>
    <ul id="mvLm">
      <li id="KrTj">Через утечки (Dehashed) находится, что один из email использовался на форумах, где пароль был скомпрометирован.</li>
    </ul>
  </ol>
  <p id="pO9u"><strong>Итог кейса:</strong></p>
  <ul id="3o1X">
    <li id="6vHX">Обнаружены забытые поддомены (<code>staging</code>, <code>dev</code>, <code>test</code>), которые всё ещё доступны и содержат уязвимые версии ПО.</li>
    <li id="VMRd">Найден дамп базы данных, который может содержать конфиденциальную информацию.</li>
    <li id="aZOx">Получены email-адреса для дальнейшей социальной инженерии или проверки утечек.</li>
  </ul>
  <p id="oyqv"><strong>Вывод:</strong> Wayback Machine — мощный инструмент для обнаружения поддоменов, которые уже не существуют в DNS или CT-логах, но всё ещё могут быть доступны по IP или содержать следы в архивах.</p>
  <p id="70Cv"><strong>КЕЙС 6: КОМПЛЕКСНОЕ РАССЛЕДОВАНИЕ (ПОЛНАЯ КАРТИНА ЗА 1 ЧАС)</strong></p>
  <p id="1cxi"><strong>Исходные данные:</strong> Аналитик получает задачу: «Что мы знаем о компании <code>omega.tech</code>?» У него есть только домен.</p>
  <p id="gmyF"><strong>Ход работы (пошагово, с таймингами):</strong></p>
  <ol id="8E4D">
    <li id="PXk5"><strong>WHOIS (2 мин):</strong> <code>omega.tech</code> зарегистрирован через GoDaddy, дата создания 2015-03-10, NS: <code>ns1.omega.tech</code>, контакты скрыты.</li>
    <li id="1dUE"><strong>DNS (3 мин):</strong></li>
    <ul id="X3BW">
      <li id="8XIm">A → <code>54.0.0.10</code>.</li>
      <li id="PAbF">MX → <code>mail.omega.tech</code> (приоритет 10), <code>mx2.omega.tech</code> (20).</li>
      <li id="7OlB">TXT → <code>v=spf1 include:_spf.google.com ~all</code> (использует Google Workspace).</li>
    </ul>
    <li id="3UkB"><strong>Поддомены (crt.sh + SecurityTrails) (5 мин):</strong></li>
    <ul id="WKBt">
      <li id="7L36">Найдено 30 поддоменов, включая <code>jenkins</code>, <code>gitlab</code>, <code>monitoring</code>, <code>dev</code>.</li>
    </ul>
    <li id="P6NM"><strong>Анализ IP и ASN (5 мин):</strong></li>
    <ul id="ioQB">
      <li id="NXnD"><code>54.0.0.10</code> принадлежит AWS (AS14618), регион <code>us-east-1</code>.</li>
      <li id="QY1m">Другие IP поддоменов принадлежат тому же AWS-аккаунту (определено по схожести IP-диапазонов).</li>
    </ul>
    <li id="1boF"><strong>Shodan/Censys по IP (5 мин):</strong></li>
    <ul id="3ZgT">
      <li id="MzWL">На <code>54.0.0.10</code>: порты 80, 443 (Nginx 1.20.0, PHP 8.0).</li>
      <li id="JCPv">На <code>54.0.0.22</code> (jenkins): порт 8080 (Jenkins 2.303, уязвимый).</li>
      <li id="RsPE">На <code>54.0.0.33</code> (gitlab): порты 80, 443 (GitLab 14.5).</li>
    </ul>
    <li id="2Vd0"><strong>SSL-сертификаты (3 мин):</strong></li>
    <ul id="cL9J">
      <li id="7tY0">Все сертификаты выданы Let&#x27;s Encrypt, истекают через 20 дней. Это указывает на единую политику управления.</li>
    </ul>
    <li id="gsVE"><strong>Технологический стек (3 мин):</strong></li>
    <ul id="WVdf">
      <li id="0VpO">Wappalyzer: основной сайт на WordPress 5.9 с плагинами: WooCommerce, Yoast SEO, WP Rocket. Тема — OceanWP.</li>
    </ul>
    <li id="UK5t"><strong>GitHub-поиск (5 мин):</strong></li>
    <ul id="ZdTT">
      <li id="5cXy"><code>omega.tech</code> упоминается в 7 репозиториях. В одном из них есть файл <code>.env</code> с открытым ключом SMTP.</li>
    </ul>
    <li id="4v2y"><strong>Wayback Machine (5 мин):</strong></li>
    <ul id="s6Y9">
      <li id="7ziQ">Найдена старая версия сайта 2017 года с контактами и старым списком сотрудников.</li>
    </ul>
    <li id="Ilyt"><strong>Сборка карты инфраструктуры (остальное время):</strong></li>
    <ul id="wV56">
      <li id="J8Vy">Визуализация в Maltego: домен → IP → ASN → поддомены → сервисы.</li>
    </ul>
  </ol>
  <p id="D2aV"><strong>Итог за 1 час:</strong></p>
  <figure id="LmNz" class="m_column">
    <img src="https://img2.teletype.in/files/1b/18/1b18bc6d-9e4c-4a2f-a136-dbd9fb4d3a39.png" width="1218" />
  </figure>
  <p id="0zcf"><strong>Принятое решение:</strong> Команда безопасности немедленно приступила к анализу обнаруженных уязвимостей, а стратегический отдел использовал информацию о технологиях и инфраструктуре для оценки конкурентных рисков.</p>
  <p id="lGU6"><strong>ЭТИЧЕСКИЕ МОМЕНТЫ: ЧТО ДЕЛАТЬ С НАЙДЕННЫМ</strong></p>
  <p id="DYWx">Каждый из описанных кейсов поднимает этические вопросы. Вот несколько правил:</p>
  <ol id="7UDn">
    <li id="CmQo"><strong>Если вы нашли секрет (пароль, ключ), НЕ ИСПОЛЬЗУЙТЕ ЕГО</strong> для доступа к системе. Сообщите владельцу через официальный канал (security@company.com, программа Bug Bounty). В некоторых случаях можно использовать отчетные платформы (HackerOne, Bugcrowd).</li>
    <li id="mJyq"><strong>Не распространяйте найденные данные.</strong> Если вы обнаружили дамп базы данных с персональными данными, не копируйте их, не делитесь ими. Просто уведомите владельца.</li>
    <li id="iZWm"><strong>Соблюдайте законы о персональных данных (GDPR, 152-ФЗ).</strong> В некоторых юрисдикциях даже хранение найденных данных может быть нарушением.</li>
    <li id="BG8I"><strong>Если вы мониторите конкурента в коммерческих целях</strong>, используйте только публичные источники. Активное сканирование или взлом — это шпионаж и уголовное преступление.</li>
    <li id="2jNn"><strong>В пентесте с разрешением</strong> — все найденное документируется и передается заказчику. Не используйте уязвимости для получения несанкционированного доступа, даже если они есть.</li>
  </ol>
  <p id="B923"><strong>ЗАКЛЮЧЕНИЕ</strong></p>
  <p id="50bu">Технический OSINT — это системный подход к сбору информации об инфраструктуре организаций из открытых источников. Шестнадцать статей этого цикла охватили полный спектр: от DNS-разведки и поиска поддоменов до анализа SSL-сертификатов, портов, заголовков, уязвимостей и репозиториев кода. Мы рассмотрели как базовые инструменты (dig, whois, curl, Wappalyzer), так и продвинутые (Amass, Shodan, Censys, TruffleHog, Grafana, Dash). Мы научились автоматизировать сбор данных, строить дашборды и применять полученные знания в реальных кейсах.</p>
  <p id="RMbB">Главные выводы цикла:</p>
  <ul id="xxks">
    <li id="fIDL"><strong>Пассивная разведка безопасна и легальна</strong> (в отличие от активного сканирования), но даёт до 80% информации об инфраструктуре.</li>
    <li id="Lxjp"><strong>Комбинируйте источники</strong>: DNS, CT-логи, архивы, GitHub, Shodan — каждый добавляет свои уникальные данные.</li>
    <li id="tME0"><strong>Автоматизация — ключ к масштабу</strong>: ручной сбор годится для одного-двух доменов; для десятков и сотен нужны скрипты.</li>
    <li id="Cyqp"><strong>Интерпретация важнее сбора</strong>: найденные данные нужно анализировать, визуализировать и применять.</li>
    <li id="q9La"><strong>Этика — основа профессии</strong>: собранная информация должна использоваться для защиты, а не для атак.</li>
  </ul>
  <p id="a0IJ">Технический OSINT — это не просто навык, а образ мышления, при котором вы видите интернет как гигантскую базу данных, из которой можно извлекать ценную информацию, не нарушая законов и прав других людей.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/BhH2i_kZYn1</guid><link>https://teletype.in/@specialist_infosec/BhH2i_kZYn1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/BhH2i_kZYn1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Создание дашборда для мониторинга инфраструктуры цели</title><pubDate>Tue, 07 Jul 2026 21:33:24 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f2/21/f2211d1a-d72f-46a4-8345-81be1b638bcb.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/f1/7a/f17a6c0e-92d1-4610-8494-88cd300dabe7.png"></img>После того как все этапы технического OSINT автоматизированы и данные собираются в базу данных, возникает следующая задача: как сделать эту информацию доступной, наглядной и удобной для анализа. Отчёты в виде JSON или CSV хороши для машинной обработки, но для человека визуализация в виде графиков, карт, таблиц и интерактивных панелей значительно эффективнее. Дашборд (dashboard) — это единая панель управления, которая отображает ключевые показатели, изменения в инфраструктуре, новые поддомены, открытые порты, уязвимости и другие данные в реальном времени (или близком к нему). Данная статья посвящена созданию веб-дашборда для мониторинга инфраструктуры цели с использованием открытых инструментов.]]></description><content:encoded><![CDATA[
  <figure id="fn07" class="m_retina">
    <img src="https://img4.teletype.in/files/f1/7a/f17a6c0e-92d1-4610-8494-88cd300dabe7.png" width="1099" />
  </figure>
  <h3 id="L9sV">Создание дашборда для мониторинга инфраструктуры цели</h3>
  <p id="64EC">После того как все этапы технического OSINT автоматизированы и данные собираются в базу данных, возникает следующая задача: как сделать эту информацию доступной, наглядной и удобной для анализа. Отчёты в виде JSON или CSV хороши для машинной обработки, но для человека визуализация в виде графиков, карт, таблиц и интерактивных панелей значительно эффективнее. Дашборд (dashboard) — это единая панель управления, которая отображает ключевые показатели, изменения в инфраструктуре, новые поддомены, открытые порты, уязвимости и другие данные в реальном времени (или близком к нему). Данная статья посвящена созданию веб-дашборда для мониторинга инфраструктуры цели с использованием открытых инструментов.</p>
  <p id="aLhK"><strong>Зачем нужен дашборд в техническом OSINT?</strong></p>
  <figure id="umTR" class="m_column">
    <img src="https://img1.teletype.in/files/86/1b/861b4f42-c7ad-41dc-a04a-de2b1fc8d476.png" width="1212" />
  </figure>
  <p id="xvtX"><strong>Подходы к созданию дашборда</strong></p>
  <figure id="IJz6" class="m_column">
    <img src="https://img3.teletype.in/files/28/f1/28f1681c-0af0-479a-ad9f-81d4f7ec1db2.png" width="1111" />
  </figure>
  <p id="IL0v">В этой статье мы рассмотрим два основных подхода:</p>
  <ol id="0ICw">
    <li id="z4GP"><strong>Быстрый старт с Grafana</strong> — минимальная настройка, мощная визуализация.</li>
    <li id="yqIF"><strong>Гибкий дашборд на Python (Dash)</strong> — полный контроль над данными и интерфейсом.</li>
  </ol>
  <p id="LSAX"><strong>ВАРИАНТ 1: ДАШБОРД НА GRAFANA + SQLITE</strong></p>
  <p id="8b0x">Grafana — это популярная платформа для мониторинга и визуализации данных. Она поддерживает множество источников данных, включая SQLite, PostgreSQL, Prometheus, Elasticsearch. Для нашего случая SQLite подходит отлично — данные уже хранятся в ней.</p>
  <p id="LEt1"><strong>Архитектура:</strong></p>
  <pre id="BdHm">SQLite Database → Grafana (с плагином SQLite) → Дашборд с панелями</pre>
  <p id="WhaW"><strong>Установка Grafana:</strong></p>
  <pre id="vHzp"># Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository &quot;deb https://packages.grafana.com/oss/deb stable main&quot;
sudo apt-get update
sudo apt-get install grafana

# Запуск
sudo systemctl enable grafana-server
sudo systemctl start grafana-server</pre>
  <p id="PaYb">Grafana будет доступна по адресу <code>http://localhost:3000</code> (логин/пароль по умолчанию: admin/admin).</p>
  <p id="ea1L"><strong>Подключение SQLite к Grafana:</strong></p>
  <p id="Apic">Стандартный Grafana не поддерживает SQLite напрямую. Нужно использовать плагин:</p>
  <ol id="jF0V">
    <li id="VqZE">Установить плагин <code>grafana-sqlite-datasource</code>:bashsudo grafana-cli plugins install frser-sqlite-datasource sudo systemctl restart grafana-server</li>
    <li id="TgYO">В веб-интерфейсе Grafana: Configuration → Data Sources → Add data source → SQLite.</li>
    <ul id="aswZ">
      <li id="GAfP">Указать путь к файлу БД: <code>/path/to/osint.db</code></li>
    </ul>
  </ol>
  <p id="Yg4b"><strong>Создание панелей в Grafana:</strong></p>
  <p id="HiT8"><strong>Панель 1: Количество поддоменов за последние 30 дней (гистограмма)</strong></p>
  <pre id="dMNn">SELECT 
    DATE(discovered_at) as date,
    COUNT(*) as count
FROM subdomains
WHERE discovered_at &gt; datetime(&#x27;now&#x27;, &#x27;-30 days&#x27;)
GROUP BY DATE(discovered_at)
ORDER BY date ASC</pre>
  <p id="dxa2"><strong>Панель 2: Таблица последних поддоменов</strong></p>
  <pre id="x8Lh">SELECT subdomain, discovered_at
FROM subdomains
ORDER BY discovered_at DESC
LIMIT 20</pre>
  <p id="m38b"><strong>Панель 3: Истекающие сертификаты (таблица)</strong></p>
  <pre id="DLnK">SELECT name, valid_to, 
       julianday(valid_to) - julianday(&#x27;now&#x27;) as days_left
FROM certificates
WHERE days_left &lt; 30 AND days_left &gt; 0
ORDER BY days_left ASC</pre>
  <p id="wT9Q"><strong>Панель 4: Распределение открытых портов (круговая диаграмма)</strong></p>
  <pre id="IYbz">SELECT port, COUNT(*) as count
FROM shodan_ports
GROUP BY port
ORDER BY count DESC
LIMIT 10</pre>
  <p id="Y2ig"><strong>Grafana преимущества:</strong></p>
  <ul id="IzpG">
    <li id="mdru">Быстрая настройка, красивые графики &quot;из коробки&quot;.</li>
    <li id="2I7e">Автообновление данных.</li>
    <li id="EpLL">Поддержка алертов (email, Telegram, Slack).</li>
  </ul>
  <p id="BwFZ"><strong>Grafana недостатки:</strong></p>
  <ul id="3Y8c">
    <li id="wAi1">Ограниченная кастомизация (сложно добавить нестандартную логику).</li>
    <li id="OPQk">Нужно устанавливать плагин для SQLite (или использовать PostgreSQL).</li>
  </ul>
  <p id="LqgI"><strong>ВАРИАНТ 2: ГИБКИЙ ДАШБОРД НА PYTHON (DASH + PLOTLY)</strong></p>
  <p id="BtIp">Dash — это веб-фреймворк от Plotly для создания аналитических дашбордов на Python. Он позволяет полностью контролировать логику обработки данных и визуализацию, не требуя знаний JavaScript.</p>
  <p id="fRl6"><strong>Архитектура:</strong></p>
  <pre id="WIXY">SQLite Database → Python (Dash) → Веб-интерфейс (HTML/CSS/JS)</pre>
  <p id="abS9"><strong>Установка зависимостей:</strong></p>
  <pre id="ERsQ">pip install dash plotly pandas</pre>
  <p id="gDnS"><strong>Структура проекта:</strong></p>
  <pre id="vyvA">dashboard/
├── app.py              # Главный файл приложения
├── data/
│   └── osint.db        # База данных
├── assets/
│   └── style.css       # Стили (опционально)
└── requirements.txt</pre>
  <p id="X8in"><strong>Создание дашборда (app.py):</strong></p>
  <pre id="Bq32">import dash
from dash import dcc, html, Input, Output, State
import plotly.graph_objects as go
import plotly.express as px
import sqlite3
import pandas as pd
from datetime import datetime, timedelta

# Инициализация приложения
app = dash.Dash(__name__, title=&quot;OSINT Dashboard&quot;)
server = app.server

# Функция подключения к БД
def get_db_connection():
    conn = sqlite3.connect(&#x27;data/osint.db&#x27;)
    conn.row_factory = sqlite3.Row
    return conn

# ============ ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ============

def get_subdomain_history(domain=None, days=30):
    &quot;&quot;&quot;Получение истории поддоменов за последние N дней&quot;&quot;&quot;
    conn = get_db_connection()
    query = &quot;&quot;&quot;
        SELECT DATE(discovered_at) as date, COUNT(*) as count
        FROM subdomains s
        JOIN domains d ON s.domain_id = d.id
        WHERE d.domain = ? AND discovered_at &gt; datetime(&#x27;now&#x27;, &#x27;-&#x27; || ? || &#x27; days&#x27;)
        GROUP BY DATE(discovered_at)
        ORDER BY date ASC
    &quot;&quot;&quot;
    df = pd.read_sql_query(query, conn, params=(domain, days))
    conn.close()
    return df

def get_recent_subdomains(domain=None, limit=20):
    &quot;&quot;&quot;Получение последних поддоменов&quot;&quot;&quot;
    conn = get_db_connection()
    query = &quot;&quot;&quot;
        SELECT s.subdomain, s.discovered_at
        FROM subdomains s
        JOIN domains d ON s.domain_id = d.id
        WHERE d.domain = ?
        ORDER BY s.discovered_at DESC
        LIMIT ?
    &quot;&quot;&quot;
    df = pd.read_sql_query(query, conn, params=(domain, limit))
    conn.close()
    return df

def get_expiring_certs(domain=None, days=30):
    &quot;&quot;&quot;Получение истекающих сертификатов&quot;&quot;&quot;
    conn = get_db_connection()
    query = &quot;&quot;&quot;
        SELECT name, issuer, valid_to,
               julianday(valid_to) - julianday(&#x27;now&#x27;) as days_left
        FROM certificates c
        JOIN domains d ON c.domain_id = d.id
        WHERE d.domain = ? AND days_left &lt; ? AND days_left &gt; 0
        ORDER BY days_left ASC
    &quot;&quot;&quot;
    df = pd.read_sql_query(query, conn, params=(domain, days))
    conn.close()
    return df

def get_port_distribution(domain=None):
    &quot;&quot;&quot;Распределение открытых портов&quot;&quot;&quot;
    conn = get_db_connection()
    query = &quot;&quot;&quot;
        SELECT port, COUNT(*) as count
        FROM shodan_ports sp
        JOIN domains d ON sp.domain_id = d.id
        WHERE d.domain = ?
        GROUP BY port
        ORDER BY count DESC
        LIMIT 15
    &quot;&quot;&quot;
    df = pd.read_sql_query(query, conn, params=(domain,))
    conn.close()
    return df

def get_tech_stack(domain=None):
    &quot;&quot;&quot;Технологический стек&quot;&quot;&quot;
    conn = get_db_connection()
    # Предположим, есть таблица technologies
    query = &quot;&quot;&quot;
        SELECT tech_name, COUNT(*) as count
        FROM technologies t
        JOIN domains d ON t.domain_id = d.id
        WHERE d.domain = ?
        GROUP BY tech_name
        ORDER BY count DESC
        LIMIT 15
    &quot;&quot;&quot;
    # Если таблицы нет — заглушка
    df = pd.DataFrame({&#x27;tech_name&#x27;: [&#x27;nginx&#x27;, &#x27;PHP&#x27;, &#x27;WordPress&#x27;, &#x27;jQuery&#x27;, &#x27;Bootstrap&#x27;],
                       &#x27;count&#x27;: [1, 1, 1, 1, 1]})
    conn.close()
    return df

def get_all_domains():
    &quot;&quot;&quot;Список всех отслеживаемых доменов&quot;&quot;&quot;
    conn = get_db_connection()
    df = pd.read_sql_query(&quot;SELECT domain FROM domains ORDER BY domain ASC&quot;, conn)
    conn.close()
    return df[&#x27;domain&#x27;].tolist()

# ============ МАКЕТ ДАШБОРДА ============

app.layout = html.Div([
    # Заголовок
    html.H1(&quot;📊 OSINT Infrastructure Dashboard&quot;, style={&#x27;textAlign&#x27;: &#x27;center&#x27;, &#x27;marginBottom&#x27;: 30}),
    
    # Выбор домена
    html.Div([
        html.Label(&quot;Выберите домен:&quot;),
        dcc.Dropdown(
            id=&#x27;domain-selector&#x27;,
            options=[{&#x27;label&#x27;: d, &#x27;value&#x27;: d} for d in get_all_domains()],
            value=&#x27;example.com&#x27; if &#x27;example.com&#x27; in get_all_domains() else get_all_domains()[0] if get_all_domains() else None,
            style={&#x27;width&#x27;: &#x27;50%&#x27;, &#x27;margin&#x27;: &#x27;10px 0&#x27;}
        )
    ], style={&#x27;padding&#x27;: &#x27;0 20px&#x27;}),
    
    # Верхние карточки (метрики)
    html.Div([
        html.Div([
            html.H3(&quot;🌐 Всего поддоменов&quot;),
            html.H2(id=&#x27;total-subdomains&#x27;, style={&#x27;color&#x27;: &#x27;#2196F3&#x27;})
        ], className=&#x27;metric-card&#x27;),
        html.Div([
            html.H3(&quot;🔄 Изменений за 7 дней&quot;),
            html.H2(id=&#x27;changes-7d&#x27;, style={&#x27;color&#x27;: &#x27;#FF9800&#x27;})
        ], className=&#x27;metric-card&#x27;),
        html.Div([
            html.H3(&quot;⏳ Истекающих сертификатов (&lt;30 дн)&quot;),
            html.H2(id=&#x27;expiring-certs&#x27;, style={&#x27;color&#x27;: &#x27;#F44336&#x27;})
        ], className=&#x27;metric-card&#x27;),
        html.Div([
            html.H3(&quot;🔓 Открытых портов&quot;),
            html.H2(id=&#x27;total-ports&#x27;, style={&#x27;color&#x27;: &#x27;#4CAF50&#x27;})
        ], className=&#x27;metric-card&#x27;),
    ], style={&#x27;display&#x27;: &#x27;flex&#x27;, &#x27;gap&#x27;: &#x27;20px&#x27;, &#x27;padding&#x27;: &#x27;0 20px&#x27;, &#x27;flexWrap&#x27;: &#x27;wrap&#x27;}),
    
    # Графики (сетка 2x2)
    html.Div([
        # График 1: История поддоменов
        html.Div([
            dcc.Graph(id=&#x27;subdomain-history&#x27;)
        ], className=&#x27;graph-card&#x27;),
        
        # График 2: Распределение портов
        html.Div([
            dcc.Graph(id=&#x27;port-distribution&#x27;)
        ], className=&#x27;graph-card&#x27;),
        
        # График 3: Истекающие сертификаты
        html.Div([
            dcc.Graph(id=&#x27;cert-expiry&#x27;)
        ], className=&#x27;graph-card&#x27;),
        
        # График 4: Технологический стек
        html.Div([
            dcc.Graph(id=&#x27;tech-stack&#x27;)
        ], className=&#x27;graph-card&#x27;),
    ], style={&#x27;display&#x27;: &#x27;grid&#x27;, &#x27;gridTemplateColumns&#x27;: &#x27;1fr 1fr&#x27;, &#x27;gap&#x27;: &#x27;20px&#x27;, &#x27;padding&#x27;: &#x27;20px&#x27;}),
    
    # Таблица последних поддоменов
    html.Div([
        html.H3(&quot;🆕 Последние поддомены&quot;),
        html.Div(id=&#x27;recent-subdomains-table&#x27;, style={&#x27;overflowX&#x27;: &#x27;auto&#x27;})
    ], style={&#x27;padding&#x27;: &#x27;0 20px&#x27;, &#x27;marginTop&#x27;: 20}),
    
    # Автообновление (раз в 60 секунд)
    dcc.Interval(
        id=&#x27;interval-component&#x27;,
        interval=60 * 1000,  # 60 секунд
        n_intervals=0
    )
], style={&#x27;maxWidth&#x27;: &#x27;1400px&#x27;, &#x27;margin&#x27;: &#x27;0 auto&#x27;, &#x27;fontFamily&#x27;: &#x27;Arial, sans-serif&#x27;})

# ============ КОЛБЭКИ ============

@app.callback(
    [
        Output(&#x27;total-subdomains&#x27;, &#x27;children&#x27;),
        Output(&#x27;changes-7d&#x27;, &#x27;children&#x27;),
        Output(&#x27;expiring-certs&#x27;, &#x27;children&#x27;),
        Output(&#x27;total-ports&#x27;, &#x27;children&#x27;),
        Output(&#x27;subdomain-history&#x27;, &#x27;figure&#x27;),
        Output(&#x27;port-distribution&#x27;, &#x27;figure&#x27;),
        Output(&#x27;cert-expiry&#x27;, &#x27;figure&#x27;),
        Output(&#x27;tech-stack&#x27;, &#x27;figure&#x27;),
        Output(&#x27;recent-subdomains-table&#x27;, &#x27;children&#x27;),
    ],
    [Input(&#x27;domain-selector&#x27;, &#x27;value&#x27;),
     Input(&#x27;interval-component&#x27;, &#x27;n_intervals&#x27;)]
)
def update_dashboard(domain, n_intervals):
    if not domain:
        return &quot;—&quot;, &quot;—&quot;, &quot;—&quot;, &quot;—&quot;, {}, {}, {}, {}, &quot;Выберите домен&quot;
    
    # 1. Количество поддоменов
    conn = get_db_connection()
    total_sub = pd.read_sql_query(
        &quot;SELECT COUNT(*) as cnt FROM subdomains s JOIN domains d ON s.domain_id = d.id WHERE d.domain = ?&quot;,
        conn, params=(domain,)
    ).iloc[0][&#x27;cnt&#x27;]
    conn.close()
    
    # 2. Изменения за 7 дней (новые поддомены)
    conn = get_db_connection()
    changes_7d = pd.read_sql_query(
        &quot;SELECT COUNT(*) as cnt FROM subdomains s JOIN domains d ON s.domain_id = d.id WHERE d.domain = ? AND discovered_at &gt; datetime(&#x27;now&#x27;, &#x27;-7 days&#x27;)&quot;,
        conn, params=(domain,)
    ).iloc[0][&#x27;cnt&#x27;]
    conn.close()
    
    # 3. Истекающие сертификаты
    expiring_df = get_expiring_certs(domain)
    expiring_count = len(expiring_df)
    
    # 4. Открытые порты
    ports_df = get_port_distribution(domain)
    total_ports = ports_df[&#x27;count&#x27;].sum() if not ports_df.empty else 0
    
    # 5. График истории поддоменов
    history_df = get_subdomain_history(domain)
    fig_history = px.line(
        history_df, x=&#x27;date&#x27;, y=&#x27;count&#x27;,
        title=&#x27;Поддомены по дням&#x27;,
        labels={&#x27;date&#x27;: &#x27;Дата&#x27;, &#x27;count&#x27;: &#x27;Количество&#x27;}
    ) if not history_df.empty else go.Figure()
    
    # 6. Распределение портов
    fig_ports = px.pie(
        ports_df, values=&#x27;count&#x27;, names=&#x27;port&#x27;,
        title=&#x27;Распределение портов&#x27;
    ) if not ports_df.empty else go.Figure()
    
    # 7. Истекающие сертификаты (бар-чарт)
    if not expiring_df.empty:
        fig_certs = px.bar(
            expiring_df, x=&#x27;name&#x27;, y=&#x27;days_left&#x27;,
            title=&#x27;Дней до истечения сертификата&#x27;,
            labels={&#x27;name&#x27;: &#x27;Домен&#x27;, &#x27;days_left&#x27;: &#x27;Дней&#x27;},
            color=&#x27;days_left&#x27;,
            color_continuous_scale=&#x27;RdYlGn_r&#x27;
        )
    else:
        fig_certs = go.Figure()
        fig_certs.add_annotation(text=&quot;Нет истекающих сертификатов&quot;, showarrow=False)
    
    # 8. Технологический стек
    tech_df = get_tech_stack(domain)
    fig_tech = px.bar(
        tech_df, x=&#x27;count&#x27;, y=&#x27;tech_name&#x27;,
        orientation=&#x27;h&#x27;,
        title=&#x27;Технологии&#x27;,
        labels={&#x27;count&#x27;: &#x27;Количество&#x27;, &#x27;tech_name&#x27;: &#x27;Технология&#x27;}
    ) if not tech_df.empty else go.Figure()
    
    # 9. Таблица последних поддоменов
    recent_df = get_recent_subdomains(domain)
    if not recent_df.empty:
        table = html.Table([
            html.Thead(html.Tr([
                html.Th(&quot;Поддомен&quot;, style={&#x27;textAlign&#x27;: &#x27;left&#x27;}),
                html.Th(&quot;Обнаружен&quot;, style={&#x27;textAlign&#x27;: &#x27;left&#x27;})
            ])),
            html.Tbody([
                html.Tr([
                    html.Td(row[&#x27;subdomain&#x27;]),
                    html.Td(row[&#x27;discovered_at&#x27;])
                ]) for _, row in recent_df.iterrows()
            ])
        ], style={&#x27;width&#x27;: &#x27;100%&#x27;, &#x27;borderCollapse&#x27;: &#x27;collapse&#x27;})
    else:
        table = &quot;Нет данных&quot;
    
    return (
        total_sub,
        changes_7d,
        expiring_count,
        total_ports,
        fig_history,
        fig_ports,
        fig_certs,
        fig_tech,
        table
    )

# ============ ЗАПУСК ============

if __name__ == &#x27;__main__&#x27;:
    app.run_server(debug=True, host=&#x27;0.0.0.0&#x27;, port=8050)</pre>
  <p id="nAIo"><strong>Добавление CSS-стилей (assets/style.css):</strong></p>
  <pre id="g3lI">.metric-card {
    background: white;
    border-radius: 10px;
    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
    padding: 20px;
    flex: 1;
    min-width: 150px;
    text-align: center;
}
.metric-card h3 {
    margin: 0 0 10px 0;
    font-size: 14px;
    color: #666;
}
.metric-card h2 {
    margin: 0;
    font-size: 32px;
}

.graph-card {
    background: white;
    border-radius: 10px;
    box-shadow: 0 2px 10px rgba(0,0,0,0.05);
    padding: 15px;
}

table {
    border: 1px solid #ddd;
}
table th {
    background: #f5f5f5;
    padding: 10px;
    border-bottom: 2px solid #ddd;
}
table td {
    padding: 8px 10px;
    border-bottom: 1px solid #eee;
}
table tr:hover {
    background: #f9f9f9;
}</pre>
  <p id="cvr4"><strong>Запуск дашборда:</strong></p>
  <pre id="37Gm">python app.py</pre>
  <p id="VMDS">Дашборд будет доступен по адресу: <code>http://localhost:8050</code></p>
  <p id="itio"><strong>ВАРИАНТ 3: БЫСТРЫЙ СТАТИЧЕСКИЙ ОТЧЁТ (HTML)</strong></p>
  <p id="g1bF">Если веб-сервер не требуется, можно генерировать статический HTML-отчёт с графиками.</p>
  <p id="zwox"><strong>Использование библиотеки <code>matplotlib</code> + <code>mpld3</code> для интерактивных графиков в HTML:</strong></p>
  <pre id="5bo1">import matplotlib.pyplot as plt
import mpld3
import sqlite3
import pandas as pd

def generate_report(domain):
    # Получение данных
    history_df = get_subdomain_history(domain)
    ports_df = get_port_distribution(domain)
    
    # Генерация графиков
    fig1, ax1 = plt.subplots()
    ax1.plot(history_df[&#x27;date&#x27;], history_df[&#x27;count&#x27;])
    ax1.set_title(&#x27;Поддомены по дням&#x27;)
    fig1_html = mpld3.fig_to_html(fig1)
    
    fig2, ax2 = plt.subplots()
    ax2.pie(ports_df[&#x27;count&#x27;], labels=ports_df[&#x27;port&#x27;], autopct=&#x27;%1.1f%%&#x27;)
    ax2.set_title(&#x27;Распределение портов&#x27;)
    fig2_html = mpld3.fig_to_html(fig2)
    
    # Сборка HTML
    html = f&quot;&quot;&quot;
    &lt;html&gt;
    &lt;head&gt;&lt;title&gt;Отчёт по {domain}&lt;/title&gt;&lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;OSINT Отчёт: {domain}&lt;/h1&gt;
        &lt;div&gt;{fig1_html}&lt;/div&gt;
        &lt;div&gt;{fig2_html}&lt;/div&gt;
    &lt;/body&gt;
    &lt;/html&gt;
    &quot;&quot;&quot;
    with open(f&#x27;report_{domain}.html&#x27;, &#x27;w&#x27;) as f:
        f.write(html)</pre>
  <p id="4nCr"><strong>ВАРИАНТ 4: ИСПОЛЬЗОВАНИЕ SPIDERFOOT</strong></p>
  <p id="SGmD">SpiderFoot — это OSINT-фреймворк с собственным веб-интерфейсом. Он автоматически собирает данные из множества источников и визуализирует их в виде графа связей.</p>
  <p id="GfuL"><strong>Установка SpiderFoot:</strong></p>
  <pre id="rJct"># Docker (рекомендуемый способ)
docker run -p 5000:5000 spiderfoot/spiderfoot</pre>
  <p id="Qbfm"><strong>Особенности SpiderFoot:</strong></p>
  <ul id="zuMP">
    <li id="izRC">Графовое представление связей (домены, IP, email, хэши).</li>
    <li id="21lP">Автоматический сбор из 200+ модулей.</li>
    <li id="W8Iu">Встроенный дашборд с картами и таймлайнами.</li>
  </ul>
  <p id="OII0">требует времени на настройку, может быть избыточным для простых задач.</p>
  <p id="4GKF"><strong>ВАРИАНТ 5: MALTEGO ДЛЯ ВИЗУАЛИЗАЦИИ СВЯЗЕЙ</strong></p>
  <p id="Zosd">Maltego — это инструмент для визуализации связей между сущностями (доменами, IP, личностями). В сочетании с трансформами он превращает собранные данные в интерактивный граф.</p>
  <p id="HnKT"><strong>Как использовать:</strong></p>
  <ul id="NchE">
    <li id="O4Am">Экспортировать данные из SQLite в CSV.</li>
    <li id="Puwk">Импортировать в Maltego как &quot;сущности&quot; (Entities).</li>
    <li id="OsAX">Использовать трансформы для дальнейшего обогащения.</li>
  </ul>
  <p id="3Z1A"><strong>СРАВНЕНИЕ ИНСТРУМЕНТОВ ДЛЯ ДАШБОРДОВ</strong></p>
  <figure id="qnDS" class="m_column">
    <img src="https://img2.teletype.in/files/16/e5/16e51c88-41e9-4eb5-b150-03abdaeacc22.png" width="1021" />
  </figure>
  <hr />
  <p id="r1Qd"><strong>Практический пример: использование дашборда для мониторинга</strong></p>
  <p id="L0aZ"><em>Сценарий:</em> аналитик мониторит 5 доменов конкурентов.</p>
  <ol id="Ia4M">
    <li id="JRkY"><strong>Ежедневный сбор</strong> → данные попадают в SQLite через автоматизированный конвейер.</li>
    <li id="IxKa"><strong>Дашборд (Dash)</strong> → отображает для каждого домена:</li>
    <ul id="BBUi">
      <li id="ItnT">Количество поддоменов (график роста).</li>
      <li id="JnVt">Новые поддомены за неделю (таблица).</li>
      <li id="gwAt">Открытые порты и сервисы.</li>
      <li id="LHFo">Истекающие сертификаты (алерт).</li>
    </ul>
    <li id="VAEp"><strong>Обнаружение:</strong> на дашборде появляется новый поддомен <code>newapp.competitor.com</code>. Аналитик видит, что это произошло сегодня. Через Shodan выясняется, что на нём открыт порт 443 с сертификатом от AWS. Вывод: конкурент запускает новый облачный сервис.</li>
    <li id="2Mbo"><strong>Реакция:</strong> информация передаётся в стратегический отдел.</li>
  </ol>
  <p id="McSX"><strong>РЕКОМЕНДАЦИИ ПО ВЫБОРУ</strong></p>
  <figure id="hq6v" class="m_column">
    <img src="https://img2.teletype.in/files/9e/ba/9eba62b3-2fc1-4351-aaf4-12c16beaa60a.png" width="1216" />
  </figure>
  <p id="iX4P">Дашборд — это завершающий элемент системы технического OSINT, превращающий сырые данные в понятную и удобную для анализа информацию. Выбор инструмента зависит от задач: Grafana подходит для быстрого старта и оперативного мониторинга, Dash/Plotly — для глубокой кастомизации, Maltego — для визуализации связей. Интеграция дашборда с автоматизированным конвейером (из предыдущей статьи) создаёт полноценную систему непрерывной разведки, где данные собираются, обрабатываются и отображаются в реальном времени.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@specialist_infosec/Automation-of-technical-OSINT</guid><link>https://teletype.in/@specialist_infosec/Automation-of-technical-OSINT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec</link><comments>https://teletype.in/@specialist_infosec/Automation-of-technical-OSINT?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=specialist_infosec#comments</comments><dc:creator>specialist_infosec</dc:creator><title>Автоматизация технического OSINT: сбор данных в скриптах</title><pubDate>Tue, 07 Jul 2026 21:25:14 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ae/90/ae9083f8-4e43-48b6-9e57-763c4eb57308.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/6d/73/6d732144-e975-4bb8-aa26-7ef8c3fd4900.png"></img>Ручное выполнение всех этапов технического OSINT для одного домена может занять несколько часов. При необходимости мониторинга десятков или сотен целей ручной сбор становится невозможным. Автоматизация превращает разрозненные запросы к API, парсинг веб-страниц и анализ данных в единый воспроизводимый конвейер, который можно запускать по расписанию. Правильно построенная система автоматизации позволяет получать актуальную информацию о целях без участия человека, экономить время и избегать ошибок. Данная статья посвящена методам и практическим примерам автоматизации технического OSINT с использованием Python и Bash.]]></description><content:encoded><![CDATA[
  <figure id="hZDx" class="m_retina">
    <img src="https://img3.teletype.in/files/6d/73/6d732144-e975-4bb8-aa26-7ef8c3fd4900.png" width="1099" />
  </figure>
  <h3 id="2VPe">Автоматизация технического OSINT: сбор данных в скриптах (Python, Bash)</h3>
  <p id="XflP">Ручное выполнение всех этапов технического OSINT для одного домена может занять несколько часов. При необходимости мониторинга десятков или сотен целей ручной сбор становится невозможным. Автоматизация превращает разрозненные запросы к API, парсинг веб-страниц и анализ данных в единый воспроизводимый конвейер, который можно запускать по расписанию. Правильно построенная система автоматизации позволяет получать актуальную информацию о целях без участия человека, экономить время и избегать ошибок. Данная статья посвящена методам и практическим примерам автоматизации технического OSINT с использованием Python и Bash.</p>
  <p id="QXBl"><strong>Зачем автоматизировать технический OSINT?</strong></p>
  <figure id="81Ld" class="m_column">
    <img src="https://img1.teletype.in/files/c0/d2/c0d2d0a4-c511-4f78-a6bc-fb5386806413.png" width="1081" />
  </figure>
  <p id="Q7AX"><strong>Подходы к автоматизации</strong></p>
  <figure id="HNa1" class="m_column">
    <img src="https://img1.teletype.in/files/c5/1a/c51a00d1-fef9-43a9-a828-c02683c298ed.png" width="1213" />
  </figure>
  <p id="wjc1"><strong>Этап 1: Структура проекта</strong></p>
  <p id="DeEP">Рекомендуемая структура каталога для автоматизации:</p>
  <pre id="06MT">osint-automation/
├── config/
│   ├── config.yaml            # API ключи, настройки
│   └── targets.txt            # Список доменов (по одному на строку)
├── modules/
│   ├── dns.py                 # Сбор DNS-записей
│   ├── whois.py               # WHOIS-информация
│   ├── subdomains.py          # Поиск поддоменов (crt.sh, SecurityTrails)
│   ├── certificates.py        # SSL/TLS сертификаты
│   ├── shodan.py              # Shodan-данные
│   ├── tech_stack.py          # Wappalyzer/BuiltWith технологии
│   ├── github.py              # Поиск секретов в GitHub
│   └── changes.py             # Сравнение с предыдущим состоянием
├── utils/
│   ├── logger.py              # Логирование
│   ├── notifier.py            # Отправка уведомлений (Telegram, Email)
│   └── db.py                  # Работа с SQLite
├── data/                      # Хранилище результатов (JSON, SQLite)
├── main.py                    # Главный скрипт
├── requirements.txt           # Зависимости Python
└── run.sh                     # Bash-обёртка для cron</pre>
  <p id="ATyE"><strong>Этап 2: Настройка конфигурации (config.yaml)</strong></p>
  <pre id="QNHF"># config.yaml
api_keys:
  shodan: &quot;SHODAN_API_KEY&quot;
  securitytrails: &quot;SECURITYTRAILS_API_KEY&quot;
  github: &quot;GITHUB_TOKEN&quot;
  virustotal: &quot;VIRUSTOTAL_API_KEY&quot;  # опционально
  censys:
    api_id: &quot;CENSYS_API_ID&quot;
    api_secret: &quot;CENSYS_API_SECRET&quot;

notifications:
  telegram:
    token: &quot;TELEGRAM_BOT_TOKEN&quot;
    chat_id: &quot;TELEGRAM_CHAT_ID&quot;
  email:
    smtp_server: &quot;smtp.gmail.com&quot;
    smtp_port: 587
    username: &quot;user@gmail.com&quot;
    password: &quot;app_password&quot;
    to: &quot;recipient@example.com&quot;

database:
  path: &quot;data/osint.db&quot;

targets:
  file: &quot;config/targets.txt&quot;

logging:
  level: &quot;INFO&quot;
  file: &quot;data/osint.log&quot;

scan:
  # интервал повторных запросов для Shodan (если нужно ждать)
  shodan_delay: 1  # секунды между запросами
  timeout: 30  # таймаут для HTTP-запросов</pre>
  <p id="CiQd"><strong>Этап 3: Сбор DNS-записей (modules/dns.py)</strong></p>
  <pre id="XsPK">import dns.resolver
import json
from utils.logger import get_logger

logger = get_logger(__name__)

def get_dns_records(domain):
    &quot;&quot;&quot;
    Сбор основных DNS-записей: A, AAAA, MX, TXT, NS, CNAME, SOA
    &quot;&quot;&quot;
    records = {}
    record_types = [&#x27;A&#x27;, &#x27;AAAA&#x27;, &#x27;MX&#x27;, &#x27;TXT&#x27;, &#x27;NS&#x27;, &#x27;CNAME&#x27;, &#x27;SOA&#x27;]
    
    for rtype in record_types:
        try:
            answers = dns.resolver.resolve(domain, rtype)
            records[rtype] = [str(r) for r in answers]
        except dns.resolver.NoAnswer:
            records[rtype] = []
        except dns.resolver.NXDOMAIN:
            records[rtype] = []
        except Exception as e:
            logger.warning(f&quot;DNS {rtype} для {domain}: {e}&quot;)
            records[rtype] = []
    
    return records

def get_reverse_dns(ip):
    &quot;&quot;&quot;
    Обратный DNS (PTR) для IP-адреса
    &quot;&quot;&quot;
    try:
        answers = dns.resolver.resolve_address(ip)
        return [str(r) for r in answers]
    except:
        return []

# Пример использования
if __name__ == &quot;__main__&quot;:
    records = get_dns_records(&quot;example.com&quot;)
    print(json.dumps(records, indent=2))</pre>
  <p id="bgEY"><strong>Этап 4: WHOIS-информация (modules/whois.py)</strong></p>
  <pre id="RSVZ">import whois
import json
from datetime import datetime

def get_whois_info(domain):
    &quot;&quot;&quot;
    Получение WHOIS-информации о домене
    &quot;&quot;&quot;
    try:
        w = whois.whois(domain)
        return {
            &#x27;domain_name&#x27;: w.domain_name,
            &#x27;registrar&#x27;: w.registrar,
            &#x27;creation_date&#x27;: str(w.creation_date),
            &#x27;expiration_date&#x27;: str(w.expiration_date),
            &#x27;updated_date&#x27;: str(w.updated_date),
            &#x27;name_servers&#x27;: w.name_servers,
            &#x27;emails&#x27;: w.emails,
            &#x27;org&#x27;: w.org,
            &#x27;country&#x27;: w.country,
        }
    except Exception as e:
        return {&#x27;error&#x27;: str(e)}</pre>
  <p id="bHjT"><strong>Этап 5: Поиск поддоменов через crt.sh (modules/subdomains.py)</strong></p>
  <pre id="sTXe">import requests
import json
from utils.logger import get_logger

logger = get_logger(__name__)

def get_subdomains_crtsh(domain):
    &quot;&quot;&quot;
    Получение поддоменов из Certificate Transparency логов через crt.sh
    &quot;&quot;&quot;
    url = f&quot;https://crt.sh/?q=%25.{domain}&amp;output=json&quot;
    subdomains = set()
    try:
        resp = requests.get(url, timeout=30)
        if resp.status_code == 200:
            data = resp.json()
            for entry in data:
                name = entry.get(&#x27;name_value&#x27;, &#x27;&#x27;)
                if name.endswith(f&#x27;.{domain}&#x27;) or name == domain:
                    # убираем wildcard
                    if name.startswith(&#x27;*.&#x27;):
                        name = name[2:]
                    subdomains.add(name.lower())
        else:
            logger.warning(f&quot;crt.sh ошибка: {resp.status_code}&quot;)
    except Exception as e:
        logger.error(f&quot;crt.sh исключение: {e}&quot;)
    
    return sorted(subdomains)

def get_subdomains_securitytrails(domain, api_key):
    &quot;&quot;&quot;
    Получение поддоменов через SecurityTrails API (требуется ключ)
    &quot;&quot;&quot;
    if not api_key:
        return []
    url = f&quot;https://api.securitytrails.com/v1/domain/{domain}/subdomains&quot;
    headers = {&quot;APIKEY&quot;: api_key}
    try:
        resp = requests.get(url, headers=headers, timeout=30)
        if resp.status_code == 200:
            data = resp.json()
            subdomains = data.get(&#x27;subdomains&#x27;, [])
            return [f&quot;{s}.{domain}&quot; for s in subdomains]
    except Exception as e:
        logger.error(f&quot;SecurityTrails ошибка: {e}&quot;)
    return []

def get_all_subdomains(domain, securitytrails_key=None):
    &quot;&quot;&quot;
    Агрегация поддоменов из всех источников
    &quot;&quot;&quot;
    all_subs = set()
    all_subs.update(get_subdomains_crtsh(domain))
    if securitytrails_key:
        all_subs.update(get_subdomains_securitytrails(domain, securitytrails_key))
    return sorted(all_subs)</pre>
  <p id="2heD"><strong>Этап 6: Анализ SSL/TLS сертификатов (modules/certificates.py)</strong></p>
  <pre id="rNR9">import requests
import json
from datetime import datetime

def get_certificates_crtsh(domain):
    &quot;&quot;&quot;
    Получение информации о сертификатах для домена
    &quot;&quot;&quot;
    url = f&quot;https://crt.sh/?q=%25.{domain}&amp;output=json&quot;
    certs = []
    try:
        resp = requests.get(url, timeout=30)
        if resp.status_code == 200:
            data = resp.json()
            for entry in data:
                if len(entry) &lt; 6:
                    continue
                certs.append({
                    &#x27;name&#x27;: entry[1],
                    &#x27;issuer&#x27;: entry[2],
                    &#x27;valid_from&#x27;: entry[3],
                    &#x27;valid_to&#x27;: entry[4],
                    &#x27;ca&#x27;: entry[5]
                })
    except Exception as e:
        pass
    return certs

def get_certificate_expiry(certs):
    &quot;&quot;&quot;
    Определение ближайшего истекающего сертификата
    &quot;&quot;&quot;
    now = datetime.now()
    expiring = []
    for cert in certs:
        try:
            valid_to = datetime.strptime(cert[&#x27;valid_to&#x27;], &#x27;%Y-%m-%dT%H:%M:%S&#x27;)
            days_left = (valid_to - now).days
            if days_left &lt; 30:
                expiring.append({
                    &#x27;name&#x27;: cert[&#x27;name&#x27;],
                    &#x27;expires&#x27;: cert[&#x27;valid_to&#x27;],
                    &#x27;days_left&#x27;: days_left
                })
        except:
            pass
    return expiring</pre>
  <p id="EOVj"><strong>Этап 7: Сбор данных из Shodan (modules/shodan.py)</strong></p>
  <pre id="biXv">import shodan
from utils.logger import get_logger

logger = get_logger(__name__)

def get_shodan_host(ip, api_key):
    &quot;&quot;&quot;
    Получение информации о хосте из Shodan
    &quot;&quot;&quot;
    if not api_key:
        return {}
    try:
        api = shodan.Shodan(api_key)
        host = api.host(ip)
        return {
            &#x27;ip&#x27;: host.get(&#x27;ip_str&#x27;),
            &#x27;organization&#x27;: host.get(&#x27;org&#x27;),
            &#x27;isp&#x27;: host.get(&#x27;isp&#x27;),
            &#x27;country&#x27;: host.get(&#x27;country_name&#x27;),
            &#x27;ports&#x27;: host.get(&#x27;ports&#x27;, []),
            &#x27;vulns&#x27;: host.get(&#x27;vulns&#x27;, []),
            &#x27;data&#x27;: host.get(&#x27;data&#x27;, [])  # баннеры
        }
    except shodan.APIError as e:
        logger.error(f&quot;Shodan ошибка для {ip}: {e}&quot;)
        return {}
    except Exception as e:
        logger.error(f&quot;Shodan исключение для {ip}: {e}&quot;)
        return {}

def get_shodan_host_by_domain(domain, api_key):
    &quot;&quot;&quot;
    Поиск хостов, связанных с доменом, через Shodan
    &quot;&quot;&quot;
    if not api_key:
        return []
    try:
        api = shodan.Shodan(api_key)
        results = api.search(f&quot;hostname:{domain}&quot;)
        hosts = []
        for match in results.get(&#x27;matches&#x27;, []):
            hosts.append({
                &#x27;ip&#x27;: match.get(&#x27;ip_str&#x27;),
                &#x27;port&#x27;: match.get(&#x27;port&#x27;),
                &#x27;data&#x27;: match.get(&#x27;data&#x27;, &#x27;&#x27;)[:200]
            })
        return hosts
    except shodan.APIError as e:
        logger.error(f&quot;Shodan search ошибка: {e}&quot;)
        return []</pre>
  <p id="2cUw"><strong>Этап 8: Поиск в GitHub (modules/github.py)</strong></p>
  <pre id="1MIV">import requests
from utils.logger import get_logger

logger = get_logger(__name__)

def search_github_secrets(domain, token):
    &quot;&quot;&quot;
    Поиск упоминаний домена и подозрительных паттернов в GitHub
    &quot;&quot;&quot;
    if not token:
        return []
    
    # Комбинированный запрос: упоминания домена + файлы .env, пароли, ключи
    queries = [
        f&#x27;&quot;{domain}&quot; extension:env&#x27;,
        f&#x27;&quot;{domain}&quot; password&#x27;,
        f&#x27;&quot;{domain}&quot; api_key&#x27;,
        f&#x27;&quot;{domain}&quot; secret&#x27;,
        f&#x27;&quot;{domain}&quot; token&#x27;,
    ]
    
    headers = {
        &quot;Authorization&quot;: f&quot;token {token}&quot;,
        &quot;Accept&quot;: &quot;application/vnd.github.v3+json&quot;
    }
    
    all_results = []
    for query in queries:
        url = &quot;https://api.github.com/search/code&quot;
        params = {&quot;q&quot;: query, &quot;per_page&quot;: 20}
        try:
            resp = requests.get(url, headers=headers, params=params, timeout=20)
            if resp.status_code == 200:
                data = resp.json()
                for item in data.get(&#x27;items&#x27;, []):
                    all_results.append({
                        &#x27;repo&#x27;: item[&#x27;repository&#x27;][&#x27;full_name&#x27;],
                        &#x27;path&#x27;: item[&#x27;path&#x27;],
                        &#x27;url&#x27;: item[&#x27;html_url&#x27;],
                        &#x27;query&#x27;: query
                    })
            else:
                logger.warning(f&quot;GitHub ошибка ({query}): {resp.status_code}&quot;)
        except Exception as e:
            logger.error(f&quot;GitHub исключение: {e}&quot;)
    
    return all_results</pre>
  <p id="V7Yf"><strong>Этап 9: Технологический стек (modules/tech_stack.py)</strong></p>
  <pre id="fXQI">import subprocess
import json
from utils.logger import get_logger

logger = get_logger(__name__)

def get_tech_wappalyzer(url):
    &quot;&quot;&quot;
    Определение технологий через Wappalyzer CLI
    Требуется установить: npm install -g wappalyzer
    &quot;&quot;&quot;
    try:
        result = subprocess.run(
            [&#x27;wappalyzer&#x27;, url],
            capture_output=True,
            text=True,
            timeout=60
        )
        if result.returncode == 0:
            return json.loads(result.stdout)
        else:
            logger.warning(f&quot;Wappalyzer ошибка: {result.stderr}&quot;)
            return {}
    except Exception as e:
        logger.error(f&quot;Wappalyzer исключение: {e}&quot;)
        return {}

def get_tech_builtwith(url, api_key=None):
    &quot;&quot;&quot;
    Использование BuiltWith API (требуется ключ)
    &quot;&quot;&quot;
    if not api_key:
        return {}
    endpoint = f&quot;https://api.builtwith.com/free1/api.json?KEY={api_key}&amp;LOOKUP={url}&quot;
    try:
        import requests
        resp = requests.get(endpoint, timeout=30)
        if resp.status_code == 200:
            return resp.json()
    except Exception as e:
        logger.error(f&quot;BuiltWith ошибка: {e}&quot;)
    return {}</pre>
  <p id="wp81"><strong>Этап 10: Общая база данных (utils/db.py)</strong></p>
  <p id="CIzm">Используем SQLite для хранения истории изменений.</p>
  <pre id="RDKl">import sqlite3
import json
from datetime import datetime

class OSINTDatabase:
    def __init__(self, db_path):
        self.conn = sqlite3.connect(db_path)
        self.create_tables()
    
    def create_tables(self):
        cursor = self.conn.cursor()
        cursor.execute(&#x27;&#x27;&#x27;
            CREATE TABLE IF NOT EXISTS domains (
                id INTEGER PRIMARY KEY,
                domain TEXT UNIQUE,
                first_seen TEXT,
                last_updated TEXT
            )
        &#x27;&#x27;&#x27;)
        cursor.execute(&#x27;&#x27;&#x27;
            CREATE TABLE IF NOT EXISTS subdomains (
                id INTEGER PRIMARY KEY,
                domain_id INTEGER,
                subdomain TEXT,
                discovered_at TEXT,
                FOREIGN KEY(domain_id) REFERENCES domains(id)
            )
        &#x27;&#x27;&#x27;)
        cursor.execute(&#x27;&#x27;&#x27;
            CREATE TABLE IF NOT EXISTS dns_records (
                id INTEGER PRIMARY KEY,
                domain_id INTEGER,
                record_type TEXT,
                record_value TEXT,
                discovered_at TEXT,
                FOREIGN KEY(domain_id) REFERENCES domains(id)
            )
        &#x27;&#x27;&#x27;)
        cursor.execute(&#x27;&#x27;&#x27;
            CREATE TABLE IF NOT EXISTS certificates (
                id INTEGER PRIMARY KEY,
                domain_id INTEGER,
                name TEXT,
                issuer TEXT,
                valid_from TEXT,
                valid_to TEXT,
                discovered_at TEXT,
                FOREIGN KEY(domain_id) REFERENCES domains(id)
            )
        &#x27;&#x27;&#x27;)
        cursor.execute(&#x27;&#x27;&#x27;
            CREATE TABLE IF NOT EXISTS shodan_ports (
                id INTEGER PRIMARY KEY,
                domain_id INTEGER,
                ip TEXT,
                port INTEGER,
                data TEXT,
                discovered_at TEXT,
                FOREIGN KEY(domain_id) REFERENCES domains(id)
            )
        &#x27;&#x27;&#x27;)
        cursor.execute(&#x27;&#x27;&#x27;
            CREATE TABLE IF NOT EXISTS changes (
                id INTEGER PRIMARY KEY,
                domain TEXT,
                change_type TEXT,
                old_value TEXT,
                new_value TEXT,
                detected_at TEXT
            )
        &#x27;&#x27;&#x27;)
        self.conn.commit()
    
    def get_domain_id(self, domain):
        cursor = self.conn.cursor()
        cursor.execute(&quot;SELECT id FROM domains WHERE domain = ?&quot;, (domain,))
        row = cursor.fetchone()
        if row:
            return row[0]
        # Создаём новый
        cursor.execute(&quot;INSERT INTO domains (domain, first_seen, last_updated) VALUES (?, ?, ?)&quot;,
                       (domain, datetime.now().isoformat(), datetime.now().isoformat()))
        self.conn.commit()
        return cursor.lastrowid
    
    def save_subdomains(self, domain_id, subdomains):
        cursor = self.conn.cursor()
        for sub in subdomains:
            cursor.execute(&quot;INSERT OR IGNORE INTO subdomains (domain_id, subdomain, discovered_at) VALUES (?, ?, ?)&quot;,
                           (domain_id, sub, datetime.now().isoformat()))
        self.conn.commit()
    
    def save_dns_records(self, domain_id, records):
        cursor = self.conn.cursor()
        for rtype, values in records.items():
            for val in values:
                cursor.execute(&quot;INSERT INTO dns_records (domain_id, record_type, record_value, discovered_at) VALUES (?, ?, ?, ?)&quot;,
                               (domain_id, rtype, val, datetime.now().isoformat()))
        self.conn.commit()
    
    def save_certificates(self, domain_id, certs):
        cursor = self.conn.cursor()
        for cert in certs:
            cursor.execute(&quot;INSERT INTO certificates (domain_id, name, issuer, valid_from, valid_to, discovered_at) VALUES (?, ?, ?, ?, ?, ?)&quot;,
                           (domain_id, cert.get(&#x27;name&#x27;), cert.get(&#x27;issuer&#x27;), cert.get(&#x27;valid_from&#x27;), cert.get(&#x27;valid_to&#x27;), datetime.now().isoformat()))
        self.conn.commit()
    
    def log_change(self, domain, change_type, old_value, new_value):
        cursor = self.conn.cursor()
        cursor.execute(&quot;INSERT INTO changes (domain, change_type, old_value, new_value, detected_at) VALUES (?, ?, ?, ?, ?)&quot;,
                       (domain, change_type, old_value, new_value, datetime.now().isoformat()))
        self.conn.commit()
    
    def close(self):
        self.conn.close()</pre>
  <p id="DNFE"><strong>Этап 11: Главный конвейер (main.py)</strong></p>
  <pre id="3wKi">#!/usr/bin/env python3
import os
import sys
import json
import yaml
from datetime import datetime
from utils.logger import setup_logger
from utils.db import OSINTDatabase
from utils.notifier import send_telegram
from modules.dns import get_dns_records
from modules.whois import get_whois_info
from modules.subdomains import get_all_subdomains
from modules.certificates import get_certificates_crtsh, get_certificate_expiry
from modules.shodan import get_shodan_host_by_domain
from modules.tech_stack import get_tech_wappalyzer
from modules.github import search_github_secrets
from modules.changes import compare_and_notify

# Загрузка конфига
with open(&#x27;config/config.yaml&#x27;, &#x27;r&#x27;) as f:
    config = yaml.safe_load(f)

logger = setup_logger(config[&#x27;logging&#x27;][&#x27;level&#x27;], config[&#x27;logging&#x27;][&#x27;file&#x27;])
db = OSINTDatabase(config[&#x27;database&#x27;][&#x27;path&#x27;])

def process_domain(domain):
    logger.info(f&quot;Обработка {domain}&quot;)
    
    # Получаем ID домена в БД
    domain_id = db.get_domain_id(domain)
    
    # 1. WHOIS
    whois_data = get_whois_info(domain)
    logger.info(f&quot;WHOIS для {domain}: {whois_data.get(&#x27;registrar&#x27;, &#x27;unknown&#x27;)}&quot;)
    
    # 2. DNS записи
    dns = get_dns_records(domain)
    db.save_dns_records(domain_id, dns)
    logger.info(f&quot;DNS: A={len(dns.get(&#x27;A&#x27;, []))}, MX={len(dns.get(&#x27;MX&#x27;, []))}&quot;)
    
    # 3. Поддомены
    sec_key = config[&#x27;api_keys&#x27;].get(&#x27;securitytrails&#x27;)
    subdomains = get_all_subdomains(domain, sec_key)
    db.save_subdomains(domain_id, subdomains)
    logger.info(f&quot;Найдено {len(subdomains)} поддоменов&quot;)
    
    # 4. Сертификаты
    certs = get_certificates_crtsh(domain)
    db.save_certificates(domain_id, certs)
    expiring = get_certificate_expiry(certs)
    if expiring:
        logger.warning(f&quot;Сертификаты истекают: {expiring}&quot;)
    
    # 5. Shodan (по поддоменам, ограничимся первыми 10 IP)
    shodan_key = config[&#x27;api_keys&#x27;].get(&#x27;shodan&#x27;)
    if shodan_key and subdomains:
        for sub in subdomains[:10]:
            hosts = get_shodan_host_by_domain(sub, shodan_key)
            # сохраняем в БД
            for h in hosts:
                pass  # упрощённо
    
    # 6. Технологический стек
    if subdomains:
        main_url = f&quot;https://{domain}&quot;
        tech = get_tech_wappalyzer(main_url)
        logger.info(f&quot;Технологии: {tech.get(&#x27;technologies&#x27;, [])}&quot;)
    
    # 7. GitHub секреты
    github_token = config[&#x27;api_keys&#x27;].get(&#x27;github&#x27;)
    if github_token:
        secrets = search_github_secrets(domain, github_token)
        if secrets:
            logger.warning(f&quot;Найдены потенциальные секреты в GitHub: {len(secrets)}&quot;)
            send_telegram(
                config[&#x27;notifications&#x27;][&#x27;telegram&#x27;][&#x27;token&#x27;],
                config[&#x27;notifications&#x27;][&#x27;telegram&#x27;][&#x27;chat_id&#x27;],
                f&quot;Обнаружены секреты для {domain}: {len(secrets)} файлов&quot;
            )
    
    # 8. Сравнение изменений
    compare_and_notify(domain, config, db)
    
    logger.info(f&quot;Обработка {domain} завершена&quot;)

def main():
    targets_file = config[&#x27;targets&#x27;][&#x27;file&#x27;]
    with open(targets_file, &#x27;r&#x27;) as f:
        domains = [line.strip() for line in f if line.strip()]
    
    for domain in domains:
        try:
            process_domain(domain)
        except Exception as e:
            logger.error(f&quot;Ошибка для {domain}: {e}&quot;)
    
    db.close()
    logger.info(&quot;Все задачи выполнены&quot;)

if __name__ == &quot;__main__&quot;:
    main()</pre>
  <p id="dokO"><strong>Этап 12: Сравнение изменений и уведомления (modules/changes.py)</strong></p>
  <pre id="xs0S">import json
import hashlib
import os
from utils.notifier import send_telegram

def load_previous_state(domain, data_dir=&#x27;data/states&#x27;):
    &quot;&quot;&quot;Загрузка предыдущего состояния из JSON&quot;&quot;&quot;
    os.makedirs(data_dir, exist_ok=True)
    state_file = os.path.join(data_dir, f&quot;{domain}_state.json&quot;)
    if os.path.exists(state_file):
        with open(state_file, &#x27;r&#x27;) as f:
            return json.load(f)
    return {}

def save_current_state(domain, state, data_dir=&#x27;data/states&#x27;):
    state_file = os.path.join(data_dir, f&quot;{domain}_state.json&quot;)
    with open(state_file, &#x27;w&#x27;) as f:
        json.dump(state, f, indent=2)

def compare_and_notify(domain, config, db):
    &quot;&quot;&quot;Сравнение текущего состояния с предыдущим и уведомление об изменениях&quot;&quot;&quot;
    # Собираем текущее состояние в словарь
    current = {
        &#x27;subdomains&#x27;: sorted(db.get_subdomains(domain)),
        &#x27;dns&#x27;: db.get_dns_records(domain),
        &#x27;certs&#x27;: db.get_certificates(domain),
    }
    
    previous = load_previous_state(domain)
    
    changes = []
    
    # Сравнение поддоменов
    if previous:
        old_subs = set(previous.get(&#x27;subdomains&#x27;, []))
        new_subs = set(current.get(&#x27;subdomains&#x27;, []))
        added = new_subs - old_subs
        removed = old_subs - new_subs
        if added:
            changes.append(f&quot;Новые поддомены: {&#x27;, &#x27;.join(added)}&quot;)
        if removed:
            changes.append(f&quot;Удалены: {&#x27;, &#x27;.join(removed)}&quot;)
    
    # Если есть изменения — отправляем уведомление
    if changes:
        msg = f&quot;Изменения для {domain}:\n&quot; + &quot;\n&quot;.join(changes)
        send_telegram(
            config[&#x27;notifications&#x27;][&#x27;telegram&#x27;][&#x27;token&#x27;],
            config[&#x27;notifications&#x27;][&#x27;telegram&#x27;][&#x27;chat_id&#x27;],
            msg
        )
        # Логируем в БД
        for change in changes:
            db.log_change(domain, &#x27;change&#x27;, &#x27;&#x27;, change)
    
    # Сохраняем новое состояние
    save_current_state(domain, current)</pre>
  <p id="vYmX"><strong>Этап 13: Утилита уведомлений (utils/notifier.py)</strong></p>
  <pre id="o7Ut">import requests
import smtplib
from email.mime.text import MIMEText

def send_telegram(token, chat_id, message):
    &quot;&quot;&quot;Отправка уведомления в Telegram&quot;&quot;&quot;
    if not token or not chat_id:
        return
    url = f&quot;https://api.telegram.org/bot{token}/sendMessage&quot;
    try:
        requests.post(url, json={&#x27;chat_id&#x27;: chat_id, &#x27;text&#x27;: message}, timeout=10)
    except Exception as e:
        print(f&quot;Telegram ошибка: {e}&quot;)

def send_email(smtp_server, port, username, password, to, subject, body):
    &quot;&quot;&quot;Отправка email уведомления&quot;&quot;&quot;
    msg = MIMEText(body)
    msg[&#x27;Subject&#x27;] = subject
    msg[&#x27;From&#x27;] = username
    msg[&#x27;To&#x27;] = to
    try:
        with smtplib.SMTP(smtp_server, port) as server:
            server.starttls()
            server.login(username, password)
            server.send_message(msg)
    except Exception as e:
        print(f&quot;Email ошибка: {e}&quot;)</pre>
  <p id="EAVf"><strong>Этап 14: Bash-обёртка для cron (run.sh)</strong></p>
  <pre id="lE80">#!/bin/bash
# run.sh — обёртка для запуска конвейера с логированием

cd /path/to/osint-automation

# Активация виртуального окружения Python (если используется)
source venv/bin/activate

# Запуск основного скрипта
python main.py &gt;&gt; data/osint_cron.log 2&gt;&amp;1

# Проверка кода возврата
if [ $? -ne 0 ]; then
    echo &quot;Ошибка выполнения $(date)&quot; &gt;&gt; data/osint_errors.log
fi

# Удаление старых логов (старше 30 дней)
find data/ -name &quot;*.log&quot; -mtime +30 -delete</pre>
  <p id="BTCz"><strong>Настройка cron (ежедневно в 8 утра):</strong></p>
  <pre id="guf6">0 8 * * * /path/to/osint-automation/run.sh</pre>
  <p id="d7s1"><strong>Этап 15: Обработка ошибок и rate limits</strong></p>
  <p id="4ynZ">Важные аспекты при автоматизации:</p>
  <ul id="s4my">
    <li id="EiUn"><strong>Ограничения API:</strong> Используйте задержки между запросами (time.sleep), храните время последнего запроса.</li>
    <li id="l6CM"><strong>Повторные попытки:</strong> Реализуйте повтор при временных ошибках (например, 429 Too Many Requests).</li>
    <li id="IcEi"><strong>Логирование:</strong> Все ошибки пишите в лог для последующего анализа.</li>
    <li id="4Prs"><strong>Таймауты:</strong> Все HTTP-запросы должны иметь таймаут, чтобы скрипт не зависал.</li>
  </ul>
  <p id="4hgU"><strong>Пример декоратора для повторных попыток:</strong></p>
  <pre id="gDZK">import time
import functools

def retry(max_attempts=3, delay=5):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if attempt == max_attempts - 1:
                        raise
                    time.sleep(delay * (attempt + 1))
            return None
        return wrapper
    return decorator</pre>
  <p id="C0fR"><strong>Этап 16: Тестирование и мониторинг работы</strong></p>
  <p id="gx9F">После настройки автоматизации важно проверять:</p>
  <ul id="qrjP">
    <li id="oOzj"><strong>Работоспособность:</strong> Запустите скрипт вручную и проверьте вывод.</li>
    <li id="wIjf"><strong>Корректность данных:</strong> Проверьте, что база данных заполняется.</li>
    <li id="VQV2"><strong>Уведомления:</strong> Убедитесь, что при изменениях приходят сообщения.</li>
    <li id="q9Ml"><strong>Логи:</strong> Проверьте файл логов на наличие ошибок.</li>
  </ul>
  <p id="qdkR"></p>
  <ol id="lHCT">
    <li id="Zrfa">Используйте только публичные API и данные.</li>
    <li id="QrPU">Соблюдайте условия использования сервисов (Shodan, SecurityTrails, GitHub) — не превышайте лимиты запросов.</li>
    <li id="U63K">Не пытайтесь обойти защиту (CAPTCHA, блокировки) нелегальными методами.</li>
    <li id="jFYi">Полученные данные используйте только для законных целей.</li>
    <li id="0pRz">При обнаружении уязвимостей или секретов сообщайте владельцам.</li>
  </ol>
  <p id="Oyov"></p>
  <p id="Fd5y">Автоматизация технического OSINT — это создание программного конвейера, который собирает, обрабатывает и сохраняет данные о цифровой инфраструктуре цели без участия человека. Модульная архитектура на Python с использованием готовых библиотек (dns.resolver, whois, requests, shodan) и внешних API (crt.sh, SecurityTrails, Shodan, GitHub) позволяет охватить все основные источники. Сравнение состояний и уведомления делают систему полезной для долгосрочного мониторинга. Регулярный запуск через cron превращает набор скриптов в постоянно работающую систему разведки.</p>

]]></content:encoded></item></channel></rss>