스치니 팔로우 늘리기 자동화
Part 1: 기초 및 윤리적 고려사항
1.1. 중요한 서문: 규정 이해하기
⚠️ 주의: 자동화와 책임
소셜 미디어 자동화는 강력하지만, 플랫폼의 서비스 약관을 위반할 수 있습니다. 특히 사용자 동의 없는 데이터 수집(스크레이핑)은 계정 정지 등의 위험을 초래할 수 있습니다. 이 프로젝트는 상업적 목적이 아닌, 기술 학습을 위한 “교육용”으로 접근해야 합니다.
1.2. “Thread-Mate” 설계: 프로젝트 청사진
좋은 소프트웨어는 좋은 설계에서 시작됩니다. 우리 앱의 구조는 4개의 핵심 요소로 구성됩니다. 아래 다이어그램의 각 요소에 마우스를 올려보세요.
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’라는 테이블을 만들 것입니다.
컬럼명 | 데이터 타입 | 설명 |
---|---|---|
id | INTEGER | 고유 식별자 (자동 증가) |
username | TEXT | Threads 사용자 이름 (중복 불가) |
full_name | TEXT | 전체 이름 |
scraped_at | TEXT | 데이터 수집 시각 |
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. 로그인 및 팔로워 스크레이핑
자동화의 핵심은 ‘무한 스크롤’을 처리하는 것입니다. 페이지 끝까지 스크롤하는 동작을 반복하고, 로드된 모든 데이터를 추출해야 합니다.
스크롤 루프 로직
- 팔로워 목록이 담긴 창을 찾는다.
- `while` 루프 안에서 자바스크립트 코드를 실행해 창을 맨 아래로 스크롤한다.
- 새로운 데이터가 로드될 때까지 잠시 기다린다. (`page.wait_for_load_state(‘networkidle’)`)
- 더 이상 새 데이터가 없으면 루프를 종료한다.
- 완전히 로드된 목록에서 사용자 이름과 전체 이름을 추출한다.
Part 5: 멀티스레딩으로 반응성 확보하기
5.1. GUI가 멈추는 이유와 해결책
웹 스크레이핑처럼 오래 걸리는 작업을 실행하면 GUI가 응답하지 않는 ‘멈춤 현상’이 발생합니다. 이를 해결하기 위해 ‘스레딩(Threading)’을 사용합니다. 아래 시각화를 통해 개념을 이해해 보세요.
싱글 스레드 (멈춤 발생)
한 번에 하나의 작업만 처리합니다. 작업이 끝날 때까지 다른 모든 것이 멈춥니다.
멀티 스레드 (반응성 유지)
GUI 스레드와 작업 스레드를 분리하여, 오래 걸리는 작업 중에도 GUI는 계속 반응합니다.
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` 파일로 만들어 보세요.
