Обновляем краткое содержания статей в блоге с помощью ИИ, денег, bash и wp-cli

Всем привет! Если вы не первый раз на моём сайте, как я и гуглобот, то могли заметить, что краткое содержание заметок содержит первые n слов (вроде, 22) из заметки безо всякого осмысления. По крайней мере, так было до недавнего времени.

Поскольку сейчас наступил XXI век, то пора передать формирование краткого содержания заметок на откуп искусственному интеллекту.

Делать плагин мне откровенно не хочется, поэтому я обновил все заметки с помощью bash-скрипта, запрашивая краткое содержание статьи через curl у Yandex GPT через их API.

Алгоритм такой:

  • получаю ID всех статей блога с помощью wp-cli
  • для каждой статьи блога, отправляю её содержимое в Yandex GPT с помощью API
  • получаю краткую выжимку статьи и показываю пользователю
  • если он согласен с содержимым, то обновляю поле post_excerpt у статьи
  • вывожу post_excerpt в мета поле description при формировании статьи в разделе <head>
  • ???
  • PROFIT

Для регистрации и работы с Yandex GPT нужно немного денег, я потратил 50 рублей. Регистрация и получение идентификаторов каталога (folder_id) и API ключа (api_key) найдёте в этой статье на «Хабре»: Как подключить Yandex GPT к своему проекту на Python.

Добавил в скрипт подтверждение каждого шага от пользователя, потому что иногда ИИ выдаёт какую-то политкорректную дичь типа «Я не могу обсуждать эту тему. Давайте поговорим о чём-нибудь ещё» на простые запросы, а также он не умеет работать с видео.

Перед запуском скрипта, не забудьте изменить folder_id, api_key и wordpress_dir на свои.

#!/bin/env bash

# Конфигурация
FOLDER_ID="folder_id"
API_KEY="api_key"
API_URL="https://llm.api.cloud.yandex.net/foundationModels/v1/completion"
WP_DIR=wordpress_dir

wrap_for_yandexgpt() {
  local text="$1"

  jq -n \
    --arg text "$text" \
    --arg folder "$FOLDER_ID" \
    '{
      "modelUri": "gpt://\($folder)/yandexgpt-lite",
      "completionOptions": {
        "stream": false,
        "temperature": 0.6,
        "maxTokens": "2000"
      },
    "messages": [
    {
      "role": "user",
      "text": $text
    }
  ]
}'
}

# Функция для отправки запроса
summarize() {
  local prompt="Кратко перескажи суть следующей статьи для мета описания (длиной до 60 слов) по возможности от первого лица: $1"
  local json_payload=$(wrap_for_yandexgpt "$prompt")

  response=$(curl -s -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Api-Key $API_KEY" \
    -H "x-folder-id: $FOLDER_ID" \
    -d "$json_payload" \
    "$API_URL")

  echo "$response" | jq -r '.result.alternatives[0].message.text'
}


cd $WP_DIR

post_ids=$(wp --allow-root post list --post_status=publish --fields=ID --format=ids)

for post_id in $post_ids; do
  title=$(wp --allow-root post get $post_id --field=title)
  echo "ЗАГОЛОВОК: \"$title\""
  content=$(wp --allow-root post get $post_id --field=content)
  description=$(summarize "$content")
  echo "ЦИТАТА: \"$description\""
  echo

  while true; do
    read -n1 -p "Обновить цитату? (y - да, n - пропустить, q - выход) " choice
    choice=$(echo "$choice" | tr '[:upper:]' '[:lower:]')
    echo

    case $choice in
      y)
        wp --allow-root post update $post_id --post_excerpt="$description"
        break
        ;;
      n)
        break
        ;;
      q)
        exit 0
        ;;
      *)
        continue
        ;;
    esac
  done
done

cd -

Всё, что делает этот скрипт он делает только под вашу личную ответственность. Я никаких гарантий не даю и ответственности за результат не несу. Примерно половину скрипта написал DeepSeek, претензии к нему.

Комментариев нет. Будьте первым!
Добавить комментарий

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

Блог Евгения Жирнова