개발일지/던파 쌀먹봇

[던파 쌀먹봇] 2021-02-04 개발일지 - 카카오 오픈빌더 외부 API 호출하기

Emil :) 2021. 2. 25. 16:32
728x90
반응형
이 글은 Notion에서 작성 후 재편집한 포스트입니다.

 

목차

개요


구름 서버로 호출해서 결과값을 받는것까지 확인했다.

안되던 이유는 IP주소가 계속 바뀌어서 인것같다..

참고


1. 개발환경 메모

ubuntu 18.04
node.js v14.15.4
npm 6.14.10

 

 

코드 GIT 주소


github.com/kkkapuq/ssalbot

 

kkkapuq/ssalbot

던파 쌀먹봇. Contribute to kkkapuq/ssalbot development by creating an account on GitHub.

github.com

진행 과정


스킬 과정 이해하기


아직까지 전체적인 프로세스에 대한 이해가 부족한 것 같다.

그래도 이것저것 만져보니까 조금씩 이해가 간다... 어렵네

일단 https://github.com/resourceSaga/DF_SEARCH/blob/master/app.js 이 코드를 많이 참조했다.

애초에 오픈빌더 자체가, 디버깅이 안된다는게 제일 큰 문제인것같다...
정확히는, 로컬 웹서버로 돌리면 디버깅이 가능한데, 문제는 사내 보안망이라 외부에서 접속이 안됨.. 그래서 구름을 쓴 이유도 있다.

생각보다 코드 양이 많이 나오는 프로젝트는 아닌것 같았다.

스킬 프로세스


/api/호출될 이름

이런식으로 정의하고 스킬에서 호출한다면, 다음과 같이 함수를 형성해준다.

apiRouter.post("/findItem", function (req, res) { ... }

그리고 응답을 요청한 유저의 키와 타입, 채팅내용 등등을 알아내야하는데..
이것들이 카카오 오픈빌더를 통해서만 넘어오는 값이라, 로컬에선 디버깅이 불가능하다.

뭐... 그래서 일단은 오픈빌더를 통해서 디버깅을 해보고 있는데, 문제가 발생했다.

request가 비동기로 처리되는것..!

비동기 처리는 참 할때마다 난감하다. 뭔가 순서대로 안흘러가는 기분이라...
일단 이렇게 하면 0번째 row값은 가져오는걸 확인했다.

const APIkey = require('./myKey.js');

var dnf = 'https://api.neople.co.kr/df/auction'

var itemId;         //아이템ID
var itemName;       //아이템명
var count;          //아이템개수
var unitPrice;      //개당 가격
var currentPrice;   //현재가(총합)
var avgPrice;       //평균가(개당)

var jsonData; //json 파싱 데이터
var url;      //json url
var answer;   //최종 응답
var botsay;   //봇이 할말

const express = require('express');
const app = express();
const logger = require('morgan');
const bodyParser = require('body-parser');
const { request, response } = require('express');
const { json } = require('body-parser');

const apiRouter = express.Router();

app.use(logger('dev', {}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

app.use('/api', apiRouter);

//응답 예제
apiRouter.post('/sayHello', function (req, res) {
  const responseBody = {
    version: "2.0",
    template: {
      outputs: [
        {
          simpleText: {
            text: "hello I'm Ryan"
          }
        }
      ]
    }
  };

  res.status(200).send(responseBody);
});

//응답 예제 (카드형)
apiRouter.post('/showHello', function (req, res) {
  console.log(req.body);

  const responseBody = {
    version: "2.0",
    template: {
      outputs: [
        {
          simpleImage: {
            imageUrl: "https://t1.daumcdn.net/friends/prod/category/M001_friends_ryan2.jpg",
            altText: "hello I'm Ryan"
          }
        }
      ]
    }
  };

  res.status(200).send(responseBody);
});

function setErrorTalk() {
  botsay = '에러발생, 상담직원전환 -> 현재화면을 보내주시면 감사하겠습니다.';
}

// apiRouter.post('/frequentlyResources', function (req, res) {
//   console.log(req.body);

//   const question = req.body.user

//   const responseBody = {
//     version: "2.0",
//     template: {
//       outputs: [
//         {
//           simpleImage: {
//             imageUrl: "https://t1.daumcdn.net/friends/prod/category/M001_friends_ryan2.jpg",
//             altText: "hello I'm Ryan"
//           }
//         }
//       ]
//     }
//   };

//   res.status(200).send(responseBody);
// });

apiRouter.post("/findItem", function (req, res) {

  var user_key = decodeURIComponent(req.body.user_key); // user's key
  var type = decodeURIComponent(req.body.type); // message type
  var content = decodeURIComponent(req.body.content); // user's message

  var user_key = 'asdf'
  var type = 'text'; // message type
  var content = '생명의 숨결'; // user's message

  console.log(user_key);
  console.log(type);
  console.log(content);

  function setMsg(msg) {
    answer = {
        'message': {
            'text': msg
        }
    }
  }

  function lastCall() {
    setMsg(botsay);
    res.set({
        'content-type': 'application/json'
    }).send(JSON.stringify(answer));
  }

  function cannotFind() {
    botsay = '아이템을 정확히 입력해주세요, 약칭은 개선해 나가겠습니다 ㅠㅠ';
    lastCall();
  }

  function findItem(){
    const request = require('request');
    url = "https://api.neople.co.kr/df/auction?itemName=%EC%83%9D%EB%AA%85%EC%9D%98%20%EC%88%A8%EA%B2%B0&apikey=" + APIkey;
    console.log('url 1=' + url);
    request.get({uri:url}, function(error, response, body){

      console.log(res.statusCode);
      if(!error) {
        jsonData = JSON.parse(body);
        jsonData = jsonData.rows[0];
        itemId = jsonData.itemId;
        console.log(itemId);
  
        itemName = jsonData.itemName;
        count = jsonData.count;
        unitPrice = jsonData.unitPrice;
        currentPrice = jsonData.currentPrice;
        avgPrice = jsonData.avgPrice;

        const responseBody = {
          version: "2.0",
          template: {
            outputs: [
              {
                basicCard: {
                  title: itemName,
                  description: "개수 : " + count + "\n" + "개당 가격 : " + unitPrice + "\n",
                  thumbnail:{
                    imageUrl: "https://img-api.neople.co.kr/df/items/" + itemId
                  }
                }
              }
            ]
          }
        };
      
        res.status(200).send(responseBody);
  
      } else {
        setErrorTalk();
        lastCall();
      }
    });
  }
  //함수 선언 끝

  // const userRequest = req.body.userRequest;

  findItem();
  console.log(req.body);

  // const question = req.body.user

  // botsay = '검색을 원하는 아이템명을 입력해주세요';
  // lastCall();
  // console.log(lastCall());

  // const responseBody = {
  //   version: "2.0",
  //   template: {
  //     outputs: [
  //       {
  //         basicCard: {
  //           title: itemName,
  //           description: "개수 : " + count + "\n" + "개당 가격 : " + unitPrice + "\n",
  //           thumbnail:{
  //             imageUrl: "https://img-api.neople.co.kr/df/items/" + itemId
  //           }
  //         }
  //       }
  //     ]
  //   }
  // };

  // res.status(200).send(responseBody);

  // const responseBody = {
  //   version: "2.0",
  //   template: {
  //     outputs: [
  //       {
  //         simpleImage: {
  //           imageUrl: "https://t1.daumcdn.net/friends/prod/category/M001_friends_ryan2.jpg",
  //           altText: itemName
  //         }
  //       }
  //     ]
  //   }
  // };

  // res.status(200).send(responseBody);
});




apiRouter.get('/keyboard', (req, res) => {
  const data = { 'type': 'text' }
  res.json(data);
});

app.listen(3000, function () {
  console.log('Example skill server listening on port 3000!');
});

나머지 해야할일은

  1. 이 값을 오픈빌더로 보내줄것.
  2. 사용자가 입력한 값에 따라 검색을 할 것
  3. 10개까지 값 가져오기

이렇게만 하면 대략적인 알파버전으로 테스트가 가능할거같다!

오늘의 결과


 

구독 및 하트는 정보 포스팅 제작에 큰 힘이됩니다♡

728x90
반응형