08 фев 2022 · 17:59    
{"document":[{"text":[{"type":"attachment","attributes":{"presentation":"gallery"},"attachment":{"caption":"","contentType":"image/png","filename":"telegram-5772057_1280.png","filesize":1243105,"height":1280,"pic_id":12879,"url":"https://storage.yandexcloud.net/pabliko.files/article_cloud_image/2022/02/08/telegram-5772057_1280.jpeg","width":1280}},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"italic":true},"string":"Часть 1: Регистрация аккаунта разработчика и настройка клиента"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["quote"]},{"text":[{"type":"string","attributes":{},"string":"Всем привет! Парсинг сайтов — дело веселое, можно использовать эти данные для своего ресурса или же делать это на заказ. А что если скачать, к примеру, все сообщения из телеграм-чата или список его участников, а затем использовать эти данные для аналитики или еще лучше, для формирования своей базы данных пользователей, которым интересна та или иная тема."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"В этой серии статей мы с вами рассмотрим как написать свой отдельный клиент Telegram, который будет собирать данные из интересных нам чатов, а также посмотрим, как сохранять эти сведения в свою базу данных."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Для создания отдельного клиента хорошо подойдет асинхронная библиотека «Telethon» (Вот "},{"type":"string","attributes":{"href":"https://vk.com/away.php?to=https%3A%2F%2Fgithub.com%2FLonamiWebs%2FTelethon&cc_key="},"string":"репозиторий"},{"type":"string","attributes":{},"string":" библиотеки). Сама библиотека может использоваться как для создания телеграм-ботов, так и для создания отдельных приложений работающих с API Telegram. Главным преимуществом является понятная "},{"type":"string","attributes":{"href":"https://vk.com/away.php?to=https%3A%2F%2Fdocs.telethon.dev%2Fen%2Flatest%2F&cc_key="},"string":"документация"},{"type":"string","attributes":{},"string":" в которой можно найти ответы на все вопросы (необходимо знание английского языка)."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Создание нашего проекта начнем с регистрации аккаунта разработчика"},{"type":"string","attributes":{"href":"https://vk.com/away.php?to=https%3A%2F%2Fmy.telegram.org%2Fauth%3Fto%3Dapps&cc_key="},"string":" здесь"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"attachment","attributes":{"presentation":"gallery"},"attachment":{"caption":"","contentType":"image/jpeg","filename":"Z9TvxphYWhw.jpg","filesize":76965,"height":544,"pic_id":12854,"url":"https://storage.yandexcloud.net/pabliko.files/article_cloud_image/2022/02/08/Z9TvxphYWhw.jpeg","width":1280}},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"bold":true},"string":"Регистрация разработчика"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["heading1"]},{"text":[{"type":"string","attributes":{},"string":"Вводим пришедший в Telegram численно-буквенный код и попадаем на страницу регистрации нового приложения. Заполняем форму, достаточно первых двух граф:"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"attachment","attributes":{"presentation":"gallery"},"attachment":{"caption":"","contentType":"image/jpeg","filename":"2qtofm9TGtM.jpg","filesize":48999,"height":611,"pic_id":12856,"url":"https://storage.yandexcloud.net/pabliko.files/article_cloud_image/2022/02/08/2qtofm9TGtM.jpeg","width":807}},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Если все введено верно вы увидите следующие сведения."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"attachment","attributes":{"presentation":"gallery"},"attachment":{"caption":"","contentType":"image/jpeg","filename":"PgxcDKBeonU.jpg","filesize":24292,"height":331,"pic_id":12861,"url":"https://storage.yandexcloud.net/pabliko.files/article_cloud_image/2022/02/08/PgxcDKBeonU.jpeg","width":807}},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Сразу оговорюсь, данных будет немного больше, но нам важны параметры App api_id и App api_hash."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["quote"]},{"text":[{"type":"string","attributes":{},"string":"Поздравляю! Вы зарегистрировали ваше приложение в "},{"type":"string","attributes":{"bold":true},"string":"API Telegram"},{"type":"string","attributes":{},"string":". Закрывать страничку пока не стоит. Мы будем брать оттуда значения "},{"type":"string","attributes":{"bold":true},"string":"App api_id, App api_hash, Short_name"},{"type":"string","attributes":{},"string":" для нашего приложения."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Переходим в PyCharm"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["heading1"]},{"text":[{"type":"string","attributes":{},"string":"Хорошим тоном будет не хранить в коде наш хэш и app_id, поэтому давайте сделаем красиво =) Используем библиотеку "},{"type":"string","attributes":{"bold":true},"string":"configparser"},{"type":"string","attributes":{},"string":" для создания файла настроек. Создайте в корне проекта файл с расширением "},{"type":"string","attributes":{"bold":true},"string":".ini (пример config.ini)"},{"type":"string","attributes":{},"string":" и давайте поместим туда наши данные из аккаунта разработчика который мы зарегистрировали."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"attachment","attributes":{"caption":"Файл config.ini","presentation":"gallery"},"attachment":{"caption":"","contentType":"image/jpeg","filename":"qyAXdTbxMQM.jpg","filesize":33461,"height":454,"pic_id":12867,"url":"https://storage.yandexcloud.net/pabliko.files/article_cloud_image/2022/02/08/qyAXdTbxMQM.jpeg","width":807}},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"И да, я знаю про venv и переменные окружения. Вы можете использовать удобный вам метод."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Далее нас ждет самое интересное. Давайте установим в наш проект саму библиотеку Telethon командой «"},{"type":"string","attributes":{"bold":true},"string":"pip install telethon"},{"type":"string","attributes":{},"string":"» и импортируем в проект класс TelegramClient из нашей установленной библиотеки."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"bold":true},"string":"import configparser\nfrom telethon import TelegramClient"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{},"string":"Далее давайте настроим передачу наших данных в подключение из файла настроек"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"bold":true,"italic":true},"string":"config = configparser.ConfigParser()\nconfig.read(\"config.ini\")"},{"type":"string","attributes":{"blockBreak":true,"bold":true,"italic":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true,"italic":true},"string":"# Присваиваем значения внутренним переменным\napi_id: str = config['Telegram']['api_id']\napi_hash = config['Telegram']['api_hash']\nusername = config['Telegram']['username']"},{"type":"string","attributes":{"blockBreak":true,"bold":true,"italic":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true,"italic":true},"string":"client = TelegramClient(username, api_id, api_hash)"},{"type":"string","attributes":{"blockBreak":true,"bold":true,"italic":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true,"italic":true},"string":"client.start()"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{},"string":"Обратите внимание что в файле «"},{"type":"string","attributes":{"bold":true},"string":"config.ini"},{"type":"string","attributes":{},"string":"» первой строкой мы указали [Telegram]. С помощью этих тэгов мы просто не будем путаться в переменных настроек и разделять их в одном файле."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Создадим нашу главную функцию и запросим у сервера телеграм сведения о нас."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"bold":true},"string":"async def main():\n about_me = await client.get_entity('me')\n print(about_me)"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{},"string":"Наша библиотека Telethon асинхронная а значит функции и методы мы будем использовать с добавлением ключевых слов async и await (кстати можно и без них но не рекомендую)"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Для того, что бы наш клиент не закрывался после запуска мы добавим в конце нашего файла такую запись"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"bold":true},"string":"with client:\n client.loop.run_until_complete(main())"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{},"string":"Наше приложение готово к запуску."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["quote"]},{"text":[{"type":"string","attributes":{},"string":"……почти =)"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"При первом запуске в консоли PyCharm вас попросит ввести ваш номер телефона или токен бота"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"attachment","attributes":{"presentation":"gallery"},"attachment":{"caption":"","contentType":"image/jpeg","filename":"YfGYnIPPMYQ.jpg","filesize":21302,"height":191,"pic_id":12873,"url":"https://storage.yandexcloud.net/pabliko.files/article_cloud_image/2022/02/08/YfGYnIPPMYQ.jpeg","width":807}},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Это нужно, что бы создать файл сессии он будет хранится в корне проекта с расширением .session ( удалять их не стоит о них поговорим позднее)"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Вводите ваш номер телефона в международном формате без «+»"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"attachment","attributes":{"presentation":"gallery"},"attachment":{"caption":"","contentType":"image/jpeg","filename":"8F436XU7x60.jpg","filesize":25215,"height":205,"pic_id":12874,"url":"https://storage.yandexcloud.net/pabliko.files/article_cloud_image/2022/02/08/8F436XU7x60.jpeg","width":807}},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Вам снова пришел код в аккаунт телеграмм только теперь из 5 цифр. Введите их."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Поздравляю вы запустили ваш клиент Телеграм."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"attachment","attributes":{"presentation":"gallery"},"attachment":{"caption":"","contentType":"image/jpeg","filename":"LWWX09PI0eE.jpg","filesize":37967,"height":205,"pic_id":12875,"url":"https://storage.yandexcloud.net/pabliko.files/article_cloud_image/2022/02/08/LWWX09PI0eE_GPaZlms.jpeg","width":807}},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Так что же вернула нам наша функция "},{"type":"string","attributes":{"bold":true},"string":"main"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"bold":true},"string":"about_me = await client.get_entity('me')"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{},"string":"наша переменная about_me теперь содержит объект "},{"type":"string","attributes":{"bold":true},"string":"User"},{"type":"string","attributes":{},"string":" с специфическим типом данных библиотеки telethon."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Внутри объекта вы можете увидеть данные о вашем аккаунте."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Для того, что бы посмотреть отдельные сведения давайте сделаем вот такой код"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"bold":true},"string":"async def main():\n about_me = await client.get_entity('me')"},{"type":"string","attributes":{"blockBreak":true,"bold":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true},"string":" print('Имя:', about_me.first_name)\n print('Ник:', about_me.username)\n print('Id', about_me.id)\n print('Телефон', about_me.phone)"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{},"string":"И вуаля…."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Имя: Le****k"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Ник: Da*****st"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Id 1060217*****"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Телефон 375297******"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Ну в вашем случае звездочек не будет."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Только что сервер Телеграм рассказал вам о вас чуть больше чем вы видите в своем аккаунте. В следующей мы немного обнаглеем и соберем с серверов Телеграм сведения об участниках какого-нибудь чата."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Утечка данных из Telegram — проблема Telegram."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"Все сведения которые мы будем получать являются общедоступными. И эти же сведения мы можем увидеть и через официальное приложение. Но я все-таки призываю Вас не использовать полученные знания в плохих целях. Вся изложенная информация подается с целью образования и популяризации языка программирования, его библиотек и возможностей."},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{},"string":"По традиции полный код:"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]},{"text":[{"type":"string","attributes":{"bold":true},"string":"import configparser\nfrom telethon import TelegramClient"},{"type":"string","attributes":{"blockBreak":true,"bold":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true},"string":"config = configparser.ConfigParser()\nconfig.read(\"config.ini\")"},{"type":"string","attributes":{"blockBreak":true,"bold":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true},"string":"# Присваиваем значения внутренним переменным\napi_id: str = config['Telegram']['api_id']\napi_hash = config['Telegram']['api_hash']\nusername = config['Telegram']['username']"},{"type":"string","attributes":{"blockBreak":true,"bold":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true},"string":"client = TelegramClient(username, api_id, api_hash)"},{"type":"string","attributes":{"blockBreak":true,"bold":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true},"string":"client.start()"},{"type":"string","attributes":{"blockBreak":true,"bold":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true},"string":"async def main():\n about_me = await client.get_entity('me')"},{"type":"string","attributes":{"blockBreak":true,"bold":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true},"string":" print('Имя:', about_me.first_name)\n print('Ник:', about_me.username)\n print('Id', about_me.id)\n print('Телефон', about_me.phone)"},{"type":"string","attributes":{"blockBreak":true,"bold":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"bold":true},"string":"with client:\n client.loop.run_until_complete(main())"},{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":["code"]},{"text":[{"type":"string","attributes":{"blockBreak":true},"string":"\n"}],"attributes":[]}],"selectedRange":[1,1]}
Комментарии 2