Python + chatwork + google extension = 쉽게 재미있는 채팅 BOT를 만드는 방법

전제



다음 준비할 수 있는 것
  • ChatWork 관련
  • Chatwork Webhook
  • Chatwork 채널

  • 파이썬 관련
  • http.server, socketserver, json, requests, ChatBot 설치

  • ngrok 관련
  • ngrok 설치


  • 스크립트 구현



    파이썬에서 200 OK를 반환하는 서버 만들기

    webhookchatwork.py
    import http.server
    import socketserver
    import json
    import requests
    class MyHandler(http.server.BaseHTTPRequestHandler):
        def do_POST(self):
            self.send_response(200)
            self.end_headers()
            content_leng  = int(self.headers.get("content-length"))
            req_body = self.rfile.read(content_leng).decode("utf-8")
            json_object = json.loads(req_body)
            print(json_object)
    # ローカルの環境に3000ポートを設定
    with socketserver.TCPServer(("", 3000), MyHandler) as httpd:
        httpd.serve_forever() 
    

    Ngrok에서 로컬 호스트를 인터넷에 게시


  • ngrok 설치

  • htps : / / 응 g로 k. 코m/

  • ngrok 실행
  • 위의 webhookchatwork.py에 3000 포트를 사용하고 있으므로 아래에 실행

  • ngrok http 3000
    

    결과:


    Chatwork webhook과 Ngrok과 협력



    지금까지 로컬 webhookchatwork.py 파일이 인터넷에 게시되었습니다.
    채팅 워크에서 게시할 때 webhookchatwork.py 에 받도록 설정해야 합니다.

    위의 빨간색 테두리에 ngrok URL 입력
    기입 후 Chatwork webhook과 Ngrok에 연동할 수 있다고 생각합니다.
    확인:
  • webhookchatwork.py 실행:
  • python3 webhookchatwork.py 
    
  • 방에 webhook을 등록한 사람을 게시해보기

  • ngrok 실행 중 확인

    200 OK로 돌아왔다.


  • ChatBot 스크립트



    ChatBot의 처리에는 두 가지가 있습니다.
  • 채팅 작업에 회신

  • webhookchatwork.py
    APIKEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # ChatworkのAPI tokenから取得
    ENDPOINT = 'https://api.chatwork.com/v2'
    ROOMID = 'XXXXXXXXX'  # 投稿したいルーム
    post_message_url = '{}/rooms/{}/messages'.format(ENDPOINT, ROOMID)
    headers = { 'X-ChatWorkToken': APIKEY }
    def checkAssignee(assigneenum): # 返事する人
        if assigneenum ==3987766: 
            assigneename = 'Aさん'
        elif assigneenum ==4388605:
            assigneename = 'Bさん '
        return assigneename
    
    # # チャットワークに送信- start
    def sendtoChatworkRemind(answer,fromaccountid,sendtouser):
            headers = { 'X-ChatWorkToken': APIKEY }
            params = { 'body': '[To:'+str(fromaccountid)+']'+ sendtouser+ '\n' + str(answer)
                                }
    
    
            requests.post(post_message_url,
                             headers=headers,
                             params=params)
    # チャットワークに送信 - end
    
  • 훈련

  • webhookchatwork.py
            chatbot = ChatBot('EventosChatBot')
            trainer = ListTrainer(chatbot)
    
            traningjson = []
            print(json_object['webhook_event']['body'].find("[To:2555387]Chat Bot Eventos"))
            if "[To:2555387]Chat Bot Eventos" in json_object['webhook_event']['body'] :
                fromaccountid = json_object['webhook_event']['from_account_id']
                reponse = json_object['webhook_event']['body'].replace("[To:2555387]Chat Bot Eventos\n","")
                sendtouser = checkAssignee(fromaccountid)
                if "教えさせてください ]:)" in json_object['webhook_event']['body'] :
                    for item in json_object['webhook_event']['body'].split("\n"):
                        if "質問 :" in item:
                            print(item.strip().replace("● 質問 : ",""))
                            if item.strip().replace("● 質問 : ","") != "":
                                traningjson.append(item.strip().replace("● 質問 : ",""))
                            else:
                                traningjson.append("")
                        if "回答 :" in item:
                            print(item.strip().replace("● 回答 : ",""))
                            if item.strip().replace("● 回答 : ","") != "":
                                traningjson.append(item.strip().replace("● 回答 : ",""))
                            else:
                                traningjson.append()
                        trainer.train(traningjson)
                    answer = "教えていただき、ありがとうございます (bow)"
                    sendtoChatworkRemind(answer,fromaccountid,sendtouser)
                else:
                    answer = chatbot.get_response(reponse)
                    sendtoChatworkRemind(answer,fromaccountid,sendtouser)
    

    Google extension으로 만들기



    누구나 chatbot으로 교육할 수 있도록 Google 확장 프로그램을 만드세요.
  • googel extension 개발 방법
  • htps : // m / Ry b / ms / 32b2 a 7b879f21b3 에로 fc

  • 훈련의 소스 코드

  • content_scropts.js
    setTimeout(function(){
        $("#__chatworkInputTools_toolbarIcons").prepend('<li class="_showDescription __chatworkInputTools_toolbarIcon" id="teachChatbot"  role="button" aria-label="info: Surround selection with [chatbotEV] tag"><span class="btnDanger" style="padding: 3px 4px; font-size: 10px; border-radius: 3px; position: relative; top: -2px;">chatbotEV</span></li>');
        $("#teachChatbot").click(function(){
        $("#_chatText").val('[To:2555387]Chat Bot Eventos \n教えさせてください ]:) \n[info]\n   ● 質問 : \n   ● 回答 : \n[/info]');
    })
    },1000);
    

    결과:


    OK입니다. 마지막으로 테스트해보기


  • 트레이닝:

    제대로 공부되었습니다.
  • 대답:
  • 좋은 웹페이지 즐겨찾기