Разное

Регистрация telegram бота: Регистрация бота в Telegram — BotFather

Содержание

Регистрация бота в Telegram — BotFather

Бот в Telegram — вид аккаунта при создании которого не требуется указывать номер телефона. По сути бот это отдельное приложение которое управляется через чат Telegram. Действия ботов автоматизируются с помощью специального API.

Отличие ботов от пользователей

У ботов нет нет отметки статуса online или времени последнего входа. Вместо этого у них отображается метка «bot».

Бот не может начать разговор с пользователем или вступить в группу. Пользователь должен отправить ему первое сообщение или добавить его в группу.

Имя пользователя у бота оканчивается на «bot», например, @IceMoneyBot

Регистрация нового бота

Для управления ботами в Telegram используется специальный бот @BotFather. Его название и аватар намекает на известный фильм

Для создания нового бота отправьте команду

BotFather предложит ввести название нового бота и имя пользователя для аккаунта бота. Название отображается в окне диалога с ботом, а имя пользователя используется для ссылок на него.

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

В случае если токен стал известен кому-то ещё кроме вас нужно сгенерировать новый токен командой

Старый токен перестанет работать.

Найдем нового бота в поиске

Пока не добавляйте бота в контакты. Как видите в окне описания пусто. Установим текст который будет выводиться в окне добавления бота. Для этого отправьте BotFather команду

Описание отображается в окне с заголовком «What can this bot do?». Текст описания ограничен 512 символами, допустимы переводы строк.

Для изменения описания бота в окне информации о пользователе отправьте BotFather команду

Текст описания в этом окне ограничен 120 символами. Бот также выдает, что текст не должен содержать переводы строк, но текст с ними нормально принимается.

Если бот уже добавлен в контакты то после команд /setabouttext, /setdescription и /setuserpic описание в клиенте обновляется не сразу. Помогает перезапустить клиент, или удалить разговор с ботом и снова его добавить.

Самая заметная часть описания — аватар. Для его изменений введите команду BotFather

После её ввода отправьте BotFather изображение которое станет аватаром бота. Аватар используется в двух местах — в описании пользователя и в изображении в списке контактов. Причем в контактах изображение обрезается в форме круга.

Имя созданного бота изменяется командой

Если же бот больше не нужен то команда удаления бота

Последняя, в этом списке, команда — редактирование списка команд бота

Например отправляем такое описание

help — Описание функций
yesterday — Вчерашний курс



help — Описание функций

yesterday — Вчерашний курс

И получаем подсказку при вводе символа «/»

Команды в этом списке — это подсказка для пользователя. Сам бот может обрабатывать любые команды, независимо от того что в списке.

Ссылки

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Telegram — регистрация и настройка бота

Переписываю старую статью дабы более полно отделить и структурировать информацию. В данной статье речь пойдет о создании своего собственного бота и приглашение его в чат!

Создаем бота

Находим в мессенджере @botfather и пишем в нем команду /newbot, заполняем необходимые параметры (имя бота и его адрес — обязательно должен включать в себя слово bot в одном из двух вариантов: @namebot или @name_bot). В чате @botfather появится токен нашего свежеиспеченного бота, который понадобится нам чуть ниже.

@botfather ругнулся на существующее имя бота и пришлось подбирать другое. В конце боту присвоился токен. Теперь создадим чат и пригласим в него бота!

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

Создаем чат и приглашаем в него бота

Чат создается в пару кликов. В главном меню выбираем NEW CHANNEL и заполняем имя и адрес. Можно отправлять текст на имя чата — публичный чат и на его id — приватный! Теперь заходим на бота и активируем его, будет кнопка или можно командой /start

Через меню бота находим пункт меню Add to group и вступаем в только что созданный чат. На этом для публичного чата подготовка завершена, но если у вас приватный чат, присылать сообщения на имя чата не получится и понадобится его id. Чтобы его узнать, пишем в чат с приглашенным ботом любой текст и следуем по ссылке:

https://api.telegram.org/bot273805635:AAGQOuPVadtQyEx0COPrDnq2r-YmUo90xaU/getUpdates

Красный токен меняете на тот, который выдал @bothfather. Если все сделано правильно, страница отобразит примерно следующие объекты в формате JSON, где нам понадобится лишь айди чата.

Форма для отправки

Вынес код в отдельную статью: /676-telegram-nastraivaem-peredachu-dannyh-iz-form-na-sayte-v-chat.html

Регистрация с помощью telegram бота / Хабр

Сейчас почти на всех сайтах есть регистрация. Реализована она чаще всего с помощью e-mail, реже с помощью смс. А что если сделать регистрацию через telegram бота? В качестве логина на сайте мы сможем использовать подтверждённый номер телефона, а сам бот будет посылать одноразовые коды для входа. В данной статье описан процесс создания такого бота на языке Golang.

Пример работы бота

Хотелось бы сразу отметить: в статье не будет описана реализация входа на сайт по одноразовым кодам.

Весь код есть в репозитории на GitHub

UPD 07.02.2018: Вход на сайт с помощью Telegram теперь можно реализовать используя Telegram Login Widget

Оглавление:

  1. Необходимое ПО
  2. Получение API ключа
  3. Структура проекта
  4. Файл настроек
  5. Инициализация бота и соединения с БД
  6. Основной код
  7. Запуск бота

Для начала нужно установить всё необходимое ПО:
Далее следует получить API ключ для нашего будущего бота. Для этого нужно написать боту BotFather. Что примерно должно получиться:

Перед тем как начать программировать нужно определится со структурой проекта, у меня она получилась такой:

/project/
	/conf/
		settings.go
	/src/
		database.go
		telegramBot.go
	main.go

Приступаем к написанию кода! Для начала файл настроек (settings.go):

const (
	TELEGRAM_BOT_API_KEY = "paste your key here"  // API  ключ, который мы получили у BotFather
	MONGODB_CONNECTION_URL = "localhost"  // Адрес сервера MongoDB
	MONGODB_DATABASE_NAME = "regbot"  // Название базы данных
	MONGODB_COLLECTION_USERS = "users"  // Название таблицы
)

Для каждого пользователя в БД хранятся: ид чата (chat_id) и номер мобильного телефона (phone_number). Поэтому сразу создаём структуру User:

type User struct {
	Chat_ID      int64
	Phone_Number string
}

Соединение с MongoDB реализуем с помощью структуры DatabaseConnection:

type DatabaseConnection struct {
	Session *mgo.Session  // Соединение с сервером
	DB      *mgo.Database // Соединение с базой данных
}

Бота представим в качестве структуры TelegramBot:

type TelegramBot struct {
	API                   *tgbotapi.BotAPI        // API телеграмма
	Updates               tgbotapi.UpdatesChannel // Канал обновлений
	ActiveContactRequests []int64                 // ID чатов, от которых мы ожидаем номер
}

Функция инициализации соединения с MongoDB:

func (connection *DatabaseConnection) Init() {
	session, err := mgo.Dial(conf.MONGODB_CONNECTION_URL)  // Подключение к серверу
	if err != nil {
		log.Fatal(err)  // При ошибке прерываем выполнение программы
	}
	connection.Session = session
	db := session.DB(conf.MONGODB_DATABASE_NAME)  // Подключение к базе данных
	connection.DB = db
}

Функция инициализации бота:

func (telegramBot *TelegramBot) Init() {
	botAPI, err := tgbotapi.NewBotAPI(conf.TELEGRAM_BOT_API_KEY)  // Инициализация API
	if err != nil {
		log.Fatal(err)
	}
	telegramBot.API = botAPI
	botUpdate := tgbotapi.NewUpdate(0)  // Инициализация канала обновлений
	botUpdate.Timeout = 64
	botUpdates, err := telegramBot.API.GetUpdatesChan(botUpdate)
	if err != nil {
		log.Fatal(err)
	}
	telegramBot.Updates = botUpdates
}

Бот инициализируется, но делать он ещё ничего не умеет. Давайте двигаться дальше!

Следующий шаг — «основной цикл бота»:

func (telegramBot *TelegramBot) Start() {
	for update := range telegramBot.Updates {
		if update.Message != nil {
			// Если сообщение есть  -> начинаем обработку
			telegramBot.analyzeUpdate(update)
		}
	}
}

Это бесконечный цикл. Обработка всех входящих сообщений начинается с него. В начале обработки мы должны проверить, есть ли пользователь у нас в базе. Нет — создаём и запрашиваем его номер, есть — продолжаем обработку.

// Начало обработки сообщения
func (telegramBot *TelegramBot) analyzeUpdate(update tgbotapi.Update) {
	chatID := update.Message.Chat.ID
	if telegramBot.findUser(chatID) {  // Есть ли пользователь в БД?
		telegramBot.analyzeUser(update)
	} else {
		telegramBot.createUser(User{chatID, ""})  // Создаём пользователя
		telegramBot.requestContact(chatID)  // Запрашиваем номер
	}
}

func (telegramBot *TelegramBot) findUser(chatID int64) bool {
	find, err := Connection.Find(chatID)
	if err != nil {
		msg := tgbotapi.NewMessage(chatID, "Произошла ошибка! Бот может работать неправильно!")
		telegramBot.API.Send(msg)
	}
	return find
}

func (telegramBot *TelegramBot) createUser(user User) {
	err := Connection.CreateUser(user)
	if err != nil {
		msg := tgbotapi.NewMessage(user.Chat_ID, "Произошла ошибка! Бот может работать неправильно!")
		telegramBot.API.Send(msg)
	}
}

func (telegramBot *TelegramBot) requestContact(chatID int64) {
        // Создаём сообщение
	requestContactMessage := tgbotapi.NewMessage(chatID, "Согласны ли вы предоставить ваш номер телефона для регистрации в системе?")
        // Создаём кнопку отправки контакта
	acceptButton := tgbotapi.NewKeyboardButtonContact("Да") 
	declineButton := tgbotapi.NewKeyboardButton("Нет")
        // Создаём клавиатуру
	requestContactReplyKeyboard := tgbotapi.NewReplyKeyboard([]tgbotapi.KeyboardButton{acceptButton, declineButton})
	requestContactMessage.ReplyMarkup = requestContactReplyKeyboard
	telegramBot.API.Send(requestContactMessage)  // Отправляем сообщение
	telegramBot.addContactRequestID(chatID)  // Добавляем ChatID в лист ожидания
}

func (telegramBot *TelegramBot) addContactRequestID(chatID int64) {
	telegramBot.ActiveContactRequests = append(telegramBot.ActiveContactRequests, chatID)
}

Начальная обработка написана, теперь давайте напишем общение с базой данных:

var Connection DatabaseConnection  // Переменная, через которую бот будет обращаться к БД

// Проверка на существование пользователя
func (connection *DatabaseConnection) Find(chatID int64) (bool, error) {
	collection := connection.DB.C(conf.MONGODB_COLLECTION_USERS)  // Получаем коллекцию "users"
	count, err := collection.Find(bson.M{"chat_id": chatID}).Count()  // Считаем количество записей с заданным ChatID
	if err != nil || count == 0 { 
		return false, err
	} else {
		return true, err
	}
}

// Получение пользователя
func (connection *DatabaseConnection) GetUser(chatID int64) (User, error) {
	var result User
	find, err := connection.Find(chatID)  // Сначала проверяем, существует ли он
	if err != nil {
		return result, err
	}
	if find {  // Если да -> получаем
		collection := connection.DB.C(conf.MONGODB_COLLECTION_USERS)  
		err = collection.Find(bson.M{"chat_id": chatID}).One(&result)
		return result, err
	} else {  // Нет -> возвращаем NotFound
		return result, mgo.ErrNotFound
	}
}

// Создание пользователя
func (connection *DatabaseConnection) CreateUser(user User) error {
	collection := connection.DB.C(conf.MONGODB_COLLECTION_USERS)
	err := collection.Insert(user)
	return err
}

// Обновление номера мобильного телефона
func (connection *DatabaseConnection) UpdateUser(user User) error {
	collection := connection.DB.C(conf.MONGODB_COLLECTION_USERS)
	err := collection.Update(bson.M{"chat_id": user.Chat_ID}, &user)
	return err
}

Это все функции, которые нам пригодятся. Для бота осталось написать функции продолжения обработки сообщения и анализа контакта:

func (telegramBot *TelegramBot) analyzeUser(update tgbotapi.Update) {
	chatID := update.Message.Chat.ID
	user, err := Connection.GetUser(chatID)  // Вытаскиваем данные из БД для проверки номера
	if err != nil {
		msg := tgbotapi.NewMessage(chatID, "Произошла ошибка! Бот может работать неправильно!")
		telegramBot.API.Send(msg)
		return
	}
	if len(user.Phone_Number) > 0 {
		msg := tgbotapi.NewMessage(chatID, "Ваш номер: " + user.Phone_Number)  // Если номер у нас уже есть, то пишем его
		telegramBot.API.Send(msg)
		return
	} else {
		// Если номера нет, то проверяем ждём ли мы контакт от этого ChatID
		if telegramBot.findContactRequestID(chatID) {
			telegramBot.checkRequestContactReply(update)  // Если да -> проверяем
			return
		} else {
			telegramBot.requestContact(chatID)  // Если нет -> запрашиваем его
			return
		}
	}
}

// Проверка принятого контакта
func (telegramBot *TelegramBot) checkRequestContactReply(update tgbotapi.Update) {
	if update.Message.Contact != nil {  // Проверяем, содержит ли сообщение контакт
		if update.Message.Contact.UserID == update.Message.From.ID {  // Проверяем действительно ли это контакт отправителя
			telegramBot.updateUser(User{update.Message.Chat.ID, update.Message.Contact.PhoneNumber}, update.Message.Chat.ID)  // Обновляем номер
			telegramBot.deleteContactRequestID(update.Message.Chat.ID)  // Удаляем ChatID из списка ожидания
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Спасибо!")
			msg.ReplyMarkup = tgbotapi.NewRemoveKeyboard(false)  // Убираем клавиатуру
			telegramBot.API.Send(msg)
		} else {
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Номер телефона, который вы предоставили, принадлежит не вам!")
			telegramBot.API.Send(msg)
			telegramBot.requestContact(update.Message.Chat.ID)
		}
	} else {
		msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Если вы не предоставите ваш номер телефона, вы не сможете пользоваться системой!")
		telegramBot.API.Send(msg)
		telegramBot.requestContact(update.Message.Chat.ID)
	}
}

// Обновление номера мобильного телефона пользователя
func (telegramBot *TelegramBot) updateUser(user User, chatID int64) {
	err := Connection.UpdateUser(user)
	if err != nil {
		msg := tgbotapi.NewMessage(chatID, "Произошла ошибка! Бот может работать неправильно!")
		telegramBot.API.Send(msg)
		return
	}
}

// Есть ChatID в листе ожидания?
func (telegramBot *TelegramBot) findContactRequestID(chatID int64) bool {
	for _, v := range telegramBot.ActiveContactRequests {
		if v == chatID {
			return true
		}
	}
	return false
}

// Удаление ChatID из листа ожидания
func (telegramBot *TelegramBot) deleteContactRequestID(chatID int64) {
	for i, v := range telegramBot.ActiveContactRequests {
		if v == chatID {
			copy(telegramBot.ActiveContactRequests[i:], telegramBot.ActiveContactRequests[i + 1:])
			telegramBot.ActiveContactRequests[len(telegramBot.ActiveContactRequests) - 1] = 0
			telegramBot.ActiveContactRequests = telegramBot.ActiveContactRequests[:len(telegramBot.ActiveContactRequests) - 1]
		}
	}
}

Наш бот готов к работе! Осталось только его запустить. Для этого в main.go пишем:

var telegramBot src.TelegramBot

func main() {
	src.Connection.Init()  // Инициализация соединения с БД
	telegramBot.Init()  // Инициализация бота
	telegramBot.Start() 
}

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

Несомненно у данной системы есть минусы, самый очевидный из которых: зависимость от Telegram (изменение API, блокировка). По мне это хорошая альтернатива e-mail и sms, будете ли вы использовать её — решать вам. Спасибо за внимание!

Как написать игрового Telegram-бота в домашних условиях — Разработка на vc.ru

Возможно, кто-то о нас слышал. Мы — популярное интернет-издание по программированию. Мы не только пишем статьи на тему современной разработки, но и ищем способы, как держать аудиторию в постоянной заинтересованности к тому, что мы делаем.

Однажды мы решили, что нам нужно сделать бота. Бот должен был давать логические задачи в групповом чате в Telegram «Развиваем логику», закреплять их на то время, пока её решают, не давать новую, пока ответ кого-то из участников не наберёт десять (потом снизили до пяти) плюсов, а также вывешивать топ наиболее успешных решателей задачек.

Идея не приходит одна

Задача довольно простая, подумали мы, особенно учитывая волну популярности ботов и количество материала в сети по этой теме. Однако материала не очень качественного: кто-то не использует композер, а кто-то даже пишет весь код в одном файле-обработчике, полагая, очевидно, будто количество файлов влияет на скорость работы кода.

Сначала бот должен был просто давать задачи, причём их можно было пропускать, постоянно вызывая одну и ту же команду. Это первая проблема, которую мы стали решать. Выход нашёлся почти сразу: сохранение состояния бота (а точнее, текущей команды) в базе. Другими словами, получая команду /get, бот даёт задачу и сохраняет команду в базе.

В следующий раз, перед тем как отреагировать на сообщения в чате, бот сравнивает команду, которую получил прямо сейчас, с последней командой в базе. Если они совпадают, бот никак не реагирует и вдобавок удаляет команду пользователя, чтобы она не мусорила чат. Согласитесь, это выглядит как хорошее решение.

После запуска бота в работу мы обнаружили ещё одну проблему: хэштеги не очень удобны для поиска. Ведь задача может уйти далеко наверх, а листать до неё или забивать в поиске — достаточно неинтересное занятие, чтобы стравливать его пользователю. Поэтому мы решили сразу же закреплять задачу, которую даёт бот. Причём закрепляет как раз он сам, а не мы (и да, делает это без уведомлений).

Ну и напоследок ещё одна проблема, которую мы с успехом решили. Некоторые задачи предполагали не

Как создать чат-бот для Telegram — инструкция для администраторов каналов

Как регулярно вести Telegram-канал и не тратить на рутину с публикациями половину рабочего дня? Я подготовила краткое руководство для SMM-специалистов, которые ведут крупные каналы на постоянной основе, и для всех авторов, которые завели личные каналы.

Все начинается с ControllerBot. Это один из самых полезных инструментов для администраторов каналов в Telegram. Установите бот, потому что с его помощью удобно:

  • смотреть базовую статистику;
  • планировать отложенные посты;
  • форматировать текст;
  • добавлять визуальную составляющую к тексту;
  • прикреплять к постам реакции и встроенные URL-кнопки. 

Как настроить чат-бот

Перейдите в чат с ботом ControllerBot, нажмите /start. Затем задайте команду /addchannel и выполните простую пошаговую инструкцию по подключению бота.

Перейдите в диалог с ботом BotFather.

Нажмите /start и выберите команду /newbot.

Придумайте своему боту имя (оно будет отображаться в диалоговом списке) и юзернейм (уникальное имя, которое заканчивается на «bot» и пишется через @)

Получив токен, скопируйте его, перешлите в чат с ControllerBot и выполните одно из условий по добавлению канала (например, можно просто скинуть боту ник вашего канала).

Готово — вы создали бота. Добавьте его в администраторы канала. И обязательно укажите свой город, чтобы бот настроил часовой пояс и смог управлять отложенными постами.

{«0»:{«lid»:»1573230077755″,»ls»:»10″,»loff»:»»,»li_type»:»em»,»li_name»:»email»,»li_ph»:»Email»,»li_req»:»y»,»li_nm»:»email»},»1″:{«lid»:»1596820612019″,»ls»:»20″,»loff»:»»,»li_type»:»hd»,»li_name»:»country_code»,»li_nm»:»country_code»}}

Истории бизнеса и полезные фишки

Как пользоваться чат-ботом

1. Создать пост

Нажмите на команду /создать пост.

Затем выберите канал (в моем случае это Netpeak).

Поле отправки боту текстового сообщения, бот предложит вам несколько функций.

Воспользуйтесь привычными горячими клавишами для форматирования текста прямо в диалоговом окне:

  • жирный шрифт — «Ctrl+B»;
  • курсив — «Ctrl+I»;
  • залинковать ссылку — «Ctrl+K».

2. Добавить изображение

Нажмите на команду /прикрепить медиафайл и отправьте боту фото либо гифку (не обязательно сохранять изображение, можно его скопировать и вставить).

Если вдруг вам не понравилось, как выглядит пост с конкретным изображением, его всегда можно изменить, нажав на команду /открепить медиафайл, и проделать все заново.

3. Добавить реакции к посту

Кликните по команде /добавить реакции и выберите эмоджи (не более шести на один пост, разделяя каждый через /). Посмотрите, как визуально улучшилось оформление поста.

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

4. Добавить URL-кнопки

Выберите команду /добавить URL-кнопки и отправьте боту текстовое сообщение со ссылками, разделенные дефисом -. Вот так это будет выглядеть.

После нажатия на кнопку подписчик попадет на указанный сайт.

5. Опубликовать пост

После подготовки поста нажимите «Далее».

Высветится меню с несколькими вариантами публикации:

  • «Опубликовать» — при нажатии на команду пост публикуется в ваш канал сразу же после повторного подтверждения, это страхует от случайных публикаций недоработанных черновиков «ой, я что-то нажал и оно само»;
  • «Задать таймер для удаления» — укажите количество часов, через которое пост автоматически удалится;
  • «Отложить» — тот самый любимый отложенный постинг любой день и время 🙂

  • «Редактируем опубликованный пост» — если после публикации вы обнаружили опечатку или некорректную ссылку, вызовите бота и в меню нажмите «Редактировать». После этого перешлите боту сообщение, которое нужно отредактировать. Отправьте исправленный вариант поста, сохраните изменения и пост автоматически обновится.

6. Посмотреть статистику

Выберите команду «Статистика» и нажмите на название канала.

Бот покажет количество подписавшихся/отписавшихся пользователей за месяц и за неделю.
Готово! Теперь вы умеете самостоятельно создавать собственного бота в Telegram. Если возникнут вопросы, с радостью отвечу в комментариях.

{«0»:{«lid»:»1531306243545″,»ls»:»10″,»loff»:»»,»li_type»:»nm»,»li_name»:»name»,»li_ph»:»Имя»,»li_req»:»y»,»li_nm»:»name»},»1″:{«lid»:»1573230091466″,»ls»:»20″,»loff»:»»,»li_type»:»ph»,»li_name»:»phone»,»li_req»:»y»,»li_masktype»:»a»,»li_nm»:»phone»},»2″:{«lid»:»1573567927671″,»ls»:»30″,»loff»:»y»,»li_type»:»in»,»li_name»:»surname»,»li_ph»:»Фамилия»,»li_req»:»y»,»li_nm»:»surname»},»3″:{«lid»:»1531306540094″,»ls»:»40″,»loff»:»»,»li_type»:»in»,»li_name»:»domains»,»li_ph»:»Адрес сайта»,»li_rule»:»url»,»li_req»:»y»,»li_nm»:»domains»},»4″:{«lid»:»1573230077755″,»ls»:»50″,»loff»:»»,»li_type»:»em»,»li_name»:»email»,»li_ph»:»Email»,»li_req»:»y»,»li_nm»:»email»},»5″:{«lid»:»1575903646714″,»ls»:»60″,»loff»:»»,»li_type»:»hd»,»li_name»:»comment»,»li_value»:»Автоматический коммент: заявка из блога, без пользовательского комментария»,»li_nm»:»comment»},»6″:{«lid»:»1575903664523″,»ls»:»70″,»loff»:»»,»li_type»:»hd»,»li_name»:»lead_channel_id»,»li_value»:»24″,»li_nm»:»lead_channel_id»},»7″:{«lid»:»1584374224865″,»ls»:»80″,»loff»:»»,»li_type»:»hd»,»li_name»:»ip»,»li_nm»:»ip»}}

Найти клиентов
в Telegram

Пишем telegram-бота на python с помощью библиотеки telebot часть 2 / Хабр

Всем привет! Это вторая часть статьи, в которой я посвящу время запросам и серверам telegram. Если кто-то еще не видел первую часть, то рекомендую её почитать. В третьей части скорее всего будет описана работа с базами данных. Ну и если у вас опять возникли вопросы, то пишите мне в телеграм: dimagorovtsov

Что такое message?

Наверное многие, кто писал бота по моей предыдущей статье задались вопросом, что такое message и почему к примеру, чтобы отправить сообщение мы должны указать message.chat.id в параметрах функции send_message? Для того, чтобы узнать это давайте выведем message в консоль:

@bot.message_handler(commands=['start'])
def start(message):
    print(message)

Теперь когда мы вводим команду /start, наш бот присылает огромное кол-во информации. Все, что мы сейчас получили — это ответ в формате json. Json — это простой формат для хранения структурированных данных. Все выводится в формате: ‘ключ’: значение. Давайте посмотрим на то, что получил я:

{
    'content_type':'text',
    'message_id':573,
    'from_user':{
        'id':687595402,
        'is_bot':False,
        'first_name':'Dmitry',
        'username':'dimagorovtsov',
        'last_name':'Gorovtsov',
        'language_code':'ru'
    },
    'date':1565206363,
    'chat':{
        'type':'private',
        'last_name':'Gorovtsov',
        'first_name':'Dmitry',
        'username':'dimagorovtsov',
        'id':687595402,
        'title':None,
        'all_members_are_administrators':None,
        'photo':None,
        'description':None,
        'invite_link':None,
        'pinned_message':None,
        'sticker_set_name':None,
        'can_set_sticker_set':None
    },
    'forward_from_chat':None,
    'forward_from':None,
    'forward_date':None,
    'reply_to_message':None,
    'edit_date':None,
    'media_group_id':None,
    'author_signature':None,
    'text':'/start',
    'entities':[
        <telebot.types.MessageEntity object at 0x03807F50>
    ],
    'json':{
        'message_id':573,
        'from':{
            'id':687595402,
            'is_bot':False,
            'first_name':'Dmitry',
            'last_name':'Gorovtsov',
            'username':'dimagorovtsov',
            'language_code':'ru'
        },
        'chat':{
            'id':687595402,
            'first_name':'Dmitry',
            'last_name':'Gorovtsov',
            'username':'dimagorovtsov',
            'type':'private'
        },
        'date':1565206363,
        'text':'/start',
        'entities':[
            {
                'offset':0,
                'length':6,
                'type':'bot_command'
            }
        ]
    }
}

К примеру из всей этой информации мы хотим получить id чата, из которого я отправлял сообщение. Для этого обратимся к ключу chat.

Запрос:

print(message.chat)

Ответ:

{'type': 'private', 'last_name': 'Gorovtsov', 'first_name': 'Dmitry', 'username': 'dimagorovtsov', 'id': 687595402, 'title': None, 'all_members_are_administrators': None, 'photo': None, 'description': None, 'invite_link': None, 'pinned_message': None, 'sticker_set_name': None, 'can_set_sticker_set': None}

Смотрите, у ключа chat есть еще несколько ключей: first_name, last_name, username… и у каждого из них есть свои значения. Теперь обратимся к ключу id:

print(message.chat.id)

Как вы видите для того чтобы получить нужное значение необходимо просто записать название ключей через точку. А теперь смотрим на ответ от сервера:

687595402

Все идет как надо! Мы получили id чата, собственно как и хотели! А теперь получим имя отправителя. Тут, как вы заметили нужно использовать ключ from_user.

Запрос:

print(message.from_user)

Ответ:

{'id': 687595402, 'is_bot': False, 'first_name': 'Dmitry', 'username': 'dimagorovtsov', 'last_name': 'Gorovtsov', 'language_code': 'ru'}

Теперь достанем значение у ключа first_name:

print(message.from_user.first_name)

Ну вот и все! За пару секунд мы смогли получить id чата и мое имя в telegram. И еще раз, для тех кто не понял:

Чтобы получить значение ключа first_name, нам нужно сначала обратиться к ключу chat, а только потом уже к first_name!

Теперь смотрите, для того, чтобы отправить сообщение в какой-либо чат нам необходимо указать несколько параметров в функцию send_message. Первый параметр — это chat_id, собственно сам id чата. Второй — text, текст сообщения. И как вы догадались, вместо того, чтобы писать message.chat.id, мы можем написать свои данные! Вот так можно прислать сообщение самому себе, если указать в параметрах свой id:

bot.send_message(<ваш id>, 'Текст сообщения')

Ну а когда мы пишем message.chat.id, мы подразумеваем, что бот отправит сообщение в чат, из которого его вызвали.

Заключение

Ну а на этом всё! Надеюсь вы поняли как получать данные от сервера, обрабатывать их и использовать где нужно. Спасибо за внимание.

Telegram Bot — помощник в планировании мероприятий / Хабр

Всем привет 🙂

Хочу показать вам свою разработку и очень хотелось, чтобы эта вещь стала полезной не только мне и моему окружению, а всем-всем-всем.

И сразу к делу. Это бот для телеграмма. Называется он так: EventPlannerChecker

По этому имени вы его можете найти с помощью поиска в телеграмме.


Что он делает и кому может пригодится? Расскажу на своем примере зачем я его делал и почему начал применять.

Я люблю играть в футбол и состою в разных группах в вайбере и телеграмме, где разные люди объединяются для совместного «поиграть в футбол». И обычно сбор в таких группах происходит довольно просто:

-Ребята, сегодня играем, время 20:00, поле такое-то. Ставим плюсы и минусы.

И дальше в чат начинают сыпаться плюсы, минусы, обсуждения будущей игры и прочее. Сколько людей попадет на ивент — важно не только организатору. Многие игроки принимают решение о том идти или нет в зависимости от того, сколько человек уже отозвалось и кто отозвался. И ты начинаешь считать плюсы, минусы, пытаешься понять кто идет а кто нет и делаешь это не один раз за все время, пока идет сбор людей на ивент.

Я думаю с таким сталкивались многие, кто хоть раз где-то в группах собирал или сам собирался с чьей-то помощью на какие-то мероприятия.

И вот недавно я попал еще в одну футбольную группу, в которой ребята собирались на мероприятие с помощью бота. Он умел принимать реакции участников группы и отображать эти реакции в специальном сообщении.

Мне показалось это очень удобным, но я заметил ряд недостатков, которые этот бот создавал своей работой. И так как ребята были айтишниками, я предложил им внести кое какие изменения в код бота, чтобы он стал удобнее. И выяснилось, что это просто какой-то сторонний бот, к коду которого ребята не имели никакого отношения и править его не могли.

Ну а так как я уже имел дело с ботами, я понял — это мой шанс сделать еще что-то полезное и практичное для этого мира 🙂

Теперь соль:

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

Ивент создается очень просто. Вы пишите боту команду:

/event Название ивента 

Название указывать обязательно, т.к. пустые ивенты бот не хочет создавать.

У него принципы есть 🙂

Пример на скрине:

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

Вы можете спросить: «Зачем столько кнопок с галочками, крестиками, плюсами и минусами?».

Ими я покрываю все возможные варианты вашего участия в мероприятии:

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

Написан на java, крутится на амазоне.

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

Ну и надеюсь, что сфера применения бота не будет ограничена только футбольными группами. Он умеет собирать людей на любые мероприятия 🙂

Буду благодарен за любые отзывы и предложения 🙂

UPDATE от 11.11.19

Часто в личку спрашивают, как заставить этот бот работать в каналах.

Вот тут есть нюанс в работе телеграмма именно с каналами.

Боту не приходят сообщения, которые вы постите в канал.

А так как он не видит сообщений — он не сможет с ними работать. Он не может создать ивент в автоматическом режиме.

Как вариант можно сделать вариант команды, которая будет отправлять созданный ивент целенаправленно в указанное имя канала. Я над этим подумаю и возможно добавляю такую функцию.

Пока что на данный момент бот умеет работать только в группах\чатах.

Регистрация с помощью telegram бота / Хабр

Сейчас почти на всех сайтах есть регистрация. Реализована она чаще всего с помощью электронной почты, реже с помощью смс. А что если сделать регистрацию через телеграмму бота? В качестве пароля на сайте мы сможем установить подтвержденный номер телефона, а сам бот будет посылать одноразовые коды для входа. В данной статье описан процесс создания такого бота на языке Golang.

Пример работы бота

Хотелось бы сразу отметить: в статье не будет описана реализация входа на сайт по одноразовым кодам.

Весь код есть в репозитории на GitHub

UPD 07.02.2018: Вход на сайт с помощью Telegram теперь можно использовать с помощью Telegram Login Widget

Оглавление:

  1. Необходимое ПО
  2. Получение API ключа
  3. Структура проекта
  4. Файл настроек
  5. Инициализация бота и соединения с БД
  6. Основной код
  7. Запуск бота

Для начала нужно установить всё необходимое ПО:
Далее следует получить API ключ для нашего будущего бота.Для этого нужно написать боту BotFather. Что примерно должно получиться:

Перед тем как начать программировать нужно определится со структурой проекта, у меня она получилась такой:

  / project /
/ conf /
settings.go
/ src /
database.go
telegramBot.go
main.go
  

Приступаем к написанию кода! Для начала файла настроек (settings.go):

  const (
TELEGRAM_BOT_API_KEY = "вставьте сюда свой ключ" // ключ API, который мы получили у BotFather
MONGODB_CONNECTION_URL = "localhost" // Адрес сервера MongoDB
MONGODB_DATABASE_NAME = "regbot" // Название базы данных
MONGODB_COLLECTION_USERS = "users" // Название таблицы
)
  

Для каждого пользователя в БД хранятся: ид чата ( chat_id ) и номер мобильного телефона ( phone_number ).Поэтому сразу создаём структуру User :

  type User struct {
Chat_ID int64
Phone_Number строка
}
  

Соединение с MongoDB реализуем с помощью структуры DatabaseConnection :

  type DatabaseConnection struct {
Сессия * mgo.Session // Соединение с сервером
DB * mgo.Database // Соединение с базой данных
}
  

Бота представим в структурах TelegramBot :

  type TelegramBot struct {
API * tgbotapi.BotAPI // API телеграмма
Updates tgbotapi.UpdatesChannel // Канал обновлений
ActiveContactRequests [] int64 // ID чатов, от которых мы ожидаем номер
}
  

Функция инициализации соединения с MongoDB:

  func (connection * DatabaseConnection) Init () {
session, err: = mgo.Dial (conf.MONGODB_CONNECTION_URL) // Подключение к серверу
if err! = nil {
log.Fatal (err) // При ошибке прерываем выполнение программы
}
connection.Session = сеанс
db: = сеанс.DB (conf.MONGODB_DATABASE_NAME) // Подключение к базе данных
соединение.DB = db
}
  

Функция инициализации бота:

  func (telegramBot * TelegramBot) Init () {
botAPI, err: = tgbotapi.NewBotAPI (conf.TELEGRAM_BOT_API_KEY) // Инициализация API
if err! = nil {
log.Fatal (ошибка)
}
telegramBot.API = botAPI
botUpdate: = tgbotapi.NewUpdate (0) // Инициализация канала обновлений
botUpdate.Timeout = 64
botUpdates, err: = telegramBot.API.GetUpdatesChan (botUpdate)
if err! = nil {
журнал.Фатальный (ошибка)
}
telegramBot.Updates = botUpdates
}
  

Бот инициализируется, но делать он ещё ничего не умеет. Давайте двигаться дальше!

Следующий шаг — «основной цикл бота»:

  func (telegramBot * TelegramBot) Start () {
для обновления: = диапазон telegramBot.Updates {
if update.Message! = nil {
// Если сообщение есть -> начинаем обработку
telegramBot.analyzeUpdate (обновить)
}
}
}
  

Это бесконечный цикл. Обработка всех входящих сообщений начинается с него.В начале обработки мы должны проверить, есть ли пользователь у нас в базе. Нет — создаём и запрашиваем его номер, есть — продолжаем обработку.

  // Начало обработки сообщения
func (telegramBot * TelegramBot) анализироватьUpdate (обновить tgbotapi.Update) {
chatID: = update.Message.Chat.ID
if telegramBot.findUser (chatID) {// Есть ли пользователь в БД?
telegramBot.analyzeUser (обновить)
} else {
telegramBot.createUser (User {chatID, ""}) // Создаём пользователя
telegramBot.requestContact (chatID) // Запрашиваем номер
}
}

func (telegramBot * TelegramBot) findUser (chatID int64) bool {
find, err: = Соединение.Найти (chatID)
if err! = nil {
msg: = tgbotapi.NewMessage (chatID, "Произошла ошибка! Бот может работать неправильно!")
telegramBot.API.Send (сообщение)
}
вернуть находку
}

func (telegramBot * TelegramBot) createUser (пользователь Пользователь) {
err: = Connection.CreateUser (пользователь)
if err! = nil {
msg: = tgbotapi.NewMessage (user.Chat_ID, "Произошла ошибка! Бот может работать неправильно!")
telegramBot.API.Send (сообщение)
}
}

func (telegramBot * TelegramBot) requestContact (chatID int64) {
        // Создаём сообщение
requestContactMessage: = tgbotapi.NewMessage (chatID, «Согласны ли вы предоставить ваш номер телефона для регистрации в системе?»)
        // Создаём кнопку отправки контакта
acceptButton: = tgbotapi.NewKeyboardButtonContact ("Да")
DecButton: = tgbotapi.NewKeyboardButton ("Нет")
        // Создаём клавиатуру
requestContactReplyKeyboard: = tgbotapi.NewReplyKeyboard ([] tgbotapi.KeyboardButton {acceptButton, reduceButton})
requestContactMessage.ReplyMarkup = requestContactReplyKeyboard
telegramBot.API.Send (requestContactMessage) // Отправляем сообщение
telegramBot.addContactRequestID (chatID) // Добавляем ChatID в лист ожидания
}

func (telegramBot * TelegramBot) addContactRequestID (chatID int64) {
telegramBot.ActiveContactRequests = добавить (telegramBot.ActiveContactRequests, chatID)
}
  

Начальная обработка написана, теперь давайте напишем общение с базой данных:

  var Connection DatabaseConnection // Переменная, через которую бот будет обращаться к БД

// Проверка на существование пользователя
func (connection * DatabaseConnection) Find (chatID int64) (bool, error) {
коллекция: = соединение.DB.C (conf.MONGODB_COLLECTION_USERS) // Получаем коллекцию "пользователей"
count, err: = collection.Find (bson.M {"chat_id": chatID}). Count () // Считаем количество записей с заданным ChatID
если err! = nil || count == 0 {
вернуть ложь, ошибка
} else {
вернуть истину, ошибся
}
}

// Получение пользователя
func (соединение * DatabaseConnection) GetUser (chatID int64) (Пользователь, ошибка) {
var результат Пользователь
find, err: = connection.Find (chatID) // Сначала проверяем, существует ли он
if err! = nil {
вернуть результат, ошибка
}
if find {// Если да -> получаем
коллекция: = соединение.DB.C (конф.MONGODB_COLLECTION_USERS)
err = collection.Find (bson.M {"chat_id": chatID}). One (& результат)
вернуть результат, ошибка
} else {// Нет -> возвращаем NotFound
вернуть результат, mgo.ErrNotFound
}
}

// Создание пользователя
func (соединение * DatabaseConnection) Ошибка CreateUser (пользователь Пользователь) {
коллекция: = connection.DB.C (conf.MONGODB_COLLECTION_USERS)
err: = collection.Insert (пользователь)
вернуть ошибку
}

// Обновление номера мобильного телефона
func (connection * DatabaseConnection) UpdateUser (пользователь Пользователь) error {
коллекция: = соединение.DB.C (конф.MONGODB_COLLECTION_USERS)
err: = collection.Update (bson.M {"chat_id": user.Chat_ID}, & пользователь)
вернуть ошибку
}
  

Это все функции, которые нам пригодятся. Для бота осталось написать функции продолжения обработки сообщения и анализа контакта:

  func (telegramBot * TelegramBot) analysisUser (обновить tgbotapi.Update) {
chatID: = update.Message.Chat.ID
user, err: = Connection.GetUser (chatID) // Вытаскиваем данные из БД для проверки номера
if err! = nil {
сообщение: = tgbotapi.NewMessage (chatID, "Произошла ошибка! Бот может работать неправильно!")
telegramBot.API.Send (сообщение)
возвращение
}
если len (user.Phone_Number)> 0 {
msg: = tgbotapi.NewMessage (chatID, "Ваш номер:" + user.Phone_Number) // Если номер у нас уже есть, то пишем его
telegramBot.API.Send (сообщение)
возвращение
} else {
// Если номера нет, то проверяем ждём ли мы контакт от этого ChatID
если telegramBot.findContactRequestID (chatID) {
telegramBot.checkRequestContactReply (update) // Если да -> проверяем
возвращение
} else {
telegramBot.requestContact (chatID) // Если нет -> запрашиваем его
возвращение
}
}
}

// Проверка принятого контакта
func (telegramBot * TelegramBot) checkRequestContactReply (обновить tgbotapi.Update) {
если update.Message.Contact! = nil {// Проверяем, содержит ли сообщение контакт
если update.Message.Contact.UserID == update.Message.From.ID {// Проверяем действительно ли это контакт отправителя
telegramBot.updateUser (Пользователь {update.Message.Chat.ID, update.Message.Contact.PhoneNumber}, update.Message.Chat.ID) // Обновляем номер
telegramBot.deleteContactRequestID (update.Message.Chat.ID) // Удаляем ChatID из списка ожидания
msg: = tgbotapi.NewMessage (update.Message.Chat.ID, «Спасибо!»)
msg.ReplyMarkup = tgbotapi.NewRemoveKeyboard (false) // Убираем клавиатуру
telegramBot.API.Send (сообщение)
} else {
msg: = tgbotapi.NewMessage (update.Message.Chat.ID, «Номер телефона, который вы предоставили, принадлежит не вам!»)
telegramBot.API.Send (сообщение)
telegramBot.requestContact (update.Message.Chat.Я БЫ)
}
} else {
msg: = tgbotapi.NewMessage (update.Message.Chat.ID, «Если вы не предоставите ваш номер телефона, вы не сможете пользоваться системой!»)
telegramBot.API.Send (сообщение)
telegramBot.requestContact (update.Message.Chat.ID)
}
}

// Обновление номера мобильного телефона пользователя
func (telegramBot * TelegramBot) updateUser (пользователь User, chatID int64) {
err: = Connection.UpdateUser (пользователь)
if err! = nil {
msg: = tgbotapi.NewMessage (chatID, "Произошла ошибка! Бот может работать неправильно!")
telegramBot.API.Send (сообщение)
возвращение
}
}

// Есть ChatID в листе ожидания?
func (telegramBot * TelegramBot) findContactRequestID (chatID int64) bool {
for _, v: = диапазон telegramBot.ActiveContactRequests {
if v == chatID {
вернуть истину
}
}
вернуть ложь
}

// Удаление ChatID из листа ожидания
func (telegramBot * TelegramBot) deleteContactRequestID (chatID int64) {
для i, v: = диапазон telegramBot.ActiveContactRequests {
if v == chatID {
копия (telegramBot.ActiveContactRequests [i:], telegramBot.ActiveContactRequests [i + 1:])
telegramBot.ActiveContactRequests [len (telegramBot.ActiveContactRequests) - 1] = 0
telegramBot.ActiveContactRequests = telegramBot.ActiveContactRequests [: len (telegramBot.ActiveContactRequests) - 1]
}
}
}
  

Наш бот готов к работе! Осталось только его запустить. Для этого в main.go пишем:

  var telegramBot src.TelegramBot

func main () {
src.Connection.Init () // Инициализация соединения с БД
telegramBot.Init () // Инициализация бота
telegramBot.Start ()
}
  

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

Несомненно у данной системы есть минусы, самый очевидный из которых: зависимость от Telegram (изменение API, блокировка). По мне это хорошая альтернатива e-mail и sms, будете ли вы использовать её — решать вам. Спасибо за внимание!

.

Telegram — регистрация и настройка бота

Переписываю старую статью дабы более полно отделить и структурировать информацию. В данной статье речь пойдет о создании своего собственного бота и приглашение его в чат!

Создаем бота

Находим в мессенджере @botfather и пишем в нем команду / newbot , заполняем необходимые параметры.В чате @botfather появится токен нашего свежеиспеченного бота, который понадобится нам чуть ниже.

@botfather ругнулся на существующее имя бота и пришлось подбирать другое. В конце боту присвоился токен. Теперь создадим чат и пригласим в него бота!

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

Создаем чат и приглашаем в него бота

Чат создается в пару кликов.В главном меню выбираем НОВЫЙ КАНАЛ и заполняем имя и адрес. Можно отправлять текст на имя чата — публичный чат и на его id — приватный! Теперь заходим на бота и активируем его, будет кнопка или можно командой / start

Через меню бота находим пункт меню Добавить в группу и вступаем в только что созданный чат. На этом для публичного чата подготовка завершена, но если у вас приватный чат, присылать сообщения на имя чата не получится и понадобится его id. Чтобы его узнать, пишем в чат с приглашенным ботом любой текст и следуем по ссылке:

https://api.telegram.org/bot273805635:AAGQOuPVadtQyEx0COPrDnq2r-YmUo90xaU/getUpdates

Красный токен меняете на тот, который выдал @bothfather . Если все сделано правильно, страница отобразит примерно следующие объекты в формате JSON, где нам понадобится лишь айди чата.

Форма для отправки

Вынес код в отдельной статье: / 676-телеграмма-настраиваем-передачу-данных-из-формы-на-сайте-в-чате.html

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *