스레드 스하리

[태그:] 스치니 자동 수집 및 관리툴

  • 스치니 팔로우 늘리기 자동화

    스치니 팔로우 늘리기 자동화

    스치니 팔로우 늘리기 자동화

    Part 1: 기초 및 윤리적 고려사항

    1.1. 중요한 서문: 규정 이해하기

    ⚠️ 주의: 자동화와 책임

    소셜 미디어 자동화는 강력하지만, 플랫폼의 서비스 약관을 위반할 수 있습니다. 특히 사용자 동의 없는 데이터 수집(스크레이핑)은 계정 정지 등의 위험을 초래할 수 있습니다. 이 프로젝트는 상업적 목적이 아닌, 기술 학습을 위한 “교육용”으로 접근해야 합니다.

    1.2. “Thread-Mate” 설계: 프로젝트 청사진

    좋은 소프트웨어는 좋은 설계에서 시작됩니다. 우리 앱의 구조는 4개의 핵심 요소로 구성됩니다. 아래 다이어그램의 각 요소에 마우스를 올려보세요.

    🖥️ GUI (CustomTkinter)
    사용자의 명령 센터
    🕵️ 스크레이퍼 (Playwright)
    백그라운드의 실질적인 일꾼
    🗄️ 데이터베이스 (SQLite)
    수집한 데이터의 기억 장치
    🧠 커뮤니케이터 (Threading)
    앱의 신경계 (멈춤 방지)

    1.3. 개발 환경 설정하기

    본격적인 코딩 전, 필요한 도구들을 설치해야 합니다. 터미널(명령 프롬프트)에서 아래 명령어들을 차례대로 실행하세요.

    1. 가상 환경 생성 및 활성화

    python -m venv venv
    # Windows:
    venv\Scripts\activate
    # macOS/Linux:
    source venv/bin/activate

    2. 필수 라이브러리 설치

    pip install customtkinter playwright pillow

    3. Playwright 브라우저 설치

    playwright install

    Part 2: CustomTkinter로 사용자 인터페이스 제작하기

    2.1. 왜 CustomTkinter인가?

    파이썬 기본 GUI 라이브러리인 Tkinter를 현대적으로 확장한 것입니다. 단 몇 줄의 코드로 세련된 다크 모드를 구현할 수 있어 초보자에게 매우 친화적입니다.

    2.2. 메인 윈도우: 애플리케이션의 캔버스

    모든 것은 창(window)에서 시작됩니다. 아래 코드는 앱의 기본 골격입니다.

    import customtkinter
    
    class App(customtkinter.CTk):
        def __init__(self):
            super().__init__()
            self.title("Thread-Mate: 자동화 도구")
            self.geometry("1100x720")
            customtkinter.set_appearance_mode("dark")
            customtkinter.set_default_color_theme("blue")
    
    if __name__ == "__main__":
        app = App()
        app.mainloop()

    2.3 & 2.4. 레이아웃과 위젯

    앱의 화면을 기능별로 나누고, 필요한 버튼과 입력창 등을 배치합니다. `grid` 시스템을 사용해 화면을 체계적으로 구성합니다.

    핵심 위젯 구성

    • 왼쪽 (제어판): 친구 목록 수집 버튼, 게시물 입력창, 전체 멘션 버튼
    • 오른쪽 (표시 영역): 수집된 친구 목록 (스크롤 가능), 자동화 작업 상태를 보여주는 로그 창

    Part 3: 데이터 백본 – SQLite 데이터베이스 연동

    3.1. SQLite: 앱의 로컬 메모리

    앱을 껐다 켜도 데이터를 유지하려면 데이터베이스가 필요합니다. SQLite는 별도 설치 없이 파일 기반으로 동작하여 파이썬 프로젝트에 사용하기 매우 편리합니다.

    3.2. 스키마 설계 및 테이블 생성

    데이터를 어떤 구조로 저장할지 정의하는 것을 ‘스키마 설계’라고 합니다. 우리는 ‘friends’라는 테이블을 만들 것입니다.

    컬럼명 데이터 타입 설명
    idINTEGER고유 식별자 (자동 증가)
    usernameTEXTThreads 사용자 이름 (중복 불가)
    full_nameTEXT전체 이름
    scraped_atTEXT데이터 수집 시각

    3.3. CRUD 함수 구현

    데이터베이스와 소통하기 위한 기본 함수들(Create, Read, Update, Delete)을 구현합니다. 예를 들어, 친구를 추가하는 함수는 다음과 같습니다.

    # database.py
    import sqlite3
    from datetime import datetime
    
    def add_friend(username, full_name):
        conn = sqlite3.connect('threads_data.db')
        cursor = conn.cursor()
        # SQL 인젝션 방지를 위해 '?' 사용
        cursor.execute("""
            INSERT INTO friends (username, full_name, scraped_at)
            VALUES (?, ?, ?)
        """, (username, full_name, datetime.now().isoformat()))
        conn.commit()
        conn.close()

    Part 4: 자동화 엔진 – Playwright

    4.1. Playwright: 현대적인 웹 자동화

    Playwright는 프로그래밍으로 웹 브라우저를 제어하는 도구입니다. 특히 ‘자동 대기(auto-waiting)’ 기능이 강력하여, 웹페이지 요소가 로드될 때까지 알아서 기다려주므로 안정적인 스크립트 작성이 가능합니다.

    4.2 & 4.3. 로그인 및 팔로워 스크레이핑

    자동화의 핵심은 ‘무한 스크롤’을 처리하는 것입니다. 페이지 끝까지 스크롤하는 동작을 반복하고, 로드된 모든 데이터를 추출해야 합니다.

    스크롤 루프 로직

    1. 팔로워 목록이 담긴 창을 찾는다.
    2. `while` 루프 안에서 자바스크립트 코드를 실행해 창을 맨 아래로 스크롤한다.
    3. 새로운 데이터가 로드될 때까지 잠시 기다린다. (`page.wait_for_load_state(‘networkidle’)`)
    4. 더 이상 새 데이터가 없으면 루프를 종료한다.
    5. 완전히 로드된 목록에서 사용자 이름과 전체 이름을 추출한다.

    Part 5: 멀티스레딩으로 반응성 확보하기

    5.1. GUI가 멈추는 이유와 해결책

    웹 스크레이핑처럼 오래 걸리는 작업을 실행하면 GUI가 응답하지 않는 ‘멈춤 현상’이 발생합니다. 이를 해결하기 위해 ‘스레딩(Threading)’을 사용합니다. 아래 시각화를 통해 개념을 이해해 보세요.

    싱글 스레드 (멈춤 발생)

    한 번에 하나의 작업만 처리합니다. 작업이 끝날 때까지 다른 모든 것이 멈춥니다.

    일꾼 1명
    작업 1
    작업 2
    작업 3

    멀티 스레드 (반응성 유지)

    GUI 스레드와 작업 스레드를 분리하여, 오래 걸리는 작업 중에도 GUI는 계속 반응합니다.

    GUI 스레드 + 작업 스레드
    작업 1
    작업 2
    작업 3

    5.3. 안전한 통신: Queue와 `app.after`

    백그라운드 스레드는 GUI를 직접 수정할 수 없습니다. 따라서 `Queue`라는 안전한 통신 채널을 통해 작업 상태나 결과를 GUI 스레드에 전달하고, GUI는 `app.after()`를 이용해 주기적으로 이 채널을 확인하여 화면을 업데이트합니다. 이것이 바로 ‘생산자-소비자’ 패턴입니다.

    Part 6: 최종 조립 및 향후 개선 방안

    6.1. 종합: 최종 애플리케이션

    이제 모든 조각을 맞출 시간입니다. 지금까지 배운 UI, 데이터베이스, 스크레이핑, 스레딩 코드를 하나의 파이썬 파일로 통합하면 ‘Thread-Mate’가 완성됩니다. 이 과정을 통해 여러 기술을 융합하여 실용적인 프로그램을 만드는 경험을 얻게 됩니다.

    6.2. 추가 학습을 위한 길

    여기서 멈추지 마세요! 더 나은 개발자가 되기 위한 몇 가지 아이디어를 제안합니다.

    • 오류 복원력 강화: 네트워크 오류 발생 시 자동으로 재시도하는 로직을 추가해 보세요.
    • GUI 개선: 작업 진행률을 보여주는 프로그레스 바(progress bar)를 추가해 보세요.
    • 실행 파일 생성: PyInstaller 같은 도구를 사용해 여러분의 파이썬 스크립트를 다른 사람도 쉽게 실행할 수 있는 `.exe` 또는 `.app` 파일로 만들어 보세요.