Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
#Круги добра
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Веселая аркада с Печенькой для новогоднего настроения. Объезжайте препятствия, а подарки, варежки, конфеты и прочие приятности не объезжайте: они помогут набрать очки и установить новый рекорд.

Сноуборд

Спорт, Аркады, На ловкость

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • Animalrescueed Animalrescueed 36 постов
  • Oskanov Oskanov 7 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
alexaa17
alexaa17
1 год назад

Как войти в потерянный Telegram на ПК⁠⁠

При отсутствии доступа к устройству, при его поломке или потере, например.

Нам понадобится телефон с Android на время (можно ведь у кого нибудь одолжить?), и сим карта с нужным номером, вставленная в любой простой кнопочный телефон, умеющий принять смс.

На чужом телефоне устанавливаем приложение Telegram X из Google Play

Как войти в потерянный Telegram на ПК Windows, Программа, Компьютер, Android, Компьютерная помощь, Telegram, Длиннопост

Вводим номер телефона

Как войти в потерянный Telegram на ПК Windows, Программа, Компьютер, Android, Компьютерная помощь, Telegram, Длиннопост

Приложение высылает код в другое приложение, которого у нас нет :(

Как войти в потерянный Telegram на ПК Windows, Программа, Компьютер, Android, Компьютерная помощь, Telegram, Длиннопост

Нажимаем "Не получили код?" и получаем обычную смс на телефон

Вводим код полученный в смс на кнопочном телефоне в приложение, попадаем в свой аккаунт Телеграм.

Далее устанавливаем на ПК приложение из Microsoft Store, или с сайта https://desktop.telegram.org/

Как войти в потерянный Telegram на ПК Windows, Программа, Компьютер, Android, Компьютерная помощь, Telegram, Длиннопост

Вводим номер ещё раз

Получаем код, на этот раз уже в приложение Telegram X, вводим его в приложении на ПК

Как войти в потерянный Telegram на ПК Windows, Программа, Компьютер, Android, Компьютерная помощь, Telegram, Длиннопост

Вводим код и пользуемся

Удаляем приложение Telegram X и возвращаем телефон хозяину. Мы великолепны!

P. S. Есть ещё интересная фишка у Telegram X (но тогда придётся Андроид телефон отжать у хозяина)
Это обход лимита в три аккаунта, без покупки Премиум.

Как войти в потерянный Telegram на ПК Windows, Программа, Компьютер, Android, Компьютерная помощь, Telegram, Длиннопост

Пробовал четыре, больше номеров нет пока доступных.

Как войти в потерянный Telegram на ПК Windows, Программа, Компьютер, Android, Компьютерная помощь, Telegram, Длиннопост

Как то так

Показать полностью 7
[моё] Windows Программа Компьютер Android Компьютерная помощь Telegram Длиннопост
20
418
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
Android
1 год назад

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности?⁠⁠

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

С момента выхода первой части статьи из рубрики «сам себе экосистема» прошёл уже практически год! За это время, мы успели с вами реализовать клиенты VK и YouTube, которые работают на Android 2.2+, а также на Windows Phone 8, написать небольшую 2D-игру с нуля весом менее 1Мб, которая работает практически везде и довести существующее приложение до ума, дабы оно работало даже на смартфоне с дисплеем 240x320! Но на дворе 2024 год, люди стремительно переходят из соц. сетей в продвинутые мессенджеры и уже сложно себе представить современного человека, который не пользовался бы «телегой» или даже «вайбером» в качестве основного средства общения. Поэтому я решил реализовать клиент Telegram на смартфоне 14-летней давности на базе официальной реализации MTProto от команды Telegram — TDLib. Сегодня мы с вами: узнаем новые причины мотивации вернуть в строй смартфоны прошлых лет, напишем на C# реле-сервер, который обрабатывает пакеты MTProto и кодирует их в простой текстовый формат датасетов, который можно моментально обработать даже при нестабильном GPRS-соединении на 21-летнем Siemens C60, а также узнаем о разработке миниатюрных Android-приложений на базе «голого» API-системы, которые не тянут за собой никаких зависимостей, в том числе и AppCompat/androidx. Интересно? Тогда жду вас под катом!

❯ Содержание

  1. Но зачем всё это?

  2. Архитектура приложения

  3. Реализация сервера и работа с TDLib

  4. Android-приложение

  5. Как запустить клиент?

  6. Заключение

❯ Но зачем всё это?


На дворе уже стукнул 2024 год, современные смартфоны предлагают какие-то немыслимые мощности относительно тех, которые когда-то были в первых Android-девайсах. Сейчас за сотню баксов можно купить смартфон с хорошей 1080p IPS-матрицей, 4Гб ОЗУ и 8-ядерным шустрым чипсетом, который вполне способен плавно тянуть даже стремительно «жиреющие» на ресурсы клиенты социальных сетей, банков и прочие необходимые в повседневной жизни приложения.
И казалось бы: всё хорошо, покупай себе редмик раз в год или айфон раз в несколько лет и наслаждайся всеми прелестями работы современных приложений…

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Для многих людей смартфон — это лишь инструмент, повседневный компаньон, который помогает облегчить выполнение каких-то задач. Им совершенно не важно, как он выглядит, как ощущается в руках, какой у него дисплей и железо «под капотом», лишь бы работал да и нормально. Но есть и другая категория людей, для которых телефоны, смартфоны и любые портативные гаджеты — это не просто утилитарный девайс, а настоящее инженерное произведение искусства, с которого буквально сдувают пылинки и стараются до последнего пользоваться ими как повседневными устройствами. Хотите пример? Смотрите ниже:

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Фактически, среди современных смартфонов по сути и нет представителей такого нынче вымершего форм-фактора, как сайдслайдеры с физической QWERTY-клавиатурой, боковые раскладушки с двумя дисплеями и даже из QWERTY-моноблоков есть только смартфоны от Unihertz. Даже среди моноблоков с тачскринами нет никакого разнообразия, лишь без-рамочные одинаковые девайсы за исключением устройств от Sony.

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Galaxy S Plus

Раньше меня часто спрашивали, мол, да как ты вообще можешь пользоваться смартфоном 10-летней давности, на котором давно нет официальных клиентов популярных сервисов и только недавно, с развитием блога, мне перестали задавать этот вопрос, поняв, что это бесполезно — ведь это дело принципа и порыва энтузиазма! Смотрите сами: у нас уже есть простенькие, но вполне рабочие клиенты ВК, YouTube, сейчас я допиливаю клиент «Сбера» на СМСках, реализую карты OpenStreetMap (правда пока без адекватной навигации), а в будущем планирую написать приложение для мониторинга погоды и трекинга посылок. Кроме того, в рамках этой статьи мы реализуем с вами клиент Telegram: так чем же это не функционал современного смартфона?

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Но хорошо, с функционалом разобрались, однако для многих читателей слова «старый смартфон» это прямые синонимы «тормозной смартфон», мол «фуу, да как можно пользоваться этим тормозным кирпичом, он же лагает в последней версии моей ВКшечки!». Но давайте поставим вопрос ребром: может, это не столько девайсы немощные, сколько сами приложения, с кодовой базой, которая тянется более 10 лет, откровенно жиреют, обрастают костылями и хаками после далеко не одного поколения программистов, которые над ними работали? :) Один, вот, предпочитал пользоваться чистым AppCompat'ом, другой решил притащить зависимость, которая, например, оптимизирует виртуализацию ListView, третий решил заменить всю сериализацию Json со встроенных классов в Android на что-то стороннее и реализовал это костылями и вот так, по чуть-чуть изначально оптимальный и шустрый код превращается в неповоротливое УГ, которое не рефакторили кучу лет.

На видео Galaxy Pocket Neo — очень дешёвый Android-смартфон из 2011 года с 1-ядерным чипсетом на ~800МГц и 256Мб ОЗУ. При этом всём, Android софтварно рисует все анимации на процессоре, без участия GPU.

А значит у стареньких девайсов всё равно есть шанс быть полезными и стать полноценными повседневными смартфонами даже спустя более чем десять лет после выхода! И в сегодняшнем материале, я вам расскажу об особенностях разработки самопального клиента Telegram с собственным прокси-сервером, которое концептуально допускает реализацию даже на кнопочном Siemens C60 2003 года. Как? Читаем ниже!

❯ Принцип работы


В отличии от ВК (который разрабатывали те же самые люди, что и Telegram), API которого построено на базе REST-запросов и концепции Longpolling'а для моментального получения событий с сервера, Telegram построен на базе собственного протокола под названием MTProto, который может работать поверх любого «транспорта» (протокола нижнего уровня) — TCP, HTTP, WebSocket и т.п. Сам по себе MTProto в современном виде, разработка прожженного математика Николая Дурова и его команды — протокол относительно сложный для реализации «на коленке» и в первую очередь требует довольно серьезного понимания принципов работы современной криптографии, да и документирован он всё ещё не особо хорошо. Кроме того, у MTProto весьма интересный бинарный формат пакетов, эдакий велосипед Protobuf. В долгосрочной перспективе поддерживать свой велосипед MTProto может быть весьма проблематично, учитывая не самую лучшую документацию.

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Но городить велосипед и не нужно, поскольку у команды Telegram есть официальная реализация MTProto — библиотека TDLib, которая инкапсулирует в себе не только детали реализации протокола, но и сетевой ввод/вывод и выбор транспорта, хранение базы данных сообщений и авторизации, автоматическую загрузку фото и видео, конвертация объектов из бинарного формата MTProto в JSON и полная многопоточность и частичная потоко-безопасность. С одной стороны это плюс — уже готовое решение для реализации клиента на новой поддерживаемой платформе, где есть OpenSSL (можно статически слинковать), zlib (линкуется статически), сокеты и файловый ввод/вывод, а также довольно неплохой механизм JSON-based API, которое позволяет использовать библиотеку в любом языке, который поддерживает вызов C-функций, а с другой и минус — библиотека довольно много весит, в одиночку прибавляя ~20Мб веса приложения для каждой архитектуры, у неё течёт память и у нее странный механизм получения данных с сервера (например, нельзя ответить на сообщение, зная его ID, если сообщение предварительно не загружено, при том что на сервере весь ответ — это просто ID, на какое сообщение прилетел ответ).

Понятное дело, что на стареньком смартфоне использовать оригинальный TDLib будет проблематичным — даже если собрать либы современным NDK и запилить JNI-интерфейс, библиотека «жрёт» много ОЗУ (20-100Мб «вхолостую», в зависимости от числа диалогов и частоты прилетающих событий, плюс со временем течет до 1-2Гб, если не использовать базу данных сообщений. Скорее всего, это косяк в реализации пулов, объекты из которых выгружаются при сбросе в базу, но не выгружаются при высоком потреблении ОЗУ) и уж тем-более TDLib не запустить на любимых кнопочных Java-сонериках! Поэтому я решил написать прокси-сервер, который отправляет команды, слушает ивенты TDLib и предоставляет REST-like API для клиентских программ, которые просто вызывают какой-либо метод, а в ответ получают простой и короткий строковой датасет только с необходимыми полями, весом до 10Кб (что позволяет его быстро загрузить даже с GPRS-интернетом), который можно быстро распарсить даже на преусловутом Siemens C60!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

К сожалению, поскольку TDLib прожорлив, я не смогу захостить на своём сервере инстансы для читателей, которые хотят поюзать приложение, поэтому вам придется ставить и запускать сервер на своём VDS/компьютере с белым IP/роутере, если под него есть .NET Core :)

Клиентом же будет выступать Android-смартфон, где приложение будет фронтэндом данных с сервера. Ничего сложного на первое время нет: первое окно — это список диалогов, второе окно — список сообщений в диалоге + поле для написания сообщения, третье окно — информация о пользователе. Всё это я реализовал за три дня не-напряжной работы «на коленке».

Давайте же перейдем к реализации сервера!

❯ Прокси-сервер


Сервер я решил писать на C#, поскольку у .NET Core сейчас всё очень хорошо с кроссплатформенностью и производительностью. Его можно даже на Raspberry Pi запустить :)

Итак, какая-же архитектура такого сервера может быть? Программа инициализирует TDLib, начинает слушать её события в отдельном потоке, пока в основном потоке крутится HTTP-сервер, который обрабатывает каждый отдельный запрос с клиентского приложения. Почему синхронно? Потому что TDLib фактически не возвращает никаких идентификаторов для возвращаемых датасетов, дабы их можно было отличить друг от друга. Приведу пример: у нас есть метод getChatHistory, который возвращает n-сообщений. При этом TDLib сам определяет, сколько хочет сообщений вернуть (и в первый вызов возвращает одно сообщение вне зависимости от настрое и отправляем пакет message n-раз. При этом в пакете message нет какого-либо ID, который позволял бы ассоциировать текущий объект с какой-либо операцией. Увы!

Начинаем с коммуникации с TDLib. Для работы с библиотекой, мы будем использовать json-интерфейс. Для .NET есть биндинги через C++/CLI, но в таком случае, сервер не будет работать на Linux. Для работы с библиотекой хватит лишь три функции: CreateClientID, которая аллокейтит новый инстанс клиента, Send, которая асинхронно отправляет JSON-объект с командой, которую затем обработает TDLib и Receive, которая ждёт N-секунд и возвращает в виде ASCII-строки (!) JSON-объект с описанием события или данными после одного из запросов. За это у нас отвечает класс TDLibInterface, который объявляет PInvoke-методы для вызова нативных методов из библиотеки. .NET Core сам подгрузит библиотеку tdjson (причём на Linux он добавит ей префикс а-ля libtdjson.so, а на Windows загрузит tdjson.dll) и сам разберется с маршаллингом аргументов функций: например, string автоматически преобразует в const char*. Тем не менее, с const char* возвратами нужно быть аккуратнее — у меня был SIGSEGV, пока я ручками не конвертировал их в обычную строку.

З.Ы: На Пикабу нет отдельного тега для кода, а вставить листинги картинками я не могу из-за ограничения на 25 медиаэлементов. Так что листинги будут совсем без табов, но алгоритм их работы понять можно :)

[DllImport(Library, EntryPoint = "td_create_client_id", CallingConvention = CallingConvention.Cdecl)]
public static extern int CreateClientID();

[DllImport(Library, EntryPoint = "td_send", CallingConvention = CallingConvention.Cdecl)]
public static extern void Send(int id, string request);

[DllImport(Library, EntryPoint = "td_receive", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr RawReceive(double timeOut);

[DllImport(Library, EntryPoint = "td_execute")]
public static extern StringBuilder Execute(string request);

public static unsafe string Receive(double timeOut)
{
IntPtr str = RawReceive(timeOut);

return str != IntPtr.Zero ? new string((sbyte*)str.ToPointer()) : null;
}

Позволю себе чуточку критики в сторону TDLib. Во первых, почему нет s-версии функции с возможностью указать длину входной строки, а tdjson полагается исключительно на \0 в конце строки? Во вторых, почему const char*, а не wchar_t*? Сейчас юникод во входной строке приходится escape'ами превращать в \u-последовательности.
После этого, нам нужно написать обёртку над TDLib, которая будет вызывать для зарегистрированных событий специальные функции, называемые коллбэками. При этом закомментированный WriteLine снизу — это «дебаг» для того, чтобы узнать названия неизвестных мне ивентов :)

В каждом объекте, полученном с помощью receive, есть поле "@type", которое содержит в себе имя класса возвращаемого объекта. Первый же вопрос от читателей — почему я использую JObject с ручным дерганьем нужных полей и вручную пишу JSON в виде строковых литералов вместо нормальной сериализации/десериализации? Ответ прост: во-первых, для актуализации Data-классов придется писать кодогенератор из TL-схемы, а во-вторых иногда TDLib может возвращать немного разные объекты в JSON, из-за чего приходится мудрить с атрибутами на этих самых Data-классах, иначе десериализатор выбросит исключение. Это решается нормальными юнит-тестами на всех вариантах данных, но зачем себе в колени стрелять, если нужен конкретный фиксированный функционал и лишь малое число от всех полей, возвращаемых TDLib?

string recv = NativeInterface.Receive(10.0d);

if (recv != null)
{
JObject json = JObject.Parse(recv);

string type = json["@type"].ToString();

if (!handlers.ContainsKey(type))
{
//Console.WriteLine("Unknown event type: {0}", type);
continue;
}

handlers[type](recv, json);
}

Теперь переходим к самому интересному — обработке событий и реализации синхронного клиента, который позволяет без async/await просто запросить список сообщений и сразу же его получить (такой подход может быть полезен и юзерботам, которые не хотят размазывать стейты по всей программе). Почему без асинков? Честно сказать, мне они просто не нравятся: как привык к концепции wait/notify и коллбэков из Java, так их и юзаю всю жизнь :)

Сначала TDLib запрашивает параметры инициализации (стейт authorizationStateWaitTdlibParameters), затем если пользователь не авторизован — запрашивает номер телефона и код подтверждения (плюс дополнительные шаги для авторизации если они есть). В конце, TDLib возвращает стейт Ready, что означает готовность библиотеки к работе:

private void OnAuthState(string raw, JObject obj)
{
JObject authState = (JObject)obj["authorization_state"];
string type = authState["@type"].ToString();

if (type == "authorizationStateWaitTdlibParameters")
{
Console.WriteLine("Preparing TDLib parameters...");
NativeInterface.Send(InstanceID,
Utils.Format("{" +
"\"@type\": \"setTdlibParameters\", " +
"\"database_directory\": \"tdlib\", " +
"\"api_id\": {0}, " +
"\"api_hash\": \"{1}\", " +
"\"use_chat_info_database\": true," +
"\"use_file_database\": true," +
"\"use_message_database\": true," +
"\"system_language_code\": \"en\", " +
"\"device_model\": \"Phone\", " +
"\"application_version\": \"1.0\" " +
"}", APIId, APIHash));
}

if (type == "authorizationStateWaitPhoneNumber")
{
Console.WriteLine("Sending phone number");
NativeInterface.Send(InstanceID, Utils.Format("{\"@type\": \"setAuthenticationPhoneNumber\", \"phone_number\": \"{0}\" }", PhoneNumber));
}

if(type == "authorizationStateWaitCode")
{
NativeInterface.Send(InstanceID, Utils.Format("{\"@type\": \"checkAuthenticationCode\", \"code\": \"{0}\" }", WaitCode));
}

if(type == "authorizationStateReady")
{
Console.WriteLine("Authorized");

waitHandle.Set();
}
}

...

Client.AttachEventHandler("updateAuthorizationState", OnAuthState);

После этого, можно начать работу с данными. Обратите внимание, мой подход потоко-небезопасен, его нельзя дергать из нескольких потоков одновременно! В коде ниже, я вызываю метод для фетча сообщений, а затем в соответствующем коллбэке от TDLib обрабатываю данные (дабы статья не разрасталась на 20+ минут, я чуть урезал все листинги).

public List<Message> QueryMessagesInChat(long chatId, long lastMessage, int count)
{
messages.Clear();

requestMessageCount = count;
string json = Utils.Format("{\"@type\": \"getChatHistory\", \"chat_id\": \"{0}\", \"from_message_id\": {1}, \"limit\": {2} }", chatId, lastMessage, count);
NativeInterface.Send(InstanceID, json);

waitHandle.WaitOne();
return messages;
}

public User QueryUser(long userId)
{
string json = Utils.Format("{\"@type\": \"getUser\", \"user_id\": \"{0}\" }", userId);
NativeInterface.Send(InstanceID, json);

waitHandle.WaitOne();
return user;
}

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

private HttpListener listener;
private List<HttpMethodHandler> methods;
private ScheduledRestart restartManager;

private void AddMethod(HttpMethodHandler info)
{
if(info != null)
{
methods.Add(info);
Console.WriteLine("Registered method: {0}", info.Method.Name);
}
}

private void PrepareMethods()
{
AddMethod(Chats.QueryChats);
AddMethod(Chats.QueryMessages);
AddMethod(Chats.SendMessage);
AddMethod(Users.QueryUserInfo);
}

private void PrepareState()
{
// We should fetch dialog list due to TDLib nature of preloading-everything
Client.QueryChats(15);
}

public HttpServer()
{
listener = new HttpListener();
listener.Prefixes.Add("http://+:13377/");

Client = new SyncClient("test");
Client.Start();
Client.WaitUntilReady();

//restartManager = new ScheduledRestart(5);
//restartManager.Start();

methods = new List<HttpMethodHandler>();
PrepareMethods();
PrepareState();
}


...

public void Start()
{
listener.Start();

while(listener.IsListening)
{
HandleRequest(listener.GetContext());
}
}

Переходим к обработке запроса. Метод ищет, зарегистрирован ли запрошенный метод и если да, то парсит строку запроса, которая начинается с "?", которую затем передаёт в виде коллекции ключ->значения обработчику метода:

private void HandleRequest(HttpListenerContext ctx)
{
string method = ctx.Request.Url.LocalPath.Substring(1).ToLower();

if (method.Length < 0)
{
SendResponse(HttpGenericResponse.MethodRequired.ToString(), ctx);
return;
}

foreach(HttpMethodHandler handler in methods)
{
if(method == handler.Method.Name.ToLower())
{
string result = "";

if (ctx.Request.Url.Query.Length > 0)
{
string[] args = ctx.Request.Url.Query.Substring(1).Split('&', StringSplitOptions.RemoveEmptyEntries);
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();

foreach (string arg in args)
{
if (arg.IndexOf('=') >= 0)
keyValuePairs.Add(arg.Substring(0, arg.IndexOf('=')), arg.Substring(arg.IndexOf('=') + 1));
else
keyValuePairs.Add(arg.Substring(0, arg.IndexOf('=')), "");
}

result = handler(keyValuePairs);

if (result == null || result.Length < 1)
{
Console.WriteLine("Suspicious result from {0}", handler.Method.Name);
}
}

SendResponse(result, ctx);
return;
}
}

SendResponse(HttpGenericResponse.UnknownMethod.ToString(), ctx);
}

А сами методы, в свою очередь, дергают соответствующие функции из клиента и формируют на их основе датасет в примитивном формате:

public static string QueryChats(Dictionary<string, string> args)
{
if(args.ContainsKey("count"))
{
int count = int.Parse(args["count"]);
StringBuilder ret = new StringBuilder();

List<Chat> chats = HttpServer.Instance.Client.QueryChats(count);
ret.AppendLine(string.Format("Count={0}", chats.Count));

foreach(Chat chat in chats)
{
ret.AppendLine("Begin");
ret.AppendLine("ID=" + chat.ID);
ret.AppendLine("Date=" + chat.LastMessageDate);
ret.AppendLine("Name=" + chat.Name);
ret.AppendLine("Text=" + Uri.EscapeDataString(chat.LastMessageText));
ret.AppendLine("MsgId=" + chat.LastMessageID);
ret.AppendLine("End");
}

return ret.ToString();
}

return HttpGenericResponse.InternalException.ToString();
}

В результате получаем вот такой простой датасет, который, как я и говорил, легко распарсить и на Siemens C60, и на Atmega328 — да где угодно! В целом, такой сервер можно использовать для реализации бота в телеграме, который будет передавать показания каких-то датчиков, сигнализацию и прочие клевые штуки!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Переходим к реализации клиента, т.е. приложения на Android. Здесь будет не менее интересно!

❯ Пилим для Android


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

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

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Такой вот простой макет.

Каждый пункт меню — это тоже отдельный layout, в котором мы по шаблону строим внешний вид будущего элемента списка. На немолодых устройствах есть смысл использовать как можно меньше контейнеров в layout'е, поскольку пересчет позиций и размеров элементов — одна из самых «тяжелых» операций в UI-фреймворке вообще. Кроме того, не стоит использовать кучу картинок и drawable — в Android 2.x всё 2D рисуется софтварно, аппаратное ускорение появилось только в 3.0 (частично).

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Но дабы в списке диалогов что-то появилось, нужно сначала реализовать фетчинг (получение) этих самых диалогов с сервера! Сам объект, который занимается обработкой запросов называется ClientManager и является синглтоном — он в единственном экземпляре на все время работы программы. Помимо менеджмента «ноды» (т.е. прокси-сервера), токена для авторизации и обработчика ошибок, ClientManager реализует метод для асинхронного запроса информации с сервера и, собственно, формирует строки запросов с помощью соответствующих методов:

public void queryChats(int count, Response resp) {
sendRequest(String.format("%s/QueryChats?count=%d&auth_key=%s", nodeAddress, count, token), resp);
}

Подгрузка чатов и сообщений реализована через Adapter — концепция «виртуальных» списков, которая предполагает что система создаст не 50 элементов интерфейса на каждую кнопку чата, а только 5 и будет их виртуально «мотать по кругу», обновляя только данные в уже существующих элементах. Это позволяет значительно ускорить отрисовку, учитывая то, что Android 2.x Canvas рисуется программно.

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

private void updateDialogList() {
ClientManager.getCurrent().queryChats(50, new ClientManager.Response() {
@override
public void onReady(String str) {
try {
List<Packets.Chat> chats = Packets.parseChatListFromQueryResponse(str);

DialogAdapter adapter = new DialogAdapter();
adapter.setChats(chats);

((ListView) findViewById(R.id.messages_view)).setAdapter(adapter);
} catch (Exception e) {
Toast.makeText(MainActivity.this, "Упс!", Toast.LENGTH_SHORT);
}
}
});
}

Ну вы уже явно замучились видеть простыни кода, давайте посмотрим что у нас вышло!

Шустренько, да? А ведь это ультрабюджетник Alcatel OT-916D, один из последних массовых дешевых QWERTY-смартфонов за 5 000 рублей из 2012 года. Кстати, смартфон подарил мне читатель chuvakoff с Хабра!

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

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

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

view.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
// Reply to...
contextMenu.add(getString(R.string.reply)).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
setReplyContext((Packets.Message) view.getTag());

return true;
}
});

// Copy
contextMenu.add(getString(R.string.copy)).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
ViewGroup vg = (ViewGroup)view;

android.text.ClipboardManager manager = (android.text.ClipboardManager) view.getContext().getSystemService(CLIPBOARD_SERVICE);
manager.setText(((TextView)vg.findViewById(R.id.message_content)).getText());

return true;
}
});

// Send to...
contextMenu.add(getString(R.string.resend)).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
ViewGroup vg = (ViewGroup)view;
String text = ((TextView)vg.findViewById(R.id.message_content)).getText().toString();

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, text);
intent.setType("text/plain");
startActivity(Intent.createChooser(intent, null));

return true;
}
});
}
});

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

EditText editText = ((EditText)findViewById(R.id.message_text));

if(editText.getText().length() > 0) {
long replyTo = replyContext != null ? replyContext.ID : 0;

ClientManager.getCurrent().sendTextMessage(chat.ID, editText.getText().toString(), replyTo, new ClientManager.Response() {
@Override
public void onReady(String str) {

}
});

editText.setText("");
setReplyContext(null);
}

В остальном же, функционал конечно пока совсем базовый, однако клиент работает очень шустро даже бюджетной X10 Mini Pro и позволяет чатится с моими читателями в Telegram. В будущем хотелось бы допилить:

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

  • Поддержка голосовых сообщений: Не все их любят, но они порой удобны и выручают. Реализую как прослушивание, так и запись!

  • Подробный просмотр профилей и менеджмент чатов: Удаление сообщений, чатов и прочие фишечки из официальных клиентов.

    Казалось бы — до официальных клиентов ещё очень далеко. Но сам факт, чтобы всё это работало достаточно шустро на девайсах, которым уже более 10 лет!

❯ Звучит интересно! Как заюзать твой клиент?


Тут всё очень и очень просто! В первую очередь, нам понадобится ПК с белым IP, роутер (если под него есть сборка dotnet), либо VDS. Виртуальные сервера сейчас стоят копейки, у ТаймВеба есть тариф за 188 рублей в месяц, которого с головой хватит для нашего сервера.

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Такая вот рекламная интеграция (к слову, прокси для всех приложений уже более года крутятся именно на мощностях TimeWeb Cloud)!

Берём уже собранный TDLib и сервер под Windows, или собираем TDLib под Linux, накатываем .NET Core. Пример для Debian/Ubuntu:

sudo apt-get install dotnet

Затем запускаем сервер:

dotnet tdsrv.dll

Программа сначала запросит номер телефона, а затем код подтверждения Telegram. После этого будет создана папка tdlib/, где будут хранится данные вашей сессии, а также файл authkey.txt, где хранится случайный ключ для сессии (md5 phone_number + response code + псевдослучайное число). Не оставляйте его в /var/www/!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Если всё нормально, программа начнёт слушать порт 13377 на всех сетевых интерфейсах, в т.ч и в локальной сети. После этого, ставим уже предварительно собранный, либо собираем сами в Android Studio APK и в окне авторизации пишем адрес ноды и ключ авторизации. Если всё настроено верно — программа запомнит сервер и будет работать без проблем! Вот так всё легко :) Как видите — всё очень и очень просто!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Кроме того, буквально за пару дней до публикации статьи я сел вечерком из интереса что-нить под Java-телефоны попилить… и, как и обещал, реализовал Proof of Concept возможности работы Telegram даже на сонериках, которым скоро 20 лет стукнет! А ведь если ещё чуть заморочится, можно запустить приложение даже на преусловутых монохромных сименсах!

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

❯ Заключение


Вот такой у нас получился проект с реализацией лёгкого, примитивного, но тем не менее рабочего клиента Telegram, который на клиентской части вообще не использует никаких зависимостей. Вес собранного APK в release-версии — всего 54 килобайта! Понятное дело что с ростом функционала, вес программы будет увеличиваться, но я обещаю — больше 1Мб он не вырастет :)

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Ну а вам, моим читателям, надеюсь было интересно прочитать такой «двойной материал» не только о разработке сетевой части без использования Apache/nginx/IIS, но и UI-фронтэнда для Android-смартфонов, которым уже более 10 лет!
Исходный код проекта можно найти на моём GitHub: как приложения, так и сервера, а также убедиться в отсутствии каких либо закладок и, если совсем не доверяете, собрать бинарники сами! Для сборки понадобится VS2017 или свежее, а также Android Studio 2.3.2 (если собираете для Android 2.1 и ниже).

Сам себе экосистема. Часть 4: как я реализовал клиент Telegram на Android-смартфоне 14-летней давности? Программирование, Гаджеты, Смартфон, Покупка, Android, Java, Код, Приложение, Telegram, ВКонтакте, Научпоп, Клиенты, Программа, Софт, Кейс, Гик, Электроника, Видео, YouTube, Длиннопост

Друзья! Сейчас на Хабре опросы сломаны, поэтому если у вас есть желание, вы можете проголосовать в комментариях: какой стиль статей вам больше нравится — где больше конкретики и кода с пояснением как конкретно работает та или иная часть программы, или наоборот стиль ближе к научпопу, где фрагментов кода нет, или их значительно меньше? Пишите своё мнение о проекте в комментариях!

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

Статья подготовлена при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи каждую неделю!

Показать полностью 18 2
[моё] Программирование Гаджеты Смартфон Покупка Android Java Код Приложение Telegram ВКонтакте Научпоп Клиенты Программа Софт Кейс Гик Электроника Видео YouTube Длиннопост
79
Mighty2000
Mighty2000
1 год назад

Microsoft представила новую клавиатуру, которая будет иметь кнопку Copilot вместо одной из кнопок Win⁠⁠

Microsoft представила новую клавиатуру, которая будет иметь кнопку Copilot вместо одной из кнопок Win Windows, Программа, Искусственный интеллект, Чат-бот, Telegram, Telegram (ссылка), Telegram каналы

Microsoft взяла клавиатуру на карандаш и решила немного пошутить над кнопкой Win. Вместо нее они представили новую кнопку Copilot, которая будет запускать ИИ-помощника. Теперь пользователи смогут насладиться улучшенным опытом работы с приложениями и операционной системой Windows 11. 🎉

Она будет располагаться рядом с правой клавишей Alt, чтобы быть всегда под рукой. Теперь пользователи смогут получить помощь от ИИ-помощника, который будет отвечать на вопросы и помогать в различных задачах, похоже на чат-бота ChatGPT. 💁‍♂️💻

Так что готовьтесь к новому уровню взаимодействия с компьютером! Microsoft делает все возможное, чтобы сделать вашу жизнь проще и интереснее. Кто знает, может быть, следующим шагом будет кнопка для заказа пиццы прямо с клавиатуры? 🍕😄

Ссылка на пост в нашем телеграмм канале: https://t.me/CraikNews/56

Показать полностью 1
[моё] Windows Программа Искусственный интеллект Чат-бот Telegram Telegram (ссылка) Telegram каналы
8
user8505343
user8505343
1 год назад

Урок №13. Выгрузка проекта на сервер⁠⁠

Урок №13. Выгрузка проекта на сервер Python, Программирование, IT, Telegram, Программа, Telegram бот, Бот, Чат-бот, Windows, Длиннопост

В данном уроке мы научимся выгружать свой проект на сервер gethub.com.

Регистрация gethub.

Для начала заходим на gethub.com и регистрируемся на сайте. После нажимаем на свою иконку и выбираем your repositories. Пишем название своего проекта и нажимаем на create repository.

Урок №13. Выгрузка проекта на сервер Python, Программирование, IT, Telegram, Программа, Telegram бот, Бот, Чат-бот, Windows, Длиннопост

Теперь у вас появляется личный аккаунт на gethub.

Подключение и выгрузка проекта на gethub.

Чтобы подключить свой проект к gethub нам нужно зайти в pycharm, и сверху tool и выбрать get repository. После вас перекинет на сайт где вы должны войти в свой gethub. Далее у вас появится сверху git. Нажимаем на git и выбираем commit.

Урок №13. Выгрузка проекта на сервер Python, Программирование, IT, Telegram, Программа, Telegram бот, Бот, Чат-бот, Windows, Длиннопост

Далее в появившимся окне нажимаем на push.

Урок №13. Выгрузка проекта на сервер Python, Программирование, IT, Telegram, Программа, Telegram бот, Бот, Чат-бот, Windows, Длиннопост

Возвращаемся на сайт gethub и видим наш появившийся файл на сайте.

Урок №13. Выгрузка проекта на сервер Python, Программирование, IT, Telegram, Программа, Telegram бот, Бот, Чат-бот, Windows, Длиннопост

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

Итоги.

На этом наши уроки по созданию telegram бота закончены. Теперь вы умеете создавать telegam бота на двух разных библиотеках и уже можете делать ботов под заказ. Можете подключать систему оплаты и различные кнопки.

Что будет дальше?

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

Показать полностью 4
Python Программирование IT Telegram Программа Telegram бот Бот Чат-бот Windows Длиннопост
6
4
user8505343
user8505343
1 год назад

Урок №11. Веб-приложение в Telegram боте⁠⁠

В этом уроке мы добавим полноценное веб-приложение в нашего Telegram бота.

Создание веб-приложения в боте.

Давайте сначала отслеживать команду /start. Именно при команде /start мы будем показывать пользователю кнопку, по нажатию на которую откроется веб-приложение. Чтобы отследить команду /start, мы используем функцию message_handler и указываем, что обрабатываем команду /start. Затем мы создаем асинхронную функцию, например, start, и здесь принимаем один параметр message с типом message. Далее создаем кнопку, создавая объект markup, затем обращаясь к types и вызывая ReplyKeyboardMarkup(). Затем добавляем нашу кнопку с помощью markup.add и types.KeyboardButton. Пишем текст нашей кнопки, например, 'Веб-приложение'. Здесь мы также указываем параметр web_app, передавая ему WebAppInfo в качестве значения. Для подключения этого нам нужно обратиться к библиотеке aiogram.types.web_app_info и импортировать из нее WebAppInfo. В WebAppInfo нужно указать адрес сайта, который откроется при нажатии на кнопку. Мы создадим наш сайт позже, а пока укажем ссылку на канал Дзен.

1/2

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

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

Создание своей страницы.

Теперь создадим свою собственную веб-страницу, которая откроется при нажатии на кнопку. Для этого внутри проекта нужно создать HTML-файл, который мы попробуем отобразить в веб-приложении в Telegram боте. Внутри HTML-файла прописываем стандартную HTML-разметку и основное содержимое нашей страницы(данную разметку можно найти в моем Telegram канале: https://t.me/CodeCashh).

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

Затем, чтобы наша страница отображалась в веб-приложении, нам нужно выгрузить эту страницу на локальный сервер. Если у вас уже есть свой веб-сайт, вы можете добавить файл в папку вашего сайта и просто указать ссылку на этот файл. Если же у вас, как в моем случае, нет своего веб-сайта, мы воспользуемся GitHub. Регистрируемся на сайте, затем нажимаем на свою иконку и выбираем "Your repositories".

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

Вводим название нашего сайта, затем через точку указываем "github.io". Ставим галочку на "Add a README file" и создаем проект.

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

После создания нажимаем "Add file" -> "Upload files" и добавляем наш HTML-файл. Затем он появляется в нашем проекте.

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

Далее заходим в папку "README.md", нажимаем "Edit this file" и добавляем наш HTML-код.

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

Сохраняем файл. Затем переходим в настройки и нажимаем "Pages". В пункте "Branch" указываем направление, где лежат наши файлы, и нажимаем "Save".

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

Теперь GitHub отправит ссылку на наш сайт, по которой откроется наша веб-страница.

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

Копируем ссылку на наш сайт и вставляем ее в Python-файл. Затем запускаем наш проект и заходим в Telegram бота. При нажатии на кнопку откроется наша веб-страница.

Урок №11. Веб-приложение в Telegram боте Программирование, IT, Telegram, Python, Программа, Программист, Чат-бот, Windows, Telegram бот, Бот, Длиннопост, Telegram (ссылка)

Стиль веб-приложения я сделаю в telegram канале.

Также если вы не хотите долго ждать, то все уроки и коды с уроков уже есть в моем telegram канале.

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

Показать полностью 11
Программирование IT Telegram Python Программа Программист Чат-бот Windows Telegram бот Бот Длиннопост Telegram (ссылка)
0
2
user8505343
user8505343
1 год назад

Урок No8. Создание бота для конвертации валют⁠⁠

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

В этом уроке мы начнем создавать telegram бота, который будет конвертировать валюты.

Установка библиотеки.

Для конвертации валют мы будем использовать такую библиотеку, как currency converter. Для этого нам нужно ее установить в python.

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

После установки мы модем подключить нашу библиотеку к программе(from currency_converter import CurrencyConverter). И далее нам необходимо создать объект, класса CurrencyConverter().

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

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

Обработка команды /start.

В первую очередь в любом боте мы должна обрабатывать команду /start. Тут же мы напишем стандартную для нас функцию, где мы будем выводить сообщение о том, чтобы он ввел сумму для конвертации, а далее будет говорить среди каких валют пользователь хочет совершить конвертацию. Для этого мы зарегистрируем некое следующее действие, где указываем параметр message, а также укажем нашу следующую функцию, например, summ. И по сути эта функция будет срабатывать как только пользователь введет некую сумму.
В нашей функции давайте получать от пользователя данные и будем помещать их в переменную, например, money. Для этого пропишем message.text.strip(). И еще так как эта переменная будет использоваться в других функциях, то давайте делаем ее глобальной. Для этого в начале программы напишем, что money = 0, а внутри нашей функции будет обращаться к глобальной переменной money.

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

Кнопки для конвертации.

Теперь давайте установим набор различных кнопок, при нажатии на которые пользователь сможет выбрать пару для конвертации. Также для удобства импортируем из библиотеки telebot такую вещь, как types. Прописываем создаем markup, где обращаемся к types, потом к InlineKeyboardMarkup(). Также можно делать встроенные кнопки в сам telegram, но я решил, что данные кнопки будут удобнее. Также я хочу указать что в одном ряду будет максимум 2 кнопки. Для этого в InlineKeyboardMarkup() мы указываем row_width=2 (это означает, что в одном ряду будет не более двух кнопок). Теперь создаем сами по себе кнопки. Для этого используем InlineKeyboardButton. И тут мы указываем текст пары купюр для конвертации, а также указываем callback_data, по которой потом мы будем переводить купюры. В точно таком же формате создаем и другие кнопки. А также создадим кнопку 'Другое значение', при нажатии на которую пользователь будет сам указывать какие купюры он хочет перевести. И в конце мы указываем markup.add, где указываем все значения наших кнопок. И еще будем писать текст пользователю 'Выберите пару валют:', а также в конце прописываем reply_markup=markup.

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

Теперь давайте на данном этапе запустим бота и посмотрим как он будет работать.

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

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

Исправление ошибок.

Сначала нам необходимо указать то, что данные, которые мы будем получать от пользователя они должны быть числом. Для этого в переменной money напишем то, что она будет у нас int переменной.
Если же сейчас мы запустим бота и будем вводить некую строку, то наш бот будет выдавать ошибку, так как мы пытаемся перевести некую строку в число. Поэтому давайте пропишем обработчик исключения.(try: .......... except: ..........). Наше исключения будет заключаться в том, что мы с вами будем пробовать привести money в число. Если же мы с вами будем получать ошибку, как ValueError(это ошибка, когда пользователь вводит не тот тип данных), то мы пользователю будем отправлять сообщение 'Формат не верный. Впишите сумму:'. Кроме этого нам надо зарегистрировать следующее действие, которая будет эта же функция. Ну и в конце мы должны прописать return, чтобы последующий код не выполнялся.

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

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

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

Теперь давайте запустим бота и посмотрим что получилось.

Урок No8. Создание бота для конвертации валют Python, Программирование, Telegram, Программа, IT, Telegram бот, Бот, Windows, Чат-бот, Программист, Длиннопост, Telegram (ссылка)

На этом мы пока остановимся и продолжим на следующем уроке.

Также если вы не хотите долго ждать, то все уроки и коды с уроков уже есть в моем telegram канале.

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

Показать полностью 9
Python Программирование Telegram Программа IT Telegram бот Бот Windows Чат-бот Программист Длиннопост Telegram (ссылка)
0
0
user8505343
user8505343
1 год назад

Урок №5. Отправка и получение разных файлов пользователю⁠⁠

Урок №5. Отправка и получение разных файлов пользователю Гайд, Python, Программа, Программирование, Telegram, Бот, Telegram бот, IT, Чат-бот, Длиннопост, Telegram (ссылка)

В этом уроке мы научимся отвечать и отправлять различные файлы пользователю.

Получение и ответ на файлы пользователя.

В прошлых уроках мы научились отслеживать команды, а также текст. Но что делать если вдруг пользователь отправит нам некий файл(видео, фото, аудио и т.д.)?
Для этого по сути используется тот же самый принцип, как и для отслеживания команд и текста. Мы создаем с вами декоратор @bot.message_handler(), но теперь вместо commands мы будем обращаться к content_types и внутри мы говорим какой тип файла мы ожидаем(т.е. этот метод сработает только в том случае, если самому коду будет отправлен определенный файл с конкретным разрешением). Сейчас мы можем указать любой тип файла(это может быть: 'audio', 'video', 'photo'). Также данный метод, как и с отслеживаниями команд может срабатывать на несколько типов файлов, если указать их через запятую(Например:content_types = 'photo', 'video').

Давайте будем обрабатывать изображения. Для этого напишем в content_types наш тип данных ('photo'). Далее мы создаем функцию, которую назовем get_file. Он также принимает параметр message. Внутри же функции мы будем выполнять ответ на предыдущее сообщение. Для этого мы пишем bot.reply_to(), потом в качестве первого параметра мы указываем message, который указывали в функции. Потом в качестве второго параметра мы указываем текст, который будет отправляться нашему пользователю после того, как он отправит нам файл. В моем случае я буду отправлять: 'Великолепная фотография'.
Теперь давайте запустим программу и посмотри что получилось.

1/2

Таким образом можно обрабатывать получения различных типов объектов и в зависимости от того, что пользователь вам отправляет, вы можете выполнять абсолютно любой код!

Отправка различных файлов.

Мы уже умеем отправлять нашему пользователю различный текст, но как же нам отправлять ему разный типы файлов?
Давайте для начала научимся отправлять пользователю некое изображение. Будем при получении команды /photo, отправлять ему изображение. Для этого мы пишем декоратор @bot.message_handler() в котором обращаемся к commands и обращаемся к команде 'photo'. Далее создаем функцию, например, send_ph и указываем параметр message. Теперь важно чтобы ваш проект и файл находились в одной папке, иначе вам придётся в программе указывать путь до вашего файла! Далее мы с вами открываем этот файл.

Для этого мы с вами обращаемся к методу open. Потом мы говорим, что конкретно мы хотим открыть. По сути мы обращаемся к текущей папке и нахожу в ней наше изображение. Также нам надо указать формат открытия файла. Тут мы указываем что открываем его на чтение('rb'). После того как мы все это сделали, обращаемся к боту и к методу под названием send_photo(). По сути этот метод работает также, как работал метод send_message. Разница только в том, что вместо теста мы отправляем с вами изображение. Чтобы нам это сделать, то в качестве первого параметр мы указываем также message.chat.id, а вторым параметром указываем какой файл мы будем отправлять. Также дополнительно вы можете с помощью метода send.message вы можете дополнять отправленное сообщение текстом.
Давайте проверим, что у нас получилось.

1/2

Если же мы хотим отправить пользователю какой-либо аудио файл, то в таком случае вы делайте то же самое, только указываете вместо изображения ваше некое аудио, а также вместо send_photo указываете send_audio. Остальное будет не изменяться. Также в случае видео вы указываете ваше изображение и указывает send_video.

1/2

Также если вы не хотите долго ждать, то все уроки и коды с уроков уже есть в моем telegram канале.

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

Показать полностью 7
Гайд Python Программа Программирование Telegram Бот Telegram бот IT Чат-бот Длиннопост Telegram (ссылка)
0
1
user8505343
user8505343
1 год назад

Урок №4. Создание кнопок в telegram боте⁠⁠

Урок №4. Создание кнопок в telegram боте Python, Программа, Программирование, Гайд, Telegram, Бот, Telegram бот, IT, Windows, Чат-бот, Длиннопост, Telegram (ссылка)

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

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

Встроенные кнопки.

Ранее при получении команды /start мы отправляли текст пользователю "Приветствуем вас, {имя пользователя}, в нашем telegram боте".

Давайте же теперь будем при получении команды /start будем отправлять нашему пользователю тот же самый текст, но только уже с кнопками. Возьмем нашу программу, написанную в прошлом уроке(программа есть в telegram канале: https://t.me/pythotelegram) и добавим в нашу функцию, где мы обрабатывали команду /start, команды для появления кнопок.

Урок №4. Создание кнопок в telegram боте Python, Программа, Программирование, Гайд, Telegram, Бот, Telegram бот, IT, Windows, Чат-бот, Длиннопост, Telegram (ссылка)

Для начала создадим некий объект, который назовем, например, markup, далее нам надо обратиться к такому значению как types. Чтобы это значение корректно работало, его необходимо сначала подключить. Поэтому в самом вверху мы из библиотеки telebot импортируем types (from telebot import types). Далее мы будем создавать с вами встроенные кнопки, поэтому нас будет интересовать такой класс, на основе которого мы все это будем делать, как InlineKeyboardMarkup(). Далее мы обращаемся к нашему markup, к методу add и будем добавлять по одной новой кнопке.

Чтобы нам добавить некую новую кнопку, мы опять обращаемся к types, далее говорим какую кнопку мы будем создавать(нас интересует InlineKeyboardButton, т.е. встроенная кнопка). В качестве параметров мы должны указать текст для кнопки(у меня это будет 'Перейти в telegram группу') и также, если мы переходим по какой-либо ссылке, нам надо в качестве параметра указать url и здесь же мы указываем саму ссылку группу или сайт, который будет открываться при нажатии на данную кнопку(в моем случае будет открываться моя группа в telegram). Теперь давайте попробуем вывести нашу кнопку с сообщением. И тут в методе send_message мы передаем еще один параметр, который называется reply_markup и в качестве значения передаем наш объект markup. Теперь при запуске бота, когда мы введем команду /start, то наш бот выдаст нам текст, а также нашу встроенную кнопку, при нажатии на которую мы будем переходить в нашу telegram группу.

1/2

Давайте теперь добавим еще одну кнопку 'help', при нажатии на которую нам будет выдаваться текст, ранее написанный для команды /help.

Кнопки будут добавляться точно также, только теперь у нас не будет url адреса, а вместо этого у нас будет такой параметр, как callback_data и тут я напишу 'hlp'. Callback_data означает то, что при нажатии на данную кнопку будет вызываться некая функция, которая как раз и будет отвечать за действия этой кнопки, и куда мы будем передавать некоторые значения.
Теперь же если мы запустим бота, то у нас появятся наши кнопки, но кнопка help пока работать не будет.

1/2

Также перед тем, как мы создадим функцию, для кнопки help, я вам покажу, как вы можете располагать наши кнопки. Сейчас же наши кнопки находятся друг под другом. Для чтобы поместить несколько кнопок в один ряд, нам надо вынести создание кнопок из самой функции add и создать отдельные объекты(в моем случае они будут называться bot1 и bot2), в которые мы в качестве значения будем прописывать создание кнопок. А далее вместо markup.add мы будем использовать другой метод под названием markup.row. И уже сюда мы будем добавлять наши объекты, в которых хранятся создание кнопок.

И теперь если мы оба объекта помести в метод markup.row, то наши кнопки будут находиться в одном ряду.

1/2

Давайте теперь напишем функцию, которая будет приводить в работу нашу кнопку help. Чтобы нам создать данную функцию мы должны прописать декоратор, который называется @bot.callback_query_handler()(это специальный декоратор для обработки параметров callback_data).Внутри декоратора мы пишем анонимную функцию, где мы говорим один неким параметр, в случае если он будет пустым, то возвращаем значение True.(func = lambda callback: True).
Далее мы создаем функция, например, callback_message. Тут же мы будем принимать один некий параметр, который мы принимаем в декораторе(callback).Теперь мы обращаться с callback.data и будем получать то, что передается при нажатии на некую кнопку (в моем случае help). Например, в случае, если у нас пользователь нажимает на кнопку help, то у нас отправляется callback_data с такой информацией, как hlp. Здесь же мы перехватываем эту отправку и выполняем некие действия, в нашем случае это отправка сообщения пользователю. Прописываем bot.send_message с которым мы ознакомились в прошлых уроках. Теперь мы пишем параметр callback.message.chat.id и также пишем наш текст, который хотим отправить.
Теперь наша кнопка будет успешно работать!

1/2

Кнопки Reply Keyboard.

Теперь давайте сделаем так, что как только мы будем запускать бота у нас сразу же будет появляться, как в BotFather.Для создания таких кнопок мы будем использовать точно такую же структуру, как мы это делали для встроенных кнопок. Тут будет отличаться только то, что вместо InlineKeyboardMarkup() мы будем использовать ReplyKeyboardMarkup(), а также для самих кнопок нам надо использовать класс KeyboardButton. Этот класс принимает просто название кнопки. Тут мы уже не можем указать url как делали это раньше, а также не можем указывать callback_data. Дизайн и добавление кнопок происходит также, как это делалось во встроенных кнопках.

Посмотрим что у нас получилось.

1/2

При нажатии на кнопку они будут выводить нам некий текст в чат, но наш бот пока не отвечает на них.
Если же мы хотим обрабатывать нажатия на эти кнопки, то нам в самом низу этого метода необходимо зарегистрировать следующую функцию, которая будет срабатывать при вводе любого текста в чат. Для этого мы обращаемся в bot. Далее обращаемся к register_next_step_handler(), сюда мы передаем объект message, а также ту функцию, которая будет срабатывать следующей.
Так как в прошлом уроке мы уже создавали функцию, где обращались к тексту, то давайте обратимся здесь к этой функции и уже там напишем обращение к нашим кнопкам.
В функции txt мы проверяем текст на схожесть(текст должен быть такой же, как и в самих кнопках), и уже тогда мы выводим.
Давайте проверим, что получилось.

1/2

Также если вы не хотите долго ждать, то все уроки и коды с уроков уже есть в моем telegram канале.

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

Показать полностью 14
Python Программа Программирование Гайд Telegram Бот Telegram бот IT Windows Чат-бот Длиннопост Telegram (ссылка)
1
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии