Я использую API бота Telegram, но все равно не могу загрузить файл, который был отправлен моему боту. Я получил хэш файла, но не знаю, что с ним делать. Там в любом случае? Благодарю.
Arthur Felipe 28 Июн 2015 в 08:11
6 ответов
Лучший ответ
Теперь это доступно!
Ура! 18 сентября было добавлено:
Использование:
В JSON сообщения вы, как и раньше, получите file_id . Пример объекта сообщения с голосовым файлом:
< message_id: 2675, from: < id: 10000001, first_name: ‘john’, username: ‘john’ >, chat: < id: 10000001, first_name: ‘john’, username: ‘john’ >, date: 1442848171, voice: < duration: 2, mime_type: ‘audio/ogg’, file_id: ‘AwADBAADYwADO1wlBuF1ogMa7HnMAg’, // >
Теперь через API getFile вы можете получить необходимую информацию о пути к файлу:
https://api.telegram.org/bot/getFile?file_id=the_file_id
Будет возвращен объект с file_id , file_size и file_path . Затем вы можете использовать путь к файлу , чтобы загрузить файл:
Телеграм бот на Java. Скачиваем файлы из телеграмма и сохраняем в БД. Урок 10.
https://api.telegram.org/file/bot/
Обратите внимание, что эта ссылка будет доступна только в течение часа. Через час вы можете запросить еще одну ссылку. Это означает, что если вы хотите каким-то образом разместить файл и предпочитаете избегать проверки и повторной проверки новых ссылок каждый раз, когда вы его обслуживаете, вам может быть лучше загрузить файл на свой собственный хостинг.
Максимальный размер файла, получаемого с помощью этого метода, составляет 20 МБ . Ошибка: возникает при использовании файла размером более 20 МБ (показано ниже).
Из документов телеграммы:
Guy 2 Май 2017 в 02:15
Также обратите внимание, что Telegram api (через веб-перехватчик) предоставляет поддержку thumbs , для изображений и гифок он предоставляет эскиз файла. Чтобы получить исходный файл, вам нужно проверить корневой объект file_id.
Nigrimmist 7 Июн 2020 в 20:07
Если вы используете pyTelegramBotAPI, вы можете загрузить свою фотографию с помощью этого кода:
raw = message.photo[2].file_id path = raw+».jpg» file_info = bot.get_file(raw) downloaded_file = bot.download_file(file_info.file_path) with open(path,’wb’) as new_file: new_file.write(downloaded_file)
Farbod Ahmadian 14 Май 2016 в 10:38
Если у вас есть file_id, вам необходимо использовать sendDocument или sendPhoto, если вы хотите отправить самому себе, вам нужно сообщить своему боту свой идентификатор пользователя или идентификатор чата ( то же самое в индивидуальном чате).
delaf 29 Июн 2015 в 16:25
Метод работы с файлами пока недоступен. Источник: телеграмма в твиттере
Gosh Hernandez 2 Июл 2015 в 19:07
Ура! Он был добавлен 18 сентября 2015 г.
Вы можете использовать getFile(file_id) . Эта функция возвращает объект File, содержащий file_path . Вы можете скачать файл по этому адресу:
Как упоминалось в документации Telegram Bot API, объект File будет действителен в течение примерно одного часа. Вам следует снова вызвать getFile , чтобы получить новый объект File, если срок действия старого истек.
URL Uploader Bot Telegram
Источник: question-it.com
How do I download a file or photo that was sent to my Telegram bot?
I am using the telegram bot API but I cant see anyway to download a filé that was sent to my bot. I get a hash of the file but dont know what to do with it. Is there any way? Thanks.
10.4k 16 16 gold badges 85 85 silver badges 152 152 bronze badges
asked Jun 28, 2015 at 5:11
Arthur Felipe Arthur Felipe
1,364 1 1 gold badge 12 12 silver badges 20 20 bronze badges
6 Answers 6
This is now available!
Hooray! It was added on Sep 18th (2015):
Usage:
In the JSON of the message you will receive a file_id as before. An example of a message object with a voice file:
< message_id: 2675, from: < id: 10000001, first_name: ‘john’, username: ‘john’ >, chat: < id: 10000001, first_name: ‘john’, username: ‘john’ >, date: 1442848171, voice: < duration: 2, mime_type: ‘audio/ogg’, file_id: ‘AwADBAADYwADO1wlBuF1ogMa7HnMAg’, // >
Via the API’s getFile you can now get the required path information for the file:
https://api.telegram.org/bot/getFile?file_id=the_file_id
This will return an object with file_id, file_size and file_path. You can then use the file_path to download the file:
https://api.telegram.org/file/bot/
Note that this link will only be available for an hour. After an hour you can request another link. This means that if you want to host the file somehow and you rather avoid checking and re-checking for fresh links every time you serve it you might be better off downloading the file to your own hosting service.
The maximum size of a file obtained through this method is 20MB. Error: Obtained when a file large than 20mb is used.(Shown below)
Источник: stackoverflow.com
Telegram в качестве хранилища данных для IT проектов
Добрый день, сегодня я хотел бы поделится с Вами проблемами и их необычными решениями, которые встретились при написании небольших IT проектов. Сразу скажу, что статья для тех, кто хоть немного разбирается в разработке телеграмм ботов, баз данных, SQL и в языке программировании python.
Весь проект выложен на github, ссылка будет в конце статьи.
Основная проблема
Изначально я хотел для себя написать простенького телеграмм бота счетчика калорий, который получает число от пользователя и возвращает сколько калорий осталось до нормы на день. То есть нужно хранить грубо говоря пару переменных для каждого пользователя.
В итоге нужно было выбрать способ хранить эти данные.
- Вариант — глобальные переменные, оперативная память. Вариант сразу провальный, так как при падении программы мы теряем все
- Вариант — запись в файл на диске. Для такого проекта может и пойдет, но я планировал деплой бота на heroku, который каждый день стирает все данные с диска. Так что этот вариант не подошел
- Вариант — Google-таблицы. Изначально я хотел остановится на этом варианте, но начал разбираться и понял, что есть ограничение на количество запросов к таблице, и чтобы только начать использовать таблицу нужно написать кучу строк кода и разобраться в их не самом простом апи
- Вариант — база данных. Да, это наилучший вариант во всем. Но для такого проекта это даже смешно использовать. Также развертывание и поддержка базы данных на стороннем сервере обойдется в копеечку.
Решение
Идея очень простая, для хранения данных мы будем использовать in memory базу данных sqllite, так как она уже встроена в python 3 и будем делать бэкапы нашей таблицы на сервера Telegram с небольшим интервалом (примерно каждые 30 секунд) и бэкап при закрытие процесса программы.
Если сервер упал, то при первом запросе мы автоматически загрузим нашу таблицу с сервера Telegram и восстановим данные в sqllite.
Можно использовать и любую другую in memory бд, кому как нравится.
Плюсы
- Быстродействие — за счет работы с данными в оперативной памяти скорость выполнения программы даже быстрее, чем при использовании бд на стороннем сервере (графики скорости выполнения и тестирования будут в конце)
- Бесплатно — не нужно покупать сторонние сервера для баз данных и все данные хранятся в виде бэкапа бесплатно на серверах Telegramа
- Относительно надежно — если сервер падает по непонятным причинам, то мы максимум теряем данные за последние 30 секунд (время интервала бэкапов), для рабочего прототипа или небольшого проекта будет достаточно.
- Минимальные затраты при переходе на обычную бд — нужно заменить данные подключения, убрать код бекапов и перенести данные таблицы из бэкапа на новую бд.
Минусы
- Отсутствие горизонтального масштабирования
- Нужно два аккаунта в Telegramе (один для администратора, другой для тестирования пользователя)
- Сервер не будет работать в России из-за блокировок
- В комментариях я думаю Вы найдете еще десяток других нюансов.
Время говнокодить
Напишем простой кликер и проведем тесты на скорость выполнения.
Бот будет написан на языке программирования python с использованием асинхронной библиотеки взаимодействия с api телеграмма aiogram.
Первым делом нужно заполнить настройки бота, не буду рассказывать как получить токен от BotFather, уже сотни статей есть на эту тему.
Также нам нужен второй аккаунт в телеграмме для админа, в котором будут сохраняться наши бекапы.
Для того, чтобы получить admin_id и config_id нам нужно запустить бота с аккаунта администратора и написать боту «admin», после чего он создаст первый бекап, и напишет ваш admin_id, config_id. Заменяем и запускаем бота заново.
#———————Настройки бота————————- # Ваш токен от BotFather TOKEN = ‘1234567:your_token’ # Логирование logging.basicConfig(level=logging.INFO) bot = Bot(token=TOKEN) dp = Dispatcher(bot) # Ваш айди аккаунта администратора и айди сообщения где хранится файл с данными admin_id=12345678 config_id=12345 conn = sqlite3.connect(«:memory:») # настройки in memory бд cursor = conn.cursor()
Так теперь пройдемся по основной логике бота
Если боту приходит сообщение со словом «admin», то мы создаем таблицу пользователей с такой моделью данных:
- chatid — уникальный чат айди пользователя
- name — имя пользователя
- click — количество кликов
- state — значение для машины состояний, в данном проекте не используется, но в более сложных без него не обойтись
# Логика для администратора if message.text == ‘admin’: cursor.execute(«CREATE TABLE users (chatid INTEGER , name TEXT, click INTEGER, state INTEGER)») cursor.execute(«INSERT INTO users VALUES (1234, ‘eee’, 1,0)») conn.commit() sql = «SELECT * FROM users » cursor.execute(sql) data = cursor.fetchall() str_data = json.dumps(data) await bot.send_document(message.chat.id, io.StringIO(str_data)) await bot.send_message(message.chat.id, ‘admin_id = <>’.format(message.chat.id)) await bot.send_message(message.chat.id, ‘config_id = <>’.format(message.message_id+1))
Логика для пользователя
Первым делом пытаемся получить из in memory бд данные пользователя, который отправил сообщение. Если ловим ошибку, то загружаем данные с бекапа сервера Telergam, заполняем нашу бд данными с бекапа и повторно пытаемся найти пользователя.
# Логика для пользователя try: sql = «SELECT * FROM users where chatid=<>».format(message.chat.id) cursor.execute(sql) data = cursor.fetchone() # or use fetchone() except Exception: data = await get_data() cursor.execute(«CREATE TABLE users (chatid INTEGER , name TEXT, click INTEGER, state INTEGER)») cursor.executemany(«INSERT INTO users VALUES (. )», data) conn.commit() sql = «SELECT * FROM users where chatid=<>».format(message.chat.id) cursor.execute(sql) data = cursor.fetchone() # or use fetchone()
Если мы нашли пользователя в бд, то обрабатываем кнопки:
- При нажатие «Клик» мы обновляем количество кликов у данного пользователя
- При нажатие «Рейтинг» мы выводим список пятнадцати человек у которых наибольшее количество кликов.
#При нажатии кнопки клик увеличиваем значение click на один и сохраняем if data is not None: if message.text == ‘Клик’: sql = «UPDATE users SET click = <> WHERE chatid = <>».format(data[2]+1,message.chat.id) cursor.execute(sql) conn.commit() await bot.send_message(message.chat.id, ‘Кликов: <> ‘.format(data[2]+1)) # При нажатии кнопки Рейтинг выводим пользователю топ 10 if message.text == ‘Рейтинг’: sql = «SELECT * FROM users ORDER BY click DESC LIMIT 15» cursor.execute(sql) newlist = cursor.fetchall() # or use fetchone() sql_count = «SELECT COUNT(chatid) FROM users» cursor.execute(sql_count) count=cursor.fetchone() rating=’Всего: <>n’.format(count[0]) i=1 for user in newlist: rating=rating+str(i)+’: ‘+user[1]+’ — ‘+str(user[2])+’n’ i+=1 await bot.send_message(message.chat.id, rating) else: await bot.send_message(message.chat.id, ‘Вы не зарегистрированы’)
Напишем логику для регистрации пользователя
Пытаемся найти пользователя в бд, если его нет, то добавляем новую строку в таблицу и делаем бэкап.
Если ловим ошибку, то подгружаем последний бэкап, заполняем таблицу и повторяем попытку регистрации.
sql_select = «SELECT * FROM users where chatid=<>».format(message.chat.id) sql_insert = «INSERT INTO users VALUES (<>, ‘<>’, <>,<>)».format(message.chat.id,message.chat.first_name, 0, 0) try: cursor.execute(sql_select) data = cursor.fetchone() if data is None: cursor.execute(sql_insert) conn.commit() await save_data() except Exception: data = await get_data() cursor.execute(«CREATE TABLE users (chatid INTEGER , name TEXT, click INTEGER, state INTEGER)») cursor.executemany(«INSERT INTO users VALUES (. )», data) conn.commit() cursor.execute(sql_select) data = cursor.fetchone() if data is None: cursor.execute(sql_insert) conn.commit() await save_data() # Создаем кнопки button = KeyboardButton(‘Клик’) button2 = KeyboardButton(‘Рейтинг’) # Добавляем kb = ReplyKeyboardMarkup(resize_keyboard=True).add(button).add(button2) # Отправляем сообщение с кнопкой await bot.send_message(message.chat.id,’Приветствую <>’.format(message.chat.first_name),reply_markup=kb)
Так, ну и самое интересное.