June 1, 2024

Заставляем chatGPT создать бота-воронку в телеграм с подпиской на канал..

..куда будем гнать трафик. Без серверов, без кодинга, бесплатно.

Сложность: 3/5

Ликбез

Любому небольшому бизнесу хочется (читай как "жизненно необходимо") использовать крутые маркетинговые фишки для удешевления стоимости заявок/подписчиков.

Существует множество воронок, сейчас себя эффективно показывают связки "таргетированая реклама + телеграм бот". Бот нужен для того, чтобы проверить, выполнил ли наши условия Лид прежде, чем получить бесплатную полезность (файл/ссылка/видео/скидка).

Чаще всего условием является подписка на канал, в котором мы естественно будем его греть, НО помимо подписки на канал мы получаем еще и источник для рассылок, куда можем присылать информацию до тех пор, пока Лид не заблокирует бота.

Чтобы создать такого бота обычно нужно либо кому-то заплатить, либо платить за сервис конструктор и еще самому все настраивать, но мы то бизнес маленький, давайте выкручиваться, и поможет нам как всегда chatGPT, в этом случае версии 4o.

Как установить удобный и бесплатный VPN в хром/яндекс для использования chatGPT - ТУТ ССЫЛКА БУДЕТ

План

Разделим на несколько этапов задачу и поймем, что нужно:

  • Создать и настроить телеграм бота через @botfather
  • Создать таблицу, где мы будем хранить базу Лидов активировавших бота, чтобы в дальнейшем по ней делать рассылки
  • С помощью chatGPT написать скрипт для функционирования бота
К сожалению за экономию денег мы заплатим временем и меньшей гибкостью, в сравнении с тем, что могли бы сделать, если бы поручили работу программистам либо арендуя сервис визуального программирования. Но кому действительно нужно, следите за руками и все получится с первого раза 🙌

Создаем и настраиваем своего бота через @botfather

Открываем t.me/BotFather и попадаем к отцу всех ботов. Он позволяет создавать своих ботов и их настраивать, этим и займемся:

1. Активируем бота (нажимаем Начать или /start

2. Отправляем команду /newbot

3. Отвечаем на вопросы по порядку, придумываем название и логин для бота

4. После этого Батя Ботов отправит нам подтверждение, что мы успешно создали бота и в этом же сообщении будет содержаться так называемый API TOKEN, он понадобится нам позже

5. Готово! Для примера этого хватит, но если отправить боту команду /mybots можно будет настроить боту и описание и аватарку. Это важно, чтобы пользователь видел оформленный бот, а не просто пустышку, можно оставить это на потом

Под закрашенным прямоугольником тот самый API токен

Создаем Google онлайн-таблицу

1. Для быстрого создания google-таблицы можно перейти по адресу sheets.new

2. Называйте как хотите, чтобы не потерять

3. В базу мы будем сохранять 3 типа данных: ID пользователя, логин в тг, и время активации бота. Запишем названия в первую строку по порядку

4. Далее нужно создать скрипт, который будет пустым, сюда мы вставим код, который нам напишет chatGPT, для этого нажимаем: "Расширения" -> "Apps Script"

5. В пустом файле ничего пока можно не трогать, не закрывайте вкладку, позже сюда вставим код и запустим

6. База готова!

Получите список из 50 промтов для продуктивной работы с chatGPT - ТУТ ССЫЛКА НА НАШ БОТ ВОРОНКУ

Создаем скрипт с функционалом для нашего бота

Приготовьтесь, для непростого бота и непростой промт (команда для нейросети).

Промт который нужно отправить chatGPT:

Создай скрипт для бота в Telegram, который выполняет следующие задачи:

Основные параметры:
Введите токен вашего Telegram-бота.
Укажите идентификатор Google Sheets, куда будут сохраняться данные пользователей.
Введите URL для настройки вебхука бота.
Укажите идентификатор Telegram-канала, на который пользователи должны подписаться.
Укажите идентификатор администратора для особых прав.

Сообщения:
Приветственное сообщение, предлагающее подписаться на канал.
Сообщение об ошибке, если пользователь не подписан на канал.
Текст кнопки для получения подарка.
Текст кнопки для подписки на канал.
Сообщение с ссылкой на подарок после подписки.

Функции бота:
Настройка вебхука: отправьте запрос с токеном и URL вебхука.
Обработка входящих сообщений: определите, является ли отправитель администратором или пользователем, и обработайте сообщения и запросы.
Отправка начального сообщения: отправьте приветственное сообщение с кнопками для подписки и получения подарка.
Обработка запросов на получение подарка: проверьте, подписан ли пользователь на канал, и отправьте ссылку на подарок.
Проверка подписки: убедитесь, что пользователь подписан на канал.
Отправка ссылки на подарок: отправьте сообщение с ссылкой на подарок пользователю.
Отправка текстового сообщения: отправьте текстовое сообщение пользователю.
Отправка фото с подписью: отправьте фото с подписью пользователю.
Рассылка сообщений всем пользователям: отправьте текстовое сообщение всем пользователям, записанным в Google Sheets.
Рассылка фото всем пользователям: отправьте фото с подписью всем пользователям.
Форматирование текста: форматируйте текст с использованием HTML.
Добавление новых пользователей: добавьте новых пользователей в Google Sheets, если они еще не записаны.

Используйте это описание для создания точного и рабочего скрипта на языке JavaScript для Google Apps Script, который интегрируется с Telegram API и Google Sheets.На выходе мы получим примерно такой код:

На выходе мы получим примерно такой код:

Его нужно скопировать и вставить в наш созданный Apps Scripts который мы открывали из google-таблицы ранее.

var TOKEN = 'СЮДА'; // Замените на ваш токен
var SPREADSHEET_ID = ''; // Замените на ID вашего Google Sheet
var WEBHOOK_URL = ''; // Замените на URL развертывания
var CHANNEL_ID = '@'; // Замените на ID вашего канала
var ADMIN_CHAT_ID = ''; // Замените на ваш ID администратора


// Сообщения и тексты
var START_MESSAGE = "Привет! Подпишись на наш канал, чтобы получить ссылку на подарок";
var ERROR_MESSAGE = "Ошибка: вы не подписаны на канал.";
var GIFT_BUTTON_TEXT = "Получить подарок";
var SUBSCRIBE_BUTTON_TEXT = "Подписаться";
var GIFT_LINK_TEXT = "Спасибо за подписку! Вот ваша ссылка на подарок: https://example.com/gift"; 

// Установка вебхука
function setWebhook() {
  var url = 'https://api.telegram.org/bot' + TOKEN + '/setWebhook?url=' + WEBHOOK_URL;
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}

// Обработчик запросов от Telegram
function doPost(e) {
  var contents = JSON.parse(e.postData.contents);
  var chatId = contents.message ? contents.message.chat.id : contents.callback_query.from.id;
  var isAdmin = (chatId == ADMIN_CHAT_ID);
  
  if (isAdmin && contents.message) {
    if (contents.message.photo) {
      var photo = contents.message.photo.pop().file_id; // Получаем последнее фото в массиве (наибольшее по размеру)
      var caption = contents.message.caption || ''; // Подпись может быть пустой
      var entities = contents.message.caption_entities || [];
      broadcastPhotoMessage(photo, caption, entities);
    } else if (contents.message.text || contents.message.entities) {
      broadcastMessage(contents.message);
    }
  } else if (contents.message) {
    if (contents.message.text === '/start') {
      addUserToSheet(contents.message);
      sendInitialMessage(chatId);
    }
  } else if (contents.callback_query) {
    handleCallbackQuery(contents.callback_query);
  }
}

// Отправка первоначального сообщения
function sendInitialMessage(chatId) {
  var keyboard = {
    inline_keyboard: [
      [{ text: SUBSCRIBE_BUTTON_TEXT, url: "https://t.me/" + CHANNEL_ID }],
      [{ text: GIFT_BUTTON_TEXT, callback_data: "get_gift" }]
    ]
  };
  sendMessage(chatId, START_MESSAGE, keyboard, 'HTML');
}

// Обработка callback-запросов
function handleCallbackQuery(callbackQuery) {
  var chatId = callbackQuery.from.id;
  var data = callbackQuery.data;
  
  if (data == 'get_gift') {
    if (isUserSubscribed(chatId)) {
      sendGiftLink(chatId);
    } else {
      sendMessage(chatId, ERROR_MESSAGE, null, 'HTML');
    }
  }
}

// Проверка подписки пользователя
function isUserSubscribed(chatId) {
  var url = 'https://api.telegram.org/bot' + TOKEN + '/getChatMember?chat_id=' + CHANNEL_ID + '&user_id=' + chatId;
  var response = UrlFetchApp.fetch(url);
  var result = JSON.parse(response.getContentText());
  
  if (result.ok) {
    var status = result.result.status;
    return status == 'member' || status == 'administrator' || status == 'creator';
  }
  
  return false;
}

// Отправка ссылки на подарок
function sendGiftLink(chatId) {
  sendMessage(chatId, GIFT_LINK_TEXT, null, 'HTML');
}

// Отправка сообщения
function sendMessage(chatId, text, keyboard, parseMode) {
  var url = 'https://api.telegram.org/bot' + TOKEN + '/sendMessage';
  var payload = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify({
      chat_id: chatId,
      text: text,
      parse_mode: parseMode || 'HTML', // Используем HTML по умолчанию
      reply_markup: keyboard ? JSON.stringify(keyboard) : undefined
    })
  };
  UrlFetchApp.fetch(url, payload);
}

// Отправка фото с подписью
function sendPhoto(chatId, photo, caption, parseMode) {
  var url = 'https://api.telegram.org/bot' + TOKEN + '/sendPhoto';
  var payload = {
    method: "post",
    contentType: "application/json",
    payload: JSON.stringify({
      chat_id: chatId,
      photo: photo,
      caption: caption,
      parse_mode: parseMode || 'HTML' // Используем HTML для подписей
    })
  };
  UrlFetchApp.fetch(url, payload);
}

// Рассылка текстового сообщения всем пользователям
function broadcastMessage(message) {
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var successfulCount = 0;
  var failedCount = 0;

  var text = message.text;
  var entities = message.entities || [];
  var formattedText = formatText(text, entities);

  for (var i = 1; i < data.length; i++) {
    try {
      sendMessage(data[i][0], formattedText, null, 'HTML');
      successfulCount++;
    } catch (e) {
      failedCount++;
    }
  }
  
  var statsMessage = "Сообщения отправлены: " + successfulCount + "\n" +
                     "Не удалось отправить: " + failedCount;
  sendMessage(ADMIN_CHAT_ID, statsMessage, null, 'HTML');
}

// Рассылка фото с подписью всем пользователям
function broadcastPhotoMessage(photo, caption, entities) {
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var successfulCount = 0;
  var failedCount = 0;

  var formattedCaption = formatText(caption, entities);

  for (var i = 1; i < data.length; i++) {
    try {
      sendPhoto(data[i][0], photo, formattedCaption, 'HTML');
      successfulCount++;
    } catch (e) {
      failedCount++;
    }
  }
  
  var statsMessage = "Сообщения с фото отправлены: " + successfulCount + "\n" +
                     "Не удалось отправить: " + failedCount;
  sendMessage(ADMIN_CHAT_ID, statsMessage, null, 'HTML');
}

// Форматирование текста с использованием HTML-разметки
function formatText(text, entities) {
  var offsetCorrection = 0;
  entities.forEach(entity => {
    var start = entity.offset + offsetCorrection;
    var end = start + entity.length;
    var pre = text.slice(0, start);
    var post = text.slice(end);
    var entityText = text.slice(start, end);
    
    switch (entity.type) {
      case 'bold':
        entityText = '<b>' + entityText + '</b>';
        break;
      case 'italic':
        entityText = '<i>' + entityText + '</i>';
        break;
      case 'code':
        entityText = '<code>' + entityText + '</code>';
        break;
      case 'pre':
        entityText = '<pre>' + entityText + '</pre>';
        break;
      case 'text_link':
        entityText = '<a href="' + entity.url + '">' + entityText + '</a>';
        break;
    }
    
    text = pre + entityText + post;
    offsetCorrection += entityText.length - entity.length;
  });
  
  return text;
}

// Добавление пользователя в таблицу
function addUserToSheet(message) {
  var chatId = message.chat.id;
  var username = message.chat.username || '';
  var now = new Date();
  var formattedDate = Utilities.formatDate(now, Session.getScriptTimeZone(), 'yyyy-MM-dd HH:mm:ss');

  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var exists = false;

  for (var i = 1; i < data.length; i++) {
    if (data[i][0] == chatId) {
      exists = true;
      break;
    }
  }

  if (!exists) {
    sheet.appendRow([chatId, username, formattedDate]);
  }
}

Теперь нужно настроить переменные и запустить код, как заполнить каждый по пунктам:

TOKEN

Его мы получали в боте @botfather ранее, найдите его и вставьте полностью вместо слова СЮДА в начале кода.

SPREADSHEET_ID

ID таблицы найти не сложно, просто возвращаемся в таблицу и копируем из адреса строки все что после spreadsheets/d/ и до /, например: 1JYWFAgsb_yvpTc7FzqkjosAmiqFDT_k1qVZYybykEEM

WEBHOOK_URL

Создадим позже.

CHANNEL_ID

Копируем логин нашего канала в телеграм вместе с знаком @, на который хотим, чтобы люди подписывались. Лучше сразу добавить нашего нового бота в администраторы нашего канала, так он получит доступ к списку вступивших и сможет работать как и задумывалось.

ADMIN_CHAT_ID

Этот ID мы можем узнать активировав бот @getmyid_bot, он отправит Вам ID и его нужно вставить для того, чтобы скрипт знал, что когда вы взаимодействуете с ботом, вы админ и для Вас будут выполняться другие команды.

Осталось запустить скрипт

1. Проверьте еще раз, что все заполнили правильно, а еще можете переписать под себя сразу текст в переменных где // Сообщения и тексты, чтобы бот присылал то, что вы хотите.

2. Нажмите кнопку "Начать развертывание", затем "Новое развертывание"

3. Добавьте любое описание, а главное выберите "У кого есть доступ" - Все

4. Нажмите "Начать развертывание" и подождите

5. После появления окна, нужно обязательно скопировать ссылку Веб-приложения и после нажать "Готово"

  1. Скопированный URL нам нужно вставить в ранее пропущенный параметр WEBHOOK_URL в начале кода
  2. Остается запустить вебхук, чтобы телеграм после отправки сообщений боту мог фиксировать сообщения и скрипт их обрабатывал. Для этого нужно выбрать функцию "setWebhook" и нажать "Выполнить".

Готово! Осталось протестировать работу бота

  • Для этого зайдем в бота, который ранее создавали через @botfather, ссылку на него можно найти как раз в чате с Отцом ботов.
  • Далее активируем бота и проверим, что все работает.
  • Если вы верно заменили все значения на свои, то бот будет корректно записывать в ваш гугл документ новых пользователей, проверять подписаны ли они на канал и в случае, если подписаны, отправлять пользователю то, что вы ему записать в переменную для отправки после подписки.

Подпишитесь на наш канал!

Подписывайтесь на канал о нейросетях, помимо новостей мы публикуем подробные инструкции по использованию уже работающих инструментов для упрощения жизни самых разных сфер - @gptgodmode