{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Заметки — Игорь К.: заметки с тегом автоматизация",
    "_rss_description": "Блог Игоря К. о маркетинге, аналитике, фотографии и жизни...",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/blog.fossko.ru\/tags\/avtomatizaciya\/",
    "feed_url": "https:\/\/blog.fossko.ru\/tags\/avtomatizaciya\/json\/",
    "icon": "https:\/\/blog.fossko.ru\/pictures\/userpic\/userpic@2x.jpg?1610628098",
    "authors": [
        {
            "name": "Игорь К.",
            "url": "https:\/\/blog.fossko.ru\/",
            "avatar": "https:\/\/blog.fossko.ru\/pictures\/userpic\/userpic@2x.jpg?1610628098"
        }
    ],
    "items": [
        {
            "id": "576",
            "url": "https:\/\/blog.fossko.ru\/all\/kak-ya-pomog-organizovat-monitoring-i-sohranenie-publichnyh-v\/",
            "title": "Как я помог организовать мониторинг и сохранение публичных видеостримов",
            "content_html": "<p>На стриминговых платформах трансляции часто запускаются без расписания. Страницы могут оставаться неактивными часами, а затем в любой момент переходить в режим прямого эфира. Если такие трансляции нужно фиксировать и сохранять, ручной контроль быстро перестаёт работать.<\/p>\n<p>С такой задачей ко мне обратился заказчик. На тот момент он мониторил <b>три модели<\/b> и делал это вручную: открывал страницы, проверял статус, ждал начала эфира и запускал сохранение сам. Даже при таком объёме на это уходило много времени и внимания, а часть трансляций всё равно пропускалась.<\/p>\n<p>Моя задача была в том, чтобы <b>снять с человека постоянное дежурство<\/b> и заменить его системой автоматического мониторинга, которую можно сопровождать, а не обслуживать вручную.<\/p>\n<h2>Контекст: стримы ведут модели<\/h2>\n<p>На платформе работают модели — живые авторы трансляций. Каждая из них выходит в эфир по собственному графику:<\/p>\n<ul>\n<li>заранее неизвестно, когда начнётся трансляция;<\/li>\n<li>страница большую часть времени неактивна;<\/li>\n<li>прямой ссылки на видео нет до момента старта;<\/li>\n<li>эфир может закончиться в любой момент.<\/li>\n<\/ul>\n<p>Даже при работе с одной моделью это означает необходимость постоянно возвращаться к странице и проверять её состояние. В случае заказчика таких страниц было три — и уже на этом объёме ручной процесс стал трудоёмким и неудобным.<\/p>\n<h2>В чём была основная сложность<\/h2>\n<p>Проблема была не в сохранении видео как таковом, а в самом процессе наблюдения:<\/p>\n<ul>\n<li>нужно регулярно проверять несколько страниц, чтобы не пропустить начало эфира;<\/li>\n<li>невозможно надолго отвлечься без риска что-то упустить;<\/li>\n<li>видео становится доступно только в момент начала трансляции;<\/li>\n<li>внимание постоянно тратится на ожидание.<\/li>\n<\/ul>\n<p>Даже три модели требуют постоянного внимания. При дальнейшем расширении списка моделей к этому добавляется ещё один слой сложности — <b>ресурсный<\/b>.<\/p>\n<h2>Как выстроена система мониторинга<\/h2>\n<p>Вместо ручных действий была выстроена система из нескольких специализированных скриптов. Каждый из них решает свою задачу и работает автоматически. В обычном режиме система не требует участия человека, но за ней нужно присматривать и периодически адаптировать под изменения — этим я и занимаюсь.<\/p>\n<p>В упрощённом виде логика работы выглядит так:<\/p>\n<ul>\n<li><b>Отслеживание состояния страниц<\/b>.   Скрипты регулярно проверяют состояние страниц и понимают, активна ли модель в данный момент. Если трансляции нет, система не выполняет лишних действий.<\/li>\n<li><b>Режим ожидания<\/b>.  Пока эфиры не идут, мониторинг работает с минимальной нагрузкой и просто ждёт изменений.<\/li>\n<li><b>Фиксация начала трансляции<\/b> . Когда модель выходит в эфир, система автоматически фиксирует переход страницы в активное состояние.<\/li>\n<li><b>Обнаружение видео<\/b>. В момент начала трансляции система определяет, что на странице появилось активное видео и его можно сохранять.<\/li>\n<li><b>Сохранение и продолжение мониторинга<\/b>. После завершения эфира система возвращается в режим ожидания и продолжает работу без участия человека.<\/li>\n<\/ul>\n<h2>Почему такой формат оказался удобным<\/h2>\n<p>Такой подход оправдан уже <b>даже при работе с одной моделью<\/b>.<br \/>\nТрансляции запускаются нерегулярно, и чтобы не пропустить эфир, нужно постоянно проверять страницу или держать её открытой.<\/p>\n<p>В случае с тремя моделями эта нагрузка просто утраивается: внимание распыляется, возрастает риск пропустить начало трансляции, а сам процесс превращается в постоянное ожидание.<\/p>\n<p>Автоматический мониторинг снимает эту нагрузку: система сама следит за состоянием страниц и реагирует только тогда, когда действительно начинается трансляция.<\/p>\n<p>При увеличении количества моделей появляется вторая задача — <b>управление ресурсами<\/b>:<\/p>\n<ul>\n<li>возрастает нагрузка на сервер;<\/li>\n<li>увеличивается потребление сетевой пропускной способности;<\/li>\n<li>появляются ограничения по количеству параллельных операций.<\/li>\n<\/ul>\n<p>В этом случае уже недостаточно просто «проверять чаще». Нужен подход, в котором мониторинг, нагрузка и объём данных находятся в балансе.<\/p>\n<p>Автоматизация здесь — не отдельный инструмент, а часть процесса, который я настраиваю, сопровождаю и адаптирую под конкретные объёмы и условия работы.<\/p>\n<h2>Надёжность и длительная работа<\/h2>\n<p>Отдельное внимание уделено стабильности:<\/p>\n<ul>\n<li>система рассчитана на длительную работу без остановок;<\/li>\n<li>при отсутствии активности не расходует ресурсы;<\/li>\n<li>корректно восстанавливается после временных сбоев;<\/li>\n<li>по логам понятно, что происходит и в каком состоянии мониторинг.<\/li>\n<\/ul>\n<p>Это позволяет использовать решение в повседневной работе без возврата к ручному контролю.<\/p>\n<h2>Результат<\/h2>\n<p>В итоге заказчик перестал тратить время на постоянное наблюдение даже за этими тремя страницами.<br \/>\nМониторинг и сохранение трансляций выполняются автоматически, иногда нужно сопровождать систему, следить за состоянием и адаптировать под изменения.<\/p>\n<p>Такие задачи редко удаётся закрыть одним готовым инструментом.<br \/>\nОбычно приходится учитывать особенности конкретной платформы, подстраивать логику мониторинга и со временем её поддерживать.<\/p>\n",
            "date_published": "2026-02-07T10:21:20+03:00",
            "date_modified": "2026-02-07T10:41:23+03:00",
            "tags": [
                "автоматизация"
            ],
            "_date_published_rfc2822": "Sat, 07 Feb 2026 10:21:20 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "576",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "543",
            "url": "https:\/\/blog.fossko.ru\/all\/google-skript-prosit-prava-srazu-na-vse-dokumenty\/",
            "title": "Google скрипт просит права сразу на все документы",
            "content_html": "<p>Когда Google Apps Script просит доступ ко всем документам на гугл диске.<br \/>\nЧтобы избежать проблем с доступом, добавьте в шапку скриптов код:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/**\n * @OnlyCurrentDoc\n *\/<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-18.png\" width=\"990\" height=\"389\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Код вставляется со всеми слешами и звездочками. <a href=\"https:\/\/developers.google.com\/apps-script\/guides\/services\/authorization?hl=ru#manual_authorization_scopes_forand\">Справка гугл документов<\/a><\/div>\n<\/div>\n",
            "date_published": "2023-12-18T11:33:08+03:00",
            "date_modified": "2023-12-18T11:33:04+03:00",
            "tags": [
                "автоматизация",
                "скрипт"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/image-18.png",
            "_date_published_rfc2822": "Mon, 18 Dec 2023 11:33:08 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "543",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/image-18.png"
                ]
            }
        },
        {
            "id": "540",
            "url": "https:\/\/blog.fossko.ru\/all\/parsim-telegram-kanaly-agentstv-internet-marketinga\/",
            "title": "Парсим телеграм каналы агентств интернет-маркетинга",
            "content_html": "<p>В гугл таблицах автоматически получим ссылки на телеграм каналы интернет-агентств.<\/p>\n<p><b>Предыстория<\/b> .У Павела Злобина вышла статья «<a href=\"https:\/\/pavezlo.ru\/testirovanie-gipotez\/top-telegramm-kanalov-pro-marketing\/\">Топ телеграм каналов про маркетинг<\/a>»  в которой описывает как можно получить телеграм каналы агентств.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Reyting-agentstv-Performance-marketinga,-TOP-luchshih-perfomans-kompaniy---Opera-2023-11-28-20.16.58.jpg\" width=\"639\" height=\"503\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><a href=\"https:\/\/ratingruneta.ru\/performance\/\">В рейтинге рунета есть список топ-100 агентств<\/a>, из списка мы можем получить название и ссылку на страницу о агентстве<\/div>\n<\/div>\n<p>Наименование агенства<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IMPORTXML(A1;&quot;\/\/table[@id=&#039;rating_table_id&#039;]\/tbody\/tr\/td\/div\/a&quot;)<\/code><\/pre><p>Ссылка на страницу<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IMPORTXML(A1;&quot;\/\/table[@id=&#039;rating_table_id&#039;]\/tbody\/tr\/td\/div\/a\/@href&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/IT-Agency--otzyvy-klientov,-portfolio,-klienty,-stoimost-uslug---Opera-2023-11-28-20.19.32.jpg\" width=\"848\" height=\"214\" alt=\"\" \/>\n<div class=\"e2-text-caption\">На подробной странице агентства может быть ссылка на телеграм и ВК, получим их<\/div>\n<\/div>\n<p>Ссылка на телеграм<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IFNA(IMPORTXML(&quot;https:\/\/ratingruneta.ru&quot;&amp;B4;&quot;\/\/a[@class=&#039;_1OOlgax2iF telegram&#039;]\/\/@href&quot;);&quot;&quot;)<\/code><\/pre><p>Ссылка на ВК<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IFNA(IMPORTXML(&quot;https:\/\/ratingruneta.ru&quot;&amp;B4;&quot;\/\/a[@class=&#039;_1OOlgax2iF vkontakte&#039;]\/\/@href&quot;);&quot;&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/TG-kanaly-ratingruneta---Google-Tablicy---Opera-2023-11-28-20.13.26.jpg\" width=\"763\" height=\"650\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Протягиваем формулы, и получаем готовую страницу<\/div>\n<\/div>\n<p>Таким же образом можно получить информацию о других рейтингах.<\/p>\n<p><a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1OnaWe5nGN7f7FH4CZm9ec3E6LkSapPqGDDphsvZUGvU\/edit#gid=0\">Ссылка на таблицу<\/a><\/p>\n",
            "date_published": "2023-11-28T20:21:53+03:00",
            "date_modified": "2023-11-28T20:22:15+03:00",
            "tags": [
                "автоматизация",
                "парсинг",
                "таблицы"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Reyting-agentstv-Performance-marketinga,-TOP-luchshih-perfomans-kompaniy---Opera-2023-11-28-20.16.58.jpg",
            "_date_published_rfc2822": "Tue, 28 Nov 2023 20:21:53 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "540",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Reyting-agentstv-Performance-marketinga,-TOP-luchshih-perfomans-kompaniy---Opera-2023-11-28-20.16.58.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/IT-Agency--otzyvy-klientov,-portfolio,-klienty,-stoimost-uslug---Opera-2023-11-28-20.19.32.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/TG-kanaly-ratingruneta---Google-Tablicy---Opera-2023-11-28-20.13.26.jpg"
                ]
            }
        },
        {
            "id": "510",
            "url": "https:\/\/blog.fossko.ru\/all\/transkribiruem-video-iz-telegrama\/",
            "title": "Транскрибируем видео из телеграма",
            "content_html": "<p>Когда требуется распознать видео с вебинара в телеграме, делаем следующее:<\/p>\n<ol start=\"1\">\n<li>Скачиваем видео к себе на компьютер<\/li>\n<li>Вытаскиваем аудиодорожку через ffmpeg<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">ffmpeg -i video1014957119.mp4 video1014957119.mp3<\/code><\/pre><ol start=\"3\">\n<li>Транскрибируем через <a href=\"\/all\/rasshifrovka-audio-i-video\/\">whisper-ctranslate2 в Гугл колаб<\/a><\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/whisper-ctranslate2-audio-to-text-bystry.ipynb---Colaboratory---Google-Chrome-2023-05-12-12.44.30.jpg\" width=\"920\" height=\"416\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Фрагмент вебинара SEO c Ильей Карбышевом: <a href=\"https:\/\/t.me\/irinausichenko\/865\" class=\"nu\">«<u>SEO для редакторов<\/u>»<\/a><\/div>\n<\/div>\n",
            "date_published": "2023-05-12T12:51:24+03:00",
            "date_modified": "2023-05-12T12:51:21+03:00",
            "tags": [
                "автоматизация",
                "питон",
                "транскрибация"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/whisper-ctranslate2-audio-to-text-bystry.ipynb---Colaboratory---Google-Chrome-2023-05-12-12.44.30.jpg",
            "_date_published_rfc2822": "Fri, 12 May 2023 12:51:24 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "510",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/whisper-ctranslate2-audio-to-text-bystry.ipynb---Colaboratory---Google-Chrome-2023-05-12-12.44.30.jpg"
                ]
            }
        },
        {
            "id": "508",
            "url": "https:\/\/blog.fossko.ru\/all\/rasshifrovka-audio-i-video\/",
            "title": "Расшифровка аудио и видео",
            "content_html": "<p>Когда требуется расшифровать аудиофайл, или ролик с ютуба, я пользуюсь whisper или whisper-ctranslate2 в среде <a href=\"https:\/\/colab.research.google.com\/\">Гугл колаб<\/a><\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"761\" data-ratio=\"1.4834307992203\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.35.15.jpg\" width=\"761\" height=\"513\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.36.18.jpg\" width=\"711\" height=\"309\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">При использовании библиотеки whisper-ctranslate2 лучше использовать графическую карту — GPU. Меню → Среда выполнения → Сменить среду выполнения → GPU<\/div>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\"># установка оригинального whisper\n!pip install git+https:\/\/github.com\/openai\/whisper.git\n\n# установка ffmpeg\n!sudo apt update &amp;&amp; sudo apt install ffmpeg\n\n# установка whisper-ctranslate2\n!pip install -U whisper-ctranslate2\n\n# установка yt-dlp для сохранения видео с ютуба\n!pip install yt-dlp<\/code><\/pre><p>Двойной символ && используется для запуска двух команд одновременно, если первая команда завершена успешно. Это означает, что если первая команда возвращает ошибку, то вторая команда не будет выполнена.<\/p>\n<p><a href=\"https:\/\/github.com\/Softcatala\/whisper-ctranslate2\">Гитхаб whisper-ctranslate2<\/a><\/p>\n<p>С декабря 2023 года выдается ошибка: «RuntimeError: Library libcublas.so.11 is not found or cannot be loaded»<br \/>\nДля исправления ошибки установите Cuda 11 командой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">!apt install libcublas11<\/code><\/pre><p>Скачивать будем ролик Ильи Бирмана из лекции <a href=\"https:\/\/ilyabirman.ru\/meanwhile\/all\/understanding-the-task\/\">о понимании задачи<\/a><\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># качаем ролик id в mp3 в корень\n!yt-dlp -x --audio-format mp3 -o .\/birman_ponimanie_zadachi.mp3 -- PbnbwkoCQOE<\/code><\/pre><p>Распознавать можно whisper-ctranslate2 — по моим наблюдением расшифровывает в 2—3 раза быстрее чем оригинальный whisper.  На данный момент модель large-v2 самая полная.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#распознаем через whisper-ctranslate2\n!whisper-ctranslate2 &quot;birman_ponimanie_zadachi.mp3&quot; --language Russian  -o .\/result --model large-v2 --model_dir .\/model<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/rasshifrovka-audio-i-video.png\" width=\"749\" height=\"558\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Результат в консоле будет появляться по мере распознавания. Результирующие файлы будут в папке result в форматах .json, .srt, .tsv, .txt и .vtt. Например, в txt — только текст, в tsv — таймкоды, в vtt и srt — субтитры.<\/div>\n<\/div>\n<p>Через оригинальный whisper имеет смысл распознавать на компьютерах без видеокарт, это долго, но работает. Whisper требует версию питона 3.8—3.10, на других версиях не заработает.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#распознаем через оригинальный whisper\n!whisper &quot;iliahov2.mp3&quot; -o .\/result --model large-v2 --model_dir .\/model<\/code><\/pre><p class=\"loud\">Если вам нужно что-то распознать или транскрибацию провести. Пишите в телеграм, договоримся :—)<\/p>\n",
            "date_published": "2023-04-21T15:13:37+03:00",
            "date_modified": "2024-03-12T00:01:53+03:00",
            "tags": [
                "автоматизация",
                "питон",
                "транскрибация"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.35.15.jpg",
            "_date_published_rfc2822": "Fri, 21 Apr 2023 15:13:37 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "508",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js",
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.35.15.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Untitled0.ipynb---Colaboratory---Google-Chrome-2023-04-21-14.36.18.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/rasshifrovka-audio-i-video.png"
                ]
            }
        },
        {
            "id": "507",
            "url": "https:\/\/blog.fossko.ru\/all\/vypolnyaem-sql-zapros-v-pitone\/",
            "title": "Выполняем SQL запрос в питоне",
            "content_html": "<p>В питоне можно выполнить запрос к базе данных на SQL сервере, а ответ получить как датасет пандос.<\/p>\n<p>Импортируем библиотеки, в примере мы будем подключаться к MS SQL серверу, но можно подключаться к другим базам данных, используя нужную библиотеку.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">import pyodbc\nimport pandas as pd<\/code><\/pre><p>В переменную con запишем подключение к SQL серверу<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># создание подключения к базе данных\ncon = pyodbc.connect(&quot;Driver={SQL Server Native Client 11.0};&quot;\n                      &quot;Server=NAME_SQL_SERVER;&quot;\n                      &quot;Database=NAME_BASE;&quot;\n                      &quot;Trusted_Connection=yes;&quot;)<\/code><\/pre><p>Функция select — для быстрой отправки sql запроса, на входе sql запрос, на выходе результат выполнения<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># функция отправки запроса к базе sql\ndef select(sql):\n    return pd.read_sql(sql,con)<\/code><\/pre><p>Используем тройные кавычки, для переноса построчно, иначе нужно писать в одну строку<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># Переменной sql присваиваем запрос\nsql=&#039;&#039;&#039;\n\nDECLARE\n@today DATE,\n@yesterday DATE\n\nSELECT\n@yesterday = DATEADD(day, -1, CAST(GETDATE() AS date))  --вчера в виде даты без времени\n,@today = CAST(GETDATE() AS date)  --сегодня в виде даты без времени\n\nSELECT \n  *  \nFROM table.data\n\nWHERE\n DataZvonka &lt;= @yesterday \n and\n DataPrihoda &gt;= @today\n\n&#039;&#039;&#039;<\/code><\/pre><p>Присваиваем датасету df, результат выполнения запроса sql<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># создание датасета с данными запроса\ndf=select(sql)<\/code><\/pre><p>Дальше можно производить вычисления в пандос, и делать что нужно с данными, например, записать в гугл таблицу, отправить в телеграм группу.<\/p>\n",
            "date_published": "2023-04-20T17:16:02+03:00",
            "date_modified": "2023-04-21T23:27:01+03:00",
            "tags": [
                "SQL",
                "автоматизация",
                "питон"
            ],
            "_date_published_rfc2822": "Thu, 20 Apr 2023 17:16:02 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "507",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "475",
            "url": "https:\/\/blog.fossko.ru\/all\/unpivot-v-google-sheets\/",
            "title": "Unpivot в Google Sheets",
            "content_html": "<p>Что если у нас уже имеется возрастная когорта, без исходных данных.<br \/>\nТребуется из нее получить сколько денег мы заработали каждый месяц?<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/unpivot-v-google-sheets.png\" width=\"722\" height=\"286\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Есть когорта — в столбцах время прошедшее с момента месяца первой регистрации, строчки — время первой регистрации. Мы хотим ее перевернуть и получить данные по каждому месяцу<\/div>\n<\/div>\n<p><b>Вопрос<\/b>: Как считали возраст? Между месяцами или между датами?<\/p>\n<ul>\n<li>Если между датами, то 1-к-1 в календарную когорту перевести нельзя, так как у каждого юзера там свой собственный m0.<\/li>\n<\/ul>\n<ul>\n<li>Если между месяцами, то можно просто “сдвинуть” все колонки вправо и заменить возраст на календарный месяц.<\/li>\n<\/ul>\n<p>Мы считаем по второму варианту:<\/p>\n<ul>\n<li>каждой оплате присваиваем первый день месяца оплаты,<\/li>\n<li>каждой регистрации первый первый день месяца оплаты.<\/li>\n<\/ul>\n<p>Наш вариант второй — между месяцами.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/unpivot-v-google-sheets-2.png\" width=\"722\" height=\"288\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Наша когорта, линиями показано, из чего состоит каждый месяц.<\/div>\n<\/div>\n<p>Основная формула, для решения задачи:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">OFFSET(C5,0,$B5))<\/code><\/pre><p>возвращаем значение со сдвигом строки, для этого пронумеруем строки в минус.<br \/>\nДальше if отрезает не нужное<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/unpivot-v-google-sheets-1.png\" width=\"971\" height=\"797\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Получившаяся помесячная когорта с выручкой.<\/div>\n<\/div>\n<p>Итоговая формула:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">=IFERROR(IF(OFFSET(C3;0;$B3)=$B3;&quot;&quot;;OFFSET(C3;0;$B3));&quot;&quot;)<\/code><\/pre><p><a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1QT7OAnAv20KVaoeb5uqDRmT0qjz9WcO4FmGZCdiTszM\/edit?usp=sharing\">Таблица со всеми формулами<\/a><\/p>\n",
            "date_published": "2023-02-02T14:53:47+03:00",
            "date_modified": "2023-02-02T14:53:31+03:00",
            "tags": [
                "автоматизация",
                "портфолио",
                "таблицы",
                "эксель"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/unpivot-v-google-sheets.png",
            "_date_published_rfc2822": "Thu, 02 Feb 2023 14:53:47 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "475",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/unpivot-v-google-sheets.png",
                    "https:\/\/blog.fossko.ru\/pictures\/unpivot-v-google-sheets-2.png",
                    "https:\/\/blog.fossko.ru\/pictures\/unpivot-v-google-sheets-1.png"
                ]
            }
        },
        {
            "id": "472",
            "url": "https:\/\/blog.fossko.ru\/all\/tipograf-v-gugl-dokumentah\/",
            "title": "Типограф в гугл документах",
            "content_html": "<p>Когда используешь гугл документы для набора текстов для печати, не хватает встроенного типографа. Типограф нужен для правильного проставления неразрывного пробела, знака тире, замены кавычек на правильные.<\/p>\n<p><a href=\"https:\/\/github.com\/glebkema\/google-docs-typograf\">Скрипт от Глеба Керамского<\/a> написан на google apps script и легко адаптируется<\/p>\n<h2>Скрипт работает только в текущем документе<\/h2>\n<p>В оригинале скрипт можно запускать в определенном документе, для этого:<br \/>\nоткрываем наш гугл документ и переходим в Apps Script<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah.png\" width=\"744\" height=\"260\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Меню — расширения — Apps Script<\/div>\n<\/div>\n<p>Копируем код из скрипта Глеба и вставляем в наш скрипт<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-1.png\" width=\"1194\" height=\"866\" alt=\"\" \/>\n<div class=\"e2-text-caption\">У Глеба на гитхабе код лежит в файле <a href=\"https:\/\/github.com\/glebkema\/google-docs-typograf\/blob\/master\/Code.gs\">Code.gs<\/a><\/div>\n<\/div>\n<p>Можно остановиться на этом, но лучше в только что созданный скрипт, добавить следующее<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/**\n * @OnlyCurrentDoc\n *\/<\/code><\/pre><p>Эта строчка позволит ограничить запуск скрипта текущим документом<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-2.png\" width=\"1078\" height=\"527\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Итоговый скрипт с нашим дополнением<\/div>\n<\/div>\n<p>Дальше мы сохраняем и переходим в гугл документ.<\/p>\n<p>Для работы скрипта нужно перегрузить страницу, нажимаем CTRL+F5<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-3.png\" width=\"1278\" height=\"545\" alt=\"\" \/>\n<div class=\"e2-text-caption\">После перезагрузки страницы в этом документе появился пункт меню — typograf, при нажатии на него текст будет отипографирован.<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"729\" data-ratio=\"1.744019138756\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-4.png\" width=\"729\" height=\"418\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-5.png\" width=\"767\" height=\"649\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Если вы запускаете скрипт первый раз, будет предложено проверить разрешение скрипта. После разрешение текст будет отипографирован.<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-6.png\" width=\"713\" height=\"412\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Пример до: висячие предлоги и дефис вместо тире.<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-7.png\" width=\"726\" height=\"396\" alt=\"\" \/>\n<div class=\"e2-text-caption\">После применения скрипта, висячие пробелы пропали и дефис поменялся на длинное тире. На самом деле тут после всех предлогов стали неразрывные пробелы.<\/div>\n<\/div>\n<p>Для применения скрипта нужно в каждом документе проделать следующие шаги:<\/p>\n<ol start=\"1\">\n<li>Зайти в гитхаб и скопировать скрипт.<\/li>\n<li>Добавить скрипт в google apps script.<\/li>\n<li>Перезагрузить документ.<\/li>\n<li>Выполнить скрипт.<\/li>\n<\/ol>\n<h2>Скрипт работает для любого документа к которому есть доступ.<\/h2>\n<p>Можно сделать один скрипт на все документы к которым есть доступ.<br \/>\nДля этого нужно сделать google apps script который не подключен к конкретному документу, для этого зайдите на гугл диск в любую папку, например «Скрипты», нажмите правой клавишей пункт Еще — google apps script<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-8.png\" width=\"768\" height=\"501\" alt=\"\" \/>\n<div class=\"e2-text-caption\">При таком создании, скрипт будет работать отдельно от документа<\/div>\n<\/div>\n<p>Рекомендую дать скрипту нормально название, например «Типограф», так будет проще искать по поиску на гугл диске.<\/p>\n<p>Копируем в наш скрипт <a href=\"https:\/\/github.com\/glebkema\/google-docs-typograf\/blob\/master\/Code.gs\">код из гитхаба Глеба.<\/a><\/p>\n<p>Теперь нам нужно модифицировать скрипт<\/p>\n<p>В функции typograf() комментируем строчку с выбором текущего файла, ставит две косые<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/\/var body = DocumentApp.getActiveDocument().getBody();<\/code><\/pre><p>Создаем новую переменную в которую будем вставлять урл нашего документа<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">var body = DocumentApp.openByUrl(&#039;https:\/\/docs.google.com\/document\/d\/XXXXXXX&#039;);<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-9.png\" width=\"1303\" height=\"613\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Наши изменения скрипта<\/div>\n<\/div>\n<p>Сохраняем.<\/p>\n<p>Теперь нам нужно подправить какой-то документ:<\/p>\n<ol start=\"1\">\n<li>Копируем его полный адрес<\/li>\n<li>Вставляем в переменную body — не забываем что адрес вставляется в одинарной в кавычках, у меня одинарная кавычка.<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">var body = DocumentApp.openByUrl(&#039;URL_DOC&#039;);<\/code><\/pre><p>Сохраняем.<\/p>\n<p>Осталось запустить, для этого в скрипте выбираем Типограф и кнопку «выполнить»<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-10.png\" width=\"860\" height=\"270\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Если у вас не выбран типограф — нажимаем стрелочку вниз и выбираем.<\/div>\n<\/div>\n<p>Скрипт попросит авторизацию на возможное изменения всех документов, даем ему это разрешения.<\/p>\n<p>После запуска скрипт запустится и оттипографирует ваш документ.<\/p>\n<p>Если нужно, можно вставить ссылку на другой документ, а затем еще один.<\/p>\n",
            "date_published": "2023-01-29T15:46:28+03:00",
            "date_modified": "2023-01-29T15:49:46+03:00",
            "tags": [
                "автоматизация",
                "документы",
                "скрипт"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah.png",
            "_date_published_rfc2822": "Sun, 29 Jan 2023 15:46:28 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "472",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-1.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-2.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-3.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-4.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-5.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-6.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-7.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-8.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-9.png",
                    "https:\/\/blog.fossko.ru\/pictures\/tipograf-v-gugl-dokumentah-10.png"
                ]
            }
        },
        {
            "id": "471",
            "url": "https:\/\/blog.fossko.ru\/all\/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script\/",
            "title": "Отправляем поток из РСС в телеграм через Google Apps Script",
            "content_html": "<p>Обновляем канал «<a href=\"https:\/\/t.me\/pochitaet\">Почитаем…<\/a>»<br \/>\nТеперь новые статьи будут приходить в канал автономно, через гугл таблицы и без участия локального сервера с питоном.<br \/>\n<a href=\"\/all\/otpravlyaem-novye-statyi-iz-rss-v-telegram\/\">Раньше работало через питон и базу данных на sqlite3<\/a><\/p>\n<p>В гугл таблице нам нужны три листа: rss, rss_data, error<\/p>\n<ul>\n<li>rss — будем хранить рсс потоки сайтов,<\/li>\n<li>rss_data — будем хранить базу данных что отпарсилось и что отправлено,<\/li>\n<li>error — будем хранить ошибки при отладке, если это потребуется<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-12.png\" width=\"1124\" height=\"610\" alt=\"\" \/>\n<div class=\"e2-text-caption\">На листе rss, в первой колонке перечислены все рсс-потоки, при необходимости добавить или удалить, делаем это здесь.<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-11.png\" width=\"1124\" height=\"610\" alt=\"\" \/>\n<div class=\"e2-text-caption\">На листе rss_data, первая строчка с наименованием колонок<\/div>\n<\/div>\n<p>У меня сейчас 110 источников, когда идет запись в таблицу, скрипт не успевает обработать все данные, и отваливается по тайм-ауту гугла. После нескольких запусков он все ссылки обработает и начинает укладываться в тайминг.<br \/>\nВозможно, в будущем, нужно скрипт делить на несколько<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script.png\" width=\"510\" height=\"834\" alt=\"\" \/>\n<div class=\"e2-text-caption\">сообщения приходят в том же виде, что и раньше.<\/div>\n<\/div>\n<h2>Парсинг потоков рсс через гугл таблицы<\/h2>\n<pre class=\"e2-text-code\"><code class=\"\">\/\/ Считываем базу данных РСС\nfunction data_base_rss() {\n  var app = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&quot;rss_data&quot;)\n  data_base= app.getRange(1,1, app.getLastRow(), app.getLastColumn()).getValues(); \/\/только заполненный диапазон\n  return(data_base)\n}\n\n\/\/ поиск по базе данных\nfunction find_rss(url) {\n  rezult = rss_data.findIndex(item =&gt; item[3] === url) \/\/ищем в 4 столбце\n  \/\/console.log(rezult) \/\/-1 если не найдено, и индекс положительный если нашлось это что нашлось лог\n  return(rezult)\n}\n\n\n\/\/ Запись нового поста в таблицу\nfunction data_write_rss(data) {\n  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&quot;rss_data&quot;);\n  var value = data\n  sheet.getRange(sheet.getLastRow() + 1,1,1,4).setValues([value]);\n  console.log(data)\n}\n\n\/\/ Запись error в таблицу\nfunction error_log(data) {\n  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&quot;error&quot;);\n  \/\/var sheet = spreadsheet.getActiveSheet();\n  \/\/var value = new Date(); \/\/ value you want to insert\n  \/\/var value = data\n  sheet.getRange(sheet.getLastRow() + 1,1,1,3).setValues([data]);\n  console.log(data)\n}\n\n\n\/\/функция проверки новых постов текущего потока\nfunction get_rss(rss_url) {\n  var url =rss_url\n  var date_rss =[]\n  var xml = UrlFetchApp.fetch(url).getContentText()\n  document = XmlService.parse(xml);\n  root = document.getRootElement();\n  channel = root.getChild(&#039;channel&#039;);\n  items = channel.getChildren(&#039;item&#039;);\n  items.forEach(item =&gt; {\n    parsing_date=new Date(); \/\/ дата текущая\n    title = item.getChild(&#039;title&#039;).getText();\n    link = item.getChild(&#039;link&#039;).getText()\n    try{\n    author = item.getChild(&#039;author&#039;).getText();} \/\/автор не у всех бывает\n    catch(e){author =&quot;&quot;}\n    if (find_rss(link) == -1) {\n      data_write_rss([parsing_date,title,author,link])  \n    }\n   });\n  console.log(date_rss)\n}\n\n\/\/ Основная функция парсинга всех РСС потоков, ее нужно установить в запуск раз в 15 минут\nfunction parse_rss() {\n  var rss_data=data_base_rss()\n  var app = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(&quot;rss&quot;)\n  url_array = app.getRange(1,1, app.getLastRow(), 1).getValues(); \/\/только заполненный первый столбец\n  console.log(url_array);\n  url_array.forEach(url =&gt; {\n    console.log(url)\n    try{ \n      get_rss(url)}\n    catch(e){console.log(&quot;! недействительный URL&quot;, console.log(url),&#039;Ошибка &#039; + e.name + &quot;:&quot; + e.message + &quot;\\n&quot; + e.stack)\n    \/\/error_log([new Date(),url,&#039;Ошибка &#039; + e.name + &quot;:&quot; + e.message + &quot;\\n&quot; + e.stack]) \/\/При необходимости записи ошибок снять комментарий     \n    } \/\/Обработка ошибки \n  })\n}<\/code><\/pre><h2>Код отправки сообщений в телеграм:<\/h2>\n<pre class=\"e2-text-code\"><code class=\"\">const tokendr = &quot;BOT_token&quot;; \nconst IDChattelegramdr = &quot;ID_CHAT&quot; \n\nfunction timerSENDtgDR() {\n  let ss = SpreadsheetApp.getActiveSpreadsheet();\n  let ws = ss.getSheetByName(&quot;rss_data&quot;); \/\/таблица с которой берем данные\n  let data = ws.getRange(2, 1, ws.getLastRow()-1, 5).getValues(); \/\/диапазон с которого берем данные\n  Logger.log ( data ); \n  for (i = 0; i &lt; data.length; i++) {\n    let dataInfo = data[i]; \/\/строчка таблицы\n    \/\/Logger.log ( dataInfo );\n    let telegram_send = dataInfo[4]; \/\/пятая ячейка telegram_send\n    Logger.log(telegram_send)\n    if (telegram_send ===&quot;&quot;){\n      title = dataInfo[1];\n      author = dataInfo[2];\n      if (author !=&#039;&#039;){\n      author=author+&quot;\\n\\n&quot;    \/\/если имя автора есть, добавить переносы строк\n      }\n      link = dataInfo[3];\n      sendTextDR(IDChattelegramdr, &quot;&lt;b&gt;&quot;+title+&quot;&lt;\/b&gt;\\n\\n&quot; + author + link);\n      ws.getRange(i+2 , 5, 1, 1).setValues([[new Date()]]);\n      Utilities.sleep(500);\/\/ pause in the loop for 500 milliseconds\n      Logger.log (&quot;сообщение отправлено&quot;);\n    }\n  }\n}\n \nfunction sendTextDR(chatId, text, keyBoard) {\n  let data = {\n    method: &#039;post&#039;,\n    payload: {\n      method: &#039;sendMessage&#039;,\n      chat_id: String(chatId),\n      text: text,\n      \/\/parse_mode:&#039;Markdown&#039;,\n      parse_mode: &#039;html&#039;,\n      reply_markup: JSON.stringify(keyBoard)\n    }\n  }\n  UrlFetchApp.fetch(&#039;https:\/\/api.telegram.org\/bot&#039; + tokendr + &#039;\/&#039;, data);\n}<\/code><\/pre>",
            "date_published": "2022-12-22T11:50:33+03:00",
            "date_modified": "2023-11-15T18:52:43+03:00",
            "tags": [
                "автоматизация",
                "парсинг",
                "портфолио",
                "таблицы",
                "телеграм"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/image-12.png",
            "_date_published_rfc2822": "Thu, 22 Dec 2022 11:50:33 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "471",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/image-12.png",
                    "https:\/\/blog.fossko.ru\/pictures\/image-11.png",
                    "https:\/\/blog.fossko.ru\/pictures\/otpravlyaem-potok-iz-rss-v-telegram-cherez-google-apps-script.png"
                ]
            }
        },
        {
            "id": "466",
            "url": "https:\/\/blog.fossko.ru\/all\/videonablyudenie-cherez-telegram\/",
            "title": "Видеонаблюдение через телеграм",
            "content_html": "<p>На камерах Hikvision можно сделать простое видеонаблюдение через телеграм.<br \/>\nКогда в камере срабатывает датчик движения, камера отправляет на телеграм фотографию что произошло.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-6.png\" width=\"510\" height=\"942\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Отправляются три изображения с интервалом 2 секунды, от момента срабатывания датчика<\/div>\n<\/div>\n<p>По умолчанию, мы не можем отправлять изображения в телеграм, можем только на почту.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1091\" data-ratio=\"1.4924760601915\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Nastroyki---Internet-Explorer-2022-10-15-14.23.59.jpg\" width=\"1091\" height=\"731\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Nastroyki---Internet-Explorer-2022-10-15-14.24.25.jpg\" width=\"1092\" height=\"731\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Настройки детектора движения: «Настройки» → «По событию» → «События» → «Детектор движения». Настраиваем зону срабатывания и событие отправки на электронную почту.<\/div>\n<\/div>\n<p>Отправлять события нужно на гугл почту. В гугле есть App Script, с помощью которого можно пересылать почту в телеграм.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Nastroyki---Internet-Explorer-2022-10-15-14.29.27.jpg\" width=\"1068\" height=\"728\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Настройки видеокамеры для отправки на электронную почту: «Настройки» → «Сеть» → «Доп. настройки» → «Email»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram.png\" width=\"820\" height=\"521\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Если все настроено правильно, в почту гугл начнут приходить письма с фотографиями.<\/div>\n<\/div>\n<p>На гитхабе выложен <a href=\"https:\/\/github.com\/kooison\/Gmail-to-Telegram\">пример скрипта, для отправки вложенных в письма фотографий в телеграм<\/a><\/p>\n<p>Нам, остается немного его доработать, так как скрипт отправляет первое вложение в телеграм.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram-1.png\" width=\"1183\" height=\"794\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Присваиваем всем нашим письмам ярлык — CAMERA, скрипт проверяет или все письма или по определенным параметрам, например, ярлык.<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-7.png\" width=\"696\" height=\"401\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Если правильно настроено правило, ярлыки появляются у каждого нового письма с камеры<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram-3.png\" width=\"1203\" height=\"969\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Дальше в апп скрипте вставляем наш скрипт, запускаем, тестирует, занимаемся отладкой.<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram-4.png\" width=\"1325\" height=\"980\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Ставим запуск скрипта раз в минуту. То есть почта будет проверяться раз в минуту и при соответвии условиям отправляться.<\/div>\n<\/div>\n<p>Мой скрипт:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">\/\/ The token of your Telegram bot\nvar TOKEN = &quot;token bot&quot;;\n\n\/\/ Name of the Telegram channel which bot is added into\nvar CHANNEL = &quot;id канала&quot;;\n\n\/\/ Name of the Gmail Label which need to search for\nvar LABEL = &quot;CAMERA&quot;\n\nfunction processEmails() {\n  \n  \/\/ Search unread emails with specified label\n  var search = &quot;label:&quot; + LABEL + &quot; is:unread&quot;;\n  Logger.log(&#039;Search: &#039; + search);\n  var threads = GmailApp.search(search, 0, 10);\n  \n  for (var i = 0; i &lt; threads.length; i++) {\n    var messages = threads[i].getMessages();\n    Logger.log(&#039;Number of emails found: &#039; + messages.length);\n\n    for (var j = 0; j &lt; messages.length; j++) {\n      var m = messages[j];\n      if (!m.isInTrash() &amp;&amp; m.isUnread()) {\n        if (m.getAttachments().length &gt; 0) {\n          \n          \/\/ Get the first attachment (image jpeg file)\n          \/\/ and send to telegram bot\n          sendPhoto(m.getAttachments()[0].copyBlob());\n          Logger.log(&#039;фото: &#039; + &#039;1&#039;);\n          Utilities.sleep(500);\/\/ pause in the loop for 500 milliseconds\n          sendPhoto(m.getAttachments()[1].copyBlob());\n          Logger.log(&#039;фото: &#039; + &#039;2&#039;);\n          Utilities.sleep(500);\/\/ pause in the loop for 500 milliseconds\n          sendPhoto(m.getAttachments()[2].copyBlob());\n          Logger.log(&#039;фото: &#039; + &#039;3&#039;);\n          Utilities.sleep(500);\/\/ pause in the loop for 500 milliseconds   \n        }\n        m.markRead(); \n        m.moveToTrash(); \/\/ Where I would need a delete forever trigger;\n      }\n    }\n  }\n}\n\nfunction sendPhoto(photo) {\n  var payload = {\n    &#039;chat_id&#039;: CHANNEL,\n    &#039;photo&#039;: photo\n  };\n  var options = {\n    &#039;method&#039;: &#039;post&#039;,\n    &#039;payload&#039;: payload\n  };\n  UrlFetchApp.fetch(&quot;https:\/\/api.telegram.org\/bot&quot; + TOKEN + &quot;\/sendPhoto&quot;, options);\n}<\/code><\/pre><p>Из правок:<\/p>\n<ul>\n<li>отправляются 1,2,3 вложения,<\/li>\n<li>между отправкой пауза 0,5 секунды,<\/li>\n<li>сообщение после обработки удаляется в корзину.<\/li>\n<\/ul>\n",
            "date_published": "2022-10-15T15:01:43+03:00",
            "date_modified": "2023-07-10T09:23:52+03:00",
            "tags": [
                "автоматизация",
                "телеграм"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Nastroyki---avito.fossko@gmail.com---Gmail---Google-Chrome-2022-10-15-14.44.27.jpg",
            "_date_published_rfc2822": "Sat, 15 Oct 2022 15:01:43 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "466",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js",
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Nastroyki---avito.fossko@gmail.com---Gmail---Google-Chrome-2022-10-15-14.44.27.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram-2.png",
                    "https:\/\/blog.fossko.ru\/pictures\/image-6.png",
                    "https:\/\/blog.fossko.ru\/pictures\/Nastroyki---Internet-Explorer-2022-10-15-14.23.59.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Nastroyki---Internet-Explorer-2022-10-15-14.24.25.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Nastroyki---Internet-Explorer-2022-10-15-14.29.27.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram.png",
                    "https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram-1.png",
                    "https:\/\/blog.fossko.ru\/pictures\/image-7.png",
                    "https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram-3.png",
                    "https:\/\/blog.fossko.ru\/pictures\/videonablyudenie-cherez-telegram-4.png"
                ]
            }
        },
        {
            "id": "465",
            "url": "https:\/\/blog.fossko.ru\/all\/otpravlyaem-novye-statyi-iz-rss-v-telegram\/",
            "title": "Отправляем новые статьи из РСС в телеграм",
            "content_html": "<p>Удобно присылать новые ссылки на статьи моих подписок РСС в телеграм, так как вся коммуникация уже в нем, фидли почти не использую.<\/p>\n<p>Евгений Гончаров, в статье <a href=\"https:\/\/sys-adm.in\/programming\/805-rss-fider-na-python-s-opravkoj-uvedomlenij-v-telegram.html\" class=\"nu\">«<u>RSS фидер на Python с оправкой уведомлений в Телеграм<\/u>»<\/a> описал весь принцип отправки и использование базы данных для контроля что отправили. <a href=\"https:\/\/github.com\/m0zgen\/rss2bot\/blob\/master\/rss.py\">Готовый код на гитхабе Евгения<\/a><\/p>\n<p>Я внес небольшие изменения в код:<\/p>\n<ul>\n<li>Сообщения в телеграм отправляются с задержкой 1 секунда. Если не использовать таймаут, сервер телеграма, может отправить не все сообщения.<\/li>\n<li>Изменил вид отправки сообщений: добавил переносы строк и автора, если он есть.<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-5.png\" width=\"518\" height=\"904\" alt=\"\" \/>\n<div class=\"e2-text-caption\">В канал телеграма приходят новые сообщения. Проверка РСС проходит с 7 утра до 11 вечера, с интервалом 30 минут.<\/div>\n<\/div>\n<p>Канал открытый, можно подписаться на <a href=\"https:\/\/t.me\/pochitaet\" class=\"nu\">«<u>Почитаем<\/u>»<\/a>, там 95 источников РСС: например, избранное блогов на Эгее, Илья Бирман, Максим Ильяхов, Николай Товеровский, и другие.<\/p>\n<p>В примере скрипта: блоги на Эгее и мой блог.<\/p>\n<p>Скрипт:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/usr\/bin\/python3\n# Created by Yevgeniy Goncharov, https:\/\/sys-adm.in\n# Script for reading and forwarding to Telegram, rss feeds\n\n\n# Imports\nimport sqlite3\nimport requests\nimport feedparser\nimport os\nimport urllib\nimport random\nimport time\n\n# Bot creds\nbot_token = &#039;bot_token&#039;\nbot_chatID = &#039;bot_chatID&#039;\n\n# Feeds\nmyfeeds = [\n    &#039;https:\/\/blogengine.ru\/blogs\/rss\/&#039;,\n    &#039;http:\/\/blog.fossko.ru\/rss\/&#039;,\n\n]\n\n# User agents\nuags = [\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/13.1.1 Safari\/605.1.15&#039;,\n  &#039;Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko\/20100101 Firefox\/77.0&#039;,\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/83.0.4103.97 Safari\/537.36&#039;,\n  &#039;Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko\/20100101 Firefox\/77.0&#039;,\n  &#039;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/83.0.4103.97 Safari\/537.36&#039;,\n]\n\n# Random User Agent (from uags list)\nua = random.choice(uags)\n\n# Header\nheaders = {\n  &quot;Connection&quot; : &quot;close&quot;,  # another way to cover tracks\n  &quot;User-Agent&quot; : ua\n}\n\n# Proxies\nproxies = {\n}\n\n# DB\nscriptDir = os.path.dirname(os.path.realpath(__file__))\ndb_connection = sqlite3.connect(scriptDir + &#039;\/rss.sqlite&#039;)\ndb = db_connection.cursor()\ndb.execute(&#039;CREATE TABLE IF NOT EXISTS myrss (title TEXT, date TEXT)&#039;)\n\n# Get posts from DB and print\ndef get_posts():\n    with db_connection:\n        db.execute(&quot;SELECT * FROM myrss&quot;)\n       # print(db.fetchall())\n\n# Check post in DB\ndef article_is_not_db(article_title, article_date):\n    db.execute(&quot;SELECT * from myrss WHERE title=? AND date=?&quot;, (article_title, article_date))\n    if not db.fetchall():\n        return True\n    else:\n        return False\n\n# Add post to DB\ndef add_article_to_db(article_title, article_date):\n    db.execute(&quot;INSERT INTO myrss VALUES (?,?)&quot;, (article_title, article_date))\n    db_connection.commit()\n\n# Send notify to Telegram bot\ndef bot_sendtext(bot_message):\n    #bot_message = urllib.parse.quote(bot_message)\n    bot_message = bot_message\n    send_text = &#039;https:\/\/api.telegram.org\/bot&#039; + bot_token + &#039;\/sendMessage?chat_id=&#039; + bot_chatID + &#039;&amp;parse_mode=Markdown&amp;text=&#039; + bot_message\n    requests.get(send_text, proxies=proxies, headers=headers)\n    print(send_text)\n\n# Check, read articles\ndef read_article_feed(feed):\n    &quot;&quot;&quot; Get articles from RSS feed &quot;&quot;&quot;\n    feedparser.USER_AGENT = ua\n    feed = feedparser.parse(feed)\n    print(feed)\n    for article in feed[&#039;entries&#039;]:\n        if article_is_not_db(article[&#039;title&#039;], article[&#039;published&#039;]):\n            add_article_to_db(article[&#039;title&#039;], article[&#039;published&#039;])\n           # bot_sendtext(&#039;New feed found &#039; + article[&#039;title&#039;] +&#039;, &#039; + article[&#039;link&#039;] + &#039;, &#039; + article[&#039;description&#039;])\n            try:\n                rss_autor = article[&#039;author&#039;] +&#039;%0A%0A&#039;\n            except:\n                rss_autor = &quot;&quot;\n            MSGsend=&#039;*&#039;+ article[&#039;title&#039;] + &#039;*%0A%0A&#039; + rss_autor + article[&#039;link&#039;]\n            MSGsend=MSGsend.replace(&quot;_&quot;, &quot;\\_&quot;)  # замена подчеркивания для отправки в ТГ\n            bot_sendtext(MSGsend)            \n            time.sleep(1)\n           # print(article)\n\n# Rotate feeds array\ndef spin_feds():\n    for x in myfeeds:\n       # print(x)\n        read_article_feed(x)\n\n# Runner :)\nif __name__ == &#039;__main__&#039;:\n    spin_feds()\n    # get_posts()\n    db_connection.close()<\/code><\/pre>",
            "date_published": "2022-10-10T10:10:19+03:00",
            "date_modified": "2023-11-15T18:52:55+03:00",
            "tags": [
                "автоматизация",
                "парсинг",
                "питон",
                "портфолио",
                "телеграм"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/image-5.png",
            "_date_published_rfc2822": "Mon, 10 Oct 2022 10:10:19 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "465",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/image-5.png"
                ]
            }
        },
        {
            "id": "464",
            "url": "https:\/\/blog.fossko.ru\/all\/otpravka-iz-yandeks-form-v-telegram\/",
            "title": "Отправка из Яндекс форм в телеграм",
            "content_html": "<p>У Яндекса есть удобный сервис — Яндекс формы, он позволяет вставлять любые формы на любые сайты.<br \/>\nА вот получение данных не всегда удобное: нужно зайти в форму, перейти к ответам, посмотреть результаты.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Zayavka-dzen-(Nastroyki)---Google-Chrome-2023-04-21-13.19.06.jpg\" width=\"1003\" height=\"236\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Входим в форму — интеграции<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Zayavka-dzen-(Nastroyka-integraciy)---Google-Chrome-2023-04-21-13.19.41.jpg\" width=\"1127\" height=\"883\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Можно отправлять на е-маил, это реализовано сразу, включаем в настройках, указываем кому отправить форму, что написать и заполняем шаблон.<\/div>\n<\/div>\n<p>Для отправки в телеграм, используется интеграция — *<b>API Запрос заданным методом<\/b><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Zayavka-dzen-(Nastroyka-integraciy)---Google-Chrome-2023-04-21-13.21.43.jpg\" width=\"1009\" height=\"712\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Метод запроса POST<\/div>\n<\/div>\n<p>У меня отправляется только если весь запрос передать в УРЛ, по-хорошему нужно передавать через тело запроса, но у меня не работает.<\/p>\n<p>В УРЛ подставляем следующее:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">https:\/\/api.telegram.org\/ИД вашего бота:Секретный ключ бота\/sendMessage?chat_id=ИД кому отправлять&amp;text=*Дзен_Яндекс*: Что из формы отправлять   &amp;parse_mode=Markdown\n\nhttps:\/\/api.telegram.org\/bot111111:AABBBCCDDDFFFHJGHGHG\/sendMessage?chat_id=1111111&amp;text=&amp;text=*Заявка_с_Дзена*%0A\nОтветы на все вопросы&amp;parse_mode=Markdown<\/code><\/pre><p>Айди канала или пользователя можно <a href=\"\/all\/kak-uznat-ay-di-kanala-gruppy-ili-polzovatelya-v-telegram\/\">узнать через бота<\/a><\/p>\n<p>%0A — Это символ пробела<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Novaya-forma-(Uvedomleniya)---Google-Chrome-2022-05-12-09.56.45.jpg\" width=\"951\" height=\"646\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/image-8.png\" width=\"926\" height=\"489\" alt=\"\" \/>\n<div class=\"e2-text-caption\">После какого-то обновления на Яндекс Формах не проходят знаки пробела, можно поставить подчеркивание и пользоваться дальше<\/div>\n<\/div>\n<p class=\"loud\">Ответы на вопросы — что передаем в сообщении, выбирается в параметрах, там куча всего можно передавать.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/otpravka-iz-yandeks-form-v-telegram.png\" width=\"368\" height=\"404\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Варианты, что можно отправить из формы в телеграм<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"829\" data-ratio=\"1.5612052730697\">\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Novaya-forma--Yandex.Forms---Google-Chrome-2022-05-12-09.51.51.jpg\" width=\"829\" height=\"531\" alt=\"\" \/>\n<img src=\"https:\/\/blog.fossko.ru\/pictures\/Telegram-(1801441)-2022-05-12-09.55.21.jpg\" width=\"440\" height=\"122\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Заполняем форму и получаем ответ в телеграм<\/div>\n<\/div>\n",
            "date_published": "2022-05-12T10:09:13+03:00",
            "date_modified": "2023-04-21T13:29:35+03:00",
            "tags": [
                "автоматизация",
                "телеграм"
            ],
            "image": "https:\/\/blog.fossko.ru\/pictures\/Novaya-forma-(Uvedomleniya)---Google-Chrome-2022-05-12-09.59.50.jpg",
            "_date_published_rfc2822": "Thu, 12 May 2022 10:09:13 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "464",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/blog.fossko.ru\/pictures\/Novaya-forma-(Uvedomleniya)---Google-Chrome-2022-05-12-09.59.50.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Zayavka-dzen-(Nastroyki)---Google-Chrome-2023-04-21-13.19.06.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Zayavka-dzen-(Nastroyka-integraciy)---Google-Chrome-2023-04-21-13.19.41.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Zayavka-dzen-(Nastroyka-integraciy)---Google-Chrome-2023-04-21-13.21.43.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Novaya-forma-(Uvedomleniya)---Google-Chrome-2022-05-12-09.56.45.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/image-8.png",
                    "https:\/\/blog.fossko.ru\/pictures\/otpravka-iz-yandeks-form-v-telegram.png",
                    "https:\/\/blog.fossko.ru\/pictures\/Novaya-forma--Yandex.Forms---Google-Chrome-2022-05-12-09.51.51.jpg",
                    "https:\/\/blog.fossko.ru\/pictures\/Telegram-(1801441)-2022-05-12-09.55.21.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171)"
}