인스타그램 봇 만들기

개요

최근에 인스타그램 봇을 하나 만들었습니다. 기숙사에서 제공하는 식단을 알려주시던 분이 계셨는데 운영을 접으시더군요.. 불편해서 직접 우물을 팠습니다. 불편한 사람이 직접 만들어야죠..

작동 방식

일단 기본적으로 파이썬으로 코딩하고 Github Actions에 스케쥴링 하는 방식으로 매일 24시 부근에 업로드 하도록 코드를 구성하였습니다. 학식은 기본적으로 생활관 홈페이지에 올라오고, 생활관 홈페이지에서 매일 식단을 크롤링 해와 그대로 업로드 하는 방식으로 이루어집니다.

image = Image.new('RGB', (img_width, img_height), bg_color)
draw = ImageDraw.Draw(image)

try:
    title_font = ImageFont.truetype(FONT_PATH, 80)
    text_font = ImageFont.truetype(FONT_PATH, 50)
    date_font = ImageFont.truetype(FONT_PATH, 30)
except IOError:
    title_font = ImageFont.load_default()
    text_font = ImageFont.load_default()
    date_font = ImageFont.load_default()

center_x = img_width / 2

y_offset = 300

# 1. 날짜 표시
draw.text((center_x, 80 + y_offset), date_str, font=date_font, fill=text_color, anchor="mt")

# 2. 식사 종류 제목
draw.text((center_x, 200 + y_offset), title, font=title_font, fill=title_color, anchor="mt")

# 구분선 긋기
line_y = 320 + y_offset
line_half_width = 440
draw.line(
    (center_x - line_half_width, line_y, center_x + line_half_width, line_y),
    fill=(200, 200, 200),
    width=3
)

# 3. 메뉴 내용
current_h = 380 + y_offset
line_spacing = 80

for line in content.split('\n'):
    draw.text((center_x, current_h), line, font=text_font, fill=text_color, anchor="mt")
    current_h += line_spacing

filename = f"{date_str}_{title}.jpg"
image.save(filename)
return filename

width를 1080으로, height를 1920으로 설계하여 스토리에도 포스트에도 올려도 손색이 없게 만든 코드입니다. PIL라이브러리를 통해 이미지를 매일 제작 후 업로드 하는 방식으로 설계하였습니다.

업로드

이미지 업로드에서 가장 많이 애를 먹었다고 볼 수 있습니다. 원래는 GIthub Actions가 실행되는 서버에서 업로드를 하였는데.. Github Actions가 이루어 지는 서버의 ip대역을 인스타그램이 차단할 것으로 인식 하다 보니 인스타그램 서버가 봇으로 인식하고 계정을 차단 먹이더군요..

    # DEBIAN_FRONTEND=noninteractive는 설치 중 '예/아니오' 질문 무시하고 진행
    sudo DEBIAN_FRONTEND=noninteractive apt-get install -y wireguard resolvconf

    # Secrets에 저장된 설정을 파일로 생성
    echo "${{ secrets.WIREGUARD_CONFIG }}" | sudo tee /etc/wireguard/wg0.conf
    
    # 권한 설정 (보안)
    sudo chmod 600 /etc/wireguard/wg0.conf
    
    # resolvconf 서비스가 꺼져있을 수 있으므로 강제 활성화 (에러 방지용)
    sudo systemctl enable --now resolvconf.service || true
    
    # VPN 시작
    sudo wg-quick up wg0

그래서, Github Actions에 하나의 절차를 추가했습니다. 집에 항상 켜져 있는 IPTime공유기의 WireGuardVPN을 활용하여 집 대역의 Ip를 통해 식단표를 업로드 하는 절차로 구성한 것입니다. 이를 통해 서버IP대역에서 업로드 되지 않던 instagrapi기반 코드를 매일 자정마다 실행할 수 있게 되었습니다.

결론

목 마른 사람이 우물 판다라는 속담과 같이 제 실생활에 필요한 창작이다 보니 정말로 재미있는 창작 이었던 것 같습니다. 하지만 instagrapai를 활용함을 이유로 매일 알 수 없는 로그인 경고가 뜨는 것을 보니 아직까지 불안한 면도 없지 않아 있는 것 같습니다. Instagram Developer api를 활용하면 훨씬 더 안정적이게 구동 할 수 있겠지만.. 굳이 작동하는 코드를 어지럽히진 않겠습니닷..!