카카오톡 봇 만들기 (유튜브 )
카카오톡 봇 만들기! #1 짧고 쉽고 간단하게~ https://youtu.be/It1uQuxegx0
카카오톡 봇 만들기! #2 가위바위보 https://youtu.be/VaQiSzzxLxs
카카오톡 봇 만들기! #3 실시간 검색어 순위 https://youtu.be/Wv0Sv83oLTg
카카오톡 봇 만들기! #번외1 메신져봇으로 갈아타자
https://youtu.be/ojgqvCK26XE
카카오톡 봇 만들기! #4 기능설명, 접어보기, 전체보기 https://youtu.be/Dg1IX-tIEu0
카카오톡 봇 만들기! #5 날씨 알려주기
https://youtu.be/7DNaqFJYm5A
카카오톡 봇 만들기! #6 ftp 원격코딩, 코드관리
https://youtu.be/0nVmajTTNv4
메신져봇 앱으로 카카오톡 봇 만들기! #7 파일 읽고 저장하기
https://youtu.be/PMi7S-92VII
취소선은 2020년 3월 8일 22시 기준 작동불가인것

기능 개선으로 영상과는 코드가 다릅니다.

사용법이 조금 다르니 이점 참조해주시기 바랍니다.

고급진 카톡봇 제작의 필수요소!

 

파일을 읽고 쓰는 방법을 알려드리겠습니다.

 

작동구조는 위 영상에 있으니 따로 언급하지 않겠습니다. 

 


사용법
1. save(파일경로, 저장할 변수)
2. read(파일경로)

영상에서는 save(폴더경로, 파일이름, 저장할변수) , read(폴더경로, 파일이름) 이렇게 되어 있습니다.

폴더경로와 파일이름을 파일경로로 합쳐서 쓰도록 패치 하였습니다. 


밑의 코드중

var sdcard는 코드의 맨 윗쪽에

함수 부분은 코드의 맨 밑쪽에 넣어주시면됩니다.

var sdcard = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();    //절대경로

function save(originpath, content)
{
    // originpath는 sdcard/폴더/파일
    var splited_originpath = originpath.split("/");
    splited_originpath.pop();
    var path = splited_originpath.join("/");

    var folder = new java.io.File(path);
    folder.mkdirs();
    var file = new java.io.File(originpath);
    var fos = new java.io.FileOutputStream(file);
    var contentstring = new java.lang.String(content);
    fos.write(contentstring.getBytes());
    fos.close();
}

function read(originpath)
{
    var file = new java.io.File(originpath);
    if(file.exists() == false) return null;
    try
    {
        var fis = new java.io.FileInputStream(file);
        var isr = new java.io.InputStreamReader(fis);
        var br = new java.io.BufferedReader(isr);
        var temp_br = br.readLine();
        var temp_readline = "";
        while((temp_readline = br.readLine()) !== null){
            temp_br+="\n" + temp_readline; 
        }
        try
        {
            fis.close();
            isr.close();
            br.close();
            return temp_br;
        }
        catch(error)
        {
            return error;
        }
    }
    catch(error)
    {
        return error;
    }
}

 

 


전체코드

var allsee = new Array(1000).join(String.fromCharCode(847));
var sdcard = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();    //절대경로


function response(room, msg, sender, isGroupChat, replier, ImageDB, packageName, threadId){

    if (msg == "/기능") {
        replier.reply("made by 옴블\n\n--------기능------"+allsee+"\n\n안녕\n바보\n가위바위보\n/날씨");
    }
    if (msg == "/패치노트"){
        replier.reply("-----패치노트-----"+allsee+"\n\n20190826 ver1 /기능과 /패치노트 추가");
    }

    if(msg == '안녕'){
        replier.reply('안녕하세요');
    }
    
    if(msg == '바보'){
    	replier.reply('바부야');
    }
    
    if(msg == '가위'||msg == '보' ||msg == '바위'){
        var RSP = ['가위', '바위', '보'];
    	RSP_bot = RSP[Math.floor((Math.random() * 3))];
    	replier.reply(RSP_bot);
    	   
    	if(msg == RSP_bot){
     	   replier.reply('비겼습니다');
    	}
        else if((msg == '가위' && RSP_bot == '바위')||(msg == '보' && RSP_bot == '가위')||(msg == '바위' && RSP_bot =='보')){
    	   replier.reply('당신은 졌습니다');
    	}
    	else{
    	   	replier.reply('당신은 이겼습니다');
    	}
    }
}  

function save(originpath, content)
{
    // originpath는 sdcard/폴더/파일
    var splited_originpath = originpath.split("/");
    splited_originpath.pop();
    var path = splited_originpath.join("/");

    var folder = new java.io.File(path);
    folder.mkdirs();
    var file = new java.io.File(originpath);
    var fos = new java.io.FileOutputStream(file);
    var contentstring = new java.lang.String(content);
    fos.write(contentstring.getBytes());
    fos.close();
}

function read(originpath)
{
    var file = new java.io.File(originpath);
    if(file.exists() == false) return null;
    try
    {
        var fis = new java.io.FileInputStream(file);
        var isr = new java.io.InputStreamReader(fis);
        var br = new java.io.BufferedReader(isr);
        var temp_br = br.readLine();
        var temp_readline = "";
        while((temp_readline = br.readLine()) !== null){
            temp_br+="\n" + temp_readline; 
        }
        try
        {
            fis.close();
            isr.close();
            br.close();
            return temp_br;
        }
        catch(error)
        {
            return error;
        }
    }
    catch(error)
    {
        return error;
    }
}

 

메신져봇앱에서의 방법과 메신져봇R 앱에서의 방법이 다른 경우가 있습니다. 

기존 메신져봇앱에서 기준으로 글을 작성하였으나, 큰 방식은 같으니 메신저봇R을 쓰시는 분들도 조금만 고생해 주신다면 따라하실 수 있습니다. 


카카오톡 봇 만들기 (유튜브 )
카카오톡 봇 만들기! #1 짧고 쉽고 간단하게~ https://youtu.be/It1uQuxegx0
카카오톡 봇 만들기! #2 가위바위보 https://youtu.be/VaQiSzzxLxs
카카오톡 봇 만들기! #3 실시간 검색어 순위 https://youtu.be/Wv0Sv83oLTg
카카오톡 봇 만들기! #번외1 메신져봇으로 갈아타자
https://youtu.be/ojgqvCK26XE
카카오톡 봇 만들기! #4 기능설명, 접어보기, 전체보기 https://youtu.be/Dg1IX-tIEu0
카카오톡 봇 만들기! #5 날씨 알려주기
https://youtu.be/7DNaqFJYm5A
카카오톡 봇 만들기! #6 ftp 원격코딩, 코드관리
https://youtu.be/0nVmajTTNv4
메신져봇 앱으로 카카오톡 봇 만들기! #7 파일 읽고 저장하기
https://youtu.be/PMi7S-92VII
취소선은 2020년 3월 8일 22시 기준 작동불가인것

 

ftp를 이용한 카카오톡 원격코딩 방법을 알려드리겠습니다. 

 

오늘은 코딩보다는 코딩을 위한 프로그램 설치가 더 많아요.

 


 

오늘 할거 요약
1. 공기계에서 ftp 설정
2. 파일질라 (FileZilla) 설치
3. 비쥬얼 스튜디오 코드(Visual Studio Code) 설치
3-1. 비쥬얼 스튜디오 코드 필수 애드온 설치
4. 메신져봇 내장 Api를 사용하여 코드관리 하기

작은 핸드폰 화면으로 코딩하기가 여간 쉽지 않습니다. 

 

하이라이트도 없고, 렉걸리고 ... 생각만해도 숨이 막힙니다. 

 

컴퓨터에서 코딩할 수 있다면 얼마나 편할까요?

 

그 방법을 알려드리겠습니다.

 

 


1. 공기계를 ftp서버로 만들어주기

제가 알려드릴 방식은 공기계에서만 가능합니다. 

녹스, 미뮤같은 에뮬레이터에서는 불가능합니다. 

 

 

 

 

플레이스토어에서 'Ftp 서버'라는 앱을 설치해 주세요.

 

 

 

 

앱을 실행시키고 허용을 눌러주세요

 

 

 

 

설정에 들어가셔서

 

 

 

 

익명사용자 채크 해제 해주세요

 

 

 

 

수동포트말고 '포트'에 들어가셔서 포트번호를 5000으로 해주세요.

(포트번호 5000을 이미 사용하고 있다면 다른 적당한 포트번호로 설정해주세요)

 

 

 

 

빨간 전원버튼을 누르면 이렇게 화면이 나옵니다.

 

 

 

 

빨간 밑줄친 부분을 잘 적어두세요.

핸드폰마다 당연히 다르니깐 당황하지 마세요~

핸드폰의 ip주소입니다.

 

 

 

 

인터넷창을 키고 방금 적어둔 ip주소를 넣어보세요

 

 

 

 

사용자 이름과 비밀번호는 francis 입니다.

나중에 id와 비밀번호는 변경해 주세요

 

 

 

 

이런 창이 뜨면 성공입니다. 

이제 핸드폰은 ftp 서버가 되엇죠.

 

 


2. 파일질라 (FileZilla) 설치

구글에 파일질라를 검색하셔서 무료판 깔아주시면됩니다. 

까는거는 어렵지 않으니깐 패스~ 

 

 

 

 

파일질라를 실행시키면 이런창이 나옵니다. 

호스트에 위에서 적어둔 ip주소중 ':5000'만 빼고 입력해주세요.

사용자명은 francis

비밀번호는 francis

포트는 5000

이렇게 입력하신다음 빠른연결을 누르시면 됩니다. 

 

 

 

 

이렇게 오른쪽에 폴더가 뜨면 성공입니다. 

연결이 안되시는 분들은 공기계랑 컴퓨터랑 같은 공유기에 접속해 있는지 확인해주세요.

 

 

 

 


3. 비쥬얼 스튜디오 코드 설치 (VSC)

코딩하기 편하게 해주는 비쥬얼 스튜디오 코드를 설치해 줍니다. 

구글에 비쥬얼 스튜디오 코드라 검색하셔서 프로그램을 깔아주세요. 

 

 

 

 

비쥬얼 스튜디오 코드를 실행해 줍니다. 

 

맨 왼족 세로바에 사각형 아이콘을 클릭하시면 에드온을 깔 수 있습니다. 

 

위 사진에 나오는 3개의 에드온을 설치해주세요. 

 

 

 


4. 코드 파일 관리 프로그램 만들기

manage.js 라는 파일을 새로 만들어 주시고 다음과 같이 코드를 넣어줍니다. 

 

manage.js는 다른 코딩파일들을 관리하는 프로그램입니다. 

 

리로드(컴파일), 코드 파일 목록보기, 리로드(컴파일)할 파일 정하기 등의 기능을 넣어줄 겁니다. 

 

 

 

 

관리 프로그램은 봇의 주인만 사용해야합니다.

 

이를 위한 여러가지 방법 중 가장 쉬운 방법이 사용자의 이름을 이용하는 겁니다. 

 

sender(메세지를 보내는 사람의 카톡이름)이 "준현크루"와 == (같다면) && (그리고) msg == "리로드" 일때 다음 코드를 실행한다. 

 

여기서 "준현크루"부분에 봇 주인, 또는 관리자의 카톡이름을 넣어주시면 됩니다.

 

(주의할점 : 여기서 카톡이름은 봇이 깔린 공기계 카톡에서 보이는 이름을 기준으로 한다.)

 

 

 

 

 

새로운 명령어들 설명
Api.off(스크립트이름) : 스크립트이름의 작동을 중지한다. 
Api.reload(스크립트이름) : 스크립트이름을 리로드(컴파일)한다.
Api.on(스크립트이름) : 스크립트이름을 작동시킨다.
Api.getScriptNames() : 스크립트 목록을 알려준다.

사진의 25번째 줄을 보시면 msg.indexOf("파일변경") !== -1이라는 코드가 있습니다. 

 

msg에 "파일변경"이라는 문구가 있는지 알려주는 기능을 합니다.

 

indexOf는 원래는 찾으려는 문구의 위치를 알려주는 기능을 합니다. 

 

예를들어 "가나다라"라는 문자열이 있다면, 가나다라.indexOf("나") 는 1이라는 값을 가지게 되는 것이죠. 

 

그런데 가나다라.indexOf("마")는 어떤 값을 가지게 될까요? 가나다라에는 마가 없으니깐 -1이란 값을 가지게 됩니다. 

 

이걸 이용해서 indexOf의 결과값이 !== (==앞에 !가 있으면 not이라는 뜻임) -1이 아니면 해당 문자열안에 찾으려는 문자열이 있다는걸 알 수 있습니다. 

 

 

 

 

코드를 저장하고 manage.js를 공기계에 보내줍니다.

 

보통 메신져봇이 스크립트코드파일을 저장하는 위치는 내부저장소/kakaobot입니다. 

 

(주의!) 메신져봇R에서는 코드 저장 방식과 위치가 바뀌었습니다.

내부저장소/카톡봇/Bots/스크립트파일명 에 스크립트코드파일이 들어가 있으며, 메신저봇처럼 단순히 js파일을 추가해서는 안됩니다.

먼저 메신저봇R 앱에서 manage.js라는 파일을 생성을 해야지 위에서 소개한 방법을 사용할 수 있습니다.

 

 

 

 

manage.js를 보낸후에는 수동으로 컴파일을 해줍니다. 그리고 manage.js의 톱니바퀴모양 아이콘(설정창)을 클릭해줍니다.

 

 

 

 

설정창이 나오는데, 런타임 에러시 자동종료는 체크해제해주고

Api.off()무시는 체크해줍니다.

 

 

 

 

test.js는 런타임에러시 자동종료만 체크해제를 해줍니다.

(Api.off는 건들지 않음)

 

모든 설정은 끝났습니다. 영상 후반부를 보시면 어떤식으로 이용하는지 잘 나와있으니 참조하시길...

 

 


const scriptName = "manage.js";

function response(
  room,
  msg,
  sender,
  isGroupChat,
  replier,
  ImageDB,
  packageName,
  threadId
) {
  //이 코드로 저장과 리로드 기능을 하게 할거임

  //리로드
  if (sender == "옴블" && msg == "리로드") {
    try {
      Api.off(operationJS);   
      if (Api.reload(operationJS) == true) {
        Api.on(operationJS);
        replier.reply("리로드 성공");
      } else {
        replier.reply("리로드 실패");
      }
    } catch (error) {
      replier.reply(error);
    }
  }

  //js파일 목록 (동기화)
  if (sender == "옴블" && msg == "동기화") {
    replier.reply(Api.getScriptNames());
  }

  //리로드할 파일 정하기
  if (sender == "옴블" && msg.indexOf("파일변경") !== -1) {
    operationJS = msg.split(" ")[1];
    replier.reply(operationJS + "로 변경완료");
  }
}

 

주의

이 코드는 현재(2020년 3월 12일기준) 작동을 안 합니다.

참조만 하세요~

 

 


카카오톡 봇 만들기 (유튜브 )
카카오톡 봇 만들기! #1 짧고 쉽고 간단하게~ https://youtu.be/It1uQuxegx0
카카오톡 봇 만들기! #2 가위바위보 https://youtu.be/VaQiSzzxLxs
카카오톡 봇 만들기! #3 실시간 검색어 순위 https://youtu.be/Wv0Sv83oLTg
카카오톡 봇 만들기! #번외1 메신져봇으로 갈아타자
https://youtu.be/ojgqvCK26XE
카카오톡 봇 만들기! #4 기능설명, 접어보기, 전체보기 https://youtu.be/Dg1IX-tIEu0
카카오톡 봇 만들기! #5 날씨 알려주기
https://youtu.be/7DNaqFJYm5A
카카오톡 봇 만들기! #6 ftp 원격코딩, 코드관리
https://youtu.be/0nVmajTTNv4
메신져봇 앱으로 카카오톡 봇 만들기! #7 파일 읽고 저장하기
https://youtu.be/PMi7S-92VII
취소선은 2020년 3월 8일 22시 기준 작동불가인것

 

이것도 네이버 날씨가 개편이 되면서 작동이 안되는 코드입니다. 

 

하지만 코딩한게 아까워 핵심만 간추려 포스팅을 해둡니다.

 

그리고 함수형 코딩법으로 봇을 만들어 봅니다.


들어가기전에... 핵심요약
1. Utils.getWebText() 명령어로 사이트 웹코드 얻기
2. split, replace 등등으로 필요한 내용만 간추리기
3. 함수형 코딩

날씨기능을 얻는 코드 그 자체는 별로 중요한게 아닙니다.

핵심은 #3에 다 써놓았습니다. 

https://omble-blog.tistory.com/4?category=845743

 

#3 카톡봇을 만들어 보자 - 실시간 검색어 순위 (작동안함)

주의 이 코드는 현재(2020년 3월 9일기준) 작동을 안 합니다. 참조만 하세요~ 카카오톡 봇 만들기 (유튜브 ) 카카오톡 봇 만들기! #1 짧고 쉽고 간단하게~ https://youtu.be/It1uQuxegx0 카카오톡 봇 만들기! #2..

omble-blog.tistory.com

 

 

 

 


 

기능을 추가할수록 코드가 길어져 관리하기가 점점 어려워집니다.

 

이때 함수를 사용하면 어느정도는 코드 관리가 쉬워집니다. 

 

 

 

 

 

다들 수학시간에 함수라는걸 들어봤을 겁니다. 

 

프로그래밍에서도 똑같습니다. 윗 사진을 보면 이해되실 겁니다. 

 

긴 코드를 묶어서 쓰기 좋게 만드는게 함수라고 생각하면됩니다. 

 

 


카카오톡 봇 만들기 (유튜브 )
카카오톡 봇 만들기! #1 짧고 쉽고 간단하게~ https://youtu.be/It1uQuxegx0
카카오톡 봇 만들기! #2 가위바위보 https://youtu.be/VaQiSzzxLxs
카카오톡 봇 만들기! #3 실시간 검색어 순위 https://youtu.be/Wv0Sv83oLTg
카카오톡 봇 만들기! #번외1 메신져봇으로 갈아타자
https://youtu.be/ojgqvCK26XE
카카오톡 봇 만들기! #4 기능설명, 접어보기, 전체보기 https://youtu.be/Dg1IX-tIEu0
카카오톡 봇 만들기! #5 날씨 알려주기
https://youtu.be/7DNaqFJYm5A
카카오톡 봇 만들기! #6 ftp 원격코딩, 코드관리
https://youtu.be/0nVmajTTNv4
메신져봇 앱으로 카카오톡 봇 만들기! #7 파일 읽고 저장하기
https://youtu.be/PMi7S-92VII
취소선은 2020년 3월 8일 22시 기준 작동불가인것

 

봇 사용자들을 위한 기능을 만들어 봅니다. 

 

처음 봇을 본 사람들에게 사용법을 알려줘야겠죠?

 

채팅방에 들어올 때마다 일일히 말할 수는 없는 노릇이구요. 

 

그래서! 봇이 스스로 사용법을 알려주도록 코드를 짜봅시다. 

 


들어가기 전에... 오늘 만드는 코드 설명
1. 도움말 : "/기능"을 보내면 기능과 명령어를 설명함
2. 패치노트 : "/패치노트"라 보내면 패치내역을 보내줌
3. 전체보기 : 답장이 길때, 카톡의 전체보기(접어보기) 기능을 활성화시켜줌

"/기능" msg를 받으면 replier.reply로 답장을 하게 됩니다. 

 

답장 내용은 "made by 준현크루\n\n--------기능-------\n\n가위바위보\n/실검"

 

이렇게 되어있습니다. 

 

이것을 카톡으로 보내면 다음과 같이 됩니다. 

made by 준현크루

--------기능-------

가위바위보
/실검

\n\n은 엔터입니다. 줄을 변경시켜 줍니다. 

 

\는 키보드자판에 프린트 되어 있는 경우도 있지만 대부분은 없습니다. 

 

그럴땐 한국원 기호 ₩을 입력해주세요. 메신져봇에서 자동으로 \ 라고 인식을 하게 됩니다. 

 

(주의하실점!  / <=요거 와는 다른 기호입니다.)

 

새로운 기능을 추가할 때마다 갱신해서 적어주시면 됩니다. 

 

 

 

 

 

"/패치노트" msg를 받으면 패치노트를 알려주도록 코드를 짜봅니다. 

 

"/기능"때처럼 replier.reply 로 답장을 해주면됩니다.

 

사진에 있는 코드는 카톡에서는 이렇게 보입니다. 

------패치노트------

20190826 ver1 /기능과 /패치노트 추가

"/기능"과 마찬가지로 코드를 추가할 때마다 패치노트를 갱신시켜주면 됩니다. 

 

 

 

 

 

계속해서 새로운 기능들을 추가하다보면 "/기능"과 "/패치노트"도 덩달아 길어집니다.

 

그런데 답장이 길어지면 카톡방에서 보기에 불편하겟죠?

 

이럴때 접어보기 기능을 이용하면됩니다. 

 

방법은 간단합니다. 무척긴 공백문자를 생성해서 접고 싶은 곳에 넣으면됩니다. 

 

 

 

 

var allsee = new Array(1000).join(String.fromCharCode(847));

이 공백문자 코드를 맨 윗줄에 두면됩니다. 

 

Array는 배열입니다. 제 첫글(https://omble-blog.tistory.com/2)에 나와있는 그거랑 같습니다. 

 

Array(1000)이므로 1000개의 사물함이 있는 배열을 만든겁니다. 

 

거기에 .join명령어로 1000개의 사물함을 하나로 합쳐줍니다. 

 

이때 사물함 사이에 있던 칸막이를 String.fromCharCode(847)로 치환해줍니다. 

 

String.fromCharCode(847)를 해석하면 CharCode의 847번째 문자라는 뜻입니다.

 

여기서 CharCode란 UTF-16 아스키 코드를 뜻하는데, 아스키 코드란 마치 학교에서 키순으로 번호를 매기는 것처럼 글자에다가 번호를 매기는 규칙이라 생각하시면 됩니다.

 

그중 847번째 글자가 공백문자인거구요. 

 

 

 

 

이렇게 접어보기를 하고 싶은 곳에 allsee를 넣어주면됩니다. 

 


var allsee = new Array(1000).join(String.fromCharCode(847));

function response(room, msg, sender, isGroupChat, replier, ImageDB, packageName, threadId){

    if (msg == "/기능") {
        replier.reply("made by 옴블\n\n--------기능------"+allsee+"\n\n안녕\n바보\n가위바위보\n/날씨");
    }
    if (msg == "/패치노트"){
        replier.reply("-----패치노트-----"+allsee+"\n\n20190826 ver1 /기능과 /패치노트 추가");
    }

    if(msg == '안녕'){
        replier.reply('안녕하세요');
    }
    
    if(msg == '바보'){
    	replier.reply('바부야');
    }
    
    if(msg == '가위'||msg == '보' ||msg == '바위'){
        var RSP = ['가위', '바위', '보'];
    	RSP_bot = RSP[Math.floor((Math.random() * 3))];
    	replier.reply(RSP_bot);
    	   
    	if(msg == RSP_bot){
     	   replier.reply('비겼습니다');
    	}
        else if((msg == '가위' && RSP_bot == '바위')||(msg == '보' && RSP_bot == '가위')||(msg == '바위' && RSP_bot =='보')){
    	   replier.reply('당신은 졌습니다');
    	}
    	else{
    	   	replier.reply('당신은 이겼습니다');
    	}
    }
}    ​

 

 

 

+ Recent posts