Добро пожаловать! Игровой форум WLUX.NET - Игры, Читы, Скрипты, Статьи, Софт, Курсы.

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. После регистрации и входа в систему вы сможете создавать темы, публиковать ответы на существующие темы, повышать репутацию участников, скачивать вложения и файлы и многое, многое другое. Так чего же вы ждете?

Добро пожаловать гость!

Приветствуем вас на нашем форуме! Мы очень рады вас видеть и с большим удовольствием поделимся всей информацией нашего форума!

Мы уважаем своих пользователей и так же ждем от вас приятного общения.

Система наград, ежедневное пополнения тем!

Общайся, получай награды.

Статьи, гайды, софт

У нас вы можете скачать бесплатно читы для игр. Полезные гайды на любые темы и схемы заработка. Есть раздел халявы!

FAQ по форуму

Не понимаю, как и что тут работает у вас?!Как создавать темы, писать сообщения, как получать реакции. Почему не засчитывает сообщения. Все ответы здесь

  • Добро пожаловать на сайт - wlux.net!

    FAQ по форуму

    1. Все сообщения до группы местный проходят модерацию от 1 минуты до 24 часа

    2. Сообщения учитываються в следующих разделах: Читать

    3.Что-бы скачать вложение нужно 2 сообщения.

    4.Личные переписки работают только с Администрацией форума

    5. Запрещено: Просить скрытый текст , спам, реклама, скам, ддос, кардинг и другая чернуха, нарушать любые законы РФ/СНГ = бан аккаунта

    6. Внимание! Мы не удаляем аккаунты с форума! Будьте внимательны ДО регистрации! Как удалить аккаунт на форуме?!

    5.Не понимаю, как и что тут работает у вас?!Как создавать темы, писать сообщения, как получать реакции. Почему не засчитывает сообщения. Все ответы здесь

Исходник Гайд Бот обратной связи без хостинга: Google Apps Script + Telegram Bot API

wlux.net Оффлайн

wlux.net

Где волчьи уши, там волчьи зубы.
Команда форума
LV
7
 
20.06.2022
23 849
218
36
Награды
10
Пол
Муж.

Репутация:

  • Автор темы
  • Администратор
  • Модератор
  • Команда форума
  • #1
Развертывание бота на площадке Google Apps Script


Начнем с простого действия, перейдем по ссылке

Пожалуйста, войдите или зерегистрируйтесь, чтобы увидеть скрытый текст.

- если вы авторизованы в Google, то вы перейдете на новую созданную таблицу.
pDJ3bIm.png

У таблицы необходимо получить ее id - он находится в адресной строке, далее пропишем его в настройках бота в параметре sheet
33e3b19e44225ea21dd6adf9286cc2f7be71bd2b.png

Сразу же переименуем лист таблицы в Users, в нем будет хранится информация о пользователях
0v0zmP7.png

Перейдем: Расширения > Apps Script
38460f027713b965c30b1f2b4da56b88b2d94077.png

Откроется страница нового проекта "Проект без названия" (можете переименовать)
fc9cedfa335a7dc4891d9ad85d0558c7da6758e4.png

Заменим все что находится в файле Код.gs (открыт по умолчанию), на содержимое из нашего кода

В коде из нашего кода в настройках бота укажем id таблицы (sheet), данные бота (токен, username), ваш id (botAdmin) как владельца бота.

Сохраняем все это дело, можно использовать быстрые клавиши CTRL + S, запустим новое развертывание - это большая синяя кнопка справа вверху "Начать развертывание"
Is8TxUL.png


Откроется диалоговое окно, нажимаем на иконку "Шестеренка", выбираем "Веб-приложение"
lUN22v8.png

Заполните поля и нажмите кнопку Начать развертывание
  1. Описание - название развертывания
  2. Запуск от имени - выберите От моего имени
  3. У кого есть доступ - укажите Все, иначе Телеграм не сможет направить данные
2e1b1456fa535e29b3c2ee956618d02ffa392b0e.png

При первом развертывания проекта, у вас запросят Предоставление прав, нажмите на синию кнопку.
2pBroAC.png

Подробнее о предоставлении прав можно почитать в

Пожалуйста, войдите или зерегистрируйтесь, чтобы увидеть скрытый текст.



В отображенном списке выберите аккаунт, который вы указали в поле Запуск от имени в настройках развертывания пару шагов назад
0aa089f4457fe93fe074c48c0b0deafe4b3f17a0.png

Google выдаст предупреждение, о том что указанное вами приложение не проверенное и будет остерегать вас давать разрешения, но это же ваш аккаунт и ваше приложение - предлагаю рискнуть и продолжить ... жмите Advanced - или на каком у вас там языке будет ссылка (зависит от выбранного вами языка интерфейса - у меня выдало on English)
zXOKN4J.png

Выдаст еще одно предупреждение - жмите Go to ......
e4d437785c508da7adbdd55cea65e74af1fa5e2e.png

В отображенной форме нажимайте кнопку Allow
FyLIIRo.png

Все, развертывание создано, из данных показанных в окне, нам нужно ссылка (URL) на веб-приложение, скопируйте ее, далее нужно будет ее добавить в настройки бота

WcQTGBz.png

Не забудьте сохранить изменения кода CTRL + S, после сохранения нужно запустить установку webHook, используя уже готовую функцию. Для этого выберите в списке функцию под названием setWebHook() и нажмите кнопку Выполнить
799856c0512c0a4619be0513e5c9352f3f0a3981.png

В идеале мы должны получить примерно вот такой ответ от Телеграм
fed5103779f75c110615267cfe26fb0e01d1452d.png

Можно запустить еще одну функцию: getWebHookInfo() - она выведет информацию о текущем состоянии настроенного webHook
624b8a5e68a946dec1043313b07fb2c6a937ff72.png

Бот готов к использованию!
Открывайте его нажимайте Старт (/start)
IZEx1oV.png

Старт бота от имени обычного пользователя

На этом думаю, что все, больше добавить нечего. С вас если не сложно предложения и комментарии, получилось ли у вас запустить этот пример бота.
Код:
/**
 * Настройки Бота
 */
const config = {
  sheet: "ID_ТАБЛИЦИ",
  webUrl: "ссылка_(URL)_на_веб-приложение",
  token: "TOKEN_BOT",
  userNameBot: "USERNAME_BOT",
  apiUrl: "https://api.telegram.org/bot",
  botAdmin: ВАШ_ID,
  langParams: {
    ru: {
      admin: {
        hello: "Начинаем ждать сообщений от пользователей",
        answer: {
          self: "Ответ на свое сообщение",
          bot: "Ответ на сообщение бота",
          button: {
            reply: "Надо поставить сообщение пользователя в ответ.",
          },
          error: {
            send: "Не удалось отправить сообщение пользователю"
          }
        }
      },
      user: {
        hello: "Приветствую Вас, {name}.\nЯ очень жду вашего сообщения.\n------\nСпасибо."
      }
    }
  },
  linkCommands: [
    {
      template: /^\/start$/,
      method: 'start'
    }
  ],
  db: {
    users: {
      table: "Users",
      uid: 1,
      name: 2,
      userName: 3,
      lang: 4,
      created_at: 5,
      updated_at: 6
    }
  }
}

function getMe() {
  let response = UrlFetchApp.fetch(config.apiUrl + config.token + "/getMe");
  console.log(response.getContentText());
}

function getWebHookInfo() {
  let response = UrlFetchApp.fetch(config.apiUrl + config.token + "/getWebHookInfo");
  console.log(response.getContentText());
}

function setWebHook() {
  let response = UrlFetchApp.fetch(config.apiUrl + config.token + "/setWebHook?url=" + config.webUrl);
  console.log(response.getContentText());
}

/**
 * Получаем данные от Телеграм
 */
function doPost(request) {
  // получаем данные
  let update = JSON.parse(request.postData.contents);
  // направляем данные в объект WebHook
  new WebHook(update);
}

/**
 * Класс WebHook
 */
class WebHook {
   /**
   * Создаем объект WebHook
   */
  constructor(update) {
    // создаем объект бота
    this.bot = new Bot(config.token, update);
    // создаем объект пользователя
    this.user = new User(this.bot.getUserData());
    // создаем объект языковых настроек
    this.lang = new Lang(this.user.lang);
    // получаем набор команд с шаблонами
    this.linkCommands = config.linkCommands;
    // запускаем роутер
    this.route();
  }
 
  /**
   * Получаем объект команды
   */
  checkCommand(text) {
    // текстовые ссылки
    if (this.linkCommands.length > 0) {
      // перебираем команды
        for (let linkCommand of this.linkCommands)
          // если есть совпадения
          if (linkCommand.template.test(text)) {
            // добавим флаг
            linkCommand.result = true;
            // вернем объект с методом
            return linkCommand;
          }
      }
    // если дошли до этой строчки то вернем флаг ошибки
    return {
      result: false
    };
  }

  /**
   * Маршрутизируем
   */
  route() {
    // проверим на частный запрос
    if(this.bot.data.message.chat.type != "private") {
      // выйдем если это группа или канал
      return;
    }
    // если это сообщение
    if(Helper.isSet(this.bot.data.message)) {
      // если это текстовое сообщение
      if(Helper.isSet(this.bot.data.message.text)) {
        // проверяем на команды
        let command = this.checkCommand(this.bot.data.message.text);
        // если есть совпадение по шаблону
        if (command.result) {
          // вызываем метод
          this[command.method]();
          // выходим
          return;
        }
      }
      // если пишет админ
      if (this.isAdmin()) {
        // если это ответ на сообщение
        if (Helper.isSet(this.bot.data.message.reply_to_message)) {
          // получаем текст из отвечаемого сообщения
          let text_ = Helper.isSet(this.bot.data.message.reply_to_message.text)
            ? this.bot.data.message.reply_to_message.text // текстовое сообщение
            : this.bot.data.message.reply_to_message.caption; // медиа сообщение
          // если ответ самому себе
          if (this.user.uid == this.bot.data.message.reply_to_message.from.id) {
            // уведомляем админа, что ответ самому себе
            this.bot.sendMessage(config.botAdmin, this.lang.getParam("admin.answer.self"));
          } // если ответ на сообщение бота
          else if (this.isReplyBot() && !/^USER_ID::[\d]+::/.test(text_)) {
            // уведомляем, что ответ боту
            this.bot.sendMessage(config.botAdmin, this.lang.getParam("admin.answer.bot"));
          }
          else {
            // получить id пользователя из сообщения
            let matches = text_.match(/^USER_ID::(\d+)::/);
            // проверяем
            if (matches) {
              // все нормально отправляем копию сообщения пользователю
              this.bot.copyMessage(matches[1], config.botAdmin, this.bot.data.message.message_id);
            } else {
              // уведомляем, что не удалось направить сообщение пользователю
              this.bot.sendMessage(config.botAdmin, this.lang.getParam("admin.answer.error.send"));
            }
          }
        } else {
          // уведомление нажать кнопку ответить
          this.bot.sendMessage(config.botAdmin, this.lang.getParam("admin.answer.button.reply"));
        }
      } else {
        // Если это написал пользователь то отправляем копию админу
        this.sendCopyToAdmin();
      }
    }
  }

  /**
   * Проверяем на Админа
   */
  isAdmin() {
    // сравним текущего пользователя с админом из настроек
    return config.botAdmin == this.user.uid;
  }
 
  /**
   * Локальная проверка на бота
   */
  isReplyBot() {
    // вернем кто владелец сообщения на которое отвечаем
    return this.bot.data.message.reply_to_message.from.is_bot;
  }

  /**
   * Старт бота
   */
  start() {
    // определяем текст
    let text = this.isAdmin() // проверяем кто стартанул
    ? this.lang.getParam("admin.hello") // если стартанул админ
    : this.lang.getParam("user.hello", { // если стартанул пользователь
        name: this.user.name // добавим для парсинга его имя
      }) ;
    // выводим сообщение
    this.bot.sendMessage(this.user.uid, text);
  }

  /**
   * Отправляем копию
   */
  sendCopyToAdmin() {
    // создаем ссылку на просмотр профиля
    let link = (this.user.userName.length > 0)
      ? "@" + this.user.userName // если есть username
      : "<a href='tg://user?id=" + this.user.uid + "'>" + this.user.name + "</a>";
    // дополнение к сообщению с id пользователя
    let dop = "USER_ID::" + this.user.uid + "::\nот <b>" + this.user.name + "</b> | " + link + "\n-----\n";
    // определяем данные по умолчанию
    let typeMessage = this.bot.getMessageType(); // тип сообщения
    let dopSend = false; // по умолчанию доп отправлять отдельно не нужно
    let data = { // формируем данные сообщения
      chat_id: String(config.botAdmin), // пользователь админ
      disable_web_page_preview: true, // закроем превью ссылок
      parse_mode: "HTML", // форматирование html
      method: null // метод по умолчанию не определен
    };
    // если это текстовое сообщение
    if (typeMessage == "text") {
      // формируем доп с текстом
      data.text = dop + this.bot.prepareMessageWithEntities(this.bot.getMessageText(), this.bot.getEntities());
      // переопределяем метод
      data.method = "sendMessage";
    } else { // если это остальные типы сообщений
      // проверяем нужно ли отправлять dop отдельным сообщением
      dopSend = Helper.isNull(this.bot.getMessageText());
      // заполняем данные
      if(typeMessage == "location") {
        // определяем координаты
        data.longitude = this.bot.data.message.location.longitude;
        data.latitude = this.bot.data.message.location.latitude;
      } else {
        // запоняем файлом
        data[typeMessage] = this.bot.getMessageFileId();
      }
      // если не надо доп, значит описание не пустое
      if (!dopSend) {
        // дополняем описание
        data.caption = dop + this.bot.prepareMessageWithEntities(this.bot.getMessageText(), this.bot.getEntities());
      }
      // переопределяем метод
      data.method = "send" + this.prepareMethod(typeMessage);
    }
    // если метод определен
    if (!Helper.isNull(data.method)) {
      // и нужно отправить доп отдельным сообщением
      if (dopSend) {
        // отправляем админу доп
        this.bot.sendMessage(config.botAdmin, dop);
      }
      // отправляем копию
      this.bot.query({
        method: "post",
        payload: data
      });
    }
  }

  /**
   * Преобразуем переданную строку в camelCase
   */
  prepareMethod(method) {
    return method.split('_') // разделяем по знаку _ в массив
      .map(function(word,index){ // перебираем все значения
        // преобразуем первый символ в верхний регистр, остальное в нижний
        return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
      })
      .join(''); // собираем в одно слово без пробелов
  }
}

/**
 * Класс Пользователь
 */
class User {
  /**
   * Создаем обект пользователя
   */
  constructor(userData) {
    // заполняем uid
    this.uid = userData.uid;
    // name сразу склеиваем из первого и второго имени
    this.name = (userData.firstName + " " + userData.lastName).trim();
    // заполняем lang из телеги
    this.lang = userData.lang;
    // username если есть
    this.userName = userData.userName;
    // сохраняем данные
    this.save()
  }

  /**
   * Получаем строку в таблице по uid
   */
  getRowByUid(sheet, uid, range_ = "A1:A") {
    // определяем диапазон ячеек в таблице
    const range = sheet.getRange(range_);
    // получаем через поиск по переданному uid
    const result = range.createTextFinder(uid).matchEntireCell(tr
 
B Оффлайн

brayn2121

Участник
LV
2
 
28.01.2024
5
0
24
Награды
2
26

Репутация:

Спасибо за информацию! Будем изучать
 

Поиск по форуму

shape1
shape2
shape3
shape4
shape7
shape8
Верх