Skip to content

Commit

Permalink
JSDocを修正&整形
Browse files Browse the repository at this point in the history
  • Loading branch information
ilim0t committed Dec 12, 2018
1 parent d7df4da commit 158b5f8
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 85 deletions.
33 changes: 21 additions & 12 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,46 +5,55 @@ const {capture} = require("./caputure");
const slack = require("./slack");

const main = async () => {
//認証鍵の設定
const {client_id, client_secret} = process.env;
if (client_id === undefined || client_secret === undefined) {
if (!client_id || !client_secret) {
console.log("READMEに従ってGoogle Photos APIsの認証鍵を設定してください");
process.exit(1);
process.exit(1)
}
const oAuth2Client = await photoapi.getOAuthToken(client_id, client_secret);

//共有するためアルバムを指定
const albumTitle = "bushitsuchan_album";
const albums = await photoapi.getAlbumList(oAuth2Client);
let album = albums.filter((album) => album.title === albumTitle)[0];

if (album === undefined) {
album = await photoapi.createAlbum(oAuth2Client, albumTitle);
await photoapi.shareAlbum(oAuth2Client, album.id);
await photoapi.shareAlbum(oAuth2Client, album.id)
}

//定期的に撮影した写真の共有リンクをslackbotで送信
//https://developers.google.com/photos/library/guides/api-limits-quotas に抵触しないように!!
/**
* 何msに一回実行するか あまり小さくしすぎるとエラーが発生します
* @type {number}
*/
const interval = 10 * 1000;
if (60 * 60 * 24 * 1000 / 10000 * 3 > interval) {
console.log(`注意: 1日あたり${(60 * 60 * 24 * 3 / interval * 1000).toLocaleString()}回PhotoAPIを叩く設定で,1日の上限10,000回を越してしまいます`);
console.log(`注意: 1日あたり${(60 * 60 * 24 * 3 / interval * 1000).toLocaleString()}回PhotoAPIを叩く設定で,1日の上限10,000回を越してしまいます`)
}
setInterval(async () => {
const url = await capture(oAuth2Client, album).catch(e => {
console.error(e.name);
if (e.name === "StatusCodeError") {
console.error(JSON.parse(e.error).error.message);
return;
return
}
console.error(e.message);
// console.error(e);
console.error(e.message)
// console.error(e)
});

if (!url) {
return;
return
}
const shortURL = await photoapi.getShortURL(url);
slack.send(shortURL); // ここをカスタマイズしてください
}, interval);

// ここをカスタマイズしてください
slack.send(shortURL)
}, interval)
};


if (require.main === module) {
main().catch(console.error);
main().catch(console.error)
}
46 changes: 10 additions & 36 deletions caputure.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,54 +18,28 @@ const Webcam = NodeWebcam.create({
});

/**
@typedef {Object} OAuth2Client
@property {Function} getAccessToken
*/

/**
* @param {OAuth2Client}oAuth2Client
* 写真を撮影しGooglePhotoへとアップロード,その共有リンクを取得します
* @param {oAuth2Client} oAuth2Client - photoapi.getOAuthToken関数で取得します
* @param {Object} album
* @returns {Promise<void>}
*/
module.exports.capture = async (oAuth2Client, album) => {
const photo = await new Promise((resolve, reject) => {
Webcam.capture("capture", (err, photo) => {
if (err) {
reject(err);
reject(err)
}
resolve(photo);
resolve(photo)
})
}).catch(e => {
console.error(e);
console.error(
"READMEに従ってカメラを使えるようにしてください\n" +
"また,OSやセキュリティソフトでカメラへのアクセスをブロックしている可能性もあります 解除してください\n");
process.exit(1);
process.exit(1)
});
const uploadToken = await photoapi.uploadPhoto(oAuth2Client, photo, Date().toLocaleString());
const mediaItem = await photoapi.createAlbumMediaItem(oAuth2Client, album.id, uploadToken, "");
if (mediaItem === undefined) {
console.error()
}
const {baseUrl} = await photoapi.getMediaItem(oAuth2Client, mediaItem.mediaItem.id);
if (baseUrl === undefined || baseUrl === "") {
console.error()
}
return baseUrl;
};

async function main() {
const oAuth2Client = await photoapi.getOAuthToken();

const albumTitle = "bushitsuchan_test_album";
const albums = await photoapi.getAlbumList(oAuth2Client);
let album = albums.filter((album) => album.title === albumTitle)[0];
if (!album.length) {
album = await photoapi.createAlbum(oAuth2Client, albumTitle);
await photoapi.shareAlbum(oAuth2Client, album.id);
}
setInterval(() => module.exports.capture(oAuth2Client, album).then(slack.send), 5000);
}

if (require.main === module) {
main().catch(console.error);
}
const {mediaItem} = await photoapi.createAlbumMediaItem(oAuth2Client, album.id, uploadToken, "");
const {baseUrl} = await photoapi.getMediaItem(oAuth2Client, mediaItem.id);
return baseUrl
};
104 changes: 67 additions & 37 deletions photoAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,28 @@ const rp = require("request-promise");


const rpap = rp.defaults({
transform: (body, response, resolveWithFullResponse) => {
const constentType = response.headers["content-type"].split(";")[0];
"transform": (body, response) => {
const constentType = response.headers["content-type"].split("")[0];
if (constentType === "application/json") {
return JSON.parse(body);
return JSON.parse(body)
} else if (constentType === "text/plain") {
return body;
return body
} else {
return body;
return body
}
}
});

/**
@typedef {Object} OAuth2Client
@property {Function} getAccessToken
* @typedef {Object} oAuth2Client
* @property {function: string} getAccessToken
*/

/**
* @returns {Promise<OAuth2Client>}
* 認証鍵を取得します
* @param {string} client_id - GCPで取得したクライアントID
* @param {string} client_secret - GCPで取得したクライアントシークレット
* @returns {Promise<oAuth2Client>}
*/
module.exports.getOAuthToken = (client_id, client_secret) => {
const oAuth2Client = new google.auth.OAuth2(
Expand All @@ -43,7 +46,7 @@ module.exports.getOAuthToken = (client_id, client_secret) => {
const tokenPath = path.join(__dirname, "token.json");
if (fs.existsSync(tokenPath)) {
oAuth2Client.setCredentials(require(tokenPath));
return oAuth2Client;
return oAuth2Client
}
const authURL = oAuth2Client.generateAuthUrl({
access_type: "offline",
Expand All @@ -60,19 +63,21 @@ module.exports.getOAuthToken = (client_id, client_secret) => {
rl.close();
if (authorizationCode === "") {
console.error("入力が無効です 再実行してください");
process.exit(1);
process.exit(1)
}
const {tokens} = await oAuth2Client.getToken(authorizationCode);
oAuth2Client.setCredentials(tokens);
fs.writeFileSync(tokenPath, JSON.stringify(tokens));
resolve(oAuth2Client);
resolve(oAuth2Client)
})
});
})
};


/**
* @param {OAuth2Client} oAuth2Client
* @returns {Promise<Array.<Object>>}
* アルバム一覧の取得
* @param {oAuth2Client} oAuth2Client - getOAuthToken関数で取得します
* @returns {Promise<Array<Object>>}
*/
module.exports.getAlbumList = async oAuth2Client => {
const accessToken = await oAuth2Client.getAccessToken();
Expand All @@ -85,14 +90,16 @@ module.exports.getAlbumList = async oAuth2Client => {
method: "GET",
headers: headers
})
.then(response => response["albums"]);
.then(response => response["albums"])
};


/**
* @param {OAuth2Client} oAuth2Client
* @param {ReadStream} photo
* 画像のバイナリデータを送信します
* @param {oAuth2Client} oAuth2Client - getOAuthToken関数で取得します
* @param photo
* @param {string} filename
* @returns {Promise<string>}
* @returns {Promise<string>} uploadToken
*/
module.exports.uploadPhoto = async (oAuth2Client, photo, filename) => {
const accessToken = await oAuth2Client.getAccessToken();
Expand All @@ -107,14 +114,16 @@ module.exports.uploadPhoto = async (oAuth2Client, photo, filename) => {
method: "POST",
headers: headers,
body: photo
});
})
};


/**
* @param {OAuth2Client} oAuth2Client
* @param {string} uploadToken
* アップロードした画像を単なる写真として保存します
* @param {oAuth2Client} oAuth2Client - getOAuthToken関数で取得します
* @param {string} uploadToken - uploadPhoto関数で取得します
* @param {string} description
* @returns {Promise<Array.<Object>>}
* @returns {Promise<Array<Object>>}
*/
module.exports.createMediaItem = async (oAuth2Client, uploadToken, description) => {
const accessToken = await oAuth2Client.getAccessToken();
Expand All @@ -138,13 +147,15 @@ module.exports.createMediaItem = async (oAuth2Client, uploadToken, description)
headers: headers,
body: JSON.stringify(body)
})
.then(response => response["newMediaItemResults"]);
.then(response => response["newMediaItemResults"])
};


/**
* @param {OAuth2Client} oAuth2Client
* アップロードした画像をアルバムに追加します
* @param {oAuth2Client} oAuth2Client - getOAuthToken関数で取得します
* @param {string} albumID
* @param {string} uploadToken
* @param {string} uploadToken - uploadPhoto関数で取得します
* @param {string} description
* @returns {Promise<Object>}
*/
Expand Down Expand Up @@ -174,8 +185,10 @@ module.exports.createAlbumMediaItem = async (oAuth2Client, albumID, uploadToken,
.then(response => response["newMediaItemResults"][0])
};


/**
* @param {OAuth2Client} oAuth2Client
* アルバムを作成します
* @param {oAuth2Client} oAuth2Client - getOAuthToken関数で取得します
* @param {string} title
* @returns {Promise<Object>}
*/
Expand All @@ -195,11 +208,12 @@ module.exports.createAlbum = async (oAuth2Client, title) => {
method: "POST",
headers: headers,
body: JSON.stringify(body)
});
})
};

/**
* @param {OAuth2Client} oAuth2Client
* アルバムを共有します
* @param {oAuth2Client} oAuth2Client - getOAuthToken関数で取得します
* @param {string} albumID
* @returns {Promise<Object>}
*/
Expand All @@ -220,11 +234,13 @@ module.exports.shareAlbum = async (oAuth2Client, albumID) => {
method: "POST",
headers: headers,
body: JSON.stringify(body)
});
})
};


/**
* @param {OAuth2Client} oAuth2Client
* アップロード済みの写真に関する情報を取得します
* @param {oAuth2Client} oAuth2Client - getOAuthToken関数で取得します
* @param {string} mediaItemID
* @returns {Promise<Object>}
*/
Expand All @@ -238,33 +254,47 @@ module.exports.getMediaItem = async (oAuth2Client, mediaItemID) => {
return rpap(url, {
method: "GET",
headers: headers,
});
})
};

/**
* 与えられたURLの短縮URLを取得します
* @param {string} url
* @returns {Promise<string>} 短縮URL
*/
module.exports.getShortURL = url => {
return rpap.get(`http://is.gd/create.php?format=simple&format=json&url=${url}`)
.then(result => JSON.parse(result)["shorturl"]);
.then(result => JSON.parse(result)["shorturl"])
};

async function main() {
const oAuth2Client = await module.exports.getOAuthToken();
const {client_id, client_secret} = process.env;
if (!client_id || !client_secret) {
console.log("READMEに従ってGoogle Photos APIsの認証鍵を設定してください");
process.exit(1)
}
const oAuth2Client = await module.exports.getOAuthToken(client_id, client_secret);

const albumTitle = "bushitsuchan_test_album";
const albums = await module.exports.getAlbumList(oAuth2Client);
let album = albums.filter((album) => album.title === albumTitle)[0];
if (album === undefined) {
album = await module.exports.createAlbum(oAuth2Client, albumTitle);
await module.exports.shareAlbum(oAuth2Client, album.id);
await module.exports.shareAlbum(oAuth2Client, album.id)
}

const filename = "figure_personal_space.png";
const filename = "example.png";
if (!fs.existsSync(filename)) {
console.error(`${filename}が存在しないのでアップロードできません`);
process.exit(1)
}
const uploadToken = await module.exports.uploadPhoto(oAuth2Client, fs.createReadStream(filename), filename);
const {mediaItem} = await module.exports.createAlbumMediaItem(oAuth2Client, album.id, uploadToken, "");
const {baseUrl} = await module.exports.getMediaItem(oAuth2Client, mediaItem.id);
console.log(`共有リンク: ${baseUrl}`);
console.log(`共有リンク: ${baseUrl}`)
}


if (require.main === module) {
main().catch(console.error);
main().catch(console.error)
}

0 comments on commit 158b5f8

Please sign in to comment.