標準入力の内容をチャットに投稿する2 (Node.js版)
こんな記事を書きましたが、結局渡す内容によってcurlが実行できないことがあったのでNode.jsで書き直しました。 依存パッケージなしで書いてみました。
ただ、プロキシ越えは未実装です。。。
#!/usr/bin/env node
const hook_url = 'https://web/hooks/url';
const channel = 'channel-name';
const icon=':deciduous_tree:';
const getStdin = function(){
return new Promise((resolve, reject) => {
process.stdin.setEncoding('utf8');
var input = [];
process.stdin.on('readable', () => {
const chunk = process.stdin.read();
if (chunk !== null) {
input.push(chunk);
}
});
process.stdin.on('end', () => {
process.stdout.write(`> sending data:\n${input.join('')}`);
resolve(input.join(''));
});
});
};
const postContent = function(url, data){
return new Promise((resolve, reject) => {
const postData = require('querystring').stringify(data);
const urllib = require('url');
const parsedUrl = urllib.parse(url);
const options = {
hostname: parsedUrl.host,
port: url.startsWith('https') ? 443 : 80,
path: parsedUrl.path,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
const lib = url.startsWith('https') ? require('https') : require('http');
const req = lib.request(options, (res) => {
// handle http errors
if (res.statusCode < 200 || res.statusCode > 299) {
reject(new Error('Failed to load page, status code: ' + res.statusCode));
}
// console.log(`STATUS: ${res.statusCode}`);
// console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
const body = [];
res.on('data', (chunk) => {
// console.log(`BODY: ${chunk}`);
body.push(chunk);
});
res.on('end', () => {
// console.log('No more data in response.');
resolve(body.join(''));
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
reject(e);
});
// write data to request body
req.write(postData);
req.end();
});
};
getStdin().then(function(input){
const mes = input;
const data = {
payload: JSON.stringify({
icon_emoji: icon,
text: '```' + mes + '```',
channel: channel
})
};
return postContent(hook_url, data);
})
.then(function(out){
console.log('> done');
})
.catch(function(e){
console.log('error', e);
});