Заставляем chatGPT создать бота-воронку в телеграм с подпиской на канал..
..куда будем гнать трафик. Без серверов, без кодинга, бесплатно.
Ликбез
Любому небольшому бизнесу хочется (читай как "жизненно необходимо") использовать крутые маркетинговые фишки для удешевления стоимости заявок/подписчиков.
Существует множество воронок, сейчас себя эффективно показывают связки "таргетированая реклама + телеграм бот". Бот нужен для того, чтобы проверить, выполнил ли наши условия Лид прежде, чем получить бесплатную полезность (файл/ссылка/видео/скидка).
Чаще всего условием является подписка на канал, в котором мы естественно будем его греть, НО помимо подписки на канал мы получаем еще и источник для рассылок, куда можем присылать информацию до тех пор, пока Лид не заблокирует бота.
Чтобы создать такого бота обычно нужно либо кому-то заплатить, либо платить за сервис конструктор и еще самому все настраивать, но мы то бизнес маленький, давайте выкручиваться, и поможет нам как всегда chatGPT, в этом случае версии 4o.
Как установить удобный и бесплатный VPN в хром/яндекс для использования chatGPT - ТУТ ССЫЛКА БУДЕТ
План
Разделим на несколько этапов задачу и поймем, что нужно:
- Создать и настроить телеграм бота через @botfather
- Создать таблицу, где мы будем хранить базу Лидов активировавших бота, чтобы в дальнейшем по ней делать рассылки
- С помощью chatGPT написать скрипт для функционирования бота
К сожалению за экономию денег мы заплатим временем и меньшей гибкостью, в сравнении с тем, что могли бы сделать, если бы поручили работу программистам либо арендуя сервис визуального программирования. Но кому действительно нужно, следите за руками и все получится с первого раза 🙌
Создаем и настраиваем своего бота через @botfather
Открываем t.me/BotFather и попадаем к отцу всех ботов. Он позволяет создавать своих ботов и их настраивать, этим и займемся:
1. Активируем бота (нажимаем Начать или /start
3. Отвечаем на вопросы по порядку, придумываем название и логин для бота
4. После этого Батя Ботов отправит нам подтверждение, что мы успешно создали бота и в этом же сообщении будет содержаться так называемый API TOKEN, он понадобится нам позже
5. Готово! Для примера этого хватит, но если отправить боту команду /mybots можно будет настроить боту и описание и аватарку. Это важно, чтобы пользователь видел оформленный бот, а не просто пустышку, можно оставить это на потом
Создаем Google онлайн-таблицу
1. Для быстрого создания google-таблицы можно перейти по адресу sheets.new
2. Называйте как хотите, чтобы не потерять
3. В базу мы будем сохранять 3 типа данных: ID пользователя, логин в тг, и время активации бота. Запишем названия в первую строку по порядку
4. Далее нужно создать скрипт, который будет пустым, сюда мы вставим код, который нам напишет chatGPT, для этого нажимаем: "Расширения" -> "Apps Script"
5. В пустом файле ничего пока можно не трогать, не закрывайте вкладку, позже сюда вставим код и запустим
Получите список из 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. После появления окна, нужно обязательно скопировать ссылку Веб-приложения и после нажать "Готово"
- Скопированный URL нам нужно вставить в ранее пропущенный параметр WEBHOOK_URL в начале кода
- Остается запустить вебхук, чтобы телеграм после отправки сообщений боту мог фиксировать сообщения и скрипт их обрабатывал. Для этого нужно выбрать функцию "setWebhook" и нажать "Выполнить".
Готово! Осталось протестировать работу бота
- Для этого зайдем в бота, который ранее создавали через @botfather, ссылку на него можно найти как раз в чате с Отцом ботов.
- Далее активируем бота и проверим, что все работает.
- Если вы верно заменили все значения на свои, то бот будет корректно записывать в ваш гугл документ новых пользователей, проверять подписаны ли они на канал и в случае, если подписаны, отправлять пользователю то, что вы ему записать в переменную для отправки после подписки.
Подпишитесь на наш канал!
Подписывайтесь на канал о нейросетях, помимо новостей мы публикуем подробные инструкции по использованию уже работающих инструментов для упрощения жизни самых разных сфер - @gptgodmode