[초보자 실패사례] 젠스파크를 활용해서 용감하게 n8n 구축 방법에 도전

소개

인터넷신문 자동 발행 시스템 개발에 대해서 연구 (실패 사례)

진행 방법

  • 챗GPT (유로)

  • 젠스파크

초반에는 젠스파크로 연구를 해보았지만, 크레딧 소모가 커서 (총 크레딧 1,000~2,000)

후반부 챗GPT로 변경하여 딥다이브함.... 결론적으로는 개발 지식이 부족해서 구현 실패

1) 젠스파크로 연구 시작

한국 음악 웹 사이트의 스크린 샷
해당 사이트(강남일보)에 어드민으로 해당 기사를 자동으로 발행하는 시스템을 개발하고 싶어 노코딩으로 n8n이나 Make를 가지고 자동화 워크플로우를 만드는 방법이 있을까?

젠스파크가 알아서 분석을 하고 개발 방법을 추천해주었습니다.

한국어 단어가있는 페이지

노코딩으로 구현하는 방법을 친절하게 알려주었고요.

n8n으로 구현하는 방법을 구체적으로 알려주었습니다.

(makePuppeteer 의 방법도 알려주었지만 스킵)

{
  "nodes": [
    {
      "name": "RSS Feed Trigger",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "parameters": {
        "url": "https://news.source.com/rss"
      }
    },
    {
      "name": "Content Processing",
      "type": "n8n-nodes-base.function",
      "parameters": {
        "functionCode": "// 기사 내용 가공 로직"
      }
    },
    {
      "name": "Submit to CMS",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "method": "POST",
        "url": "https://강남일보사이트/admin/article/create"
      }
    }
  ]
}
나는 n8n을 처음 써보는 초보자야. 
강남일보 자동 기사 발행하는 워크플로우를 만들고 자동 구현해내고 싶은데 
방법을 알려줄래?

(하지만 제가 n8n경험이 없기 때문에 따라가기가 어려웠고 그래서 추가 요청을 하였습니다)

이렇게 다시 답변을 주었지만, 초보자가 따라가기에는 모르는 영역이 너무 많았어요

또다시 puppeteer 가 나와서 이해하기 어려웠습니다.

(개발 지식 부족 ㅜㅜ)

const puppeteer = require('puppeteer');

// 입력 데이터
const articleData = items[0].json;

// Puppeteer 실행
const browser = await puppeteer.launch({
  headless: true,  // 서버에서는 true, 디버깅시 false
  slowMo: 100,     // 100ms 딜레이
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-dev-shm-usage'
  ]
});

const page = await browser.newPage();

try {
  console.log('🔑 강남일보 로그인 시작...');
  
  // 1️⃣ 로그인 페이지 이동
  await page.goto('https://강남일보사이트.com/admin/login', {
    waitUntil: 'networkidle2',
    timeout: 30000
  });
  
  // 2️⃣ 로그인 정보 입력
  await page.waitForSelector('#username', { timeout: 10000 });
  await page.type('#username', 'your_admin_id', { delay: 100 });
  await page.type('#password', 'your_admin_password', { delay: 100 });
  
  // 3️⃣ 로그인 실행
  await Promise.all([
    page.waitForNavigation({ waitUntil: 'networkidle2' }),
    page.click('#login-button')
  ]);
  
  console.log('✅ 로그인 성공');
  
  // 4️⃣ 기사 작성 페이지로 이동
  await page.goto('https://강남일보사이트.com/admin/article/create', {
    waitUntil: 'networkidle2'
  });
  
  console.log('📝 기사 작성 시작...');
  
  // 5️⃣ 제목 입력
  await page.waitForSelector('#article-title');
  await page.click('#article-title');
  await page.keyboard.selectAll();
  await page.type('#article-title', articleData.title, { delay: 50 });
  
  // 6️⃣ 카테고리 선택
  if (await page.$('#category-select')) {
    await page.select('#category-select', articleData.category);
  }
  
  // 7️⃣ 본문 입력
  await page.waitForSelector('#article-content');
  await page.click('#article-content');
  await page.type('#article-content', articleData.content, { delay: 20 });
  
  // 8️⃣ 태그 입력
  if (articleData.tags && articleData.tags.length > 0) {
    await page.type('#tags-input', articleData.tags.join(', '));
  }
  
  // 9️⃣ 발행 버튼 클릭
  await Promise.all([
    page.waitForNavigation({ waitUntil: 'networkidle2' }),
    page.click('#publish-button')
  ]);
  
  console.log('🎉 기사 발행 완료!');
  
  // 성공 결과 반환
  return [{
    json: {
      success: true,
      message: '기사 발행 성공',
      title: articleData.title,
      publishedAt: new Date().toISOString(),
      articleUrl: page.url()
    }
  }];
  
} catch (error) {
  console.error('❌ 발행 실패:', error.message);
  
  // 에러 스크린샷
  await page.screenshot({ 
    path: '/tmp/error-screenshot.png',
    fullPage: true 
  });
  
  // 실패 결과 반환
  return [{
    json: {
      success: false,
      error: error.message,
      title: articleData.title,
      failedAt: new Date().toISOString()
    }
  }];
  
} finally {
  await browser.close();
}

그래서 파이썬 기반의 [주피터 랩]을 활용해보는 방법을 물어봤고

주피터 노트북에서는 자동 실행이 힘들거 같아?

주피터 노트북과 n8n에서의 활용 장단점을 파악

한국어의 다양한 유형을 보여주는 테이블

젠스파크에서 여러 방법에 대해서 리뷰를 해줬지만, 혼자 실행하기에는 어렵다고 판단하여

추가적인 연구는 챗GPT에서 이어서 진행하였습니다.

2) 챗GPT 로 이어서 연구

 n8n을 오늘 처음 사용해보는데, 내가 강남일보 어드민(계정/패스워드)을 가지고 있어 
브라우저로 강남일보 기사 자동 발행하는 방법을 만들고 싶은데, 
어떤 부분을 준비해야하고 어떻게 세팅해야지 n8n에서 직접 실행할 수 있을까?
좋은 질문이에요 👍
n8n으로 강남일보 어드민 계정에서 기사 자동 발행을 하려면 몇 가지 준비와 설계가 필요합니다. 정리해드릴게요.

1. 사전 준비사항

어드민 계정/비밀번호

n8n 워크플로우에서 로그인해야 하므로 필수입니다.

다만 단순히 ID/PW만으로는 자동화가 어렵고, 보통은 세션 쿠키나 API 엔드포인트를 찾아야 합니다.

어드민 페이지 구조 확인

기사 작성 → 미리보기(웹보내기) → [등록] 버튼 클릭

여기서 실제 "저장/등록" 요청이 어떤 방식으로 서버에 전달되는지 확인해야 합니다.

방법: 브라우저에서 **개발자 도구(F12 → Network 탭)**로 확인 → POST 요청 URL, 파라미터, 헤더를 캡처.

자동화 방식 선택

(1) API 요청 방식:

어드민이 REST API/POST 엔드포인트를 제공한다면, n8n의 HTTP Request 노드만으로 자동 발행 가능.

(2) 브라우저 시뮬레이션 방식:

API가 없다면 Selenium 같은 브라우저 자동화 툴 필요.

n8n에서 직접 브라우저를 제어하긴 어렵고, 대신 Python + Selenium을 별도 실행 환경에 두고, n8n에서 트리거 → Python 실행하도록 설정 가능.

2. n8n 워크플로우 기본 구조

예시로 HTTP Request 방식일 때:

Trigger 노드

크론(시간 예약), Webhook(외부에서 호출), Google Sheet 연동 등.

HTTP Request (Login)

로그인 엔드포인트에 POST 요청 → 세션 쿠키 or 토큰 저장.

Set / Function 노드

기사 제목, 본문, 이미지 등 데이터 세팅.

HTTP Request (글 발행)

기사 등록 엔드포인트에 POST 요청 → 저장/발행 완료.

Slack/Email 노드 (선택)

성공 여부 알림.

3. 브라우저 클릭 자동화가 꼭 필요한 경우

[등록] 버튼이 단순히 JavaScript 클릭 이벤트로만 동작한다면 → API 요청 추적이 안 될 수 있음.

이 경우:

Python + Selenium 스크립트 작성 (로그인 → 글 입력 → 버튼 클릭).

n8n의 Execute Command 또는 Python 노드에서 해당 스크립트를 실행.

실행 결과(성공/실패 여부)를 n8n으로 반환.

4. 체크리스트

 개발자도구 → 로그인/등록 시 실제 네트워크 요청 URL/파라미터 확보했는지?

 세션 쿠키/토큰 기반 인증인지, 단순 폼 로그인인지 확인했는지?

 API 호출만으로 가능한지, 아니면 브라우저 자동화가 필요한지 구분했는지?

👉 정리하면,
n8n에서 HTTP API 요청으로 가능하다면 제일 간단합니다.
만약 버튼 클릭 같은 UI 조작이 꼭 필요하다면, Python+Selenium을 외부에 두고 n8n에서 호출하는 구조로 가야 합니다.
버튼 클릭 같은 UI 조작이 꼭 필요하다면, Python+Selenium을 외부에 두고 n8n에서 호출하는 구조로 가야할 거 같아, 내가 초보자이니 Python + Selenium 코드 예시(강남일보 로그인 → 기사 등록 버튼 클릭)까지 쉽게 설명해줘

많은 핑퐁을 하다가 다시 처음으로 돌아가서

기사 작성페이지가 있는게 아니라 이렇게 버튼을 눌러서 기사를 발행하는 방식이야 다시 설계해줘
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 크롬 실행 (드라이버 경로 수정)
driver = webdriver.Chrome(executable_path="/path/to/chromedriver")
driver.maximize_window()

# 1. 로그인 페이지 열기
driver.get("https://egangnam.kr/wb_admin/main.php")

# 2. 로그인 (실제 input name 확인 필요)
driver.find_element(By.NAME, "user_id").send_keys("YOUR_ID")
driver.find_element(By.NAME, "password").send_keys("YOUR_PASSWORD")
driver.find_element(By.NAME, "loginBtn").click()
time.sleep(2)

# 3. 기사 목록 페이지 이동
driver.get("https://egangnam.kr/wb_admin/article_list.php")
time.sleep(3)

# 4. 웹보내기 버튼 클릭 (예: 첫 번째 기사)
# 실제 버튼의 HTML 속성 확인 필요 (id, class 등)
web_send_btns = driver.find_elements(By.LINK_TEXT, "웹보내기")
if web_send_btns:
    web_send_btns[0].click()
    print("웹보내기 버튼 클릭 완료")
else:
    print("웹보내기 버튼을 찾을 수 없음")

time.sleep(3)
driver.quit()
셀레니움을 깔았는데 어떻게 사용하는 거야?
Chrome + ChromeDriver 실행하는 방법 알려줘
쥬피터랩으로 강남일보 기사 자동 발행하는 방법 알려줘
이런 에러가 뜨는데 왜 그런거야?
수정할 수 있는 코드로 다시 작성해줘
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
import time

# 1. 크롬드라이버 실행 (경로 수정 필수)
service = Service("C:/chromedriver/chromedriver.exe")   # Windows 예시
# service = Service("/usr/local/bin/chromedriver")      # Mac/Linux 예시

driver = webdriver.Chrome(service=service)
driver.maximize_window()

# 2. 강남일보 어드민 접속
driver.get("https://egangnam.kr/wb_admin/main.php")

# 3. 로그인 (input 태그 name/id 값 확인 필요)
driver.find_element(By.NAME, "user_id").send_keys("YOUR_ID")
driver.find_element(By.NAME, "password").send_keys("YOUR_PASSWORD")
driver.find_element(By.NAME, "password").send_keys(Keys.RETURN)

time.sleep(2)  # 로그인 후 대기

# 4. 기사 리스트 페이지 이동
driver.get("https://egangnam.kr/wb_admin/article_list.php")
time.sleep(2)

# 5. '웹보내기' 버튼 클릭 (첫 번째 기사 기준)
buttons = driver.find_elements(By.LINK_TEXT, "웹보내기")
if buttons:
    buttons[0].click()
    print("✅ 첫 번째 기사 웹보내기 완료")
else:
    print("❌ 웹보내기 버튼을 찾을 수 없음")

time.sleep(3)
driver.quit()

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
File ~\anaconda3\Lib\site-packages\selenium\webdriver\common\driver_finder.py:64, in DriverFinder._binary_paths(self)
     63 if not Path(path).is_file():
---> 64     raise ValueError(f"The path is not a valid file: {path}")
     65 self._paths["driver_path"] = path

ValueError: The path is not a valid file: C:/chromedriver/chromedriver.exe

The above exception was the direct cause of the following exception:

NoSuchDriverException                     Traceback (most recent call last)
Cell In[6], line 11
      8 service = Service("C:/chromedriver/chromedriver.exe")   # Windows 예시
      9 # service = Service("/usr/local/bin/chromedriver")      # Mac/Linux 예시
---> 11 driver = webdriver.Chrome(service=service)
     12 driver.maximize_window()
     14 # 2. 강남일보 어드민 접속

File ~\anaconda3\Lib\site-packages\selenium\webdriver\chrome\webdriver.py:45, in WebDriver.__init__(self, options, service, keep_alive)
     42 service = service if service else Service()
     43 options = options if options else Options()
---> 45 super().__init__(
     46     browser_name=DesiredCapabilities.CHROME["browserName"],
     47     vendor_prefix="goog",
     48     options=options,
     49     service=service,
     50     keep_alive=keep_alive,
     51 )

File ~\anaconda3\Lib\site-packages\selenium\webdriver\chromium\webdriver.py:50, in ChromiumDriver.__init__(self, browser_name, vendor_prefix, options, service, keep_alive)
     47 self.service = service
     49 finder = DriverFinder(self.service, options)
---> 50 if finder.get_browser_path():
     51     options.binary_location = finder.get_browser_path()
     52     options.browser_version = None

File ~\anaconda3\Lib\site-packages\selenium\webdriver\common\driver_finder.py:47, in DriverFinder.get_browser_path(self)
     46 def get_browser_path(self) -> str:
---> 47     return self._binary_paths()["browser_path"]

File ~\anaconda3\Lib\site-packages\selenium\webdriver\common\driver_finder.py:78, in DriverFinder._binary_paths(self)
     76 except Exception as err:
     77     msg = f"Unable to obtain driver for {browser}"
---> 78     raise NoSuchDriverException(msg) from err
     79 return self._paths

NoSuchDriverException: Message: Unable to obtain driver for chrome; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location
-----------------------------
이렇게 답변이 왔는데, 수정해줘
강남일보 로그인 + 웹보내기 자동화 코드를 다시 짜줘

파란색 배경이있는 웹 사이트의 로그인 페이지
여기서 ID/PW가 자동 입력이 되지 않는데 해결 방법 찾아줘

쥬피터랩으로 창이 열리는 것까지는 실행했으나

로그인과 PW 입력이 되지 않아서 막혀있는상태...

[결론]

※개발 지식이 없는 초보자가 시도하기에는 어려운 프로젝트라고 판단하였습니다.

[결과와 나만의 배운점]

개발 지식이 없는 초보자가 시도하기에는 어려운 프로젝트라고 판단하였습니다. ㅜㅜ

하지만, 이번 시도로 인해서 자동화 접근방법과 개념에 대해서 조금 이해도가 생긴 거 같고요.

개발적인 지식이 더 필요하다는 걸 느꼈습니다. 또한 로그인 단계에서도 구현해내는게 쉽지 않다는 생각도 들었으며, 비록 이번에는 실패를 경험했지만 더 연구하여 꼭 자동화 시스템을 만들고 싶습니다.

도움이 필요한 부분이 있나요?

ㄴ 다른 개발 고수님들과 이야기를 나누어서 개발가이드 혹은 컨설팅을 받아보면 도움이 될 거 같습니다.

앞으로의 계획이 있다면 들려주세요.

ㄴ 언제가 될지는 모르겠지만, n8n에 대해서 스터디를 한다음 인터넷신문 자동 발행시스템을 구현해 내는 것이 목표입니다.

1
3개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요