최근 Show GN 커뮤니티에 소개된 "유튜브 댓글에서 체스 플레이 매크 프로그램"이 화제가 되고 있습니다. 이 프로젝트는 구독자들의 집단 지성과 체스 AI(Stockfish)를 연결해, 유튜브 라이브 채팅에서 직접 체스 대국을 플레이하는 매크 자동 봇을 구현한 사례입니다. 본 글에서는 동작 원리, 구현 디테일, 한계와 개선 방향, 그리고 비슷한 시도를 직접 해보고 싶을 때 필요한 최소 셋업까지 정리합니다.

1. 프로젝트 개요 — 유튜브 댓글이 곧 다음 수
이 시스템은 크게 세 가지 컴포넌트로 나뉩니다.
- 크롤링 모듈: 10분 주기로 고정 댓글의 대댓글을 긁어 표준 대수 기보법(SAN) 표기로 작성된 수를 수집합니다.
- 투표 집계 모듈: 같은 수에 모인 좋아요 합산을 점수로 환산해 가장 높은 점수의 수를 현재 보드의 "사람 측 착수"로 채택합니다.
- 엔진 모듈: 채택된 사람 측 수에 대해 Stockfish가 응수(엔진 응답)를 계산하고, 그 결과를 다시 라이브 채팅에 붙여 넣습니다.
즉 유튜브 댓글 = 인간 팀의 컨트롤러, Stockfish = AI 팀의 컨트롤러로 작동하며, 시청자는 단순한 응원석이 아니라 한 수 한 수에 투표하는 운영진이 됩니다. 한 사이클은 보통 1분 이내로 끝나기 때문에 실시간 스트림에서 곧바로 체스 한 판이 굴러가는 장면을 만들 수 있습니다.
2. 핵심 구현 패턴
원작자가 공개한 코드는 의외로 단순합니다. 핵심 흐름만 추리면 다음과 같습니다.
import re, time, requests
from collections import Counter
SAN_RE = re.compile(r"\b(KQRBNP]?[a-h]?[1-8]?x?[a-h][1-8?[+#]?)\b")
def collect_moves(video_id, max_pages=2):
moves = Counter()
for page in range(max_pages):
url = f"https://www.googleapis.com/youtube/v3/commentThreads"
params = {"part": "snippet", "videoId": video_id,
"pageToken": next_token(page), "maxResults": 100, "key": API_KEY}
data = requests.get(url, params=params, timeout=10).json()
for item in data["items"]:
t = item["snippet"]["topLevelComment"]["snippet"]["textDisplay"]
if t.startswith("@") or "[삭제됨]" in t:
continue
for m in SAN_RE.findall(t):
if is_legal(m):
moves[m] += item["snippet"]["topLevelComment"]["snippet"]["likeCount"]
return moves.most_common(1)[0][0] if moves else None
def play_stockfish_reply(legal_moves_board, last_move):
UCI 모드의 로컬 Stockfish 호출은 생략. 일반적으로는 python-chess의
engine.SimpleEngine로 bestmove를 받아 다음 라이브 채팅에 게시한다.
...

핵심은 SAN 파싱 → 좋아요 가중 합산 → 상위 1개 채택 → 엔진 응답 → 채팅 게시의 5단계입니다. 실제로는 YouTube Data API v3의 quota 정책 때문에 페이지네이션과 캐싱이 매우 중요해집니다. 한 라이브 방송당 무료 10,000 unit 한도 안에서 움직이려면 2~3분에 한 번만 댓글을 폴링하는 패턴이 안전합니다.
3. 사람이 자주 틀리는 두 가지 — 보드 상태와 프로모션
운영하면서 가장 자주 거치는 이슈 두 가지를 정리합니다.
- 현재 보드 상태 일치 여부: "e4"는 대부분의 국면에서 합법이지만 폰이 이미 빠진 위치에서 "e4"는 백의 더블 폰 침범 오류입니다. python-chess의
board.parse_san()로 매번 검증하고, 실패한 표기는 버리는 것이 안전합니다. - 프로모션 표기: "e8=Q"처럼 promotion 기호를 명확히 요구하면 절반 이상의 모호한 표기를 컷할 수 있습니다. 폰의 자동 승진 룰을 그대로 둘 경우 "e8"이 흑 폰이 파이팅하는 의미인지 승진인지 컴퓨터가 알 수 없어 게임이 멈춥니다.
결국 Sanity check를 사람 손이 아니라 chess 라이브러리가 보장하도록 강제하는 것이 핵심입니다. 라이브러리에서 reject한 수는 점수가 아무리 높아도 버리는 정책이 한 판을 끝까지 굴리는 비결입니다.
4. 자주 부딪히는 운영 함정
- API quota 초과: 라이브 방송 1시간에 quota 1,500 unit 정도가 안전 마진입니다. 짧은 폴링 주기는 비용 폭탄이 되니 주의.
- 중복 댓글 stacking: 한 시청자가 같은 수를 여러 번 적으면 좋아요가 더해져 점수 왜곡이 발생합니다. 사용자별 1 표 정책이 효과적.
- 엔진 응답 지연: Stockfish는 보통 100~200ms 내 응답하지만, 복잡한 중반국면에서는 1초 가까이 걸릴 수 있습니다. 채팅 자동 게시는 < 2초 권장.
5. 직접 따라 만들고 싶다면
- YouTube Data API v3 키를 발급합니다.
- python-chess로 SAN 검증기를 만들고, 실패 표기는 점수 0 처리합니다.
- Stockfish 바이너리를 로컬에 두고 python-chess의 UCI 엔진을 연결합니다.
- 10분 간격 폴링 → 좋아요 가중 → 1수 채택 → 엔진 응답 → 채팅 게시 루프를 작성합니다.
- 스트림 키와 고정 댓글에 안내문(예: "체스 수는 SAN 표기로 대댓글에 남겨주세요")를 박습니다.
전체 코드는 보통 300줄 안팎으로 끝나며, 가장 중요한 시간은 SAN 파싱과 chess 라이브러리 검증 디버깅에 들어갑니다.
요약
- 유튜브 댓글을 입력 컨트롤러로, Stockfish를 엔진으로 결합하면 라이브 체스 매크 봇이 가능하다.
- 핵심은 좋아요 가중 합산 + SAN 검증, 사용자별 1 표 정책이다.
- YouTube API quota와 엔진 응답 지연만 잘 컨트롤하면 1시간짜리 라이브 한 판을 안정적으로 굴릴 수 있다.
스트리머라면 "구독자 vs 엔진"을 한 번 컨셉으로 굴려보는 것만으로도 채널 분위기가 크게 살아납니다. 직접 손대기 부담스럽다면, 본 글의 흐름을 영상 콘텐츠로 각색해 보는 것도 좋은 출발점이 됩니다.
— 끝 —
원문: 긱뉴스 #31554 — Show GN: 유튜브 댓글에서 체스 플레이 매크 프로그램
📰 원본 출처 · https://news.hada.io/topic?id=31554 (#N=31554)
이 글은 GeekNews(긱뉴스)에 게제된 글을 기반으로 작성되었습니다. 원본의 라이선스와 저작권은 원작자에게 있습니다.