изображение бота телеграммы с url - нежелательный кеш

Я работаю над ботом для телеграмм, который по запросу отображает изображения с нескольких веб-камер. Я получаю изображения из URL-адресов, а затем отправляю пользователю (используя bot.sendPhoto ()). Моя проблема в том, что для любой данной веб-камеры имя файла не меняется, и кажется, что фотография отправляется из кеша телеграммы. Таким образом, он будет отображать изображение с первого раза, когда это изображение было запрошено.

Я подумал о загрузке изображения с URL-адреса, сохранении с именем переменной (например, имени с меткой времени в нем), а затем отправке его в чат, это кажется неэлегантным решением и надеялся на что-то лучшее. Например, заставить изображение не кешироваться на сервере Telegram.

Я использую оболочку python-telegram-bot, но не уверен, что она предназначена для этого.

Любые идеи? Я пробовал искать, но пока мало что получается. Заранее спасибо.


person Stuart Mackintosh    schedule 10.03.2017    source источник
comment
Кажется, у вас нет другого выбора, кроме как использовать этот неизящный способ. Но боюсь, боты Telegram не предназначены для таких задач :) На вашем месте я бы сделал веб-сервер со страницей с регулярно обновляемым изображением с веб-камеры.   -  person Andrew Che    schedule 20.03.2017


Ответы (3)


У меня такая же проблема. Я хотел создать бота, который отправляет изображение горнолыжного склона, снятое веб-камерой (webcam.example.com/image.jpg). К сожалению, имя файла и URL-адрес никогда не обновляются, а телеграмма всегда отправляет кешированное изображение. Поэтому я решил изменить URL-адрес, переданный в api. Для этого я написал простой php-сайт (example.com/photo.php), который перенаправляет на исходный URL-адрес фотографии. После этого я создал папку (example.com/getphoto/) в моем веб-пространстве с файлом .htaccess внутри. .Htaccess перенаправляет все запросы в этой папке на сайт photo.php, который перенаправляет на изображение (webcam.example.com/image.jpg). Таким образом, вы можете добавить все в URL-адрес папки и при этом получить изображение (например, example.com/getphoto/42 или example.com/getphoto/hrte8437g). Кажется, что api телеграммы кэширует фотографии по URL-адресу, поэтому, если вы всегда добавляете другое окончание URL-адреса, переданного в api, Telegram не использует кешированную версию и вместо этого отправляет текущее изображение. Самый простой способ всегда изменить URL-адрес - это добавить к нему текущую дату.

example.com/photo.php

<?php
header("Location: http://webcam.example.com/image.jpg");
die();
?>

example.com/getphoto/.htaccess

RewriteEngine on
RewriteRule ^(.*)$ http://example.com/photo.php

в питоне:

bot.sendPhoto(chat_id, 'example.com/getphoto/' + strftime("%Y-%m-%d_%H-%M-%S", gmtime()))

Этот обходной путь также должен работать на других языках, таких как java или php. Вам просто нужно изменить способ получения текущей даты.

person Aljosha    schedule 20.12.2017

У меня тоже была такая же проблема, но я нашел самое простое решение.

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

http://www.example.com/img/img.jpg?a=TIMESTAMP

Где TIMESTAMP - функция отметки времени, основанная на используемом вами языке.

Просто, но сложно;)

person andremene    schedule 09.05.2018
comment
он работает, но не добавляйте его в миниатюру при использовании встроенного запроса, оставьте миниатюру без изменений - person kolodi; 22.04.2019
comment
Вы сделали мой день! Отличный ответ - person Ignacio Ara; 06.02.2021
comment
@IgnacioAra;)) - person andremene; 18.03.2021

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

Если вы используете Python, лучший способ:

timestamp = datetime.datetime.now().isoformat()
# Above statement returns like: '2013-11-18T08:18:31.809000'
pic_url = '{0}?a={1}'.format(img_url, timestamp)

Надеюсь, это поможет!

person Aashutosh Rathi    schedule 13.12.2018