Всем привет, с вами TagdTagd. И это вторая часть. Практическая.

Скрипт писался с привлечением ИИ, но мной отлажен, и точно работает. Требует jq и curl. В отличие от телеграма, в максе заявлено, что бот может писать сообщения пользователю только в течение суток, после последнего сообщения пользователя боту.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Поэтому для нормальной работы оповещателя желательно создать группу, добавить туда бота, и от его имени писать.

С определением номеров пользователей и групп разбирался по статье Романа. Там очень хорошо описано.

#!/bin/bash
# Скрипт отправляет текстовое сообщение пользователю или в чат
# $1 "user" для отправки пользователю, "chat" для отправки в чат
# $2 ID пользователя или чата, соответственно
# $3 "Текст сообщения в кавычках"
# $4 "Имя файла в кавычках"
# если файл есть, а текста нет - вместо текста ""
# v 20260812

declare -x PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

set -euo pipefail
exec 1>&2
declare BASE_URL="https://platform-api2.max.ru"  # база API + нужны сert минцифры
declare BOT_TOKEN="AAAAAAAAAAAAAAAAAAA_BBBBBBBB_CCCCCCCCCCCCCCCC"

# === Параметры скрипта ===
case "$#" in
  0|1|2)
    clear
    head -6 "$0"
    exit 1 ;;
  3)
    declare FILE="" ;;
  *)
    declare FILE=$4
    if [[ -f "$FILE" ]];then
      clear
      echo -e "Файл '$FILE' не найден"
      exit 1
    fi ;;
esac

if [[ -z "$3" && -z "$4" ]]; then
  clear
  echo -e "Ошибка. Нет текста или файла."
  exit 1
fi

declare -l RECEPIENT=$1
declare ID=$2
declare TEXT=$3

case $RECEPIENT in
  user | chat )
    declare TO_URL="$BASE_URL/messages?${RECEPIENT}_id=$ID" ;;
  *)
    clear
    echo -e "ошибка параметра 1" $RECEPIENT\\n
    head -6 "$0"
    exit 1 ;;
esac

#declare -p RECEPIENT ID TEXT FILE TO_URL

# === 1. Получить URL для загрузки файла ===
if [[ -n "$FILE" ]]; then
  UPLOAD_META=$(curl -s -X POST \
    "$BASE_URL/uploads?type=file" \
    -H "Authorization: $BOT_TOKEN")

  UPLOAD_URL=$(echo "$UPLOAD_META" | jq -r '.url')
  if [[ -z "$UPLOAD_URL" || "$UPLOAD_URL" == "null" ]]; then
    echo "Не удалось получить URL для загрузки"
    echo "Ответ API: $UPLOAD_META"
    exit 2
  fi

  # === 2. Загрузить файл ===
  UPLOAD_RESULT=$(curl -s -X POST \
    "$UPLOAD_URL" \
    -F "data=@$FILE")

  # Сохраняем результат загрузки в переменную для вложения
  ATTACHMENT_PAYLOAD="$UPLOAD_RESULT"
fi

# === 3. Формируем JSON сообщения ===
# Если есть файл, добавляем attachment
if [[ -n "$FILE" ]]; then
  MESSAGE_JSON=$(jq -n \
    --arg text "$TEXT" \
    --argjson attachment "$ATTACHMENT_PAYLOAD" \
    '{
      text: $text,
      attachments: [
        {
          type: "file",
          payload: $attachment
        }
      ]
    }')
else
  MESSAGE_JSON=$(jq -n --arg text "$TEXT" '{text: $text}')
fi
sleep 3 # для антифлуда
# === 4. Отправляем сообщение ===

curl -s -X POST \
  "$TO_URL" \
  -H "Authorization: $BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$MESSAGE_JSON" | jq .

Сохраняем send_max.sh

chmod +x ./send_max.sh
/send_max.sh "chat" 123456 "text" "/path/to/file"