Как скачать фотографии и файлы ботом телеграмм , без дополнительных выборов?

Ошибка возникает в самом телеграмме (в консоли все чисто): Использовал методы отсюда:https://ru.stackoverflow.com/questions/1176757/Как-получить-файл-присланный-пользователем-боту-в-telegram-на-python Как нормально объединить их?
Отслеживать
задан 26 мар 2022 в 18:00
Oleksandr Prokhorenkov Oleksandr Prokhorenkov
1 2 2 бронзовых знака
Ошибка не в телеграм, а в переменной photo , которая не объявлена. Вместо if message == photo: — if message.content.type == ‘photo’:
27 мар 2022 в 7:43
‘Message’ object has no attribute ‘content’ и ‘Message’ object has no attribute ‘type’ , кинуть весь код?
Как я написала чат-бот для телеги на питоне и задеплоила его на удаленную машину за один день
Всем привет! Меня зовут Катя и я backend разработчик. Пишу в основном на java, иногда на kotlin. В один прекрасный день мне пришла в голову мысль написать чат-бота для телеги. В силу специфики своей работы я начала с написания spring boot приложения на java, потом меня понесло в прикручивание БД, медленно все перетекло в тему создания сервиса как такового и до момента собственно вызова рестов ботом телеграмм не дошло .
В следующем подходе я подумала: а почему java, давай возьмем python. У меня был небольшой опыт написания на этом языке — и я решилась — начну снова с «Здравствуйте, мир!» только сразу в рамках проекта чат-бот телеграмм. На просторах интернета нашла крутую библиотеку с звучным именем natasha. Идея бота следующая: вы скачиваете свой чатик из одного ныне запрещенного мессенджера и этот .txt файл отдаете боту. Он находит ТОП 10 существительных и глаголов из вашего чата . Далее пройдемся по шагам.
Организационная часть
- Найти в телеграмм пользователя https://t.me/BotFather — он бог всех ботов.
- Передать ему команду /newbot для создания нового бота. Назвать своего бота и обязательно концовка имени должна быть Bot. Имя моего — analyzeYourChatBot
- В ответном сообщении отец ботов вышлет вам токен доступа к API.
- Так же можно сразу задать описание вашему боту путем вызова команды /setdescription а так же поставить аватар /setuserpic
Функционал бота
Вернемся к идее бота: взять .txt -файл, считать содержимое, очистить текст от ненужных штук, разбить на слова, понять что из них существительные, а что глаголы, подсчитать количество каждых и вывести ТОП 10.
Итак, основной участник действий — функция analyze , которая примет в себя контент файла. Далее построчно:
46 — приведем все слова в нижний регистр
47 — избавимся от текста с паттерном даты и отправителя сообщения вида [16.09.2021, 17:10:20] Katerina: А что осталось сегодня? Тестировала паттерн в удобном онлайн-сервисе regex101
48 — оставим в тексте только русские слова и пробелы
49 — схлопнем несколько пробелов один
51-61 — копипаст кода из примеров использования библиотеки natasha. Если очень вкратце, то мы разделили текст на слова и определили какое слово существительное, а какое — глагол.
Далее формируем структуру данных с существительными и глаголами, находим количество каждого вхождения, сортируем и оставляем ТОП 10.
#!/usr/bin/env python3 import re from string import whitespace from collections import defaultdict from natasha import ( Segmenter, MorphVocab, NewsEmbedding, NewsMorphTagger, NewsSyntaxParser, Doc ) CYRILLIC_LETTERS = u"абвгдеёжзийклмнопрстуфхцчшщъыьэюя" TOP_COUNT = 10 def strip(text): allowed_chars = CYRILLIC_LETTERS + whitespace return "".join([c for c in text if c in allowed_chars]) def sort(data): result_dict = defaultdict(int) for key in data: result_dict[key]+=1 return sorted(result_dict.items(), key=lambda kv: kv[1], reverse=True) def make_str(data): result = "" top_data = data[:TOP_COUNT] for key, value in top_data: result += key result += ": " result += str(value) result += "\n" return result def find(data, type): result = [] for item in data: if (item.pos == type): result.append(item) return result def analyze(data): text = data.lower() text = re.sub(r'\[\d\.\d\.\d\, \d:\d:\d\] .+?:', '', text, flags=re.MULTILINE) text = strip(text) text = re.sub(' +', ' ', text) segmenter = Segmenter() morph_vocab = MorphVocab() emb = NewsEmbedding() morph_tagger = NewsMorphTagger(emb) doc = Doc(text) doc.segment(segmenter) doc.tag_morph(morph_tagger) for token in doc.tokens: token.lemmatize(morph_vocab) nouns_dict = find(doc.tokens, 'NOUN') verbs_dict = find(doc.tokens, 'VERB') nouns_lemmas = [_.lemma for _ in nouns_dict] verbs_lemmas = [_.lemma for _ in verbs_dict] sorted_nouns_dict = sort(nouns_lemmas) sorted_verbs_dict = sort(verbs_lemmas) res_nouns = make_str(sorted_nouns_dict) res_verbs = make_str(sorted_verbs_dict) result = "ТОП " + str(TOP_COUNT) + " существительных в вашем чате:\n" result += res_nouns result += "\n" result += "ТОП " + str(TOP_COUNT) + " глаголов в вашем чате:\n" result += res_verbs return result
Вызов функционала бота
В отдельном файле внутри папки проекта будут собраны методы-хендлеры (приемщики определенных команд). Я выбрала библиотеку pyTelegramBotAPI чтобы быстрее и эффективнее взаимодействовать с API телеги.
9 определяем константу с токеном, который нам прислал отец ботов
11 создаем инстанс объекта Telebot
64 запускаем этот инстанс в работу
Пишем простенькие функции на команды /start и /help которые просто отвечают простыней текста. Основной участник тут — get_document . В функции мы получим документ, проверим что он формата .txt, далее считаем содержимое из него и вызовем функцию из уже готового файла с предыдущего шага.
#!/usr/bin/env python3 import telebot import requests import analyze_chat import uuid import os TOKEN = "blablabla" bot = telebot.TeleBot(TOKEN) @bot.message_handler(commands=['start']) def send_welcome(message): bot.send_message( message.chat.id, 'Привет!✌️ Я бот, который проанализирует твой диалог из WhatsApp \n' + '(принадлежит признанной на территории РФ экстремисткой организации Meta). \n' + 'Скачай диалог (только на русском языке ) и пришли боту в формате .txt.\n' + 'Для того, чтобы посмотреть как скачать весь диалог пройди на комманду /help.\n' + '⚡️ Предупреждение! Ваши диалоги не сохраняются на стороне приложения, ' + 'однако потенциально могут быть перехвачены злоумышленниками по сети!' ) @bot.message_handler(commands=['help']) def get_help(message): bot.send_message( message.chat.id, '1) Пройдите в чат, который хотите проанализировать, из WhatsApp ' + '(принадлежит признанной на территории РФ экстремисткой организации Meta). \n' + '2) Провалитесь в настройки чата \n' + '3) Нажмите "Экспортировать чат (Export chat)" -> Без медиа -> Сохраните на компьютер\n' + '4) Разархивируйте и пришлите боту содержимое архива (по одному файлу если их несколько)' ) @bot.message_handler(content_types=['document']) def get_document(message): if (message.document.mime_type != 'text/plain'): bot.reply_to(message, "Вы прислали файл, но он не в формате .txt Исправьте это недоразумение, пожалуйста") else: return analyze(message) def analyze(message): file_info = bot.get_file(message.document.file_id) response = requests.get('https://api.telegram.org/file/bot/'.format(TOKEN, file_info.file_path)) random_file_name = "response_" + str(uuid.uuid4()) + ".txt" with open(random_file_name, "wb") as f: f.write(response.content) text = get_text_from_file(random_file_name) result = analyze_chat.analyze(text) os.remove(random_file_name) bot.reply_to(message, result) def get_text_from_file(file_name): f = open(file_name, "r", encoding="utf-8") text = f.read() return text @bot.message_handler(func=lambda message: True) def echo_all(message): bot.reply_to(message, "Я могу только принять файл в формате .txt Кажется это не он") bot.infinity_polling()
Деплой этого всего дела
Итак, у нас имеется код, но он работает только тогда, когда у вас открыт ноут (лол). Вернемся на шаг назад и я скажу вам, что чтобы код работал — нужно установить две библиотеки:
pip install pyTelegramBotAPI pip install natasha
Ну и конечно должен быть установлен python . Теперь представьте, что все это надо будет установить на удаленной машине. Вспомним про докер. И используем силу докер-файла. Добавляю внутрь папки проекта Dockerfile и пишу следующее:
1 делаю образ на основе официального от питона
2,3 добавляю файлы с двумя написанными на предыдущих шагах скриптами
4,5 устанавливаю необходимые библиотеки для работы приложения
6 запускаю код
FROM python:3 ADD chatbot.py . ADD analyze_chat.py . RUN pip install pyTelegramBotAPI RUN pip install natasha CMD python3 ./chatbot.py
Далее создаем кастомный образ приложения на основе докер-файла:
docker build -t vrestles/analyze-chat-bot:latest -f Dockerfile .
Этот образ я переношу в докер-хаб в качестве приватного образа:
docker login -u vrestles -p ***** docker push vrestles/analyze-chat-bot:latest
Заметьте, что сначала я залогинилась и потом запушила образ.
Далее прохожу на удаленную машину — там уже установлен докер. И только он один кстати говоря. И все что мне нужно сделать опять залогиниться в докер и запустить приватный образ:
docker run -d vrestles/analyze-chat-bot:latest
К слову говоря, при запуске он сам поймет, что образ не скачан и пойдет сам за ним. Запуск произведен в дитач-режиме, что значит что он произведет запуск в фоне и отдаст только айдишник контейнера. Посмотреть запущенные контейнеры можно при помощи команды docker ps
Заключительное слово
В целом мне очень понравилось писать на питоне — это быстро и очень увлекательно. Докер как всегда рулит. Спасибо за внимание и можно кидать в меня помидорами в коментах .
Как написать парсер телеграм‑каналов на Python

В предыдущей статье об асинхронном программировании на Python мы разобрали основные моменты, связанные с построением асинхронного приложения и функций. Теперь рассмотрим полезный пример, который вовсю использует принципы асинхронности, — простой парсер данных из Telegram
Содержание статьи
- async for
- Как написать парсер телеграм-каналов на Python
- Шаг 1. Создаем приложение API для Telegram
- Шаг 2. Устанавливаем библиотеку telethon
- Шаг 3. Получаем первые данные из Telegram
- Шаг 4. Получаем диалоги
- Шаг 5. Получаем сообщения из выбранного канала
async for
Чтобы пример с парсером был понятнее, сначала поговорим о циклах внутри асинхронных функций. Вспомним финальный пример из первой части статьи, посвященной асинхронному программированию на Python, с получением данных о погоде.

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

Теперь, если мы запустим приложение, будем видеть прогресс измерения давления.

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

Раз функция def ticker ( ) теперь генератор, то мы должны каждый раз его вызывать, когда она нам понадобится. Классический способ перебора всех значений, возвращаемых генератором, — это подстановка его вызова в цикл for. Перепишем функцию измерения давления.

Теперь, если запустим код, столкнемся с интересной ошибкой.

Из текста может показаться, что генератор не является итерируемым объектом. Но на самом деле проблема здесь в другом. Мы работаем с асинхронным генератором, а значит, и цикл, который его перебирает, тоже должен быть асинхронным.

Все снова отлично работает! Зачем это нужно, спросите вы? Прямо сейчас и узнаем.
Как написать парсер телеграм-каналов на Python
Основы языка Python
Курс для всех, а не только для IT-специалистовTelegram — один из самых популярных источников контента. Каналов в мессенджере столько, что следить за всеми самостоятельно просто нереально, не говоря уж об использовании и анализе получаемой информации.
Но зачем все делать вручную, когда за нас это может сделать приложение? Совместим приятное с полезным: напишем приложение для парсинга данных из любого телеграм-канала и параллельно закрепим тему асинхронных компонентов.
- Все о парсинге данных на бесплатном вебинаре Контур.Школы.
Шаг 1. Создаем приложение API для Telegram
Для начала необходимо завести аккаунт в Telegram, если его еще нет. Затем переходим по ссылке https://my.telegram.org/auth и авторизуемся с помощью номера телефона.
Код подтверждения придет прямо в мессенджере Telegram. Необходимо его ввести в поле Confirmation code.
.png)
В открывшемся окне переходим по ссылке API Development Tools. Вас перебросит в окно создания приложения. Необходимо заполнить основные поля.
Значения полей можно указывать любые. Для нас они не играют особой роли. Ставим точку напротив Desktop и подтверждаем заполнение кнопкой Create application.

Следующее окно отобразит важные параметры вашего приложения, которые нам и будут нужны для создания приложения на Python, — это App api_id и App api_hash.
Шаг 2. Устанавливаем библиотеку telethon
Теперь у нас есть все необходимое, чтобы приступить к созданию приложения в Python. Первым делом нам понадобится библиотека telethon, чтобы авторизоваться и получить доступ к данным аккаунта. Устанавливаем ее обычным способом.

Далее импортируем необходимые модули и сразу создадим переменные с данными для авторизации.

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

Здесь ‘test_tg’ — это название файла, который будет создан для хранения авторизационных данных приложения. Далее необходимо создать тот самый цикл обработки событий (event loop). Это будет асинхронная функция main ( ) , в которой мы пока напишем команду-заглушку pass. И сразу запустим этот цикл, используя один из методов запуска библиотеки telethon.

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

Можно ввести номер телефона — тогда следующее сообщение попросит одноразовый код, который придет в Telegram.

Если все выполнили верно, то ниже в терминале получите сообщение:

А также в списке файлов появится файл с авторизационными данными, имеющий расширение *.session.
Готово! Все последующие запуски вашего приложения уже будут выполняться без запроса одноразовых паролей. И код, написанный в обработчике событий main ( ) , будет сразу исполняться.
Шаг 3. Получаем первые данные из Telegram
Настало время сбора данных. Начнем с того, что у telethon есть неплохая документация, основные методы из которой мы и рассмотрим. Первая информация, которая нам доступна, — о нашем аккаунте.

Если проверим тип полученного объекта, то увидим знакомое сообщение.

Мы получаем корутину. То есть все методы клиента Telegram асинхронны. Еще бы — без асинхронности мы не смогли бы получать информацию одновременно из нескольких чатов, а отправка фотографии другу вообще застопорила бы все процессы на глобальном уровне.
Поэтому все методы вызываем только через await.
Полученный объект me содержит огромное количество свойств, включая ваше имя, фамилию, номер телефона, фотографию и много еще чего персонального, что афишировать не нужно. Просмотреть содержимое объекта удобно в режиме отладки.
Шаг 4. Получаем диалогиЧтобы получить список диалогов, воспользуемся еще одним методом клиента .get_dialogs( ).

В dialogs получим общее количество диалогов. Оно включает не только каналы, на которые мы подписаны, но и личные переписки. Можете посмотреть их количество в отладчике или воспользоваться функцией len(dialogs) и испытать шок от итогового количества. У меня 1540 диалогов.

Зачем специалисту Python
Бесплатный вебинар в Контур.ШколеТак как в dialogs нам, по сути, возвращается итерируемый объект, мы можем легко его перебрать с помощью обычного цикла for, чтобы найти именно тот канал или переписку, которые нам нужны.
Каждый элемент полученного dialogs — это объект класса Dialog библиотеки telethon. Посмотреть методы и свойства этого объекта можно в документации. Переберем диалоги по названиям и найдем нужный.
Шаг 5. Получаем сообщения из выбранного каналаУбедитесь, что нужный канал находится и вы получаете об этом сообщение. Когда канал у вас на руках, можно получить из него все сообщения, которые когда-либо были написаны.
Воспользуемся методом client.iter_messages(dialog), чтобы получить сообщения.

- Важно посмотреть на тип полученного значения у messages.

Получаем не готовый список, как в случае с диалогами, а итератор. Это не должно быть проблемой, потому что элементы итератора мы можем получить так же, как и элементы списка, — закинуть в цикл for.

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

Это именно то, о чем мы говорили в начале: нужен асинхронный for, чтобы перебирать элементы асинхронного итератора. Исправим эту ошибку и получим желаемый результат.

Единственное, что рекомендуется добавить, — обычную задержку между чтением каждого сообщения во избежание блокировок вашего аккаунта со стороны сервисов Telegram. Пусть будет медленно, зато спокойно и уверенно.
Напоследок рекомендуем также ознакомиться со всеми свойствами и методами объекта message. Основные из них, которые могут пригодиться при сборе полных данных, вынесены в таблицу.
date Свойство Содержит дату сообщения edit_date Свойство Содержит дату редактирования сообщения file Свойство Содержит файл, который приложен к сообщению download_media( ) Метод Позволяет загрузить файл, приложенный к сообщению is_reply Свойство Показывает, является ли сообщение ответом на другое сообщение forward Свойство Содержит информацию о первоисточнике, если текущее сообщение было переслано Конечно, в разных ситуациях могут потребоваться разные данные, но у этой статьи нет цели перепечатать всю документацию библиотеки telethon. На этой полезной ноте мы и завершим наше знакомство с асинхронным миром программирования.
Telegram: как скачать все вложения (видео, файлы, музыку и фото) с канала (диалога)?
Собсно, по сабжу. Погуглил — вариантов не нашел, предлагается, в основном, использовать что-нибудь типа автокликеров. Неужели нет нормальных способов?
- Вопрос задан более трёх лет назад
- 241921 просмотр
2 комментария
Простой 2 комментария
Отвечаю:
Ныне все просто!
Такая функция (о боги услышали нас!) теперь есть в приложении для PC в настройках.
Там все чаты, файлы и все все все можно выгрузить, хотя и не в очень красивом виде, но можно — точно.https://zelenka.guru/threads/4950677/ Решение всех проблем.
Решения вопроса 3
Если актуально еще, в ПК версии добавили возможность. В меню чата\группы\канала (Экспорт истории. )
Ответ написан более трёх лет назад
Нравится 10 1 комментарий
catitnight @catitnight
Чел, это особенно актуально, когда каналы продают каперам, а у тебя там ценные вложения
dimin21590 @dimin21590
В клиенте для ПК можно экспортировать файлы.
Ответ написан более трёх лет назад
Комментировать
Нравится 3 КомментироватьДля начала отправляете контактам которые хотите скачать, сообщение. Чтобы они были в вверху списка.
Далее заходите в Настройки-Продвинутые настройки-Экспорт из Telegram.
Там выбираем только Личные чаты и Фотографии(Видео, и тд.)
Экспорт начинается сверху вниз по чатам. после того как прошел экспорт нужных чатов, нажимаем остановить и по умолчанию ..Downloads\Telegram Desktop\DataExport_. будут ваши файлы.