카톡 대화 자동 수집을 통한 대화 내 관계 분석

소개

카카오톡 오픈카톡방 대화 내용을 주기적으로 수집하여 커뮤니티 내 유저들의 활동을 분석하기 위함. 원래 목적은 카톡에서 이뤄지는 유저들의 공동구매를 자동으로 분석하여 주문서를 만들어 주는 프로젝트를 진행하다가 파생된 프로젝트 입니다. 실제 우리동네국민상회에서 활발하게 이루어지는 새로운 공동구매 방식에 적용하기 위해서 진행되었습니다.

진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

파이썬 IDE 인 Pycharm 을 사용했습니다. 카카오톡을 제어할 수 있는 API 가 존재하지 않아 파이썬에서 윈도우 시스템과 GUI 를 제어할 수 있는 라이브러리를 사용했습니다.

Adobe C++의 코드 편집기 스크린샷
  • pyautogui:

    • pyautogui는 Python을 사용하여 마우스와 키보드를 자동으로 제어할 수 있는 라이브러리입니다.

    • 마우스를 화면에서 이동시키거나 클릭, 드래그, 키보드 입력 등을 시뮬레이션할 수 있습니다. 이를 통해 GUI 자동화나 테스트, 작업 자동화 등에 사용됩니다.

  • ctypes:

    • ctypes는 Python에서 C 언어로 작성된 라이브러리나 함수를 호출할 수 있도록 해주는 표준 라이브러리입니다.

    • 이 모듈은 C 언어의 데이터 타입과 구조체를 Python에서 사용할 수 있도록 매핑해 주며, C의 라이브러리 함수를 Python 코드에서 직접 호출할 수 있게 합니다.

    • 주로 시스템 레벨에서 동작하는 함수들에 접근할 때 사용되며, C와 Python 간의 호환을 돕는 기능을 제공합니다.

  • 처음 시도한 카카오톡 대화 내용 수집 로직

    1. ctypes을 이용하여 윈도우즈에 현재 활성화 되어 있는 창의 이름을 오픈카톡 이름으로 찾습니다.

    2. Ctr+A 키를 조작하여 대화내용 전체를 긁습니다.

    3. Ctr+C 키를 조작하여 전체 긁힌 대화 내용을 클립보드에 저장합니다.

    4. 클립보드에 저장된 데이터를 출력합니다.

위 로직의 문제점은 대화 내용이 많아지면 클립보드에 대화 내용의 일부분이 재대로 저장되지 않는다는 것을 수십번의 다양한 대화 수집 테스트 이후 알게 돼었습니다 -> 사용불가

  • 두번째 시도한 카카오톡 대화 내용 수집 로직

    1. ctypes을 이용하여 윈도우즈에 현재 활성화 되어 있는 창의 이름을 오픈카톡 이름으로 찾습니다.

    2. Ctr+S 키를 조작하여 대화내용을 파일로 저장합니다.

위 로직의 문제는 대화내용을 저장하는데 있어 사용자가 직접 다이얼로그의 버튼을 마우스로 클릭해야만 했습니다. 대화창의 갯수과 위치, 크기 등이 변할경우 버튼의 위치를 찾아내는 것이 매우 어려운 task 가 되어 버렸지만 아래와 같은 로직으로 GUI 의 위치를 추적하여 자동으로 클릭 수 있는 로직을 개발 하였습니다.

  • 윈도우 GUI 위치 추적 및 메뉴, 버튼 추적 로직

    1. ctypes을 이용하여 윈도우즈에 현재 활성화 되어 있는 윈도우 창의 handle 을 오픈카톡 이름으로 찾습니다.

    2. 위에서 찾은 handle 을 pyautogui에 던져 사각형 바운더리를 그린다음 x, y 좌표계를 얻어 냅니다.

    3. MouseHandler 패키지를 직접 구현하여 해당 GUI 에 존재하는 메뉴와 버튼을 추적하여 마우스를 이동시키는 로직을 수행하는 함수들을 구현합니다.

위 저장 문제를 해결하고 나니 다른 문제가 발생하였습니다. 오픈카톡방의 대화내용을 저장 후 새로운 대화 내용이 계속 쌓일 시 그 자체를 전부 저장할 경우 이전 수집 내용만 분리해 낼 수 없다는 심각한 문제점이 발견되었습니다. 이는 공동구매의 경우 각각 다른 시점의 주문을 구분해 낼 수 없고 대화 내용 분석 시 중복된 대화내용으로 인해 LLM 전송 시 토큰 사용량 한계 초과가 발생 할 수 밖에 없는 구조이기 때문입니다. 머리를 싸맨 후 내린 결론은 마우스를 조작하여 메뉴를 뒤져 대화내용을 지우는 방법이었습니다. 다시 카카오톡 GUI 를 추적하는 로직을 만들고 마우스를 이동, 클릭 하여 저장 한 후 기존 대화를 지우는 것에 성공하였습니다. 대화내용을 저장하고 지우는 로직이 자동으로 수행되는 것을 쳐다보고 있으면 누군가 원격으로 컴퓨터를 해킹하는 것 처럼 보이기도 합니다. 하여튼 요롷게 작동하는 것은 영상으로 남겨보았습니다.
https://youtu.be/h2xM6u3Ii-4

그리고 저장된 대화내용에 공지, 링크, 홍보글 등은 모두 찾아서 지우고 대화 내용만 남기게 텍스트를 처리한 후 LLM 에 보내 다음과 같이 주문 내역을 구글 스프레드 시트에 자동으로 붙여 넣도록 코드를 짜고 테스트를 마쳤습니다.

Google Docs의 스프레드시트 스크린샷

대화가 길어지면 LLM 이 재대로 모든 값을 찾지 못하는 에러를 발생시키므로 이후 로직에는 20라인 씩 읽으면서 처리하는 로직이 추가되어야 비로소 완성될 것 같네요. 그리고 커뮤니티를 위해서 추가로 실험한 것이 지피터스 커뮤니티 유저들의 활동내역과 관계 분석인데요, 이것을 위해서 RAG 를 사용하기로 하였습니다.

위 자동화 프로그램을 이용해서 일단 아래와 같은 오픈카톡 내역을 수집하였습니다.

중국어 텍스트가 있는 컴퓨터 화면


그리고 반야 클라우드 트레이너를 사용해서 RAG 를 시켰습니다. 그런 후 아래와 같이 셋팅 합니다.

프롬프트 : 너는 심리 분석 전문가야. 또한 데이터 분석 전문가이기도 해.
질문 : 대화 중 누가 제일 대화의 빈도수가 많은지 분석해주고 대화 내용 중 누가 이 그룹의 리더에 가까운지 찾아줘.


결과는 아래과 같이 나오네요 :D

한국어 텍스트가 포함된 웹페이지의 스크린샷

그림이 작게 보이는 관계로 결과를 아래에 붙여 넣었습니다.

대답 :
대화의 빈도수를 분석해보면, "광밤(김현철) | 스터디장"이 가장 많은 메시지를 남겼습니다. 이는 그가 그룹 내에서 활발하게 소통하고 있음을 나타냅니다. 또한, "광밤(김현철) | 스터디장"은 여러 사람에게 정보를 제공하고, 스터디와 관련된 공지 및 안내를 주도적으로 하고 있는 것으로 보아 이 그룹의 리더 역할을 하고 있는 것으로 판단됩니다. 그는 스터디의 진행을 관리하고, 참여자들에게 필요한 정보를 제공하며, 대화를 이끌어가는 모습을 보입니다.

위 RAG 에 사용한 LLM 은 GPT-4o 입니다.

후기 :
RAG와 LLM 사용은 매우 쉬웠습니다. Banya 의 슬로건이 1인 1기업 1LLM 입니다. 문제는 카카오톡 대화 자동 수집 이였습니다. 사실 카톡 대화 수집은 솔루션이나 서비스 처럼 동작해야 해서 실제 구현은 위에 언급한 것 이외도 잔손이 훨씬 더 많이 갔습니다. 제가 구현한 방식은 모니터의 해상도와 사이즈에 영향을 받고, 굉장이 많은 수의 카톡 창이 떠 있어도 모든 창이 핸들링이 가능해야 했으며, 특수문자와 이상한 문자열이 카톡방제목이나 대화 내용에 섞여 있어 이들이 구동되고 처리되는 언어와 OS 에 조금씩 다르게 작동하여 에러를 발생시키는 일이 비일비재 했습니다. 결국 이런 것들을 처리하기 위해서 하나의 파일로는 너무 라인이 길어져 프로젝트는 3개의 파일로 쪼개서 main, FileHandler, MouseHandler 로 구현이 되었습니다.

미진한 부분 :
카카오톡 대화 자동 수집 프로그램은 아직 갈길이 많이 남았습니다. 현재 클라이언트 실행 모듈을 서버 실행 모듈로 감싸고 RestFul API 를 만들어 url 호출 시 작동 하도록 구현해야 합니다. 보안을 위한 키 생성 및 검증, 80 포트를 타고 들어오도록 웹 서버 설치 및 설정, SSL 적용을 위한 인증서 설치, 포트 포워딩, 로드 밸런싱을 위한 프록시 구성, 방화벽 구성, 침입 모니터링 등등 이 남았네요 😮

6
2개의 답글

👉 이 게시글도 읽어보세요