QR코드 리더 LINEBot 만들기 【nodejs】
완성 데모
안고 있는 과제
nodejsでQRコードを解析する場合、fsモジュールでプロジェクト配下に画像をダウンロードする必要がある。
AWS Lambdaでそれをやろうとすると、read onlyなのでダウンロードはできないと言われて困った。
S3なんかに画像をアップロードする手もあったかもしれないが、そこまでのことでもなかったので、解決策を探した。
▼Lambda에서 화가 난 이미지
▼참고로 한 사이트
Node.js에서 QR 코드 로드
해결책
LINE에서 보낸 이미지를 얻고 jimp 및 qrcode-reader의 모듈 사용
index.js//Lambdaで動かす
"use strict";
// モジュール呼び出し
const crypto = require("crypto");
const line = require("@line/bot-sdk");
const QRReader = require("qrcode-reader");
const jimp = require("jimp");
// インスタンス生成
const client = new line.Client({ channelAccessToken: process.env.ACCESSTOKEN });
exports.handler = (event) => {
let signature = crypto
.createHmac("sha256", process.env.CHANNELSECRET)
.update(event.body)
.digest("base64");
let checkHeader = (event.headers || {})["X-Line-Signature"];
if (!checkHeader) {
checkHeader = (event.headers || {})["x-line-signature"];
}
const body = JSON.parse(event.body);
const events = body.events;
console.log(events);
// 署名検証が成功した場合
if (signature === checkHeader) {
events.forEach(async (event) => {
let message;
switch (event.type) {
case "message":
message = await messageFunc(event);
break;
case "postback":
message = await postbackFunc(event);
break;
case "follow":
message = { type: "text", text: "追加ありがとうございます!" };
break;
}
// メッセージを返信
if (message != undefined) {
await sendFunc(body.events[0].replyToken, message);
// .then(console.log)
// .catch(console.log);
return;
}
});
}
// 署名検証に失敗した場合
else {
console.log("署名認証エラー");
}
};
async function sendFunc(replyToken, mes) {
const result = new Promise(function (resolve, reject) {
client.replyMessage(replyToken, mes).then((response) => {
resolve("送信完了");
});
});
return result;
}
async function messageFunc(event) {
let message = "";
message = { type: "text", text: `メッセージイベント` };
if (event.message.type === "image") {
const imageBuffer = await (() =>
new Promise((resolve) => {
client.getMessageContent(event.message.id).then((stream) => {
const bufs = [];
stream.on("data", (chunk) => {
bufs.push(chunk);
});
stream.on("end", async () => {
resolve(Buffer.concat(bufs));
});
stream.on("error", (err) => {
// error handling
});
});
}))();
const img = await jimp.read(imageBuffer);
const qr = new QRReader();
const value = await new Promise((resolve, reject) => {
qr.callback = (err, v) => (err != null ? reject(err) : resolve(v));
qr.decode(img.bitmap);
});
message = { type: "text", text: `解析結果${value.result}` };
}
return message;
}
const postbackFunc = async function (event) {
let message = "";
message = { type: "text", text: "ポストバックイベント" };
return message;
};
리포지토리
람다판도 만들었다
결론
계속 고민하고 있었던 것을 해결할 수 있어서 좋았다! !
여기도 좋다면 참고하십시오.
Reference
이 문제에 관하여(QR코드 리더 LINEBot 만들기 【nodejs】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/inoue2002/items/0099c17d9f2a69e21920
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
nodejsでQRコードを解析する場合、fsモジュールでプロジェクト配下に画像をダウンロードする必要がある。
AWS Lambdaでそれをやろうとすると、read onlyなのでダウンロードはできないと言われて困った。
S3なんかに画像をアップロードする手もあったかもしれないが、そこまでのことでもなかったので、解決策を探した。
▼Lambda에서 화가 난 이미지
▼참고로 한 사이트
Node.js에서 QR 코드 로드
해결책
LINE에서 보낸 이미지를 얻고 jimp 및 qrcode-reader의 모듈 사용
index.js//Lambdaで動かす
"use strict";
// モジュール呼び出し
const crypto = require("crypto");
const line = require("@line/bot-sdk");
const QRReader = require("qrcode-reader");
const jimp = require("jimp");
// インスタンス生成
const client = new line.Client({ channelAccessToken: process.env.ACCESSTOKEN });
exports.handler = (event) => {
let signature = crypto
.createHmac("sha256", process.env.CHANNELSECRET)
.update(event.body)
.digest("base64");
let checkHeader = (event.headers || {})["X-Line-Signature"];
if (!checkHeader) {
checkHeader = (event.headers || {})["x-line-signature"];
}
const body = JSON.parse(event.body);
const events = body.events;
console.log(events);
// 署名検証が成功した場合
if (signature === checkHeader) {
events.forEach(async (event) => {
let message;
switch (event.type) {
case "message":
message = await messageFunc(event);
break;
case "postback":
message = await postbackFunc(event);
break;
case "follow":
message = { type: "text", text: "追加ありがとうございます!" };
break;
}
// メッセージを返信
if (message != undefined) {
await sendFunc(body.events[0].replyToken, message);
// .then(console.log)
// .catch(console.log);
return;
}
});
}
// 署名検証に失敗した場合
else {
console.log("署名認証エラー");
}
};
async function sendFunc(replyToken, mes) {
const result = new Promise(function (resolve, reject) {
client.replyMessage(replyToken, mes).then((response) => {
resolve("送信完了");
});
});
return result;
}
async function messageFunc(event) {
let message = "";
message = { type: "text", text: `メッセージイベント` };
if (event.message.type === "image") {
const imageBuffer = await (() =>
new Promise((resolve) => {
client.getMessageContent(event.message.id).then((stream) => {
const bufs = [];
stream.on("data", (chunk) => {
bufs.push(chunk);
});
stream.on("end", async () => {
resolve(Buffer.concat(bufs));
});
stream.on("error", (err) => {
// error handling
});
});
}))();
const img = await jimp.read(imageBuffer);
const qr = new QRReader();
const value = await new Promise((resolve, reject) => {
qr.callback = (err, v) => (err != null ? reject(err) : resolve(v));
qr.decode(img.bitmap);
});
message = { type: "text", text: `解析結果${value.result}` };
}
return message;
}
const postbackFunc = async function (event) {
let message = "";
message = { type: "text", text: "ポストバックイベント" };
return message;
};
리포지토리
람다판도 만들었다
결론
계속 고민하고 있었던 것을 해결할 수 있어서 좋았다! !
여기도 좋다면 참고하십시오.
Reference
이 문제에 관하여(QR코드 리더 LINEBot 만들기 【nodejs】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/inoue2002/items/0099c17d9f2a69e21920
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
//Lambdaで動かす
"use strict";
// モジュール呼び出し
const crypto = require("crypto");
const line = require("@line/bot-sdk");
const QRReader = require("qrcode-reader");
const jimp = require("jimp");
// インスタンス生成
const client = new line.Client({ channelAccessToken: process.env.ACCESSTOKEN });
exports.handler = (event) => {
let signature = crypto
.createHmac("sha256", process.env.CHANNELSECRET)
.update(event.body)
.digest("base64");
let checkHeader = (event.headers || {})["X-Line-Signature"];
if (!checkHeader) {
checkHeader = (event.headers || {})["x-line-signature"];
}
const body = JSON.parse(event.body);
const events = body.events;
console.log(events);
// 署名検証が成功した場合
if (signature === checkHeader) {
events.forEach(async (event) => {
let message;
switch (event.type) {
case "message":
message = await messageFunc(event);
break;
case "postback":
message = await postbackFunc(event);
break;
case "follow":
message = { type: "text", text: "追加ありがとうございます!" };
break;
}
// メッセージを返信
if (message != undefined) {
await sendFunc(body.events[0].replyToken, message);
// .then(console.log)
// .catch(console.log);
return;
}
});
}
// 署名検証に失敗した場合
else {
console.log("署名認証エラー");
}
};
async function sendFunc(replyToken, mes) {
const result = new Promise(function (resolve, reject) {
client.replyMessage(replyToken, mes).then((response) => {
resolve("送信完了");
});
});
return result;
}
async function messageFunc(event) {
let message = "";
message = { type: "text", text: `メッセージイベント` };
if (event.message.type === "image") {
const imageBuffer = await (() =>
new Promise((resolve) => {
client.getMessageContent(event.message.id).then((stream) => {
const bufs = [];
stream.on("data", (chunk) => {
bufs.push(chunk);
});
stream.on("end", async () => {
resolve(Buffer.concat(bufs));
});
stream.on("error", (err) => {
// error handling
});
});
}))();
const img = await jimp.read(imageBuffer);
const qr = new QRReader();
const value = await new Promise((resolve, reject) => {
qr.callback = (err, v) => (err != null ? reject(err) : resolve(v));
qr.decode(img.bitmap);
});
message = { type: "text", text: `解析結果${value.result}` };
}
return message;
}
const postbackFunc = async function (event) {
let message = "";
message = { type: "text", text: "ポストバックイベント" };
return message;
};
람다판도 만들었다
결론
계속 고민하고 있었던 것을 해결할 수 있어서 좋았다! !
여기도 좋다면 참고하십시오.
Reference
이 문제에 관하여(QR코드 리더 LINEBot 만들기 【nodejs】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/inoue2002/items/0099c17d9f2a69e21920
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
계속 고민하고 있었던 것을 해결할 수 있어서 좋았다! !
여기도 좋다면 참고하십시오.
Reference
이 문제에 관하여(QR코드 리더 LINEBot 만들기 【nodejs】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/inoue2002/items/0099c17d9f2a69e21920텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)