Ниже — описание некоторых сделанных доработок, по разрабатываемому чат-боту.

Команда /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'];
    }
}

(warning) Важно: домен, откуда мы будем читать картинки, должен быть https:// (т.к. мы работам с https домена); включаем поддержку https/ssl на нашем сайте (откуда будем фотки парсить)

(плюс) Ура, теперь читается картинка по https:

https://mishaikon.ru/wp-content/uploads/2021/10/img_20121022_1713456470057789421639589-300x300.jpg

(звезда) Скриптом напрямую с сайта прочитать и передать картинки чот не получилось (URL указанный не читается, выдает ошибку 404), поэтому через метод savePhoto мы сохраняем временно картинку к себе на сервер, отсюда уже ее читаем и передаем клиенту.

(плюс) Заработала фича:


PS: если хотите начать мастерски программировать, советую пойти на курсы “Отус PHP, где я сейчас сам обучаюсь: куча полезной практики на каждом уроке !

Для тех, у кого нет опыта, здесь также есть классный вводный курс по php.

Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.