<?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>Александр Макеев</title><generator>teletype.in</generator><description><![CDATA[Александр Макеев]]></description><image><url>https://img1.teletype.in/files/00/74/00741217-b3d9-43d9-8415-9201ed086e42.png</url><title>Александр Макеев</title><link>https://teletype.in/@ramathethird</link></image><link>https://teletype.in/@ramathethird?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ramathethird</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/ramathethird?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/ramathethird?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 26 May 2026 11:56:39 GMT</pubDate><lastBuildDate>Tue, 26 May 2026 11:56:39 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@ramathethird/m6-wg-bkwdJs</guid><link>https://teletype.in/@ramathethird/m6-wg-bkwdJs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ramathethird</link><comments>https://teletype.in/@ramathethird/m6-wg-bkwdJs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ramathethird#comments</comments><dc:creator>ramathethird</dc:creator><title>🌦️ Погода с эмодзи и переводом на русском для Telegram-бота на Google Apps Script</title><pubDate>Tue, 08 Jul 2025 08:57:09 GMT</pubDate><description><![CDATA[<img src="https://img2.teletype.in/files/52/b0/52b0ce5c-4b59-4210-9cd4-289ebd873117.png"></img>В современном мире, где информация должна быть не только точной, но и визуально привлекательной, создание удобного и красивого прогноза погоды становится важной задачей. В этой статье мы рассмотрим, как создать Telegram-бота, который будет отправлять прогноз погоды с эмодзи и переводом на русский язык, используя Google Apps Script и WeatherAPI.]]></description><content:encoded><![CDATA[
  <section>
    <p id="jb2W">В современном мире, где информация должна быть не только точной, но и визуально привлекательной, создание удобного и красивого прогноза погоды становится важной задачей. В этой статье мы рассмотрим, как создать Telegram-бота, который будет отправлять прогноз погоды с эмодзи и переводом на русский язык, используя Google Apps Script и WeatherAPI.</p>
  </section>
  <h2 id="CHbv">🌍 Как это работает</h2>
  <h3 id="Rys4">📡 Получение данных о погоде</h3>
  <p id="zNNj">Система получает актуальный прогноз погоды через <strong>WeatherAPI</strong> — один из самых популярных сервисов для работы с метеорологическими данными. Преимущество этого API в том, что он поддерживает русский язык, что делает его идеальным выбором для русскоязычных пользователей.</p>
  <h3 id="ZPn2">✨ Форматирование результата</h3>
  <p id="Rdde">После получения данных скрипт обрабатывает их и формирует красивое сообщение, дополненное эмодзи для лучшей визуализации. Например:</p>
  <ul id="MoVI">
    <li id="141W">☀️ — ясная погода</li>
    <li id="9aTf">🌧️ — дождь</li>
    <li id="466C">❄️ — снег</li>
  </ul>
  <p id="bLQh">Также автоматически добавляется перевод описания погоды на русский язык, что делает информацию максимально понятной.</p>
  <h3 id="XLu2">📩 Отправка в Telegram</h3>
  <p id="dxYq">Готовое сообщение можно сразу отправить в <strong>Telegram-бота</strong> или канал, чтобы пользователи получали актуальную погоду в удобном формате.</p>
  <p id="1Yi4"></p>
  <h2 id="0gbz">🔑 Начало работы</h2>
  <h3 id="P0hA">1️⃣ Регистрация на WeatherAPI</h3>
  <p id="ws56">Для использования API необходимо:</p>
  <ol id="xyXf">
    <li id="OeaU">Зарегистрироваться на сайте <a href="https://www.weatherapi.com/" target="_blank">www.weatherapi.com</a>.</li>
    <li id="DU1i">Получить <strong>API-ключ</strong>, который потребуется для запросов.</li>
  </ol>
  <p id="XZpu">⚠️ <strong>Важно!</strong> Бесплатный тариф имеет ограничения:</p>
  <h3 id="6D69">2️⃣ Настройка Google Apps Script</h3>
  <p id="PNno">Скрипт написан на <strong>JavaScript</strong> и работает в среде <strong>Google Apps Script</strong>, что позволяет легко интегрировать его с Telegram через вебхуки.</p>
  <p id="hwvz"></p>
  <h2 id="ZGwv">📜 Разбор кода</h2>
  <h3 id="pwXn">🌤️ Получение погоды с WeatherAPI</h3>
  <pre id="IDn6" data-lang="javascript">function getWeather(city) {
  const API_KEY = &#x60;ВАШ_API_КЛЮЧ&#x60;;
  const url = &#x60;http://api.weatherapi.com/v1/forecast.json?key=${API_KEY}&amp;q=${city}&amp;days=3&amp;aqi=no&amp;alerts=no&amp;lang=ru&#x60;;
  const response = UrlFetchApp.fetch(url);
  const data = JSON.parse(response.getContentText());
  return data;
}</pre>
  <p id="Aqaf">Здесь мы отправляем запрос к API, передавая:</p>
  <ul id="hPNu">
    <li id="nph6"><strong>Город</strong> (можно указывать название или координаты).</li>
    <li id="L72g"><strong>Количество дней</strong> (максимум 3 для бесплатного тарифа).</li>
    <li id="lWeR"><strong>Язык ответа</strong> (<code>lang=ru</code> для русского).</li>
  </ul>
  <p id="rXSo"></p>
  <h3 id="kOvp">🎨 Преобразование кода погоды в эмодзи и текст</h3>
  <pre id="0Dxr" data-lang="javascript">/**
 * Возвращает эмодзи и перевод описания погоды по коду и времени суток
 * @param {number} code - weatherapi code
 * @param {boolean} isDay - true если день, false если ночь
 * @returns {{emoji: string, text: string}}
 */
function getWeatherIconAndTextRu(code, isDay) {
  const map = {
    1000: { day: [&#x27;☀️&#x27;, &#x27;ясно&#x27;], night: [&#x27;🌙&#x27;, &#x27;ясно&#x27;] },
    1003: { day: [&#x27;🌤&#x27;, &#x27;малооблачно&#x27;], night: [&#x27;🌤&#x27;, &#x27;малооблачно&#x27;] },
    1006: { day: [&#x27;☁️&#x27;, &#x27;облачно&#x27;], night: [&#x27;☁️&#x27;, &#x27;облачно&#x27;] },
    1009: { day: [&#x27;🌫&#x27;, &#x27;пасмурно&#x27;], night: [&#x27;🌫&#x27;, &#x27;пасмурно&#x27;] },
    1030: { day: [&#x27;🌫&#x27;, &#x27;туман&#x27;], night: [&#x27;🌫&#x27;, &#x27;туман&#x27;] },
    1063: { day: [&#x27;🌦&#x27;, &#x27;возможен дождь&#x27;], night: [&#x27;🌦&#x27;, &#x27;возможен дождь&#x27;] },
    1066: { day: [&#x27;🌨&#x27;, &#x27;возможен снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;возможен снег&#x27;] },
    1069: { day: [&#x27;🌨&#x27;, &#x27;возможен мокрый снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;возможен мокрый снег&#x27;] },
    1072: { day: [&#x27;🌧&#x27;, &#x27;возможен ледяной дождь&#x27;], night: [&#x27;🌧&#x27;, &#x27;возможен ледяной дождь&#x27;] },
    1087: { day: [&#x27;⛈&#x27;, &#x27;возможна гроза&#x27;], night: [&#x27;⛈&#x27;, &#x27;возможна гроза&#x27;] },
    1114: { day: [&#x27;🌬&#x27;, &#x27;метель&#x27;], night: [&#x27;🌬&#x27;, &#x27;метель&#x27;] },
    1117: { day: [&#x27;🌨&#x27;, &#x27;сильная метель&#x27;], night: [&#x27;🌨&#x27;, &#x27;сильная метель&#x27;] },
    1135: { day: [&#x27;🌫&#x27;, &#x27;туман&#x27;], night: [&#x27;🌫&#x27;, &#x27;туман&#x27;] },
    1147: { day: [&#x27;🌫&#x27;, &#x27;изморозь&#x27;], night: [&#x27;🌫&#x27;, &#x27;изморозь&#x27;] },
    1150: { day: [&#x27;🌦&#x27;, &#x27;небольшая морось&#x27;], night: [&#x27;🌦&#x27;, &#x27;небольшая морось&#x27;] },
    1153: { day: [&#x27;🌦&#x27;, &#x27;морось&#x27;], night: [&#x27;🌦&#x27;, &#x27;морось&#x27;] },
    1168: { day: [&#x27;🌧&#x27;, &#x27;ледяная морось&#x27;], night: [&#x27;🌧&#x27;, &#x27;ледяная морось&#x27;] },
    1171: { day: [&#x27;🌧&#x27;, &#x27;сильная ледяная морось&#x27;], night: [&#x27;🌧&#x27;, &#x27;сильная ледяная морось&#x27;] },
    1180: { day: [&#x27;🌦&#x27;, &#x27;небольшой дождь&#x27;], night: [&#x27;🌦&#x27;, &#x27;небольшой дождь&#x27;] },
    1183: { day: [&#x27;🌦&#x27;, &#x27;дождь&#x27;], night: [&#x27;🌦&#x27;, &#x27;дождь&#x27;] },
    1186: { day: [&#x27;🌧&#x27;, &#x27;умеренный дождь&#x27;], night: [&#x27;🌧&#x27;, &#x27;умеренный дождь&#x27;] },
    1189: { day: [&#x27;🌧&#x27;, &#x27;умеренный дождь&#x27;], night: [&#x27;🌧&#x27;, &#x27;умеренный дождь&#x27;] },
    1192: { day: [&#x27;🌧&#x27;, &#x27;сильный дождь&#x27;], night: [&#x27;🌧&#x27;, &#x27;сильный дождь&#x27;] },
    1195: { day: [&#x27;🌧&#x27;, &#x27;ливень&#x27;], night: [&#x27;🌧&#x27;, &#x27;ливень&#x27;] },
    1198: { day: [&#x27;🌧&#x27;, &#x27;ледяной дождь&#x27;], night: [&#x27;🌧&#x27;, &#x27;ледяной дождь&#x27;] },
    1201: { day: [&#x27;🌧&#x27;, &#x27;сильный ледяной дождь&#x27;], night: [&#x27;🌧&#x27;, &#x27;сильный ледяной дождь&#x27;] },
    1204: { day: [&#x27;🌨&#x27;, &#x27;мокрый снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;мокрый снег&#x27;] },
    1207: { day: [&#x27;🌨&#x27;, &#x27;сильный мокрый снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;сильный мокрый снег&#x27;] },
    1210: { day: [&#x27;🌨&#x27;, &#x27;небольшой снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;небольшой снег&#x27;] },
    1213: { day: [&#x27;🌨&#x27;, &#x27;снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;снег&#x27;] },
    1216: { day: [&#x27;🌨&#x27;, &#x27;умеренный снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;умеренный снег&#x27;] },
    1219: { day: [&#x27;🌨&#x27;, &#x27;умеренный снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;умеренный снег&#x27;] },
    1222: { day: [&#x27;🌨&#x27;, &#x27;сильный снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;сильный снег&#x27;] },
    1225: { day: [&#x27;❄️&#x27;, &#x27;очень сильный снег&#x27;], night: [&#x27;❄️&#x27;, &#x27;очень сильный снег&#x27;] },
    1237: { day: [&#x27;🧊&#x27;, &#x27;ледяная крупа&#x27;], night: [&#x27;🧊&#x27;, &#x27;ледяная крупа&#x27;] },
    1240: { day: [&#x27;🌦&#x27;, &#x27;кратковременный дождь&#x27;], night: [&#x27;🌦&#x27;, &#x27;кратковременный дождь&#x27;] },
    1243: { day: [&#x27;🌧&#x27;, &#x27;сильный ливень&#x27;], night: [&#x27;🌧&#x27;, &#x27;сильный ливень&#x27;] },
    1246: { day: [&#x27;🌧&#x27;, &#x27;очень сильный ливень&#x27;], night: [&#x27;🌧&#x27;, &#x27;очень сильный ливень&#x27;] },
    1249: { day: [&#x27;🌨&#x27;, &#x27;кратковременный мокрый снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;кратковременный мокрый снег&#x27;] },
    1252: { day: [&#x27;🌨&#x27;, &#x27;сильный кратковременный мокрый снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;сильный кратковременный мокрый снег&#x27;] },
    1255: { day: [&#x27;🌨&#x27;, &#x27;кратковременный снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;кратковременный снег&#x27;] },
    1258: { day: [&#x27;🌨&#x27;, &#x27;сильный кратковременный снег&#x27;], night: [&#x27;🌨&#x27;, &#x27;сильный кратковременный снег&#x27;] },
    1261: { day: [&#x27;🧊&#x27;, &#x27;кратковременная ледяная крупа&#x27;], night: [&#x27;🧊&#x27;, &#x27;кратковременная ледяная крупа&#x27;] },
    1264: { day: [&#x27;🧊&#x27;, &#x27;сильная ледяная крупа&#x27;], night: [&#x27;🧊&#x27;, &#x27;сильная ледяная крупа&#x27;] },
    1273: { day: [&#x27;⛈&#x27;, &#x27;дождь с грозой&#x27;], night: [&#x27;⛈&#x27;, &#x27;дождь с грозой&#x27;] },
    1276: { day: [&#x27;⛈&#x27;, &#x27;сильный дождь с грозой&#x27;], night: [&#x27;⛈&#x27;, &#x27;сильный дождь с грозой&#x27;] },
    1279: { day: [&#x27;⛈&#x27;, &#x27;снег с грозой&#x27;], night: [&#x27;⛈&#x27;, &#x27;снег с грозой&#x27;] },
    1282: { day: [&#x27;⛈&#x27;, &#x27;сильный снег с грозой&#x27;], night: [&#x27;⛈&#x27;, &#x27;сильный снег с грозой&#x27;] },
  };
  const entry = map[code] || { day: [&#x27;❔&#x27;, &#x27;неизвестно&#x27;], night: [&#x27;❔&#x27;, &#x27;неизвестно&#x27;] };
  return isDay ? { emoji: entry.day[0], text: entry.day[1] } : { emoji: entry.night[0], text: entry.night[1] };
}</pre>
  <p id="Zbom">Этот код сопоставляет <strong>код погоды</strong> с соответствующим эмодзи и текстовым описанием, учитывая, день сейчас или ночь.</p>
  <p id="65Ze"></p>
  <h3 id="zWBJ">📝 Форматирование сообщения для Telegram</h3>
  <pre id="k3EL" data-lang="javascript">/**
 * Преобразует объект погоды из getWeather в красивое текстовое сообщение для Telegram
 * @param {Object} weatherData - результат функции getWeather
 * @returns {string} - текстовое сообщение
 */
function formatWeatherMessage(weatherData) {
  // Получаем основные данные
  const city = weatherData.location.name;
  const current = weatherData.current;
  const forecast = weatherData.forecast.forecastday;

  // Текущая погода
  const temp = Math.round(current.temp_c);
  const feels = Math.round(current.feelslike_c);
  const condObj = getWeatherIconAndTextRu(current.condition.code, !!current.is_day);
  const wind = (current.wind_kph / 3.6).toFixed(2); // м/с
  const humidity = current.humidity;

  // Заголовок и сейчас
  let msg = &#x60;${condObj.emoji} Погода ${city}\n\n&#x60;;
  msg += &#x60;${condObj.emoji} Сейчас: +${temp}° | ${condObj.text}\n&#x60;;
  msg += &#x60;🧖‍♂️ Ощущается как: +${feels}°\n&#x60;;
  msg += &#x60;↖️ Ветер: ${wind} м/с\n&#x60;;
  msg += &#x60;💦 Влажность: ${humidity}%\n\n&#x60;;

  // Сегодня (вечер)
  const today = forecast[0];
  const todayEvening = today.hour.find(h =&gt; h.time.split(&#x27; &#x27;)[1] === &#x27;18:00&#x27;) || today.hour[18];
  if (todayEvening) {
    const cond = getWeatherIconAndTextRu(todayEvening.condition.code, !!todayEvening.is_day);
    msg += &#x60;Сегодня\n${cond.emoji} Вечером: +${Math.round(todayEvening.temp_c)}° | ${cond.text}\n\n&#x60;;
  }

  // Завтра (ночь, утро, день, вечер)
  if (forecast.length &gt; 1) {
    const tomorrow = forecast[1];
    const night = tomorrow.hour[0];
    const morning = tomorrow.hour[6];
    const day = tomorrow.hour[12];
    const evening = tomorrow.hour[18];
    msg += &#x60;Завтра\n&#x60;;
    if (night) {
      const cond = getWeatherIconAndTextRu(night.condition.code, !!night.is_day);
      msg += &#x60;${cond.emoji} Ночью: +${Math.round(night.temp_c)}° | ${cond.text}\n&#x60;;
    }
    if (morning) {
      const cond = getWeatherIconAndTextRu(morning.condition.code, !!morning.is_day);
      msg += &#x60;${cond.emoji} Утром: +${Math.round(morning.temp_c)}° | ${cond.text}\n&#x60;;
    }
    if (day) {
      const cond = getWeatherIconAndTextRu(day.condition.code, !!day.is_day);
      msg += &#x60;${cond.emoji} Днём: +${Math.round(day.temp_c)}° | ${cond.text}\n&#x60;;
    }
    if (evening) {
      const cond = getWeatherIconAndTextRu(evening.condition.code, !!evening.is_day);
      msg += &#x60;${cond.emoji} Вечером: +${Math.round(evening.temp_c)}° | ${cond.text}\n\n&#x60;;
    }
  }

  // Краткий прогноз на следующие дни
  for (let i = 2; i &lt; forecast.length; i++) {
    const day = forecast[i];
    const date = new Date(day.date);
    const dayNum = date.getDate().toString().padStart(2, &#x27;0&#x27;);
    const monthNum = (date.getMonth() + 1).toString().padStart(2, &#x27;0&#x27;);
    const min = Math.round(day.day.mintemp_c);
    const max = Math.round(day.day.maxtemp_c);
    const cond = getWeatherIconAndTextRu(day.day.condition.code, true);
    msg += &#x60;${cond.emoji} ${dayNum} ${getMonthName(monthNum)} +${min}..+${max}° | ${cond.text}\n&#x60;;
  }

  return msg.trim();
}</pre>
  <p id="sDbC">Этот код формирует <strong>читаемое сообщение</strong>, включающее:</p>
  <ul id="JeBh">
    <li id="moH0"><strong>Текущую погоду</strong> (температура, ощущения, ветер, влажность).</li>
    <li id="K7W7"><strong>Прогноз на сегодня</strong>.</li>
    <li id="Qd4m"><strong>Подробный прогноз на завтра</strong> (ночь, утро, день, вечер).</li>
    <li id="LzeG"><strong>Краткий прогноз на следующие дни</strong> (если доступно).</li>
  </ul>
  <p id="8XjQ"></p>
  <h3 id="kkbg">📅 Вспомогательная функция для названия месяца</h3>
  <pre id="VlOj" data-lang="javascript">function getMonthName(monthNum) {
  const months = {
    &#x27;01&#x27;: &#x27;янв&#x27;, &#x27;02&#x27;: &#x27;фев&#x27;, &#x27;03&#x27;: &#x27;мар&#x27;, &#x27;04&#x27;: &#x27;апр&#x27;, &#x27;05&#x27;: &#x27;май&#x27;, &#x27;06&#x27;: &#x27;июн&#x27;,
    &#x27;07&#x27;: &#x27;июл&#x27;, &#x27;08&#x27;: &#x27;авг&#x27;, &#x27;09&#x27;: &#x27;сен&#x27;, &#x27;10&#x27;: &#x27;окт&#x27;, &#x27;11&#x27;: &#x27;ноя&#x27;, &#x27;12&#x27;: &#x27;дек&#x27;
  };
  return months[monthNum] || &#x27;&#x27;;
}</pre>
  <p id="Ou35">Она преобразует числовой месяц в сокращенное название на русском.</p>
  <p id="jfId"></p>
  <h2 id="P4KU">🚀 Как использовать</h2>
  <ol id="lw24">
    <li id="9ek1"><strong>Скопируйте код</strong> в свой проект Google Apps Script.</li>
    <li id="2cnu"><strong>Вызовите функцию</strong> <code>formatWeatherMessage(getWeather(&#x27;ВашГород&#x27;))</code>.</li>
    <li id="3McU"><strong>Отправьте результат</strong> в Telegram через бота или используйте его в других целях.</li>
  </ol>
  <p id="7S2g"></p>
  <h3 id="yEjx">🔍 Пример вывода</h3>
  <pre id="3xI4">☀️ Погода Москва  

☀️ Сейчас: +23° | ясно  
🧖‍♂️ Ощущается как: +25°  
↖️ Ветер: 2.5 м/с  
💦 Влажность: 60%  

Сегодня  
🌤️ Вечером: +20° | малооблачно  

Завтра  
🌙 Ночью: +16°  
🌤️ Утром: +18°  
☀️ Днём: +24°  
🌤️ Вечером: +21°  

🌤️ 15 июн +17..+25° | малооблачно  
🌧️ 16 июн +15..+20° | дождь  </pre>
  <figure id="tkQT" class="m_original">
    <img src="https://img2.teletype.in/files/52/b0/52b0ce5c-4b59-4210-9cd4-289ebd873117.png" width="330" />
    <figcaption>пример вывода в чате</figcaption>
  </figure>
  <h3 id="QgHd">📌 Заключение</h3>
  <p id="HOWn">Этот скрипт позволяет легко получать <strong>красивый прогноз погоды</strong> с эмодзи и отправлять его в Telegram. Вы можете доработать его, добавив:</p>
  <ul id="QnJf">
    <li id="wDWT">Уведомления при изменении погоды.</li>
    <li id="jVON">Поддержку большего количества дней (на платном тарифе WeatherAPI).</li>
    <li id="yDVF">Интеграцию с Google Таблицами для хранения истории погоды.</li>
  </ul>
  <p id="pi7O">Попробуйте и сделайте свой бот еще удобнее! 🌈</p>

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