Ниже — описание некоторых сделанных доработок, по разрабатываемому чат-боту.
Команда /pic: Отображение случайной картинки из фото-архива
Научим нашего бота, разработку которого мы начали ранее тут, отображать случайную картинку с нашего сайта, при вводе команды /pic
Чтобы было примерно вот так:
Предварительно
Нам нужно где-то сохраниться список всех картинок, из которого мы будем потом брать случайную.
Ок, пишем скрипт для составления файла со списком всех картинок на сервере:
(все картинки в WordPress хранятся в одной папке — /www/wp-content/uploads)
index_picures.sh
#!/usr/bin/env bash # replaces a string with another string # @param string source string # @param string search string # @param string replacement string" # usage: result="$(str_replace "foo bar" "foo" "hi")" function str_replace() { [ -z "$1" ] && return 1 [ -z "$2" ] && return 1 [ -z "$3" ] && return 1 _strreplace_var_replace=$(printf "%s\n" "$1" | sed -e "s/${2}/${3}/g") printf "%s\n" "${_strreplace_var_replace}" } # Main script: index photos files echo "START INDEXING ..." target="mishaikonru_photos.txt" [ -e ${target} ] && rm ${target} for file in `find /www/wp-content/uploads -type f -name "*.jpg"` do # make https:// names result="$(str_replace ${file} "/www/wp-content" "http://XXXXX.ru/wp-content")" echo ${result} done > ${target} echo "DONE" echo "Results are saved into file: " ${target} echo "Photos collected: " wc -l < ${target}
Ок, скриптик будет нам создавать список фоток в файле mishaikonru_photos.txt
Теперь нам надо будет его прочитать ….
Доработки класса
Добавляем метод получения картинки в класс:
/** * Print random picture * @return bool * @throws TelegramBotExceptionsTelegramSDKException */ private function actPic(): bool { $photo = new BlogPhoto(); $url = $photo->getRandomPhoto(); $url = $photo->savePhoto($url); $url = TelegramBotFileUploadInputFile::create($url); // @see https://qna.habr.com/q/906075 $this->tgApi->sendPhoto(['chat_id' => $this->msg->getChatId(), 'photo' => $url, 'caption' => ""]); return true; }
в свою очередь, класс для генерации случайной фотки:
/** * Photos from blog */ class BlogPhoto { private array $config; /** * @throws Exception */ public function __construct() { // config file $filename = basename(__FILE__); $filename = strtok($filename, ".") . ".ini"; $config = parse_ini_file($filename, true); if (isset($config['blog_photo'])) { $this->config = $config['blog_photo']; } else { throw new Exception("Config section 'blog_photo' is not found"); } } /** * Get random photo * @return string */ public function getRandomPhoto(): string { if(!isset($this->config['photos_list_file']) || !is_file($this->config['photos_list_file'])) { throw new Exception("Error: photos file not found"); } $f_contents = file($this->config['photos_list_file']); $line = $f_contents[rand(0, count($f_contents) - 1)]; return $line; } /** * Save photo locally to read it properly *(cannot read from remote https:// site, incl my blog) */ public function savePhoto(string $url): string|false { $url = trim($url); $save = file_get_contents($url); if(!$save) { return false; } $fo = fopen($this->config['photo_file'], "w"); if($fo) { fwrite($fo, $save); fclose($fo); } else { return false; } return 'https://' . $_SERVER['HTTP_HOST'] . str_replace(basename(__FILE__), '', strtok($_SERVER['REQUEST_URI'], "?")) . $this->config['photo_file']; } }
Важно: домен, откуда мы будем читать картинки, должен быть https:// (т.к. мы работам с https домена); включаем поддержку https/ssl на нашем сайте (откуда будем фотки парсить)
Ура, теперь читается картинка по https:
https://mishaikon.ru/wp-content/uploads/2021/10/img_20121022_1713456470057789421639589-300x300.jpg
Скриптом напрямую с сайта прочитать и передать картинки чот не получилось (URL указанный не читается, выдает ошибку 404), поэтому через метод savePhoto мы сохраняем временно картинку к себе на сервер, отсюда уже ее читаем и передаем клиенту.
Заработала фича:
PS: если хотите начать мастерски программировать, советую пойти на курсы “Отус PHP”, где я сейчас сам обучаюсь: куча полезной практики на каждом уроке !
Для тех, у кого нет опыта, здесь также есть классный вводный курс по php.
Нет комментариев