Для начала создадим скрипт: идем по адресу https://script.google.com/, пишем нехитрый код.
function doGet(e) {
return ContentService.createTextOutput(e.parameters.prefix + '(404)')
.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
Сохраняем версию скрипта: Файл - Версии - Сохранить новую версию.
Разворачиваем веб-приложение: Публикация - Развернуть как веб-приложение.
Тестируем.
Попробуем получить данные из клиентского скрипта.
Пишем код:
<!DOCTYPE html>
<html>
<head>
<title>Node + GAS CS</title>
</head>
<body>
<script type="text/javascript">
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://script.google.com/macros/s/AKfycbyAM01B_KCQMdiDO0MOnK-wMW70GDBDuGeuoqSAZQdcTHN4atNL/exec?prefix=gotit';
document.getElementsByTagName("head")[0].appendChild(script);
function gotit(data) {
console.log(data);
document.body.appendChild(document.createTextNode(data)); // для визуализации
}
</script>
</body>
</html>
Тестируем.
Переходим к созданию приложения на Node.js.
Открываем консоль, создаем каталог приложения.
Пишем код:
var https = require('https');
https.request({
hostname: 'script.google.com',
path: '/macros/s/AKfycbyAM01B_KCQMdiDO0MOnK-wMW70GDBDuGeuoqSAZQdcTHN4atNL/exec?prefix=gotit'
}, function(res) {
console.log("statusCode: ", res.statusCode);
res.on('data', function(d) {
process.stdout.write(d);
}
);
}).on('error', function(e) {
console.error(e);
}).end();
Выполняем:
Косяк ... Попробуем напрямую по адресу редиректа.
var https = require('https');
https.request({
hostname: 'script.googleusercontent.com',
path: '/macros/echo?user_content_key=F4Hjt2xbdst9ljd3lyc_vN9MlgYVX0xmG1Dh-CRvbWrPMhPKUKNxS61xIZVmcKJXC6DgPr_qiHyFa_iFPkmwYO5UbyAbFabVm5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnGZcsj79OnH81pv3MMZcONDCa5_DrZ1OP80LQMcWh5QmFGLNpwQWbMUhp3YMIK--MhE_KXqosiQC&lib=MX6uGWWZ6UAAk8HBgycIDYfDMovwSBqo9'
}, function(res) {
console.log("statusCode: ", res.statusCode);
res.on('data', function(d) {
process.stdout.write(d);
}
);
}).on('error', function(e) {
console.error(e);
}).end();
Выполняем:
Тысяча чертей, сударь! Похоже придется парсить url с помощью соответствующего модуля.
var https = require('https'), url = require('url');
https.request({
hostname: 'script.google.com',
path: '/macros/s/AKfycbyAM01B_KCQMdiDO0MOnK-wMW70GDBDuGeuoqSAZQdcTHN4atNL/exec?prefix=gotit'
}, function(res) {
console.log("statusCode: ", res.statusCode);
var location = url.parse(res.headers.location);
console.log('\n-----\n',
'hostname: ', location.hostname + '\n',
'pathname: ', location.pathname + '\n',
'search: ', location.search,
'\n-----\n');
}).on('error', function(e) {
console.error(e);
}).end();
Выполняем код пару раз.
Значение ключа user_content_key разное. Что и следовало.
Остается сформировать и выполнить еще один запрос.
var https = require('https'), url = require('url');
https.request({
hostname: 'script.google.com',
path: '/macros/s/AKfycbyAM01B_KCQMdiDO0MOnK-wMW70GDBDuGeuoqSAZQdcTHN4atNL/exec?prefix=gotit'
}, function(res) {
console.log("statusCode: ", res.statusCode);
var location = url.parse(res.headers.location);
console.log('\n-----\n',
'hostname: ', location.hostname + '\n',
'pathname: ', location.pathname + '\n',
'search: ', location.search,
'\n-----\n');
https.get({
hostname: location.hostname,
path: location.pathname + location.search
}, function(res) {
console.log('statusCode: ', res.statusCode);
res.on('data', function(d) {
process.stdout.write(d);
});
});
}).on('error', function(e) {
console.error(e);
}).end();
Или снова с помощью https.request, например:
var https = require('https'), url = require('url');
https.request({
hostname: 'script.google.com',
path: '/macros/s/AKfycbyAM01B_KCQMdiDO0MOnK-wMW70GDBDuGeuoqSAZQdcTHN4atNL/exec?prefix=gotit'
}, function(res) {
console.log("statusCode: ", res.statusCode);
var location = url.parse(res.headers.location);
console.log('\n-----\n',
'hostname: ', location.hostname + '\n',
'pathname: ', location.pathname + '\n',
'search: ', location.search,
'\n-----\n');
https.request({
hostname: location.hostname,
path: location.pathname + location.search
}, function(res) {
console.log('statusCode: ', res.statusCode);
res.on('data', function(d) {
process.stdout.write(d);
});
}).on('error', function(e) {
console.error(e);
}).end();
}).on('error', function(e) {
console.error(e);
}).end();
Выполняем.
Статус - 200, содержательное сообщение 404 - на месте :).
В завершение - вариант решения с использованием готового модуля.
Устанавливаем:
- npm install follow-redirects
Пишем код, который почти не отличается от вступительного на Node.js текущей статьи.
var https = require('follow-redirects').https;
https.request({
hostname: 'script.google.com',
path: '/macros/s/AKfycbyAM01B_KCQMdiDO0MOnK-wMW70GDBDuGeuoqSAZQdcTHN4atNL/exec?prefix=gotit'
}, function(res) {
console.log("statusCode: ", res.statusCode);
res.on('data', function(d) {
process.stdout.write(d);
}
);
}).on('error', function(e) {
console.error(e);
}).end();
Выполняем.
Результат практически не отличается от полученного выше. Но иногда полезно написать свой "велосипед" :).







Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации