[챗봇 만들기] 20분만에 트위치 챗봇 만들기!

in #kr-dev4 years ago (edited)

12twitch.jpg

  텔레그램 봇 만들기가 벌써 6일 전의 글이네요? 무슨 시간이 이렇게 빨리 갔을까요... 오늘은 예고드렸던대로 트위치 봇 만드는 법을 가져왔습니다. 스팀잇에서 트위치 봇 만드는 방법을 쓴다는게 기분이 새롭네요. 왜 하필 트위치냐고요? 그야 제 주 직업이 트수기 때문이죠 >ㅅ< 연구와 개발은 부직업

donation.jpg

▲ 접하기 쉬우면서 끊기 힘든 중독은
술 중독, 담배 중독, 트위치 도네이션 중독이 있다.


만들기 전에...



  우선 트위치 챗봇의 API는 작성 시간 기준, 최신 버전이 new Twitch API 입니다. 본 글은 바로 이전 버전인 v5(18.12.31 만료) 를 다룰 것입니다. Twitch에서 new Twitch API의 Code Samples을 조만간 제공하겠지요. 아직 개발자 사이트에선 안내만 나와있고 샘플 코드를 제공하진 않았습니다. 코드 샘플은 여기서 확인하실 수 있습니다. 이 것을 이용해서 만들어보겠습니다.

  트위치의 채팅은 IRC(Internet Relay Chat) 기반입니다. 무슨 신기술이냐고요? 젊으신 분이군요... 크흡... 과거에 많이 쓰던 프로토콜입니다. IRC에서 놀아봤다 하시는 분들은 진성 공돌이거나 아재게임(e.g. 울티마 온라인) 유저 분들이시니까 놀려주세요. 야동 공유하시느라 사용하셨 수도 있고...

  제약 조건이 훨씬 유순한 텔레그램 봇 채팅방이라 생각하시면 될 것 같아요. 물론 IRC가 그렇다는 것이고, 트위치는 기능에 맞게 제한이 된 것입니다. 이제 시작해볼까요?

참고 자료


1. IRC 패키지 설치



  트위치 챗봇은 irc 패키지가 필요합니다. 패키지를 설치하기 위해 Anaconda Prompt를 열어주세요. 텔레그램 봇 만들기에서 했던 것 처럼 가상 환경을 activate 해주시고 pip 명령어를 입력하면 됩니다. requests는 필요하대서 안알아보고 깔았어요. (...)

activate py36_maanya
pip install irc
pip install requests

  빨간 글 없이 주르륵 주르륵 설치가 됩니다. 나타나면 댓글로 알려주세요.


2. 계정 인증



  샘플 사이트에 적혀있듯이, 챗봇을 사용하기 전에 계정인증을 해야합니다. OAuth와 Client id가 필요합니다.

2.1 OAuth 얻기

  코드를 통해 하는 법도 있지만, UI가 마련된 것을 마다할 이유는 없습니다. Twitch Chat OAuth Password Generator로 이동합니다. Connect with Twitch 버튼을 클릭하면 비밀번호가 주어집니다. 복사해서 메모해둡니다. 만약에 잃어버리시면, 다시 발급받으시면 됩니다.

oauth:xxxxxxxxxxxxxxxxxxxxxxxxxx

2.2 Client ID 얻기

  Client ID는 twitch의 확장 프로그램으로 등록하면 발급받을 수 있습니다. 확장 프로그램의 등록은 Developers 사이트에서 우측 위의 Dashboard에서 진행 가능합니다.

캡처.PNG

  챗봇은 App에 해당합니다. View App을 눌러 이동한 후, Register Your Application을 눌러서 프로그램을 등록해주세요.

캡처2.PNG

  Name은 프로그램 이름, OAuth Redirect는 OAuth 인증의 결과를 전달받을 위치인데, 서버에 올려서 돌리는게 아니니까 내 컴퓨터(http://localhost) 라고 씁니다. Category는 챗봇을 선택하면 되겠지요? 등록(Register)합니다. 등록하면 Client ID가 나타납니다.

캡처3.PNG

  잃어버리셨을 땐, View App에서 다시 확인 가능합니다. 인증은 여기까지입니다.


3. 코드 작성

ganbaruzoi.gif



  이제 힘들었던거지같은 인증 과정이 끝나고 평화로운 코드 작성의 때가 왔습니다. 쉽게 알아볼까요? 먼저 python 파일을 하나 생성해주시고 아래의 코드들을 붙여넣어주세요.

import sys  
import irc.bot  
import requests  
  
  
class TwitchBot(irc.bot.SingleServerIRCBot):  
    def __init__(self, username, client_id, token, channel):  
        self.client_id = client_id  
        self.token = token  
        self.channel = '#' + channel  
        self.hogumastack = 0  
  
        #채널 ID를 얻기 위해 v5 API 호출  
        url = 'https://api.twitch.tv/kraken/users?login=' + channel  
        headers = {'Client-ID': client_id, 'Accept': 'application/vnd.twitchtv.v5+json'}  
        r = requests.get(url, headers=headers).json()  
        self.channel_id = r['users'][0]['_id']  
  
        # IRC bot 연결 생성  
        server = 'irc.chat.twitch.tv'  
        port = 6667  
        print('서버 ' + server + ', 포트 ' + str(port) + '에 연결 중...')  
        irc.bot.SingleServerIRCBot.__init__(self, [(server, port, 'oauth:' + token)], username, username)  
  
    def on_welcome(self, c, e):  
        print(self.channel + '에 연결되었습니다.')  
  
        #봇을 사용하기 전에 채널 권한 부여가 필요  
        c.cap('REQ', ':twitch.tv/membership')  
        c.cap('REQ', ':twitch.tv/tags')  
        c.cap('REQ', ':twitch.tv/commands')  
        c.join(self.channel)  
  
    def on_pubmsg(self, c, e):  
        # If a chat message starts with an exclamation point, try to run it as a command  
        if e.arguments[0][:1] == '!':  
        cmd = e.arguments[0\].split(' ')[0][1:]  
        print('Received command: ' + cmd)  
        self.do_command(e, cmd)  
        return  
  
    def do_command(self, e, cmd):  
        c = self.connection  
  
        # Poll the API to get current game.  
        if cmd == "game":  
            url = 'https://api.twitch.tv/kraken/channels/' + self.channel_id  
            headers = {'Client-ID': self.client_id, 'Accept': 'application/vnd.twitchtv.v5+json'}  
            r = requests.get(url, headers=headers).json()  
            c.privmsg(self.channel, r['display_name'] + ' is currently playing ' + r['game'])  
  
        # Poll the API the get the current status of the stream  
        elif cmd == "title":  
            url = 'https://api.twitch.tv/kraken/channels/' + self.channel_id  
            headers = {'Client-ID': self.client_id, 'Accept': 'application/vnd.twitchtv.v5+json'}  
            r = requests.get(url, headers=headers).json()  
            c.privmsg(self.channel, r['display_name'] + ' channel title is currently ' + r['status'])  
  
        # Provide basic information to viewers for specific commands        
        elif cmd == "스팀잇":
            message = "안녕! 스팀잇!"
            c.privmsg(self.channel, message)  
  
        # The command was not recognized  
        else:  
            c.privmsg(self.channel, "Did not understand command: " \+ cmd)


  • __init__ 함수는 봇의 정보를 입력받고 인증 및 서버에 연결 해주는 함수입니다.

  • on_welcome 함수는 채널에 제대로 접속했는지를 pycharm에 출력해줍니다.

  • on_pubmsg는 봇이 채팅방에 상주하면서 메세지가 올라올 때 마다 파싱하는 함수입니다. 기본적으로 느낌표(!) 로 시작하는 글자를 명령어로 인식합니다. 모든 채팅에 대해 대응하려면 조건문을 고쳐주면 됩니다. 이 함수 코드의 이미는 ! 로 시작하는 글을 파싱해서 do_command 함수로 보내라는 뜻입니다.

  • do_command 함수는 파싱되어 들어온 명령어에 대한 기능 처리 부분입니다. 채팅창에서 누군가 !title 라고 적으면 그걸 인식해서 방송 제목을 보여준다던지 합니다. 예제 코드에 !스팀잇 명령어를 추가해서 누군가 !스팀잇 이라고 적으면 안녕! 스팀잇! 이라고 반응하는 코드를 추가했습니다.

  제대로 동작하는 것만 확인되면 do_command와 on_pubmsg 함수를 조정해주는 것으로 채팅 파싱으로 가능한 모든 것을 구현해줄 수 있습니다. 저는 제가 찾아가는 채널의 스트리머 별명이 스트리머를 놀리는 별명이라서 그게 언급되면 카운팅해서 데미지 체크를 해주는 기능을 만들고자 챗봇 만드는 걸 공부했습니다 'ㅂ'

챗봇에 대한 클래스는 위와 같고, main 함수를 이어서 복붙해주세요.
client_id 와 oauth token은 각자 발급받으신걸 적어주시면 됩니다.

def main():  
    username = "Steemit" # 별 의미 없습니다. 봇 계정의 이름은 twitch 사이트에서 조정해주면 됩니다.  
    client_id = "xxxxxxxxxxxx" # Client ID  
    token = "xxxxxxxxxxxxx" # oauth: 는 빼고 뒷부분만 적어주시면 됩니다.  
    channel = "twitch_account" # 봇이 접속할 채널입니다. 테스트할 땐 본인의 트위치 계정을 적어주세요.
  
    bot = TwitchBot(username, client_id, token, channel)  
    bot.start()  
    
if __name__ == "__main__":  
    main()

4. 확인

캡처4.PNG

  잘 되네요. 제가 직접 타이핑해준건 아이디가 청색으로 나오고, 주황색으로 나온건 봇이 대답한 것입니다. 제 계정을 직접 사용해서 그렇고, 봇의 계정을 따로 만들어주면 봇만의 닉네임을 사용해줄 수 있습니다.

끝!

  어떠셨나요? 텔레그램 챗봇 보다 쉽지 않나요? :D 스티미언 겸 트수인 개발자들에게 도움이 되기를 바랍니다. new Twitch API는 확인 안해봤지만, 샘플 코드 혹은 개발 코드가 업데이트 되면 2018년 12월 31일 이전엔 올리도록 하겠습니다.

  사실 챗봇 시리즈를 제가 계획해둔건 텔레그램과 트위치 뿐입니다. 트위치는 전혀 동떨어진 봇이라 사실 인기 없을 것 같고.. 텔레그램 봇은 솔직히 제가 예상한 인기를 뛰어넘은 포스트가 되었습니다.

  @wanabe님의 공부 시기와 겹친 것과 steem-python의 절망적인 호환성으로 인한 anaconda 설치의 필요성 등 많은 분들의 요구를 들어드릴 수 있었던게 운이 좋았던 것 같습니다. 그 외에도 제 포스트를 사랑해주신 분들께 감사드립니다.

  윈도우에서 steem-python의 호환성이 특히나 절망적(강조)이어서 ubuntu에서 돌리시거나 node.js를 기반으로 steem API를 사용하시는 것 같습니다. @wanabe님의 오류를 해결하려고 찾다보니 최근 업데이트로 설치가 간편해진 것을 확인했습니다.

  그리하여, 제가 안내해드린 환경에서 스팀 API를 사용하고 이를 텔레그램 챗봇으로 받아보는 등의 응용 예제를 다뤄볼까 합니다. 직접 만드는 재미가 있을거 같아요 ^ - ^ 알림봇이 될지, 보팅봇이 될지, 전부 다룰지, 몇 가지 실험 해보고 시리즈로 연재할 수 있도록 하겠습니다. 그럼 앞으로도 잘 부탁드리겠습니다.

궁금한건 언제든지 댓글로 질문해주세요!
마아냐(@maanya) 였습니다.

Sort:  

태그모하지라니요 ㅋㅋㅋ

헉 ㅋㅋㅋ 눈치 채셨네요... 항상 태그 4개만 쓰고 한 칸이 비어서 소소하게 제 방을 만들었습니다. 태그모하지로... ㅋㅋㅋ

본 자료는 만료되었습니다. 파이썬으로 트위치 챗봇을 구동하는 방법을 현재 (19.11.03) 정식으로 지원하지 않습니다. IRC 기반인 것은 여전하지만 api가 만료되었기 때문에 공식 문서에서 안내하는 js를 이용하여 만드시는 것을 추천합니다.

https://dev.twitch.tv/docs/irc/

분명 다른 세상의 일인데... 제가 어디서 IRC를 들어본거죠?! ㅎㅎ
잘 이해하지 못해도 개발자분들의 노력이 있는 글을 좋아합니다. 미약하지만 보팅을~

흘러흘러 들어보셨을 것 같습니다. //ㅅ/ 발음도 귀여워요. 아얄씨.
방문해주셔서 감사합니다~

아아~~~~이렇게 하는거군요^^

라고 말하고 싶네요 ㅜㅜ
하나도 이해못해서 죄송합니다 ㅠㅠ
개발자님들 대단하세요!

죄송할 것이 어딨습니까! 보러 와주시는 것만 해도 감격입니다 :D

으아... 이런걸 어떻게 만들죠??
정말 저와는 다른 세상의 일 같아요.
그러니까 이런 봇들이 스팀잇하고도 연동이 된다는 얘기죠?
알림봇이 하나 필요했는데, 다음 시리즈를 한번 기대해 봅니다~

반응이 너무나 귀여우신 것... ㅎㅎㅎㅎ
스팀잇 알림봇은 이미 구동 중인게 있으니 바로 사용하실 수 있습니다~

아아앗~ 텔레그램 알림봇이 있네요! 그럼 텔레그램을 깔아야되나요??
혹시 카톡이나 Whatsapp 으로는 안되나요... 츄무룩...

네.. 츄무룩...

옴마나....뭔소리지 : )
저같은 컴맹에겐 지렁이닷!! ㅎㅎㅎㅎ
@maanya님 이러다 프로그래머 되시겠어요 ㅎㅎㅎㅎ

그러게요, 프로그래머가 되면 안되는데 -0-...

맞앗!!!!maanya님은 개그맨이 되셔야하는데
ㅡ3ㅡ

좋은정보 감사합니다:)
리스팀하고 갑니당

댓글에 이어 리스팀까지... 감사합니다 +ㅁ+ /큰절

포스팅 읽는내내 눈이 뱅글뱅글 돌아~ 이게 뭔말이여?
하면서 읽었지만 일단 참으로 대단하십니다.
사용해보지는 못하겠지만 일단 읽어두면 나중에 도움이 되겠죠 ^^;(어느세월에~)
프로젝트하시느라 고생많으셨슈~~

트수이지만 이해 못하는 컴맹은 울고 갑니다.
능력자 시네요 ㅠㅠ

This post received a 40% upvote from @krwhale thanks to @maanya! For more information, click here!
이 글은 @maanya님의 소중한 스팀/스팀달러를 지원 받아 40% 보팅 후 작성한 글입니다. 이 글에 대한 자세한 정보를 원하시면, click here!

최고의 포스팅이네요!! ㅎ
다음 주제는 보팅파워 99.5%되면 텔레그램 알림주는 봇 개발 강추드립니다 ㅎㅎ 항상 까먹고 100프로 채우더라구여 저는 ㅠㅠ
사실 파이썬 배우려는 것도 이거 개발하고 싶어서 공부하려는겁니다 ㅎㅎ
점프투파이썬 책이 저에게 배송되고있네요 오늘
좋은 포스팅 잘보고 갑니다^^

99.5% 라니.. 알겠습니다 ㅎㅎㅎ 반영해서 만들게요!

역시 능력자이십니다 ㅎㅎ 뇌섹남!!

저도 항상 트위치에서 볼때마다 뭔가 싶었는데
이런 복잡한 구조가..
좋은 글 잘 읽고 갑니다!

츄라이 츄라이~! ㅎㅎㅎ 사실 트위치엔 이미 방송 도우미 봇 중이 유명한 ‘싹둑’이와 ‘나이트봇’ 이라는게 있습니다.

대부분의 경우엔 저 둘을 이용해서 기능을 쓸 수 있지만 자기만의 기능을 만드려면 직접 만들어야겠죠!

안녕하세요! 이번에 트위치 kraken API가 사용 종료되서 이제 r = requests.get(url, headers=headers).json() 에서 에러가 나요! 수적 부탁드려요!

Coin Marketplace

STEEM 0.51
TRX 0.09
JST 0.069
BTC 50106.56
ETH 4389.01
BNB 604.67
SBD 6.15