오픈소스

[NAVER WORKS] 파이썬을 사용하여 BOT으로 메시지 보내기

 케이군  2023. 1. 6. 15:05

네이버웍스(NAVER Works)는 네이버에서 만든 기업용 메신저입니다.

 

테스트 환경 

  • OS : Rocky Linux release 8.6 (Green Obsidian)
  • Python : 3.9

1. 네이버 클라우드(NAVER Cloud) 가입

네이버 클라우드 가입하는 방법은 생략하고, 나중에 시간 될 때 다시 정리하도록 하겠습니다.

 

 


 

2. API 키 생성하기

NAVER WORKS Developer Console을 통해 앱을 생성합니다.

https://developers.worksmobile.com/kr/console/openapi/v2/app/list/view

 

메시지를 발송하기 위해서는 Client ID, Client Secret, Private Key , Servce Account 정보가 필수로 필요합니다.

앱을 생성하여 메모장에 잘 적어 두세요.

 

 


3. Python JWT

BOT을 통해 메시지를 받기 위해서는 먼저 인증이 필요합니다.

엑세스 토큰을 발급하려면 JWT를 사용하여 인증을 받게 되는데요.

파이썬 스크립트를 사용하여 PyJWT 라이브러리를 설치하고 테스트 하였습니다.

 

 

설치

$ pip install pyjwt

 

사용 

>>> import jwt
>>> encoded_jwt = jwt.encode({"some": "payload"}, "secret", algorithm="HS256")
>>> print(encoded_jwt)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg
>>> jwt.decode(encoded_jwt, "secret", algorithms=["HS256"])
{'some': 'payload'}

 

 

NAVER WORKS API 2.0을 통해 Access Token을 발급 받는 코드입니다.

CONFIG 항목에 위에서 발급받은 값을 넣어주면 됩니다.

#!/usr/bin/env python3.9
# -*- coding: utf-8 -*-
import time, jwt, requests, json

# CONFIG #
client_id = '************'
client_secret = '**********'
service_account = '*********'
private_key = "*************

def getAccessToken():
    secret = private_key
    iat = time.time()
    exp = iat + 3600
    payload = {
                'iss': client_id,
                'sub': service_account,
                'iat': iat,
                'exp': exp
            }
    jwt_options = {
            'verify_signature': False,
            'verify_aud': False,
             }
    signed_jwt = jwt.encode(payload, secret, algorithm='RS256')
    token_url = 'https://auth.worksmobile.com/oauth2/v2.0/token'
    token_h = {
            'Content-Type':'application/x-www-form-urlencoded'
        }
    toekn_p = {
            'grant_type':'urn:ietf:params:oauth:grant-type:jwt-bearer',
            'client_id': client_id,
            'client_secret': client_secret,
            'assertion':signed_jwt,
            'scope':'bot'
        }
    token_r = requests.post(token_url, headers=token_h, params=toekn_p)
    if token_r.status_code != 200:
        print("Response Code : " + str(token_r.status_code) + "\n" + token_r.text)
    a = json.dumps(token_r.json()["access_token"])
    a = a.replace("\"", "")
    return(a)

 

 

네이버 웍스에 인증 요청을 하게 되면 아래와 같이 응답을 받을 수 있습니다.

코드 마지막줄에서 json.dumps를 이용하여 토큰값만 추출합니다.

{"access_token": "kr1AAABGbJ***************", "scope": "bot", "token_type": "Bearer", "expires_in": "86400"}

토큰 값은 하루동안 유요하니 캐시에 저장해서 다시 활용이 가능합니다.

 

 


4. NAVER WORKS BOT

이제 BOT을 통해 NAVER WORKS로 메세지를 발송하도록 하겠습니다.

위에 Access_token만 있으면 메시지 발송은 간단히 할 수 있습니다.

BOT ID와 Channel ID 값을 확인해서 넣어줍니다.

메세지는 여러 종류가 있지만 기본적인 text 메시지 형식으로 전송하였습니다.

 

bot_id = '*******
channel_id = '*******

def sandMessage():
    auth_token = getAccessToken()
    msg_url = 'https://www.worksapis.com/v1.0/bots/'+ bot_id + '/channels/' + channel_id + '/messages'
    msg_h = {
            'Content-Type':'application/json; charset=UTF-8' ,
            'Authorization':'Bearer ' + auth_token,
        }
    msg_d = {
    "content": {
        "type": "text",
        "text": "Hello. World"
         }
    }
    send = requests.post(msg_url, headers=msg_h, json=msg_d)
    print(send)

메시지가 정상적으로 발송되면 201코드를 반환합니다.

아래와 같이 네이버 웍스에 메시지를 발송할 수 있습니다.


 

전체 코드

github에 전체 코드 업로드 하였습니다.

 

GitHub - bluewins/shell-script: 리눅스 쉘 스크립트

리눅스 쉘 스크립트. Contribute to bluewins/shell-script development by creating an account on GitHub.

github.com

 

 


NAVER Works BOT : https://developers.worksmobile.com/kr/reference/bot?lang=ko 

PyJWT : https://pyjwt.readthedocs.io/en/stable/