Бот в Телеграмме для отслеживания местоположения

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

Бота я реализовал с помощью фреймворка telegraf.js для node.js. Бот называется UKRentBot доступен для всех желающих. Исходный код находится на GitHub по ссылке https://github.com/VeXell/UKRentHomeHunter. В этой статье я хотел бы рассказать как создавался этот бот и как по аналогии можно создавать других ботов.

Telegram предоставляет прекрасное api которое позволяет создавать ботов с разным функционалом. К этому api уже написано множество разных фреймфорков которые позволяют с ним взаимодействовать и упрощают работу. Я взял telegraf.js из-за того, что он один из самых популярных, имеет поддержку Typescript и постоянно обновляется под новое api Telegram. В качестве базы данных я решил попробовать использовать Google Firebase Database которая отлично подходит для создания MVP проектов или небольших приложений как у меня. Она доступна из коробки и не требует какой-то установки на собственный сервер.

Прежде всего, перед созданием бота, необходимо обратится к BotFather боту https://t.me/botfather который отвечает за создание новых ботов. После заполнения минимального количества полей вам будет доступен api ключ для выполнения запросов к Telegram api.

Теперь можно приступить к разработке. Ниже представлен листинг файла инициализации бота и подключение библиотеки локализации.

import ‘./env’; import from ‘telegraf’; import TelegrafI18n from ‘telegraf-i18n’; import from ‘types’; // Read ENV variables import from ‘config’; import enLocale from ‘./locales/en’; import ruLocale from ‘./locales/ru’; import from ‘actions’; import from ‘wizards’; import from ‘jobs’; import from ‘services/db’; initDatabase(FIREBASE_AUTH, DATABASE); const i18n = new TelegrafI18n(< defaultLanguage: ‘en’, allowMissing: true, useSession: true, defaultLanguageOnMissing: true, >); i18n.loadLocale(‘en’, enLocale); i18n.loadLocale(‘ru’, ruLocale); const bot = new Telegraf(BOT_TOKEN); bot.use(session()); bot.use(i18n.middleware()); initWizards(bot); initActions(bot); // Start bot bot.launch();

Telegram api поддерживает различные команды, действия и сцены которые можно реализовать как форму с шагами (визарды). Например, в функции initActions я сделал начальную инициализацию всех действий.

export function initActions(bot: Telegraf) < // Две обязательные команды для бота bot.start(actionStart); bot.help(actionHelp); // Быстрое меню bot.settings(async (ctx) =>< await ctx.setMyCommands([ < command: GLOBAL_ACTIONS.search, description: ctx.i18n.t(`actions.$`), >, < command: GLOBAL_ACTIONS.searches, description: ctx.i18n.t(`actions.$`), >, < command: GLOBAL_ACTIONS.share, description: ctx.i18n.t(`actions.$`), >, ]); >); bot.command(GLOBAL_ACTIONS.search, actionSearch); // Остальные команды описаны ниже // Кнопки можно делать указывая RegExp формат // Я использую такие действия для удаления заданного поиска bot.action(new RegExp(`$_(?.*)?$`), actionRemove); >

При команде /start я вывожу основную информацию по боту, а также основные действия с ним.

Основное действие бота происходит в функции actionSearch в которой я запускаю визадр для опроса пользователя какую недвижимость он хочет найти.

export default async function actionSearch(ctx: TelegrafContext) < const message = ctx.i18n.t(«wizardSearch.intro»); const chatId = ctx.from?.id; if (chatId) < // Сохраняем данные в БД updateChat(chatId, < firstName: ctx.from?.first_name || «», lastName: ctx.from?.last_name || «», username: ctx.from?.username || «», language: ctx.from?.language_code || «», >); try < const activeSearches = await getSearches(chatId); ctx.session.activeSearches = activeSearches; if ( activeSearches Object.keys(activeSearches).length >= MAX_SEARCHES ) < // Не больше 3 поисков за раз return ctx.replyWithMarkdown( ctx.i18n.t(«error.maxSearchesReached», < maxSearches: MAX_SEARCHES, >), Markup.inlineKeyboard([ Markup.button.callback(» My Searches», GLOBAL_ACTIONS.searches), ]) ); > else < await ctx.replyWithMarkdown(message, Markup.removeKeyboard()); // Входим в визард return ctx.scene.enter(SEARCH_WIZARD_TYPE); >> catch (error) < console.log(«error»); >> else < return ctx.replyWithMarkdown( ctx.i18n.t(«error.emptyChatId»), Markup.removeKeyboard() ); >>

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

Еще по теме:  Ватсап и Телеграмм как правильно пишется

export function initWizards(bot: Telegraf) < // Инициализация сцен const stage = new Scenes.Stage([searchWizard]); // Глобальная команда для отменя визарда поиска stage.action(ACTIONS.CANCEL, (ctx) => < ctx.reply(ctx.i18n.t(«operationCanceled»)); return ctx.scene.leave(); >); stage.command(ACTIONS.CANCEL, (ctx) => < ctx.reply(ctx.i18n.t(«operationCanceled»)); return ctx.scene.leave(); >); bot.use(stage.middleware()); >

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

export default new Scenes.WizardScene( WIZARD_TYPE, async (ctx) => < const chatId = ctx.chat?.id; ctx.scene.session.search = < chatId, >; await ctx.replyWithMarkdown( ctx.i18n.t(«wizardSearch.actions.location») ); return ctx.wizard.next(); >, processLocation, // Other actions. );

В функции processLocation ниже как раз и происходит обработка ввода. Если все прошло успешно, то необходимо вызывать следующую сцену с помощью метода wizard.next() .

export default async function processLocation(ctx: TelegrafContext) < try < if ( !ctx.message || !(«text» in ctx.message) || ctx.message.text.length try < const location = await detectLocation(ctx.message.text); ctx.scene.session.search.area = location.locationName; ctx.scene.session.search.searchAreaId = location.locationId; >catch (error) <> if (!ctx.scene.session.search.area) < throw new NoLocationFoundError( ctx.i18n.t(«wizardSearch.errors.locationNotFound») ); >let locationAlreadyInSearch = false; if (ctx.session.activeSearches) < const searches = ctx.session.activeSearches; Object.keys(searches).forEach((key) => < const searchObject = searches[key]; if ( searchObject.searchAreaId === ctx.scene.session.search.searchAreaId ) < locationAlreadyInSearch = true; >>); > if (locationAlreadyInSearch) < throw new LocationAlreadyInSearchError( ctx.i18n.t(«wizardSearch.errors.locationAlreadyInSearch», < location: ctx.scene.session.search.area, >) ); > // После все валидации данных переходим на след шаг. await askForDistance(ctx); return ctx.wizard.next(); > catch (error) < return cancelSearchReply(ctx, error.message); >>

Ниже показан результат визарда бота. Пользователь в любой момент может отменить поиск с помощью команды /cancel

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

export function saveSearch( searchRequest: ISearchRequestInput ): Promise < const searchesListRef = getDB().ref(`$/$`); const searchRef = searchesListRef.push(); return searchRef.set(< . searchRequest, . < createdAt: moment.utc().format(), expiredAt: moment.utc().add(30, «days»).format(), lastSearchAt: null, >, >); > export async function getSearches( chatId: number ): Promise < const searchesList = await getDB().ref(`$/$`).get(); if (searchesList.exists()) < return searchesList.toJSON() as ISearchRecords; >return null; > export async function removeSearch( chatId: number, index: string ): Promise < await getDB().ref(`$/$/$`).remove(); return true; > type IUpdateSearchRecord = Partial; export function updateSearch( chatId: number, index: string, search: IUpdateSearchRecord ) < return getDB().ref(`$/$/$`).update(search); >

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

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

Очень здорово, что Firebase позволяет подписываться на изменение структуры вместо постоянных опросов БД. Делается достаточно просто. Теперь как только изменятся данные по указанному пути, они автоматически загрузятся в бота.

function getAllSearchesRef() < return getDB().ref(`$`); > let searches: ISearchEntries | null = null; getAllSearchesRef().on(«value», (snapshot) => < if (snapshot.exists()) < searches = snapshot.val(); >>);

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

function formatTgMessage( area: string, searchResult: ISearchResult ): < media: < type: «photo»; media: string; caption?: string >[]; text: string; > < const images = Array.isArray(searchResult.images) ? searchResult.images : []; return < media: images.map((imageUrl) =>< return < type: «photo», media: imageUrl, >; >), text: ` $ / *$* Available from *$* *$* Search in $`, >; > const message = formatTgMessage(area, searchResult); const media = message.media.slice(0, 10); let submitted = false; try < if (media.length) < await telegramBot.telegram.sendMediaGroup(chatId, media); >await telegramBot.telegram.sendMessage(chatId, message.text, < parse_mode: «Markdown», reply_markup: < inline_keyboard: [[Markup.button.url(«↗️ Open», searchResult.openUrl)]], >, >); submitted = true; > catch (error) < if (error.response?.error_code === 400) < // Чат не найден >if (error.response?.error_code === 403) < // Чат был заблокирован. Удаляем поиск await removeSearch(chatId, searchId); await removeSearchResults(chatId, searchId); >break; >

Еще по теме:  Что будет если сгрузить Телеграмм на айфоне

Результат работы бота можно посмотреть на изображении снизу

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

Как я писал выше — исходный код бота доступен по ссылке https://github.com/VeXell/UKRentHomeHunter и вы можете использовать мой пример для написания своих ботов. Если вам понравился мой бот — поставьте мне звезду на GitHub.

О Блоге

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

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

Как узнать местоположение в телеграмме?

У нас есть 21 ответов на вопрос Как узнать местоположение в телеграмме? Скорее всего, этого будет достаточно, чтобы вы получили ответ на ваш вопрос.

Содержание

  • Как найти человека по телеграмму?
  • Как открыть Геолокацию в телеграмме?
  • Как в телеграмме посмотреть кто находится рядом?
  • Как найти человека по номеру телефона телеграмм?
  • Что можно узнать о человеке в телеграмме?
  • Как узнать где находится человек по ссылке?
  • Как узнать местоположение в телеграмме? Ответы пользователей
  • Как узнать местоположение в телеграмме? Видео-ответы

Отвечает Серёга Сметанин

Уязвимость скрывается в сервисе «Люди рядом», встроенном в мессенджер. С его помощью можно находить пользователей Telegram, находящихся поблизости – их место дислокации определяется по GPS-координатам и отслеживается в реальном времени.

Как найти человека по телеграмму?

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

Как открыть Геолокацию в телеграмме?

В Telegram геолокацию можно расшарить для одного собеседника или для чата. Нужно зайти в меню вложения (значок скрепки), выбрать опцию «Геопозиция» и «Транслировать мою геопозицию», а затем выбрать срок трансляции.

Как в телеграмме посмотреть кто находится рядом?

Чтобы увидеть пользователей Telegram поблизости, а также включить отображение своего профиля, нужно перейти в «Контакты» → «Найти людей рядом». В обновлении Telegram для Android до версии 7.3, пункт «Люди рядом» вынесен в боковое меню, без надобности перехода в «Контакты».

Как найти человека по номеру телефона телеграмм?

Как найти и добавить человека в Telegram по номеру телефона Перейдите на вкладку «Контакты» и нажмите «Добавить контакт». Введите имя и номер телефона человека и нажмите OK. Если он пользуется Telegram — откроется чат с ним. Если человек ещё не зарегистрирован, вы увидите сообщение об этом.

Что можно узнать о человеке в телеграмме?

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

Как узнать где находится человек по ссылке?

Онлайн-сервис IPLogger «конвертирует» ссылки и с помощью меток отслеживает IP-адрес, пользователя который кликнул на неё. С помощью ссылки можно будет увидеть не только IP-адрес, но и узнать приблизительное местоположение пользователя.

Как узнать местоположение в телеграмме? Ответы пользователей

Отвечает Виталий Даниелян

Чтобы увидеть их (и, что важно, «засветиться» самому), нужно зайти в Telegram, перейти в раздел «Контакты» и нажать сверху «Найти людей рядом».

Отвечает Виктория Соболева

Пользователи обнаружили, что в Telegram можно узнать реальный адрес человека через сервис «Люди рядом». Для этого понадобится несколько .

Отвечает Катя Вячеславовна

Проблема усугубляется тем, что Telegram показывает человека с точностью до метра.

Отвечает Алексей Лушников

Telegram показывает точное расстояние до пользователя. Чтобы узнать его, надо оказаться в радиусе 7 миль (11,3 км) от нужного пользователя, .

Отвечает Эльдар Халиков

Как посмотреть контакты человека в телеграмме? . После установки и регистрации зайдете в Телеграмм на мобильном устройстве и откройте раздел контактов. Там Вы .

Отвечает Мария Рыбакова

Поэтому надо было сначала определить направление за минуту, а потом за 4 минуты «молчания» попытаться добежать почти до «лисы», но чуть правее .

Еще по теме:  iPhone 14 pro не записывается звук через bluetooth в Телеграмм

Отвечает Сергей Добрынин

Как отследить где находится человек по номеру телефона? · Откройте страницу android.com/find и войдите в аккаунт Google. … · На потерянный телефон придет .

Отвечает Борис Лушников

Функция «Люди поблизости» в Telegram позволяет определить координаты практически любого пользователя при помощи триангуляции.

Отвечает Александр Щукин

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

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

Как создать телеграм бота для мониторинга удаленных хостов

Для мониторинга серверов или сетевых устройств существует множество программных решений, многие из которых требует ресурсов сервера для развертывания и знаний по настройке. Но если у Вас один или несколько серверов или маршрутизатор с белым* IP то нет надобности развертывать сложную структуру мониторинга только для того, чтобы проверять, доступен ли сервер или маршрутизатор. Достаточно создать простого телеграм бота, который будет отправлять Вам уведомление в телеграм, если проверяемый IP недоступен (down) и когда снова доступен (up). Сам бот будет работать 24/7 на виртуальном сервере под управлениям операционной системы Linux, с минимальной нагрузкой на ресурсы.
* белый IP адрес — это уникальный IP адрес, выданный на устройство или сервер и доступен из интернета. Такой IP является публичным.

Что необходимо сделать:
1. В Telegram создать бота и приватный канал, в который добавить бота. В канал Вы можете приглашать тех, кто тоже может наблюдать за мониторингом
2. Установить на сервере python3. В этой статье мы рассмотрим размещение бота на виртуальном сервере с ОС Ubuntu 20.04 (можно разместить на любой ОС, на которой можно установить пакет python3)
3. Создать скрипт-файл, прописать в нем IP хостов (серверов или маршрутизаторов), установить период мониторинга и запустить с крипт в режиме работы 24/7.

Приступим к выполнению.

2. Подключимся к серверу по SSH (как это сделать)

Проверим установлен ли python3:
python3 —version

Если python3 не установлен (ошибка: -bash: python3: command not found), необходимо установить командой
— для Ubuntu:
apt install python3 -y
— дляCentOS
yum install python3 -y
Дополнительно установим модуль requests:
pip3 install requests

3. Создадим папку, в которой будет размещен скрипт мониторинга. Для этого выполним команду:
cd mkdir pingmonitor cd pingmonitor

Создадим и откроем файл
vim main.py

и разместим в нем скрипт:

#—————————————————-
import os
import requests
import time
#————————-
hostname = [‘8.8.8.8′,’1.1.1.1’]
time_pause = 30
#————————-
def SendMsgToTelegramChanel(msg):
token=»TOKEN»
chat_id = ‘CHAT_ID’
params =
response = requests.get(‘https://api.telegram.org/bot’+token+’/sendMessage’, params=params)
def IsHostAlive(host):
ret = os.system(‘ping -c 2 <> > /dev/null’.format(host))
if ret == 0:
return True
return False
while True:
for i in range(len(hostname)):
file_signal = hostname[i] +’_down’
if IsHostAlive(hostname[i]):
if os.path.isfile(file_signal):
os.remove(file_signal)
SendMsgToTelegramChanel(hostname[i] + ‘ is up’)
#print(hostname + ‘ is up!’)
else:
if not os.path.isfile(file_signal):
open(file_signal,’tw’).close()
SendMsgToTelegramChanel(hostname[i] + ‘ is down’)
#print(hostname + ‘ is down!’)
time.sleep(time_pause)
#————————————————

— в скрипте следует заменить TOKEN и CHAT_ID на сохраненные ранее значения token и chat_id.
— в строке hostname = [‘8.8.8.8′,’1.1.1.1’], вместо IP 8.8.8.8 и 1.1.1.1 укажите IP (или hostname) Вашего сервера или маршрутизатора, которые необходимо мониторить*. IP адреса устройств следует указывать в одинарных кавычках и через запятую (если IP больше чем один)
— значение переменной time_pause = 30, указывает период проверки (в секундах). Не рекомендуется устанавливать меньше 10-15 секунд, особенно, если список проверяемых IP большой.
— не удаляйте отступы строк в скрипте. Это может привести к синтаксической ошибке.

(*)скрипт использует метод проверки через отправку icmp пакетов (ping), по этой причине, следует убедится, что на сервере или маршрутизаторе (которые мониторятся) не блокируются ping-запросы.

Теперь все готово для запука скрипта.
Так как скрипт должен работать 24/7, чтобы его работа не отображалась на основном экране консоли, запустим его в отдельном «окне» с помощью утилиты screen (если не установлена, установите ее. Более подробно: Основы работы с утилитой screen).
Для этого выполним команду:
screen -S pingmonitor

и перейдем к папку с файлом скрипта:
cd cd pingmonitor

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

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