개발 생활스터디 그룹을 운영하면서 Notion으로 팀원들의 스터디 현황을 기록하고 공유하고 있다. 아래 두가지 항목을 메인으로 작성하지 못한 팀원 벌금을 내는 제도로 진행한다.
정해진 시간마다 매번 노션페이지에 들어가서 확인하고 팀원들에게 알려주는 수동적인 절차를 줄이고,
실시간 소통 채널로 활용하고 있는 카카오톡 단톡방을 더욱 활성화하고자
노션(+외부) API를 활용하여 노션 페이지에 기록된 내용을 카카오톡에서 바로 확인할 수 있도록 카카오톡 봇을 만들고자 한다.
*프로젝트 레포 : https://github.com/whrod/mebot-kakao
*데모 영상 : youtube
안드로이드에서 작동하는 메신저봇R 어플리케이션과
node.js의 패키지인 remote-kakao를 활용한다.
메신저봇R은 조건 1, 2, 3 remote-kakao는 3,4,5를 충족시키기 위해 사용했다.
"use strict";
var config = {
address: '127.0.0.1', // Node.js 프로그램을 실행한 기기의 IP
port: 3000,
};
var socket = new java.net.DatagramSocket();
var address = java.net.InetAddress.getByName(config.address);
var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 65535);
var generateId = function (len) {
var result = '';
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (var _ = 0; _ < len; _++)
result += chars[Math.floor(Math.random() * chars.length)];
return result;
};
var getBytes = function (str) { return new java.lang.String(str).getBytes(); };
var inPacket = new java.net.DatagramPacket(buffer, buffer.length);
var sendMessage = function (event, data) {
var bytes = getBytes(JSON.stringify({ event: event, data: data }));
var outPacket = new java.net.DatagramPacket(bytes, bytes.length, address, config.port);
socket.send(outPacket);
};
var sendReply = function (session, success, data) {
var bytes = getBytes(JSON.stringify({ session: session, success: success, data: data }));
var outPacket = new java.net.DatagramPacket(bytes, bytes.length, address, config.port);
socket.send(outPacket);
};
var handleMessage = function (msg) {
var _a;
var _b = JSON.parse(decodeURIComponent(msg)), event = _b.event, data = _b.data, session = _b.session;
switch (event) {
case 'sendText':
var res = Api.replyRoom(data.room, ((_a = data.text) !== null && _a !== void 0 ? _a : '').toString());
sendReply(session, res);
break;
}
};
var send = function (msg) {
sendMessage('chat', {
room: msg.room,
content: msg.msg,
sender: msg.sender,
isGroupChat: msg.isGroupChat,
profileImage: msg.imageDB.getProfileBase64(),
packageName: msg.packageName,
});
};
var response = function (room, msg, sender, isGroupChat, _, imageDB, packageName) { return send({ room: room, msg: msg, sender: sender, isGroupChat: isGroupChat, imageDB: imageDB, packageName: packageName }); };
// @ts-ignore
var thread = new java.lang.Thread({
run: function () {
while (true) {
socket.receive(inPacket);
handleMessage(String(new java.lang.String(inPacket.getData(), inPacket.getOffset(), inPacket.getLength())));
}
},
});
var onStartCompile = function () { return thread.interrupt(); };
thread.start();
// index.ts
import { Server } from '@remote-kakao/core';
import LoggerPlugin from './plugins/logger'; //플러그인 추가
const prefix = '>';
const server = new Server();
server.usePlugin(LoggerPlugin); //플러그인 추가
server.on('message', async (msg) => {
if (!msg.content.startsWith(prefix)) return;
const args = msg.content.split(' ');
const cmd = args.shift()?.slice(prefix.length);
if (cmd === 'ping') {
/*
메신저봇과 카카오톡 서버간의 핑이 아닌,
Node.js와 메신저봇간의 핑입니다.
*/
const timestamp = Date.now();
await msg.reply('Pong!');
msg.reply(`${Date.now() - timestamp}ms`);
}
});
server.start(3000);
// plugins/logger.ts
import { Message, RKPlugin } from '@remote-kakao/core';
class LoggerPlugin extends RKPlugin {
onMessage = async (msg: Message) => {
this.log(`${msg.sender.name}: ${msg.content}`);
};
}
export default LoggerPlugin;
안녕하세요! 카카오톡 챗봇을 만드려고 했는데 공기계가 따로 없어서 고민하던 차에 발견했습니다! 삼성 듀얼메신저 기능 사용하신다고 하셨는데 카톡은 번호 2개가 있어야 한다더라구요ㅠㅠ 혹시 번호는 어떻게 하셨는지 알 수 있을까요??