Как отправлять .pdf файлы с google диска через телеграм бот?
Я создал самого простого бота в Node.js, используя telegraf.js фреймворк. Хочу, чтобы при нажатии на определенную команду, бот отправлял клиенту .pdf документ, расположенный на google диске (публичный доступ к документу открыл).
require('dotenv').config()
const { Telegraf } = require('telegraf')
const bot = new Telegraf(process.env.BOT_TOKEN)
bot.command('dwnld', ctx => {
bot.telegram.sendDocument(ctx.chat.id, 'https://drive.google.com/file/d/1EETTa6cruWH4i-pB6s-WnSuI4EZtEKY6/view?usp=sharing')
})
bot.launch()
Но при нажатии на созданную команду dwnld в телеграме Node.js выдаёт ошибку Error: 400: Bad Request: failed to get HTTP URL content. Ссылка на документ - рабочая. Подскажите, как мне добиться желаемого?
Ответы (1 шт):
Открываем документацию:
Отправка по URL-адресу
При отправке по URL-адресу целевой файл должен иметь правильный тип MIME (например, audio/mpeg для SendAudio и т.д.). В sendDocument отправка по URL-адресу в настоящее время работает только для gif-, pdf- и zip-файлов.
Теперь смотрим что за файл вы пытаетесь послать:
x@x:~ $ curl --head 'https://drive.google.com/file/d/1EETTa6cruWH4i-pB6s-WnSuI4EZtEKY6/view?usp=sharing'
HTTP/2 200
content-type: text/html; charset=utf-8
x-robots-tag: noindex, nofollow, nosnippet
cache-control: no-cache, no-store, max-age=0, must-revalidate
pragma: no-cache
content-type: text/html говорит нам о том, что это - web-страница.
Для того чтобы "достичь желаемого" вы должны найти настоящую ссылку на файл и он должен быть gif-, pdf- и zip-. Если файл имеет другой тип то нужно или пользоваться другим методом, или загружать файлы (любые) через multipart/form-data
Что ж, теперь, когда мы во всём разобрались, нужно понять как нам узнать ссылку на нужный файл.
In Google Drive, how can you link directly to “Download” a zip file and not view the contents?
На данный момент вам нужно создать URL-адрес вручную.
https://docs.google.com/uc?export=download&id=YourIndividualIDГде YourIndividualID - это идентификатор соответствующего документа. Вы получаете его либо из URL-адреса, либо нажав Файл → Общий доступ и скопировав его из URL-адреса общего доступа.
Попробуем:
const { URL } = require('url');
...
const url = new URL('https://drive.google.com/file/d/1EETTa6cruWH4i-pB6s-WnSuI4EZtEKY6/view?usp=sharing');
const urlpath = url.pathname.split(/\//);
const id = urlpath[urlpath.length - 2];
...
bot.telegram.sendDocument(
ctx.chat.id,
`https://docs.google.com/uc?export=download&id=${id}`
);