Доступ к бд через Телеграмм

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

В данной статье мы создадим общедоступную доску объявлений. Особенностью этой доски будет то, что пользователи смогут посылать свои объявления Telegram-боту, не заходя на сам сайт.

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

Необходимые приготовления

Для получения максимальной пользы от этого руководства читателю нужно:

  • знать язык программирования Python
  • иметь аккаунт в Телеграм и установить клиентскую часть на свой компьютер
  • иметь аккаунт в Replit или создать его прямо сейчас.

Также было бы полезно, если бы вы были знакомы с базой данных Replit, но это не критично.

Получаем доступ к базе данных

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

Для начала нам нужно зарегистрировать нашего бота в Telegram, чтобы сгенерировать учетные данные, которые мы будем использовать для подключения к Telegram API. Каждый бот должен быть привязан к конкретной учетной записи пользователя. Это можно сделать с помощью официального управляющего бота Telegram под названием «BotFather».

bot father

Для активации BotFather нажмите на кнопку Start :

bot father start

Для начала рабочего процесса создания нового бота мы должны отправить в BotFather команду /newbot .

Бот у нас спросит следующие данные:

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

token

Как только мы ответим на все вопросы, BotFather отправит нам наш токен аутентификации, который будет выглядеть примерно так:

Обратите внимание, что вся строка (до двоеточия и после) является токеном.

Создание интерфейса бота

Теперь мы можем приступить к написанию той части программы, которая обрабатывает запросы из Telegram. Создадим новую repl-среду, а в качестве языка программирования выберем Python.

new repl

Наш бот должен взаимодействовать с Telegram. Для этого нам понадобится доступ к Telegram REST API. Есть много способов сделать это, но в рамках данной статьи мы будем использовать удобную библиотеку, обернутую обернута вокруг API.

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

env variables

Это гарантирует, что наш токен доступен как переменная среды и что к нему не смогут получить доступ люди, имеющие доступ к нашей среде repl (в бесплатной версии она открыта для всех, — прим. переводчика).

Еще по теме:  Посмотреть заблокированный канал в ТГ

Создание скелета бота

Теперь, когда все настроено, мы можем приступить к программированию! Начнем с нашего файла main.py :

import os from telegram import Update #upm package(python-telegram-bot) from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext #upm package(python-telegram-bot) def help_command(update: Update, context: CallbackContext) -> None: htext = »’ Welcome Send a message to store it. Send /fetch to retrieve the most recent message»’ update.message.reply_text(htext) def main(): updater = Updater(os.getenv(«TOKEN»)) dispatcher = updater.dispatcher dispatcher.add_handler(CommandHandler(«start», help_command)) dispatcher.add_handler(CommandHandler(«help», help_command)) updater.start_polling() updater.idle() if __name__ == ‘__main__’: main()

Сначала мы импортируем модуль os , чтобы получить доступ к токену как переменной окружения.

Затем мы импортируем некоторые классы из библиотеки Telegram.

Комментарии, начинающиеся с #upm , не являются обязательными. Они используются Replit для загрузки правильного пакета. В общем случае это не нужно, но здесь необходимо, потому что подобных библиотек Telegram очень много.

Функция help_command запускается всякий раз, когда пользователь отправляет нам команду /start или /help . Команда /start также выполняется автоматически, когда новый пользователь запускает ваш бот (как мы ранее запускали BotFather ). Бот будет знать, как использовать эту функцию, потому что мы сообщим ему об этом позже в теле функции main .

В функции main мы инициализируем экземпляр класса updater , который использует наш токен.

updater = Updater(os.getenv(«TOKEN»))

Updater — это класс, который будет постоянно проверять Telegram на наличие новых сообщений в нашем боте.

Когда updater получает новое сообщение, он передает его в класс dispatcher . Тот проверяет, есть ли у нас подходящий обработчик для данного сообщения. Как уже упоминалось выше, нужно задать обработчик для команд /start и /help . Мы cделаем это при помощи функции add_handler , например:

dispatcher.add_handler(CommandHandler(«start», help_command))
dispatcher.add_handler(CommandHandler(«help», help_command))

Чтобы не усложнять задачу, команда /start и команда /help имеют здесь один и тот же обработчик, но при желании для обработки каждой из них вы можете использовать разные функции.

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

updater.start_polling()

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

Другими словами, если мы оставим это в качестве последней строки функции main , код будет выполнен, а затем немедленно завершится, потому что больше ничего не блокирует его. Поэтому, чтобы наш бот не прекращал прослушку, мы используем строку updater.idle() , чтобы заблокировать скрипт, пока мы слушаем.

Функционал для логирования

Согласно тексту справки, бот должен уметь делать две вещи:

  1. Если вы отправляете сообщение боту, он должен где-то его сохранить.
  2. При отправке боту команды /fetch он должен отправить вам последнее сообщение.
Еще по теме:  Как снять теневой бан в дайвинчике Телеграм

Для этого мы будем использовать встроенную в Replit базу данных ключ-значение. Начнем с импорта API:

from replit import db

Модуль db — это объект, который ведет себя как словарь, но сохраняет свое содержимое между запусками. Он также сериализует свои ключи в виде строк.

Получаем доступ к любым книгам через Telegram

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

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

Получаем доступ к любым книгам через Telegram

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

В настройках собственной группы выбираем вкладку «Администраторы» и присваиваем боту привилегии, изображенные на скриншоте ниже. Иначе никакой функционал работать не будет:

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

Для чтения книг подобного формата на телефоне можно воспользоваться к примеру данным приложением или же любым другим аналогом:

Источник: mipped.com

Авторизация пользователей через Telegram

Александр Менщиков

Недавно Telegram добавил поддержку виджета для авторизации пользователей на сайте. Мы решили поэкспериментировать с ним и составить простую инструкцию, как настроить такую авторизацию самостоятельно.

В качестве примера будем использовать код на PHP, однако, данные шаги актуальны и для других языков программирования.

Настройка бота

Для использования виджета вам понадобится Telegram-бот.

Скопируйте токен бота, через которого вы хотите производить авторизацию пользователей.

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

Настройка виджета

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

Встраивание на сайт

После того, как пользователь нажмёт на кнопку, Telegram готов отправить вам данные любым из двух способов:

  • Отправить пользователя на ваш сайт путём редиректа, передав информацию о нём в GET параметрах.
  • Вызвать JavaScript функцию, передав в неё информацию о пользователе в качестве аргументов.

На данный момент поддерживаются следующие данные о пользователе:

  • id – уникальный идентификатор пользователя в Telegram
  • first_name, last_name – фамилия и имя из профиля пользователя
  • username – уникальное имя из профиля
  • photo_url – ссылка на аватарку пользователя в виде https://t.me/i/. /user.jpg
  • auth_date – дата авторазации
  • hash – HMAC-подпись ответа на основе секретного токена бота
Еще по теме:  Зачем удалять чат в Телеграмме

Получение данных через JavaScript callback

Выберите в конструкторе виджета опцию Authorization Type: Callback. Сгенерированный в результате код виджета содержит JavaScript функцию, которая будет вызвана после успешной авторизации.

Эту функцию нужно передать в аттрибуте data-onauth тега

Вы можете произвольным образом реализовать функцию onTelegramAuth. Например, послать AJAX запрос на сервер с полученными аргументами.

Получение данных через Redirect

Выберите в конструкторе виджета опцию Authorization Type: Redirect to URL и введите URL, на который вы хотите получить запрос с данными пользователя. Например, введите адрес http://example.com/auth/telegram.

На странице обработки можно положить скрипт index.php следующего содержания:

Проверка данных пользователя

Чтобы удостовериться в правильности полученных данных, нужно проверить hash. Разработчики Telegram приводят пример кода проверки, добавим эту функцию в код из файла index.php

function checkTelegramAuthorization($auth_data) < $check_hash = $auth_data[‘hash’]; unset($auth_data[‘hash’]); $data_check_arr = []; foreach ($auth_data as $key =>$value) < $data_check_arr[] = $key . ‘=’ . $value; >sort($data_check_arr); $data_check_string = implode(«n», $data_check_arr); $secret_key = hash(‘sha256’, BOT_TOKEN, true); $hash = hash_hmac(‘sha256’, $data_check_string, $secret_key); if (strcmp($hash, $check_hash) !== 0) < throw new Exception(‘Data is NOT from Telegram’); >if ((time() — $auth_data[‘auth_date’]) > 86400) < throw new Exception(‘Data is outdated’); >return $auth_data; >

Разберём механизм работы функции проверки. В качестве аргумента она получает массив с данными пользователя.

array(7) < [«id»]=>string(7) «1831337» [«first_name»]=> string(18) «Александр» [«last_name»]=> string(16) «Менщиков» [«username»]=> string(5) «n0str» [«photo_url»]=> string(36) «https://t.me/i/userpic/100/n0str.jpg» [«auth_date»]=> string(10) «1518168109» [«hash»]=> string(64) «abba<..>1345» >

На первом шаге из массива извлекается значение по ключу hash и сохраняется в переменной.

На втором шаге массив преобразуется к виду key=value и сортируется в лексикографическом порядке. Полученные данные склеиваются в одну строку через разделитель “n” (код символа – 0xA0).

Далее происходит проверка равенства HMAC-SHA-256 подписи этой строки и значения сохранённого hash. Дополнительно проверяется не устарела ли auth_date.

В случае успеха, функция возвращает исходный массив без параметра hash.

Авторизация пользователя на сайте

Добавим в файл код вызова функции проверки

if (isset($_GET[‘hash’])) < try < $auth_data = checkTelegramAuthorization($_GET); echo «Hello, » . $auth_data[‘username’]; >catch (Exception $e) < die ($e->getMessage()); > >

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

Пример кода из рабочего проекта

try < $profile = $tg->checkTelegramAuthorization($_GET); $id = $profile[‘id’]; $user = Model_User::findByAttribute(‘telegram_id’, $id); if ($user->is_empty()) < $user = new Model_User(); $user->telegram_id = $id; . $user->save() > else < . >>

Кастомизация кнопки

Сейчас из-за ограничений iframe нельзя изменить внешний вид кнопки. Однако, если возникла сильная необходимость, можно обойти это ограничения с помощью clickjacking.

Рейтинг
( Пока оценок нет )
Загрузка ...