Здравствуйте! Помогите разобраться и как-то исправить ошибку. У меня возникает ошибка 302 при попытке вебхука отправить данные в apps script
Вот мой apps script код:
const config = {
sheetId: "ТУТ ID ТАБЛИЦЫ", // ID вашей таблицы
token: "ТОКЕН API", // API токен вашего бота
userNameBot: "ЮЗЕРНЕЙМ БОТА", // Имя пользователя бота в Telegram
webUrl: "https://script.google.com/macros/s/ТУТ ИДЕНТИФИКАТОР РАЗВЕРТЫВАНИЯ/exec", // URL веб-приложения
apiUrl: "https://api.telegram.org/bot", // Базовый URL для работы с Telegram API
};
/**
* Получаем данные от Telegram
*/
function doPost(request) {
// получаем данные
let update = JSON.parse(request.postData.contents);
// направляем данные в объект WebHook
new WebHook(update);
}
class WebHook {
constructor(update) {
// Разбираем данные из обновления
let message = update.message;
if (message && message.text) {
// Извлекаем информацию из сообщения
let userId = message.from.id; // ID пользователя
let messageText = message.text; // Текст сообщения
let messageId = message.message_id; // ID сообщения (номер ответа)
let source = "telegram"; // Источник сообщения
// Записываем данные в Google Sheets
this.saveToSheet(userId, messageText, source, messageId);
}
}
saveToSheet(userId, messageText, source, messageId) {
// Открываем нужную таблицу
const sheet = SpreadsheetApp.openById(config.sheetId).getSheetByName("bot");
// Добавляем новую строку с данными
sheet.appendRow([new Date(), userId, messageText, messageId, source]);
}
}
/**
* Устанавливаем вебхук для Telegram бота
*/
function setWebHook() {
const url = config.apiUrl + config.token + "/setWebhook?url=" + config.webUrl;
const response = UrlFetchApp.fetch(url);
Logger.log(response.getContentText());
}
/**
* Получаем информацию о текущем вебхуке
*/
function getWebHookInfo() {
const url = config.apiUrl + config.token + "/getWebhookInfo";
const response = UrlFetchApp.fetch(url);
Logger.log(response.getContentText());
}
При тесте через журнал выполнения функции setwebhook, он успешно устанавливается:
Информация {"ok":true,"result":true,"description":"Webhook is already set"}
Когда я запускаю функцию getWebhookInfo, мне выдает вот это:
Информация {"ok":true,"result":{"url":"https://script.google.com/macros/s/ЗДЕСЬ ТОТ ЖЕ САМЫЙ ИДЕНТИФИКАТОР, ЧТО И В ПЕРВОЙ ТАКОЙ ЖЕ ССЫЛКЕ/exec","has_custom_certificate":false,"pending_update_count":29,"last_error_date":1740138213,"last_error_message":"Wrong response from the webhook: 302 Moved Temporarily","max_connections":40,"
pending_update_count":29 - когда я отправляю сообщения в чат в телеграм, это число увеличивается, то есть, я так понимаю, он как бы видит сообщения, передает их в apps script по этому URL, который тут указан, но тот возвращает ошибку 302, т.к. URL поменялся? Или как?
2) Я пробовал отправлять запросы через curl в командной строке типа
curl -X POST "https://script.google.com/macros/s/ИДЕНТИФИКАТОР РАЗВЕРТЫВАНИЯ/exec" -H "Content-Type: application/json" -d "{\"message\": {\"message_id\": 12345, \"text\": \"Привет, как дела?\", \"chat\": {\"id\": 1738000210673, \"first_name\": \"User\", \"last_name\": \"Name\", \"username\": \"user_example\"}, \"reply_to_message\": {\"message_id\": 12344, \"text\": \"User ID:user_1738000210673\\nSource:web\\nMessage:q\"}}}"
В этом случае все нормально работало, данные доходили до apps script, он их обрабатывал и записывал в мою гугл таблицу в соответствующие столбцы.
Я использовал Make.com, делал там настройку для передачи данных из телеграм канала в google sheets с помощью модулей Telegram Bot и Google Sheets - все нормально работает, но напрямую при передаче данных в apps script идет ошибка 302
Как исправить ее? В чем проблема?
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.
Ошибка 302 (Moved Temporarily) указывает на то, что запрос перенаправляется на другой URL.
В контексте Google Apps Script это часто связано с тем, что веб-приложение не развернуто как "Доступное всем, даже анонимным пользователям".
По умолчанию, если веб-приложение не настроено правильно, Google Apps Script может перенаправлять запрос на страницу авторизации, что и вызывает ошибку 302.
А как его правильно развернуть?
Я выбираю "начать развертывание - новое развертывание" - веб-приложение (запуск от моего имени). У кого есть доступ - ВСЕ. Начать развертывание.
И мне выдается:
Идентификатор развертывания: то же самое, что в находится URL веб-приложения между /s/ и /exec
Веб-приложение
URL в таком формате:
https://script.google.com/macros/s/AKfycbzr-POMxSotbnJrNtH-cKKGvlA4B6wi3Ec........../exec
Конкретно такого поля "Доступное всем, даже анонимным пользователям" в этих настройках нет. Оно где-то еще?
да, верно
права на работу с таблицами у приложения есть?
Да, в google sheets выбран максимально возможный доступ (для всех, редактирование), и если прямой запрос через curl в командной строке apps script обрабатывает и записывает корректно, по идее с этим проблем не должно быть
Как я понимаю, происходит смена URL веб-приложения, в которое вебхук передает данные из телеграма канала. То есть я указываю один URL в коде, вебхук телеграм отправляет на него данные, но веб-приложение имеет уже другой URL?
развернул ваш скрипт - все норм - данные в таблице появились
попробуйте развернуть приложение заново
То есть я указываю один URL в коде, вебхук телеграм отправляет на него данные, но веб-приложение имеет уже другой URL?
но исходя из вводных вы же по этому адресу направляете cURL и запись заходит в таблицу.
Я уже его очень много раз развернул, но все тщетно...(
А при запуске функции getWebHookInfo в apps script у вас не возникает никаких ошибок? У меня сразу на этом этапе ошибка, и соответственно, если я пишу что-то в телеграм, никаких данных не появляется у меня в google sheets
Я вижу такие логи в журнале выполнения при запуске функции getWebHookInfo в apps script:
Журнал выполнения
15:33:20 Примечание Выполнение начато
15:33:21 Информация {"ok":true,"result":{"url":"https://script.google.com/macros/s/AKfycbzr-POMxSotbnJrNtH-cKKGvlA4B6wi3EcXwGCuq5USvoEOGPFV5UD0DIkiAQZwoZzW7Q/exec","has_custom_certificate":false,"pending_update_count":30,"last_error_date":1740141150,"last_error_message":"Wrong response from the webhook: 302 Moved Temporarily","max_connections":40,"ip_address":"192.178.49.174"}}
15:33:20 Примечание Выполнение завершено
Прямые curl запросы через командую строку работают, да
У меня проблема, видимо, именно в самом подключении вебхука какая-то
у меня не было никаких ошибок при развертывании и настройки вебхука.
попробуйте создать новый проект, именно проект (новый файл) не развертывание
Я пробую исправить ошибку, но не выходит полностью от нее избавиться.
Я пересоздал проект полностью в apps script, вставил в него код, подключил вебхук, подключение успешно, ошибок нет. Затем отправляю ответ на сообщение, первый ответ записывается в google sheets. Но после первого ответа вебхук опять выдает ошибку 302. То есть он как бы работает, но только один раз. Никакие URL не меняю. Развертываю скрипт как веб-приложение, получаю URL типа
https://script.google.com/macros/s
Этот URL вставляю в функцию, и оно работает ровно на один ответ, дальше возникает ошибка.
Что можно сделать еще? В чем вообще дело? Подскажите, пожалуйста
Вроде решил проблему, заменив везде ContentService на HtmlService