관리 메뉴

IT & Life

[해외] 자신의 슬랙 봇 및 웹 API를 R로 작성하십시오. 본문

프로그래밍/R

[해외] 자신의 슬랙 봇 및 웹 API를 R로 작성하십시오.

미운앙마 2017. 12. 3. 03:09

https://www.infoworld.com/article/3173362/application-development/create-your-own-slack-bots-and-web-apis-in-r.html?nsdr=true&page=2

 

 

자신의 슬랙 봇 및 웹 API를 R로 작성하십시오.

이 단계별 자습서에서는 현재 주가를 찾는 방법을 보여 주지만 기본 프레임 워크는 모든 종류의 데이터에 사용할 수 있습니다

 


슬랙 의 가장 큰 매력 중 하나는 확장 성이 좋다는 것입니다.

 

애드온 응용 프로그램은 그룹 공동 작업을하는 동안 비즈니스 분석 에 대한 대답 질문 부터 Jira 및 Trello와 같은 도구에서 프로젝트 업데이트 를 제공 하는 모든 작업을 수행 할 수 있습니다 .

상용 타사 및 오픈 소스 개발자가 수십 개의 미리 구성된 슬랙 봇을 가지고 있지만 코드를 작성하는 것은 어렵지 않습니다.


이미 PHP 와 Python 에서이 작업을 수행하는 방법에 대한 자습서가 있습니다 . 그러나 재무, 날씨, 정부 정보 등에 관한 데이터를 쉽게 가져올 수있는 R 함수를 활용하고 Slack이 "사용자 정의 슬래시 명령"이라고 부르는 것에 일부를 추가하기를 원했습니다.

 

이 기능을 통해 사용자는 간단한 형식으로 쿼리에 대한 응답을 얻을 수 있습니다 like /weather또는 /stockprice.

 

다음은 현재 주가를 검색하기 위해 R에서 사용자 정의 슬랙 슬래시 명령 봇을 작성한 방법입니다. R을 사용하여 가져 와서 처리 할 수있는 다른 유형의 정보에도 동일한 기술을 사용할 수 있습니다.

 

 

1 단계 : R로 주가를 찾는다.

 

R에서 현재 주가를 얻는 것은 쉬운 일입니다. quantmod 패키지 를 설치 한 install.packages(“quantmod”)다음 실행하십시오 quantmod::getQuote(“stocksymbol”). 예를 들어 quantmod::getQuote(“MSFT”)최신 Microsoft 주가를 반환합니다. 결과는 R 데이터 프레임으로 돌아옵니다.

             

Trade Time   Last Change % Change  Open  High   Low   Volume
MSFT 2017-01-31 03:38:00 64.575 -0.555  -0.852% 64.86 65.15 64.26 11326241

이를 텍스트 응답으로 전환하여 사용자가 가장 최근의 가격과 변경 사항을 더 쉽게 볼 수 있도록하는 것이 좋습니다. 결과 데이터 프레임의 첫 번째 항목은 주가보고 시간입니다. 두 번째 항목 ( "마지막"열)은 가장 최근의 사용 가능한 가격입니다. 가격을 반환하는 것과 함께 가격을 사용할 수없는 경우에 대비하여 사람이 읽을 수있는 응답이 표시되도록 오류 검사를 추가하고 싶을 것입니다. 다음은 간단한 R 함수입니다.

 

newGetQuote <- function(thesymbol){
  myresults <- quantmod::getQuote(thesymbol)
  if(is.na(myresults[1,1])){
    mytext <- paste0(“A price is not available for “, thesymbol)
  } else {
    mytext <- paste0(“Price for “, thesymbol,  is $”, myresults[1,2],  as of “, myresults[1,1])
  }
  
  return(mytext)
}

이제이 함수를 슬랙 (Slack)과 같은 다른 서비스, 즉 URL을 통해 사용할 수있는 API로 변환해야합니다.

 

 

2 단계 : R에 API 설정

 

FastRWeb 프로젝트를 사용하거나 PHP 및 쉘 스크립트를 통해 R을 실행 하는 것과 같이 URL에서 R 스크립트를 실행 가능하게 만드는 여러 가지 방법을 살펴 보았습니다 . 그러나 그들은 단순한 Slack 명령을 실행하는 것보다 설치하고 설정하는 것이 더 복잡해 보였습니다. 그런 다음 R 기능을 API로 전환 할 수 있는 R 배관공 패키지를 기억했습니다 . 배관공은 RStudio 소프트웨어 엔지니어이자 Trestle Technology 라는 창업자 인 Jeff Allen이 만들었습니다 . R을 사용하여 API를 만드는 것은 매우 쉽고 우아합니다.

 

이것은 로컬에 설치하기 쉽습니다. install.packages(“plumber”), 함께 패키지를 설치하고 다음 함수의 시작 바로 위에 줄에 다음 코드를 추가하십시오 #* @get /stockquote.

newGetQuote 함수는 이제 다음과 같이 보입니다.

 

 #* @get /stockquote 
  newGetQuote <- function(thesymbol){
  myresults <- quantmod::getQuote(thesymbol) 
  if(is.na(myresults[1,1])){ 
    mytext <- paste0(“A price is not available for “, thesymbol) 
  } else { 
   mytext <- paste0(“Price for “, thesymbol,  is $”, myresults[1,2],  as of “, myresults[1,1])
  } 
  return(mytext) 
  } 

이 #*함수를 API 끝점으로 바꾸는 특별한 배관공 주석입니다. @get데이터 읽기를위한 HTTP GET 요청이어야 함을 의미합니다. 배관공은 또한 지원 @post, @put및 @delete. 은 /stockquote후 @getAPI가에 응답해야 어떤 경로를 지정합니다. 사용 stockquote은 API URL 형식이 http://www.myurl.com/stockquote가됨을 의미합니다. 그 다음의 문자열 /은 stockprice, myquotes 또는 다른 것일 수 있습니다.

 

 

R 파일로 저장하십시오. (나는 내 ​​주식 함수라고 불렀다.하지만 그 이름은 뭐든지 될 수있다.)

두 번째 R 파일에는 배관공 서버를 시작하고 stockfunction.R 파일 (또는 API 함수를 사용하여 파일을 호출 한 파일)을 실행하는 코드가 있어야합니다. 이 두 번째 파일은 배관공 라이브러리를로드하고 plumb () 함수로 stockfunction.R 코드에서 배관공 객체를 만들고 서버가 수신 대기 할 포트를 설정합니다. 그 코드는 다음과 같습니다.


 

library(plumber)
plumbobject <- plumb(“stockfunction.R”)
plumbobject$run(port=8000)

myserver.R이라고하는이 두 번째 파일의 코드를 모두 실행 한 다음 http://localhost:8000/stockquote?thesymbol=MSFT브라우저 의 URL로 이동 하면 브라우저에 주가가 표시됩니다.

 

그런 다음 Slack이 액세스 할 수있는 시스템에이 코드를 배포해야합니다.

 

 

3 단계 : 원격으로 R API 호스팅

 

API를 호스팅하는 방법에는 웹 기반 응용 프로그램과 같이 여러 가지가 있습니다. 기존 내부 서버에 추가하거나, 조직의 외부 서버에 업로드하거나, 가상 시스템의 유무에 관계없이 클라우드 서비스를 사용하거나, 웹 호스트. 모두 다 커버 할 수는 없지만, 기본은 꽤 비슷합니다 (머신에 루트 액세스 권한이없는 웹 호스트를 사용하지 않는 한, 추가적인 조정이 필요할 수 있습니다). Docker 응용 프로그램으로 배포하려는 경우 R 배관 도구 패키지에 대한 Docker 이미지 가 있음에 유의하십시오 .

 

외부에서 호스팅하는 가장 쉬운 방법 중 하나는 Digital Ocean 입니다. 설정은 간단하며 가장 작은 "물방울"을 $ 5 / 월에 사용할 수 있습니다.

 

소프트웨어 엔지니어이자 R consultant Dean Attali는 Digital Ocean에서 R을 설정하는 방법에 대한 단계별 지침을 제공합니다 . 그의 목표는 R Shiny Web 프레임 워크 (이 프로젝트에는 필요하지 않음)로 시작하고 실행하는 것이므로이 프로젝트에 필요한 것 이상을 설명합니다.

 

Attali의 1 ~ 6 단계를 따르는 것이 좋습니다.

 

 

 - DigitalOcean으로 가입


 - 새 물방울 만들기


 - 새 서버에 로그인하십시오.


 - 보안 및 인증 기본 사항 설정


 - 브라우저에서 드롭 릿에 액세스하십시오.


 - R 및 필요한 패키지를 설치하십시오. 배관공과 퀀텀을 설치하는 것을 잊지 마십시오.하지만, 당신이 원하지 않는 한, Attali의 지시에 나오는 devtools 나 shinyj는 필요하지 않습니다.

 


일반적인 R 명령 줄 환경에서 작업하는 것을 선호한다면 단계 7로 이동하여 RStudio Server의 자체 클라우드 버전을 설치할 수 있습니다. 이 Slack 프로젝트에 Shiny 서버가 필요하지 않을 것입니다.

 

Digital Ocean 서버를 갖게되면 앱의 두 R 파일에 대한 앱 디렉토리를 만들어 서버에 업로드하십시오. 마침내 API를 테스트 할 수 있습니다.

Rscript myserver.Rapp 디렉토리에있는 동안 드롭 릿의 명령 줄에서 myserver.R 파일을 실행하십시오 . "포트 8000에서 수신 대기중인 서버"(또는 선택한 포트) 메시지가 나타납니다.

 

API URL은 http://xxx.xxx.xxx.xxx:8000/stockquote?thesymbol = 과 같습니다 ( xxx.xxx.xxx.xxx 는 드롭 릿의 IP 주소 임). API를 테스트하려면 브라우저를 열고 http : //your.droplet.ip.address : port / APIpath? thesymbol = MSFT 로 이동하면 [ "MSFT 가격은 2017-02-17 기준 $ 64.49입니다. 12:34:00 "] 대가로. API 경로는 R 함수 파일의 첫 번째 행에 설정 한 것입니다 . 서버의 앱 디렉토리 이름 이 아닙니다 . STOCKSYMBOL#* @get

 

이제 API가 작동하고 있다는 것을 알았으므로 Ctrl-C를 사용하여 수동 서버를 중지 하고 배관공 애플리케이션을 웹 호스팅하는 방법 에 대한 Trestle의 지침으로 안내하십시오 . Attali 's 의 RStudio Server와 Shiny Server를 DigitalOcean 게시판 으로 가져 오는 방법 에 따라 R을 이미 설치 했으므로 나머지 단계는 다음과 같습니다.

 

 

 - Node.js 자바 스크립트 프레임 워크 설치


 - npm ( Node.js 패키지 관리자) 설치


 - PM2를 설치 (위한 프로세스 관리자 Node.js를 )


 - pm2가 실행할 수있는 세 번째 R 스크립트 파일 만들기

 - 배관공 서버를 pm2에 등록하십시오.


 - 부팅시 서버가 실행되도록 pm2를 설정하십시오.

 


다행히도 이러한 작업의 대부분은 단 1-2 줄의 코드 만 필요 하며 배관공 애플리케이션을 웹 호스팅하는 방법 에 대해서는 모두 설명되어 있습니다. 우분투 방울에 pm2를 설치하는 데 문제가 있으면 node-legacy sudo apt install nodejs-legacy를 설치 한 다음 pm2를 설치하십시오 sudo npm install -g pm.

 

R 서버를 실행하기 위해 Node.js JavaScript 프레임 워크 가 필요한 이유가 궁금하다면 , 대답은 다음과 같습니다. Node의 pm2 프로세스 관리자에 액세스하려면. Allen이 배관공 문서에서 설명했듯이 기본 R은 한 번에 한 명의 사용자를 위해 설계되었지만 API는 한 번에 여러 세션을 처리해야 할 수도 있습니다. Node의 pm2 나 Ruby의 Phusion Passenger 와 같은 프로세스 관리자 는 R (및 다른 플랫폼)이이를 수행하도록 허용 할 수 있습니다.

 

세 번째 스크립트 파일 (run-myserver.R이라고 부름)은 다음과 유사해야합니다.


 

#!/usr/bin/env Rscript

library(plumber)
myplumobject <- plumb(‘myserver.R’)
myplumobject$run(port=8000)

’myserver.R’2 번 줄에는 배관공 서버 파일의 이름을 지정해야합니다. 3 행의 포트는 애플리케이션에서 사용할 수있는 모든 포트가 될 수 있습니다. (Webfaction과 같은 공유 호스팅 서비스를 사용하는 경우 응용 프로그램에는 사용할 수있는 포트가 하나만있을 수 있으므로 그 포트가 무엇인지 알아야합니다.)

 

이 파일을 드롭 릿의 app 디렉토리에 업로드하고 실행 가능한지 확인하십시오. 즉, 올바른 유닉스 권한을 가지고 있는지 확인하십시오. chmod 755 run-myserver.Rapp 디렉토리에서 명령 을 실행하여이를 수행 할 수 있습니다 .

 

pm2 start —interpreter="Rscript" /path/to/run-myserver.Rand -를 사용하여 pm2로 run-myserver.R 파일을 등록하기 위해 Allen의 지시를 따랐다면 pm2 save, 서버는 계속 실행되어야합니다. Rscript myserver.R한 번에 하나의 서비스 만 포트에서 실행될 수 있기 때문에 pm2가 서버를 실행하는 경우 더 이상 myserver.R 파일을 수동으로 실행할 수 없습니다 .

 

빌라! 일부 R 코드를 공개적으로 사용할 수있는 API로 전환했습니다. 슬랙 (Slack) 봇 (bot)과 슬랙 (slack) 채널 만이 슬랙 (slack) 채널을 사용하도록하기위한 몇 가지 개조가 있습니다.

 

 

4 단계 : 슬랙에 API 연결

 

Slack에서 "맞춤 슬래시 명령"을 설정하려면 채널의 맞춤 통합 부분으로 이동하십시오.이 부분은 https://YOURTEAMNAME.slack.com/apps/manage/custom-integrations 에서 바로 찾을 수 있습니다. 앱 왼쪽 상단의 채널 이름 옆에있는 드롭 다운 메뉴를 통해 슬랙 맞춤 설정> 메뉴> 앱 구성> 맞춤 통합을 클릭합니다. 어떤 방법 으로든 슬래시 명령을 클릭하십시오. 구성 추가라고 표시된 녹색 막대가 보일 것입니다.

 

사용자 정의 통합 옵션 부족 Slack 메뉴의 스크린 샷

 


Slack의 사용자 정의 통합 메뉴에서 사용자 정의 슬래시 명령을 추가 할 수있는 위치를 찾을 수 있습니다.


그것을 클릭하면 마지막으로 슬래시 명령을 추가하는 화면이 나타납니다. 사용자가 명령을 실행하는 데 사용할 단어를 선택 /stockprice하거나 /stockquote주식 가격 앱을 선택하십시오. 슬래시로 시작한 다음 소문자 만 사용하십시오. 슬래시 명령 추가 버튼을 클릭하십시오.

 

슬랙 사용자 정의 슬래시 명령 추가 슬랙 메뉴의 스크린 샷


커스텀 슬래시 명령을 추가하기위한 슬랙 페이지.


R API의 루트 URL (예 : http://xxx.xxx.xxx.xxx:8000/stockquote )을 입력하고 메소드로 GET을 선택하십시오. Slack은이 슬래시 명령에 대한 고유 한 토큰을 생성합니다. 이 토큰은 필요하지 않지만 R 함수에 추가하여 슬랙의 승인 된 요청 만 API를 사용할 수 있습니다. 이는 중요한 내부 데이터를 사용하는 앱에 대해 수행 할 수 있습니다.

액세스를 제한하려면 다음과 같은 if-else 문으로 기본 함수를 래핑하십시오.


 

#* @get /stockquote
newGetQuote <- function(thesymbol, token){
  if(token =="YOURSLACKTOKEN"){
  myresults <- quantmod::getQuote(thesymbol)
  if(is.na(myresults[1,1])){
    mytext <- paste0(“A price is not available for “, thesymbol)
  } else {
    mytext <- paste0(“Price for “, thesymbol,  is $”, myresults[1,2],  as of “, myresults[1,1])
  }
  } else {
  mytext <- Service not available
}
  return(mytext)
}

http://xxx.xxx.xxx.xxx:8000/stockquote?thesymbol=GOOG&token=YOURSLACKTOKEN 과 같은 URL을 사용하여 테스트 할 수 있습니다 . 중요 : R 파일 중 새 버전을 드롭 릿에 업로드하는 경우 변경 사항을 적용하려면 배관공 서버를 중지했다가 다시 시작해야합니다. 시스템의 다른 프로세스를 방해 할 염려가 없다면 프로세스를 쉽게 업데이트 할 수 있습니다. pm2 updatePM2

 

슬랙 (Slack)은 응답을 출력하는 봇의 이름을 사용자 정의하는 옵션을 제공합니다.이 옵션은 광산 주식 봇이라고 부릅니다. 또는 봇 기본값을 사용할 수 있습니다.

 

통합의 마지막 부분은 새 /stockprice슬래시 명령이 슬랙에서 API로 전송 된 후 슬랙 사용자가 입력 한 텍스트를 확인하는 것 입니다. Slack은 예를 들어 슬래시 명령과 함께 사용하는 GET 또는 POST 변수를 설명합니다.


 

token=3qORvogpJ0JPW2f1t6QXigPO
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
user_id=U2147483697
user_name=Steve
command=/weather
text=94070
response_url=https://hooks.slack.com/commands/1234/5678

예제에 따르면, text 는 사용자가 slash 명령 다음에 입력하는 것을 저장하는 변수입니다. 즉, newGetQuote 함수를 변경해야 할 필요가 있습니다. newGetQuote 함수는 thesymbol이 아닌 text라는 변수를 가져올 것이기 때문입니다. 나는 또한 다음과 같이 R의 trimws () 함수를 사용하여 사용자 입력 전후에 공백을 제거하는 선을 추가하는 것이 좋습니다.


 

#* @get /stockquote
newGetQuote <- function(text, token){
  thesymbol <- trimws(text)
  if(token =="YOURSLACKTOKEN"){
  myresults <- quantmod::getQuote(thesymbol)
  if(is.na(myresults[1,1])){
    mytext <- paste0(“A price is not available for “, thesymbol)
  } else {
    mytext <- paste0(“Price for “, thesymbol,  is $”, myresults[1,2],  as of “, myresults[1,1])
  }
  } else {
  mytext <- Service not available
}
  return(mytext)
}

당신의 물방울의 응용 프로그램 디렉토리에 개정 된 stockfunction.R을 업로드하여 서버를 다시 시작 pm2 updatePM2하고 다음과 같은 형태의 URL과 브라우저의 새로운 버전을 테스트 http://xxx.xxx.xxx.xxx:8000/stockquote?text=을 GOOG & token = YOURSLACKTOKEN .

그게 정상적으로 작동한다면 슬래시 명령에 대한 추가 옵션 필드를 작성하십시오. 원하는 경우 사진을 업로드하거나 도움말 텍스트를 추가 한 다음 저장하십시오.

 

슬랙 봇이 작동 할 것입니다. 따라서 팀원은 누구나 /stockprice AAPL주식 가격이 아니라면 슬랙에 슬래시 명령의 이름 을 입력 하고 Apple의 최신 주가를받을 수 있어야합니다.

 

아마 "AAPL의 가격은 2017-02-17 03:04:00 현재 $ 135.485입니다."와 같이 대괄호와 따옴표로 응답이 반환 된 것으로 나타났습니다. 그것은 배관공 패키지의 기본 응답이 json이기 때문입니다. 아직이 기능에 대한 문서는 많지 않지만 이 버그로 인해 결과가 일반 텍스트로 돌아 오면 배관공의 응답을위한 다른 형식을 정의하기 위해 직렬기를 추가해야합니다 .

 

#* @serializer contentType list(type="text/plain")

주식 함수의 초기 라인 앞에 있는 함수 파일 맨 위에서 #* @get /stockquote[ ""] JSON 래퍼없이 일반 텍스트를 보냅니다.

 

이 단계를 통해 R 코드를 사용하여 다른 Slack 봇 및 웹 API를 많이 만들 수 있습니다. 결국 배관공 환경을 이미 설정 한 후에는 서버에 사용 가능한 다른 포트가있는 한 추가 API와 슬래시 명령을 추가하는 것이 더 쉽습니다.

 

이런 식으로 API와 Slack slash 명령을 사용할 수있는 다른 데이터에 대한 아이디어가 필요하면 검색 가능한 표를 확인하십시오. 이 R 패키지는 스포츠, 날씨, 주식 데이터 등을 가져옵니다 .

 

 

이 R 방법에 대한 의견이 있으십니까? 당신은 트위터에 샤론을 찾을 수 있습니다 sharon000 @ 와의 이메일로 smachlis@computerworld.com .

이 이야기는 "자신의 슬랙 봇과 웹 API를 R로 만들자"는 원래 Computerworld에서 출판되었습니다.

Comments