# Подключение распознавания файлов в различных каналах

### <span style="font-weight: 400;">Редактирование настроек канала VK</span>

<span style="font-weight: 400;">В VK доступны реакции на фото, документы, видео, аудио и стикеры.</span>

<span style="font-weight: 400;">При создании канала необходимо для каждого типа файлов выбрать свои настройки:</span>

1\. Выбрать реакцию на файл:

- Игнорировать - бот не будет реагировать на файлы данного типа;
- Только NLP - бот будет реагировать на файлы данного типа ответом из NLP системы;
- Только меню - бот будет реагировать на файлы данного типа с помощью меню бота;
- Штатная (NLP и меню) - бот будет реагировать обоими способами.

2\. Добавить контекст NLP при необходимости.

3\. Если для файла не должен срабатывать Fallback скрипт, то проставить метку **Отключить Fallback**.

### <span style="font-weight: 400;">Редактирование настроек канала MAX</span>

<span style="font-weight: 400;">В MAX доступны реакции на фото, документы, видео, аудио и стикеры.</span>

<span style="font-weight: 400;">При создании канала необходимо для каждого типа файлов выбрать свои настройки:</span>

1\. Выбрать реакцию на файл:

- Игнорировать - бот не будет реагировать на файлы данного типа;
- Только NLP - бот будет реагировать на файлы данного типа ответом из NLP системы;
- Только меню - бот будет реагировать на файлы данного типа с помощью меню бота;
- Штатная (NLP и меню) - бот будет реагировать обоими способами.

2\. Добавить контекст NLP при необходимости.

3\. Если для файла не должен срабатывать Fallback скрипт, то проставить метку **Отключить Fallback**.

### <span style="font-weight: 400;">Редактирование настроек канала Telegram</span>

<span style="font-weight: 400;">В Telegram доступны реакции на фото, документы, видео, аудио, голосовые сообщения и стикеры.</span>

<span style="font-weight: 400;">При создании канала необходимо для каждого типа файлов выбрать свои настройки:</span>

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2026-06/scaled-1680-/D5zrmxwYnuKOhvMi-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2026-06/D5zrmxwYnuKOhvMi-image.png)

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2026-06/scaled-1680-/5IGoiuTFfPfAh690-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2026-06/5IGoiuTFfPfAh690-image.png)

1\. Выбрать реакцию на файл:

- Игнорировать - бот не будет реагировать на файлы данного типа;
- Только NLP - бот будет реагировать на файлы данного типа ответом из NLP системы;
- Только меню - бот будет реагировать на файлы данного типа с помощью меню бота;
- Штатная (NLP и меню) - бот будет реагировать обоими способами.

2\. Добавить контекст NLP при необходимости.

3\. Если для файла не должен срабатывать Fallback скрипт, то проставить метку **Отключить Fallback**.

### <span style="font-weight: 400;">Редактирование настроек канала Metabot Widget</span>

<span style="font-weight: 400;">В канале **Metabot Widget** через редактирование необходимо:</span>

<span style="font-weight: 400;">1. Поставить активность чекбокса **Разрешить отправку файлов**.</span>

<span style="font-weight: 400;">2. В поле **Список поддерживаемых расширений файлов** добавить список разрешенных форматов файлов: </span>

<table border="1" id="bkmrk-pdf%2Cdoc%2Cdocx%2Cxls%2Cxls" style="border-collapse: collapse; width: 100.001%;"><tbody><tr><td class="align-center" style="width: 99.91%;">pdf,doc,docx,xls,xlsx,csv,txt,png,jpe,jpg,jpeg,gif,bmp,ico,svg,svgz,tif,tiff,jfif,ai,drw,pct,psp,xcf,psd,raw,webp,xbm,dib,pgp,apng,pjpeg,avif,avi,divx,flv,m4v,mkv,mov,mp4,mpeg,mpg,ogm,ogv,ogx,rm,rmvb,smil,webm,wmv,xvid,3gp,3g2,qt,asx</td></tr></tbody></table>

<span style="font-weight: 400;">3. </span>Выбрать реакцию на файл:

- Игнорировать - бот не будет реагировать на файлы данного типа;
- Только NLP - бот будет реагировать на файлы данного типа ответом из NLP системы;
- Только меню - бот будет реагировать на файлы данного типа с помощью меню бота;
- Штатная (NLP и меню) - бот будет реагировать обоими способами.

<span style="font-weight: 400;">4. Сохранить настройки.</span>

<span style="font-weight: 400;"><span id="bkmrk--15" style="font-weight: normal;"><span style="font-size: 11pt; font-family: 'Times New Roman', serif; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; white-space-collapse: preserve;"><span style="border-width: initial; border-style: none; display: inline-block; overflow: hidden; width: 508px; height: 320px;">![](https://lh7-us.googleusercontent.com/bq780Nt2tykBm36gFthumdrunUxWhBTNWSzYk3DaXkAa094c193ZB2AW8ApXdAdhlk-8cDcVmx8uTaUhQUTkP4MakIOPUmVkPKO7dWXIC1pBtuT5HIEMGbxLLgr2HFZ5j0OPyRggjkdLrNFKJkCD5Z8)</span></span></span></span>

### <span style="font-weight: 400;">Создание маршрута</span>

<span style="font-weight: 400;">Для приема файлов необходимо создать маршрут со следующими настройками:</span>

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2026-06/scaled-1680-/QRmWjBP75YJySDNB-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2026-06/QRmWjBP75YJySDNB-image.png)

- Активен параметр **Действует при переводе на оператора**;
- Активен параметр **Действует в диалоге**;
- Регулярное выражение - **:FLAGS\[NO\_RUN,ANY,EMPTY\]**;
- Условие выполнения:

```JavaScript
// Импортируем модули для работы с запросами и базой данных
require("Common.Integrations.Request")
require("Common.DB.Update")

let httpRequest = CommonIntegrationsRequest
let database = CommonDBUpdate

// Входные данные - массив с информацией о файле
let attachments = bot.getAllAttachments()

// Проверяем, есть ли вложения,
// если нет - прекращаем выполнение
if (!attachments.length) {
    return false
}

// URL API для загрузки файла
const channelData = lead.getChannelData();
const platformToken = channelData.webhook_url;
const regexBaseUrl = /^https?:\/\/[^\/]+/;
const platformUrl = channelData
  .full_webhook_url
  .match(regexBaseUrl)?.[0] ?? null;
if (!platformUrl) {
  return false;
}
const apiUrl = platformUrl
  +`/api/v1/storage/uploadLeadFile/`
  + platformToken;
let fileUrl = "@" + attachments[0]?.url
let requestBody = {
    files: [fileUrl], // Передаём массив файлов
    lead_id: leadId // ID лида, к которому прикрепляется файл
}
let requestHeaders = {}
if (lead.getChannelCode() === 'telegram') {
  httpRequest.useProxy(true)
}
let uploadResponse = httpRequest.sendFileFromUrl(
  "POST",
  apiUrl,
  requestBody,
  requestHeaders,
  true
)
database.insertBotLogs(uploadResponse?.response)

lead.setAttr("file", JSON.stringify(uploadResponse?.response))
return false
```

### <span style="font-weight: 400;">Редактирование настроек скрипта с типом Fallback</span>

<span style="font-weight: 400;">В название скрипта Fallback рекомендуем добавить “+ ФАЙЛЫ” для оперативного поиска в списке скриптов. Необходимо проверить корректность настроек NLP в скрипте:</span>

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2026-06/scaled-1680-/sF2p9lFPCrL4GEaC-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2026-06/sF2p9lFPCrL4GEaC-image.png)

<span style="font-weight: 400;">Затем наполните скрипт командами.</span>

<span style="font-weight: 400;">Для работы с разными мессенджерами добавьте отдельные команды с условиями:</span>

```JavaScript
return lead.getChannelCode()
  === "telegram";
```

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2026-06/scaled-1680-/KW8ZutCs023kiSDj-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2026-06/KW8ZutCs023kiSDj-image.png)

- <span style="font-weight: 400;">Для начала добавьте команды обработки файлов для каждого канала бота (описаны ниже).</span>
- <span style="font-weight: 400;">Следующей командой должна идти команда **Выполнить JavaScript**, которая срабатывает в случае, когда файла в сообщениях **нет** (проверка в условии). JavaScript подбирает случайный ответ из списка, фиксирует дату сообщения, заносит в Google таблицу нераспознанный текст;</span>

```JavaScript
// Условие 
return !(memory.getAttr('is_attachment')*1)
```

и

```JavaScript
// JavaScript

var randomStrings = [
        "Не совсем понимаю, о чём вы.",
        "Извините, я вас не понял. Перефразируйте, пожалуйста.",
        "Попробуйте воспользоваться разделами меню или сказать другими словами.", 
        "Простите, не понял вас, попробуйте снова." 
    ];

randomIndex = Math.ceil((Math.random()*randomStrings.length-1));

lead.setAttr('randomAnswer', randomStrings[randomIndex]);
```

- <span style="font-weight: 400;">**Второй командой** должна идти команда **Отправить текст** с рандомным текстом, которая срабатывает в случае, когда файла в сообщениях **нет** (проверка в условии);</span>

```JavaScript
// Условие
return !(memory.getAttr('is_attachment')*1)
```

<table border="1" class="align-center" id="bkmrk-%D0%A2%D0%B5%D0%BA%D1%81%D1%82-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B-%7B%7B-%24ra" style="border-collapse: collapse; width: 44.5685%; height: 73px;"><tbody><tr><td class="align-center" style="width: 100%; background-color: #ced4d9;">**Текст команды**</td></tr><tr><td style="width: 100%;">{{ $randomAnswer }}</td></tr></tbody></table>

- <span style="font-weight: 400;">**Третей командой** должна идти команда **Отправить текст** с текстом, которая срабатывает в случае, когда в сообщении **есть** файл (проверка в условии);</span>```JavaScript
    // Условие
    return (memory.getAttr('is_attachment')*1)
    ```
    
    <table border="1" class="align-center" style="border-collapse: collapse; width: 44.5685%; height: 73px;"><tbody><tr><td class="align-center" style="width: 100%; background-color: #ced4d9;">**Текст команды**</td></tr><tr><td style="width: 100%;"><span style="font-weight: 400;">Файл принят, передадим на изучения группе поддержки. С вами свяжутся либо через чат-бота, либо через имеющиеся контакты.</span>
    
      
    <span style="font-weight: 400;">А пока что можете воспользоваться автоматическим функционалом чат-бота.</span>
    
    </td></tr></tbody></table>
- <span style="font-weight: 400;">При необходимости **четвертой командой** должна идти команда **Email**, которая срабатывает в случае, когда в сообщении **есть** файл (проверка в условии). На почту отправляется письмо с файлом пользователя;</span>

```JavaScript
// Условие
return (memory.getAttr('is_attachment')*1)
```

<table border="1" id="bkmrk-%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D1%82%D0%B5%D0%BB%D1%8C-email%2C-%D0%BD%D0%B0" style="border-collapse: collapse; width: 100.001%;"><tbody><tr><td class="align-left" style="width: 20.9092%; background-color: #ced4d9;">**Получатель**</td><td style="width: 79.1809%;"><span style="font-weight: 400;">email, на который необходимо отправить письмо. (</span><span style="font-weight: 400;">**{{ $bot.botSupportMails }}**)</span></td></tr><tr><td class="align-left" style="width: 20.9092%; background-color: #ced4d9;">**Тема**</td><td style="width: 79.1809%;">**\*Название бота поддержки\***: лид отправил в бота файл</td></tr><tr><td class="align-left" style="width: 20.9092%; background-color: #ced4d9;">**Содержимое**</td><td style="width: 79.1809%;">В чат-боте пользователь прислал в бота файл &lt;br&gt; &lt;br&gt;ID клиента для поиска в диалогах на платформе Metabot: {{ &amp;$leadId }} &lt;br&gt; &lt;br&gt;Ссылка на файл: {{ $is\_attachment }} &lt;br&gt; &lt;img src="{{ $is\_attachment }}" alt="Отправленный файл" width="400" height="341" /&gt; &lt;br&gt; С уважением, &lt;br&gt; Ваш Metabot</td></tr></tbody></table>

<p class="callout info"><span style="font-weight: 400;">При необходимости, можно создать системный атрибут с ключом **botSupportMails**, типом **variable** и значением равным всем почтам, на которые должно поступить письмо.</span></p>

- <span style="font-weight: 400;">**Последней командой** должна идти команда **Повторить вопрос**.</span>

#### Виджет

Для обработки файлов виджета необходим следующий перечень команд:

- <span style="font-weight: 400;">**Первой командой** должна идти команда **Выполнить JavaScript**, которая получает из вебхука событие: есть ли в сообщении с распознанным текстом файл и добавляет переменную **is\_attachment**, что файл есть;</span>

```JavaScript
let whJob = bot.getWebhookJob()
let eventType = whJob.event_type

memory.setAttr('is_attachment', false)
if (eventType === 'user_attachments'){ 
  memory.setAttr('is_attachment', true) bot.disableRepeatMessageText() 
  // погасит вывод сообщения с повтором вопроса 
  bot.hideRepeatMessageButtons() 
  // погасит вывод меню с повтором вопроса 
}
```

- <span style="font-weight: 400;">**Второй командой** должна идти команда **Выполнить JavaScript**, которая фиксирует сам файл в хранилище и формирует ссылку для передачи в последствии в сообщениях/в письме на почту;</span>

```JavaScript
// Библиотека с помощью которой можно записать в карочку лида данные не отправля их в тг
let TelegramMessage = require('Common.Integrations.Telegram')
let msg = new TelegramMessage()

// Все входящие файлы let attachments = bot.getAllAttachments()

if(Boolean(attachments?.[0]?.url)){
  uploadData = bot.downloadFileFromUrl(attachments[0].url) msg.debug('Пользователь отправил файл: ' + uploadData.url)
  lead.setAttr('file', uploadData.url) // Запуск скрипта... 
  bot.runScriptByCodeForLead("recieveFile", lead.getData('id'))
  bot.stop() 
}
```

#### <span style="font-weight: 400;">Telegram</span>

<span style="font-weight: 400;">Для обработки файлов Telegram необходим следующий код:</span>

```JavaScript
// Библиотека с помощью которой можно записать в карочку лида данные не отправля их в тг
let TelegramMessage = require('Common.Integrations.Telegram')
let msg = new TelegramMessage()       

// Все входящие файлы
let attachments = bot.getAllAttachments()

if(Boolean(attachments?.[0]?.url)){

uploadData = bot.downloadFileFromUrl(attachments[0].url)
msg.debug('Пользователь отправил файл: ' + uploadData.url)
  
lead.setAttr('file', uploadData.url)
// Запуск скрипта...
bot.runScriptByCodeForLead("recieveFile", lead.getData('id'))
  
bot.stop()
}
```

#### VK и MAX

Для обработки файлов VK и MAX необходим <span style="font-weight: 400;">следующий код</span>:

```JavaScript
// Все входящие файлы
let attachments = bot.getAllAttachments()

if (Boolean(attachments?.[0]?.url)) {
  const uploadData = bot.downloadFileFromUrl(attachments[0].url)

  if (lead.getData('bot_debug_level')) {
    let data = 'Пользователь отправил файл: ' + uploadData.url;
    bot.sendMessage("🛠️ Отладочная информация \n\n" + data);
  }

  //lead.setAttr('file', uploadData.url)
  lead.setJsonAttr('fileDebug', uploadData)
  // Запуск скрипта...
  bot.runScriptByCodeForLead("recieveFile", leadId)

  bot.stop()
}
```

### <span style="font-weight: 400;">Как достать данные вложений</span>

<span style="font-weight: 400;">Для Telegram используйте метод bot.**getAllAttachments**()</span>

```JavaScript
let attachments = bot.getAllAttachments()
if(Boolean(attachments?.[0]?.url)){
  uploadData = bot.downloadFileFromUrl(attachments[0].url) msg.debug('Пользователь отправил файл: ' + uploadData.url)
  lead.setAttr('file', uploadData.url) 
}
```

Для других каналов bot.**getWebhookPayload**()

```JavaScript
let attachments = bot.getWebhookPayload()
if(attachments.payload.attachments[0].url){
  uploadData = bot.downloadFileFromUrl(attachments.payload.attachments[0].url)
  lead.setAttr('file', uploadData.url) 
}
```

В данных примерах в атрибут записывается url вложения для скачивания с помощью метода bot.**downloadFileFromUrl**().