Как подключить api к Телеграмм боту

Последнее время начал увлекаться разработкой приложений на Node.JS. Понравился своей гибкостью и тем, что приложения можно писать на JavaScript, а с ним я хоть немного дружу.

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

И в этой статье я коротко расскажу о том, как создать своего бота на Node.JS. Кстати, вот ссылка на репозиторий бота.

Если вы открыли чат с ботом, кликаем на кнопку «Start».

После чего, бот нам выдает все доступные команды.

Отправляем команду /newbot или кликаем по активной ссылке этой команды. Далее, бот нас попросить ввести имя для нашего бота.

Можете не париться с именем и вписать любое тестовое имя. Плюс в том, что вы в любой момент сможете удалить тестового бота или поменять имя.

Я решил во время статьи создать бота для этого блога и назвал его «Archakov Blog».

Как получить токен бота Telegram API и подключить бота к платформе

На последнем этапе, бот попросит вас придумать никнейм (логин). К никнейму в конце обязательно надо добавить суффикс «bot» можно и «Bot». К сожалению, никнейм поменять больше не получится. Если это ваш первый бот, не парьтесь и придумайте любой никнейм.

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

[info] Не советую делиться токеном с другими людьми. Так как он дает полный доступ к вашему боту. Начиная от редактирования имени и до удаления бота.

Теперь приступим к написанию кода и первым делом установим Node.JS. У меня OS X и хочу предупредить, что от операционной системы не будет зависеть разработка нашего бота.

Как установить Node.JS рассказывать я не хочу и не буду. Для этого обращаемся к гугл с запросом как установить Node.JS.

После того, как установили Node.JS, начинаем разрабатывать наше приложение, а точней бота. Node.JS ищет в каждой папке наличие папки node_modules с модулями, откуда он и будет подключать библиотеку для работы с Telegram API.

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

Создаем папку с тестовым проектом, к примеру telegram-bot . Далее, в этой папке создаем файл index.js и все! Вы красавчик! Бот создан, можете работать с ним.

Ага, канешна. Код сам не напишется!

Прежде чем его и писать, установим модуль node-telegram-bot-api . Для этого открываем консоль, пропишем путь к директории нашего проекта cd telegram-bot (укажите полный путь к этой папке).

Еще по теме:  Куда скачивает видео Телеграмм на Андроид

В моем случае, это cd /Applications/MAMP/htdocs/telegram-bot .

Если вы на Windows, советую создавать папку в корне диска, чтобы можно было обращаться к проекту по короче, к примеру cd C:telegram-bot .

[Java] Как создать Telegram бота | Подключаемся к Telegram Bot API

Отлично, теперь не забываем про npm . В консоли вбиваем команду: npm install node-telegram-bot-api или yarn add node-telegram-bot-api (в зависимости от того, что вы используете yarn или npm).

И через несколько секунд модуль установился. Ура! В репозитории уже есть пример кода и с помощью этого кода, сделаем своего мега-тру-бота.

Теперь перейдем к файлу index.js и напишем немного кода.

Источник: archakov.im

Футбольный телеграм бот на Python (3/4): Получение внешних данных

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

Выбор API для результатов матчей

Обычно я использую Rapid API для получения данных, там много бесплатных предложений. Под нашу задачу хорошо подходит Football Pro. Они дают 100 запросов в день, и возможность получить все результаты за раз.

Зарегистрируйтесь на Rapid Api, создайте приложение и оформите подписку на базовый (бесплатный) план. Сервис бесплатный, но для продолжения требуется карта.

Футбольный телеграм бот на Python (3/4): Получение внешних данных

Отлично, теперь можно следить за Лигой Чемпионов.

Получение данных с внешнего API

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

Посмотрим в каком виде приходят данные в ответе с помощью интерфейса сервиса. Во вкладке «Endpoints» слева выберем «Fixtures of Today» и нажмем «Test Endpoint». Ответ появится в правом столбце.

данные в ответе

Вот эти строки мы будем использовать для каждого матча:

< . «league_id»:998 . «scores»:< . «ht_score»:»0-0″ «ft_score»:»1-1″ . >»time»: < «status»:»FT» «starting_at»:< «time»:»08:00:00″ . >»minute»:90 . «added_time»:NULL . > . «localTeam»: < «data»:< . «name»:»Hadiya Hosaena» . >> «visitorTeam»: < «data»:< . «name»:»Kedus Giorgis» . >> >

Для отправки запросов нужно установить библиотеку requests: pip install requests==2.25.1 .

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

TODO для вас. Настройте отправку сообщения админу, если fetch_results вернула словарь с ключом «error» .

# fonlinebot/app/service.py import requests import logging from config import BOT_LEAGUES, BOT_LEAGUE_FLAGS, MINUTE, SOCCER_API_URL, SOCCER_API_HEADERS, SOCCER_API_PARAMS # . def limit_control(headers): «»»Контроль бесплатного лимита запросов»»» if headers.get(«x-ratelimit-requests-remaining») is None: logging.error(f»Invalid headers response «) if int(headers[‘x-ratelimit-requests-remaining’]) dict: SOCCER_API_PARAMS[‘leagues’] = «,».join(BOT_LEAGUES.keys()) try: resp = requests.get(SOCCER_API_URL, headers=SOCCER_API_HEADERS, params=SOCCER_API_PARAMS) except requests.ConnectionError: logging.error(«ConnectionError») return limit_control(resp.headers) if resp.status_code == 200: return resp.json() else: logging.warning(f»Data retrieval error []. Headers: «) return #.

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

Еще по теме:  Как архивировать группу в Телеграм

Проверку разместим в generate_results_answer . Если запись есть, мы вернем предупреждение.

# fonlinebot/app/service.py #. async def generate_results_answer(ids: list) -> str: «»»Функция создaет сообщение для вывода результатов матчей»»» limit = cache.get(«limit_control») if limit is not None: return limit results = await get_last_results(ids) if results == [[]]*len(ids): return msg.no_results elif msg.fetch_error in results: return msg.fetch_error else: text_results = results_to_text(results) return msg.results.format(matches=text_results) #.

А теперь обновите «bot.py» и «dialogs.py».

Я дописал в функцию 2 строки для проверки answer . Если в ответе текст превышения лимита мы показываем предупреждение.

# fonlinebot/app/dialogs.py #. limit_control: str = «Лимит запросов исчерпан. Возвращайтесь завтра.» fetch_error: str = «Ошибка получения данных, попробуйте позже.» #.

Можете добавить такую запись на минуту и убедиться.

cache.setex(«limit_control», 60, msg.limit_control)

Футбольный телеграм бот на Python (3/4): Получение внешних данных

На самом деле лимит начисляется каждые 24 часа с момента подписки. Если вы подписались в 13:00, значит это время обновления остатка. В заголовках ответа по ключу x-ratelimit-requests-reset можно получить остаток времени в секундах.

Очистка данных API и сохранение

Теперь напишем функцию которая распарсит ответ для сохранения в кеш.

TODO для вас. Не всегда нужно обновлять матчи. Например, мы в 8 утра получили список и первый матч начнется в 19.00. До начала первого матча результаты не изменятся, здесь можно сэкономить запросы.

# fonlinebot/app/service.py #. async def parse_matches() -> dict: «»»Функция сбора матчей по API»»» data = <> matches = fetch_results() if matches.get(«error», False): return matches for m in matches[‘data’]: if not data.get(str(m[‘league_id’]), False): data[str(m[‘league_id’])] = [m] else: data[str(m[‘league_id’])].append(m) return data #.

Эту функцию мы вызываем в get_last_results , если не нашли результатов в кеше. Давайте туда допишем сохранение последних результатов:

# fonlinebot/app/service.py #. async def save_results(matches: dict): «»»Сохранение результатов матчей»»» for lg_id in BOT_LEAGUES.keys(): cache.jset(lg_id, matches.get(lg_id, []), MINUTE) async def get_last_results(league_ids: list) -> list: last_results = [cache.jget(lg_id) for lg_id in league_ids] if None in last_results: all_results = await parse_matches() if all_results.get(«error», False): return [msg.fetch_error] else: await save_results(all_results) last_results = [all_results.get(lg_id, []) for lg_id in league_ids] return last_results #.

Если по какой-то лиге у нас нет записи, мы обращаемся к API и сохраняем результат на 1 минуту.

Запись логов в файл

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

# fonlinebot/config.py #. formatter = ‘[%(asctime)s] %(levelname)8s — %(message)s (%(filename)s:%(lineno)s)’ logging.basicConfig( # TODO раскомментировать на сервере # filename=f’bot-from-.log’, # filemode=’w’, format=formatter, datefmt=’%Y-%m-%d %H:%M:%S’, # TODO logging.WARNING level=logging.DEBUG ) #.

Теперь строка будет выглядеть так. Появилось время и место лога:

[2021-02-05 11:38:29] INFO — Database connection established (database.py:38)

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

Красивый вывод сообщения пользователю

Хорошо, мы получили список словарей с множеством данных. Его нужно превратить в текст формата:

Английская Премьер-лига Окончен Тоттенхэм 0:1 (0:1) Челси

Форматирование реализуем в results_to_text .

# fonlinebot/app/service.py #. def add_text_time(time: dict) -> str: «»»Подбор текста в зависимости от статуса матча Все статусы здесь: https://sportmonks.com/docs/football/2.0/getting-started/a/response-codes/85#definitions «»» scheduled = [«NS»] ended = [«FT», «AET», «FT_PEN»] live = [«LIVE», «HT», «ET», «PEN_LIVE»] if time[‘status’] in scheduled and time[‘starting_at’][‘time’] is not None: # обрезаем секунды return time[‘starting_at’][‘time’][:-3] elif time[‘status’] in ended: return «Окончен» elif time[‘status’] in live and time[‘minute’] is not None: if time[‘extra_minute’] is not None: return time[‘minute’] + time[‘extra_minute’] return time[‘minute’] else: # для других статусов возвращаем заглушку return «—:—» def results_to_text(matches: list) -> str: «»» Функция генерации сообщения с матчами Получает list[list[dict]]] Возвращает текст: | Английская Премьер-лига | | Окончен Тоттенхэм 0:1 (0:1) Челси | . «»» text = «» for lg_matches in matches: if not lg_matches: continue lg_flag = BOT_LEAGUE_FLAGS[str(lg_matches[0][‘league_id’])] lg_name = BOT_LEAGUES[str(lg_matches[0][‘league_id’])] text += f» n» for m in lg_matches: text += f»7> » if m[‘localteam_id’] == m[‘winner_team_id’]: text += f»** » else: text += f» » if m[‘time’][‘minute’] is not None: text += f»- » else: text += «— » if m[‘scores’][‘ht_score’] is not None: text += f»() » if m[‘visitorteam_id’] == m[‘winner_team_id’]: text += f»**n» else: text += f»n» text += «n» return text #.

Еще по теме:  Как в Телеграмме сделать переход по ссылке на другой браузер

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

# fonlinebot/app/bot.py #. async def get_results(message: types.Message): #. await message.answer(answer, reply_markup=s.results_kb(user_leagues), parse_mode=types.ParseMode.MARKDOWN) # . async def update_results(callback_query: types.CallbackQuery): # . await bot.edit_message_text( answer, callback_query.from_user.id, message_id=int(cache.get(f»last_msg_»)), parse_mode=types.ParseMode.MARKDOWN, reply_markup=s.results_kb(user_leagues) )

Запустим и проверим, как работает бот:

TODO для вас.
1. Получение данных может длится несколько секунд, добавьте chat_action . Это текст, который отображается сверху во время выполнения кода.
2. Не всегда обновление результатов меняет сообщение, это приводит к ошибке. Пусть сообщение не редактируется, если текст дублирует старый.

Теперь допишем немного тестов и пойдем деплоить.

Тестирование бота

Будем проверять работоспособность API и контроль лимита.

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

Создайте своего первого Telegram-бота на базе ChatGPT: Пошаговое руководство 2023

Руководство не рабочее, не понятно какой код куда вставлять.

Развернуть ветку

что именно не работает ? python какой версии ?

Развернуть ветку

Ндамс. Совсем даже не для чайников текст ) Где создавать, что запускать, куда что вводить) а так — да, наверн полезная инструкция.

Развернуть ветку

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

Развернуть ветку

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

Развернуть ветку

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

Если с гитхаба клонирую проект вставляю ключи работает, но chatgp не отвечает, может быть там на узбекском нужно я не знаю.

И вот это тоже не понятно что такое (ENTRY_STATE,
QUESTION_STATE,
) = range(2)

Развернуть ветку

Эта инструкция видимо очень сложная для моего уровня владения python

Развернуть ветку

попробуйте сначала самые азы

Развернуть ветку
Развернуть ветку

Самый прикол что мне chat gp нужен чтобы питон учить)))

Развернуть ветку

Можно по подробнее для чайников?

Источник: vc.ru

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