뻘짓 Chat GTP 대화내용 출력

64

챗지티피의 대화내용을 pdf로 만들려고 했는데 2026년부터 막혔더군요.

그래서 MVC모델에 기반해서 만들어 보았습니다.

소스는 아직 미비해서 요구사항을 아래와 같이 만들었습니다.

요구사항만을 가지고 파일 하나 만들어 라고 하면 산으로 가고 기능보완이 힘들었습니다.

그래서 다른 프로그램도 만들 때 사용하던 기본 mvc모델 코드로 대충 화면을 만들고 아래 요구사항을 적용했습니다. 2025년 겨울에 chatgtp를 사용할 때보다 더 잘 만들더군요.

아래 요구사항을 다듬어서 만드시면 될 것입니다. 저는 크로미움을 띄워서 json 파일을 생성하고 이것을 기반으로 pdf 나 워드를 출력하는 방식으로 만들었습니다.

1. GUI

1.1. GUI는 Python Tkinter로 제작

- 사용자가 링크를 입력하고 버튼을 눌러 작업을 시작하는 형태.

- 사용자가 명확하게 제작을 요청할 때만 코드 수정/제작 진행.

1.2. 입력 대상은 ChatGPT 공유 링크

- 기본적으로 https://chatgpt.com/share/... 형태의 공유 링크를 대상으로 함.

- 로그인이나 권한 우회 방식은 사용하지 않음.

1.3. 사용자는 링크만 입력하고 PDF 생성 버튼을 누르면 됨

- 이후 메시지 로딩, 수집, PDF 생성은 자동으로 진행.

- 사용자가 직접 스크롤하거나 메시지를 미리 로딩할 필요는 없음.

2. 스크롤

2.1 대화는 자동 스크롤하면서 조금씩 수집

- 현재 보이는 메시지를 수집.

- 일정량 스크롤.

- 새로 나타난 메시지를 추가 수집.

- 이를 마지막까지 반복.

- 메시지는 사용자 질문과 ChatGTP 답변을 하나의 메시지로 한다.

2.2 스크롤 후 대기시간은 상수로 지정

- 사용자가 소스 상단의 상수값을 직접 변경할 수 있게 함.

- 누락이나 로딩 문제가 발생하면 대기시간을 늘려 다시 실행할 수 있도록 함.

2.3 스크롤 이동량은 화면 전체보다 작게 설정

- 예를 들어 화면 높이의 약 60~70% 정도만 이동.

- 이전 화면과 다음 화면이 일부 겹치게 해서 메시지 누락 위험을 줄임.

3. 메시지

3.1 메시지 연속성 검증 기능 포함

- 이전 구간 마지막 메시지가 다음 구간에도 일부 존재하는지 확인.

- 이전과 다음 구간 사이에 겹침이 없으면 누락 가능성으로 판단.

- 필요하면 재시도하거나 오류 로그를 남김.

3.2 중복 메시지는 수집 단계에서 자동 제거

- 메시지 ID를 사용할 수 있으면 ID 기준.

- ID를 사용할 수 없으면 작성자 + 메시지 내용 + 해시 등으로 같은 메시지인지 판단.

- 논리 메시지 ID = 사용자 질문 + 그에 대응하는 ChatGPT 답변을 묶어서 프로그램이 관리하는 ID.

- 동일 논리 메시지가 여러 스크롤 구간에서 반복 수집된 경우 하나만 유지한다.

3.3 메시지 내부 콘텐츠 중복 제거

- 하나의 논리 메시지 내부에서도 동일한 문단·목록·표·코드 블록이 중복 수집되지 않도록 한다.

- DOM의 부모 요소와 그 내부 자식 요소에서 동일 내용을 동시에 수집하지 않는다.

- 문단, 목록, 표, 코드 등 가장 작은 의미 있는 콘텐츠 블록을 우선하여 수집한다.

- 동일 내용이 부모 블록과 자식 블록에서 동시에 발견되면 자식 블록 기준으로 하나만 유지한다.

- 부모/자식 DOM 관계, 동일 DOM 식별자, 동일 위치에서 생성된 복제 요소 등으로 중복임이 확인되는 경우 하나만 유지한다.

- 단순히 텍스트가 같다는 이유만으로 서로 다른 정상 콘텐츠를 제거하지 않는다..

- 숨겨진 DOM, 화면 표시용 복제 DOM, 접근성용 중복 DOM은 수집 대상에서 제외한다.

3.4 수집 과정에서는 누락 방지를 위해 구간 중복을 허용

- 자동 스크롤 과정에서는 이전 구간과 다음 구간을 의도적으로 겹쳐 수집한다.

- 겹쳐 수집된 동일 메시지와 동일 콘텐츠는 최종 수집 데이터에서는 제거한다.

- 최종 수집 원문에는 의도하지 않은 중복을 남기지 않는다.

- PDF 사이의 의도적인 경계 중복은 5.3~5.5와 7.2의 규칙에 따른 별도 정상 동작으로 취급한다

4.이미지, 표, 하이퍼 링크

4.1 이미지는 무시

- 이미지 다운로드나 PDF 삽입은 하지 않아도 됨.

- 이미지 때문에 생기는 지연 로딩, 크기 조정, 페이지 배치 문제는 고려 대상에서 제외.

4.2 텍스트 중심으로 PDF 생성

- 일반 문장, 목록, 표, 코드, 수식 등을 대상으로 함.

- ChatGPT 특수 UI나 인터랙티브 요소를 화면 그대로 복제하는 것은 목표가 아님.

- 코드 블록은 일반 본문과 구분되는 별도의 코드 박스로 렌더링한다.

- 코드 언어가 확인되는 경우 Python, JavaScript 등 언어 정보를 유지한다.

- 코드에는 가능한 경우 문법 강조(Syntax Highlighting)를 적용한다.

- ChatGPT의 실행 버튼, 복사 버튼 등의 인터랙티브 UI는 PDF에 포함하지 않는다.

4.3 하이퍼링크는 분할 PDF 중 한쪽에만 존재해도 됨

- 중복 영역에 링크가 양쪽 PDF에 모두 있을 필요는 없음.

- 링크 텍스트가 중복되더라도 실제 링크는 최초 등장 파일에만 남아도 됨.

5.PDF

5.1 PDF는 A4 기준으로 생성

- 용지 크기 A4.

- 글꼴, 여백, 줄간격 등을 일정하게 고정.

- 브라우저/Chromium 렌더링 엔진을 최종 조판에 이용한다.

- 코드 블록은 고정폭 글꼴을 사용한다.

- 코드 블록에는 배경색, 테두리, 내부 여백을 적용한다.

- 키워드, 문자열, 숫자, 주석 등은 문법 강조 색상을 적용할 수 있다.

5.2 한 PDF당 페이지 수는 상수로 지정

- 예: 4페이지.

- GUI에서 매번 입력하기보다 소스 상단 상수값으로 설정.

- 지정한 페이지 수를 절대 상한으로 우선 적용.

- 코드 블록이 지정 페이지 수를 초과하는 경우에는 코드 블록 내부 분할을 허용.

- 지정 페이지까지만 생성하고, 남은 내용은 다음 PDF 생성 시 이어서 반영.

- 경계 중복 내용도 지정한 최대 페이지 수 안에 포함한다.

- 표 하나의 실제 A4 렌더링 결과가 지정 페이지 수를 초과하는 경우, 현재 구현에서는 해당 표를 한 블록으로 유지할 수 없어 신규 내용이 PDF에 들어가지 못하는 오류가 발생할 수 있다.

- 따라서 PAGES_PER_PDF 값을 변경할 때는 하나의 표·코드·수식 블록이 해당 페이지 수보다 커질 가능성을 고려한다.

5.3 PDF 사이 중복 영역의 최대 높이는 상수로 지정

- 예: 10mm.

- 사용자가 소스 상단의 상수값을 변경할 수 있도록 한다.

- 중복 영역은 지정한 높이를 초과하지 않는다.

5.4 PDF 분할 시 경계 부분을 의도적으로 중복

- 001.pdf 마지막의 안전한 중복 영역

- 002.pdf 시작 부분에 동일 영역 포함

- 중복 영역의 최대 높이는 5.3의 상수값을 따른다.

- 목적은 경계 누락 방지 및 검증 편의.

5.5 중복 영역은 실제 A4 렌더링 높이를 기준으로 결정

- 브라우저 화면상의 줄 수나 글자 수를 기준으로 하지 않는다.

- 이전 PDF 마지막 부분에서 5.3에서 지정한 최대 중복 높이 범위 안에 들어오는 가장 큰 안전한 텍스트 단위를 다음 PDF 시작 부분에 중복한다.

- 지정한 최대 중복 높이를 정확히 채우기 위해 문장이나 구조화된 블록을 강제로 절단하지 않는다.

- 표·코드·수식 등의 구조화된 블록에서는 6장의 분할 규칙을 우선 적용한다.

- 코드 블록이 페이지 경계에서 분할되어 다음 PDF에서 이어지는 경우, 이어지는 코드 부분은 5.3의 중복 영역으로 계산하지 않는다.

6. 페이지 분할

6.1 안전한 절단 우선순위

- 가능한 경우:

- 메시지 끝

- 문단 끝

- 문장 끝

- 일반 줄 끝

- 구조화된 블록 내부에서는 자르지 않는 방향.

6.2 표 중간에서 자르지 않도록 함

- 페이지 분할 지점이 표 안에 있을 경우, 표 전체가 다음 PDF에 무리 없이 들어가는 경우에는 표 시작 전에서 끊거나 표 전체를 다음 PDF로 넘긴다.

- 중간 크기 표(1~10행): PDF 경계에서 가능하면 표 시작 전에서 끊고 다음 PDF에서 표를 시작

- 큰 표(11행이상): 표 전체 중복 금지. 행 단위로 자연스럽게 분할하고, 다음 PDF에는 표 제목/헤더 행만 반복

6.3 코드 블록 렌더링 및 분할

- 코드 블록은 일반 본문과 구분되는 하나의 코드 박스로 렌더링한다.

- 코드 언어가 확인되는 경우 코드 박스 상단에 Python, JavaScript 등의 언어명을 표시한다.

- 코드에는 가능한 경우 문법 강조 색상을 적용한다.

- 짧거나 중간 길이 코드 블록은 가능한 한 하나의 박스로 유지한다.

- 현재 PDF의 남은 공간에 코드 블록 전체가 들어가지 않지만 다음 PDF에는 들어가는 경우에는 코드 블록 전체를 다음 PDF로 넘긴다.

- 코드 블록 자체가 PDF 최대 페이지 수를 초과하는 경우에는 코드 줄 단위로 분할을 허용한다.

- 코드 줄의 중간에서는 가능한 한 자르지 않는다.

- 분할된 코드 블록은 다음 PDF에서도 동일한 배경색, 테두리, 고정폭 글꼴, 문법 강조 스타일을 유지한다.

- 다음 PDF에서 이어지는 코드 박스에는 언어명을 다시 표시하거나 Python (계속)처럼 표시할 수 있다.

6.4 수식 블록 중간에서 자르지 않도록 함

- 수식은 하나의 블록으로 취급한다.

- 단, 하나의 수식 블록 자체가 PDF 최대 페이지 수를 초과하는 경우에는 페이지 상한을 우선하며, 안전한 수식 단위 또는 표시 행 기준으로 분할을 허용한다.

6.5 이미지 설명 블록도 가능하면 중간에서 자르지 않음

- 실제 이미지는 무시하지만, 이미지 설명 텍스트가 하나의 블록이라면 가능한 한 함께 유지.

6.6 PDF 페이지 수는 글자 수로 추정하지 않고 실제 A4 렌더링 결과로 판단

- 같은 글자 수라도 표, 코드, 수식 때문에 페이지 수가 달라질 수 있기 때문.

- 실제 PDF 렌더링 후 페이지 수를 확인해서 분할 경계를 결정.

7. PDF생성

7.1 여러 개의 분할 PDF를 자동 생성

- 예:

- 대화_001.pdf

- 대화_002.pdf

- 대화_003.pdf

- …

- 각 PDF는 지정 페이지 수 기준으로 생성

7.2 분할 PDF는 경계 중복을 포함

- 검증 및 누락 방지용.

- 중복은 의도적인 정상 동작으로 간주.

7.3 최종적으로 하나의 전체 PDF도 생성

- 최종적으로 하나의 전체 PDF도 생성

- 분할 PDF 생성이 끝난 후 자동 병합

- 분할 PDF를 남길지 여부는 상수로 지정

- 기본값은 분할 PDF를 남기지 않음

- 분할 PDF는 수정하지 않고 순서대로 그대로 병합하며, 경계 중복도 최종 PDF에 그대로 유지한다

8. 오류처리

8.1 대화 수집 또는 PDF 생성 중 복구할 수 없는 오류가 발생하면 작업을 중단한다.

- 완료한 PDF와 오류가 발생한 부분을 메시지로 표기한다.

8.2 진행 상황을 GUI에 표시

- 예:

- 현재 수집된 메시지 수

- 스크롤 구간 번호

- 연속성 검증 성공/실패

- 현재 생성 중인 PDF 번호

- 최종 병합 진행 상태

8.3 오류 발생 시 로그를 남김

- 메시지 연속성 실패

- 로딩 대기시간 부족 가능성

- 특정 PDF 렌더링 실패

- 링크 접근 실패 등을 확인할 수 있도록 함.

9. Json 파일 요구사항

- json 파일을 메시지 단위와 스크롤 단위로 저장

- 메시지 단위는 추후 json 파일을 중간 대화부터 저장할 때 사용

- 마지막으로 작업을 마칠 경우 대화제목.json을 만든다.

- 위에서 만든 메시지 단위와 스크롤 단위 json은 작업폴더 아래에 temp 폴더를 생성해서 저장한다.

- 현재 json 설정 파일을 메시지 단위와 스크롤 단위로 저장하는 것까지만 반영한다.

10. 주요 상수들에 대해 파일에서 호출

PAGES_PER_PDF = 10 # PDF 한 파일에 들어갈 최대 페이지 수 **

OVERLAP_MAX_MM = 10.0 # PDF 분할 시 이전 PDF와 겹치게 넣을 최대 높이(mm) **

NAVIGATION_TIMEOUT_SEC = 180.0 # 공유 링크 최초 접속 제한시간(초) **

INITIAL_LOAD_WAIT_SEC = 10.0 # 공유 링크 최초 접속 후 대화 화면 로딩 대기 시간(초) **

SCROLLER_SEARCH_TIMEOUT_SEC = 20.0 # 스크롤러 탐색 전체 제한시간(초) **

SCROLL_WAIT_SEC = 10.0 # 맨 위 이동/스크롤 후 DOM 안정화 대기 시간(초) 짧으면 **

# 스크롤 후 DOM 높이/메시지 수 변화가 안정화되기 전에 다음 스크롤 시도할 수 있음

# 한화면을 스크롤 할 때 마다 5초가 소요되므로,

# 스크롤러 탐색 제한시간(SCROLLER_SEARCH_TIMEOUT_SEC)과

# SCROLL_WAIT_SEC의 합이 NAVIGATION_TIMEOUT_SEC보다 작아야 함

# 기존 2초였다가 5초 그리고 10초로 늘림. **

SCROLL_RATIO = 0.4 # 스크롤 시 화면 높이 대비 스크롤 이동 비율(0.1~0.95) 기본 0.56 **

CONTINUITY_RETRY_COUNT = 3 # 스크롤 후 메시지 연속성 검증 실패 시 재시도 횟수 **

STABLE_ROUNDS_TO_FINISH = 6 # 스크롤 후 DOM 높이/메시지 수 변화가 없는 안정 라운드 수

MAX_SCROLL_ROUNDS = 5000 # 스크롤 라운드 상한 (무한루프 방지용)

KEEP_SPLIT_PDFS = True # 분할 PDF를 최종 병합 후에도 보관할지 여부 **

SAVE_COLLECTED_JSON = True # 수집한 논리 메시지를 JSON으로 저장할지 여부 **

VIEW_CHROMIUM = True # Chromium DevTools를 열어 디버깅할지 여부(True: 열기, False: 닫기)

A4_MARGIN_TOP_MM = 15.0 # PDF 상단 여백(mm)

A4_MARGIN_BOTTOM_MM = 15.0 # PDF 하단 여백(mm)

A4_MARGIN_LEFT_MM = 16.0 # PDF 좌측 여백(mm)

A4_MARGIN_RIGHT_MM = 16.0 # PDF 우측 여백(mm)

BODY_FONT_PT = 10.5 # PDF 본문 글자 크기(pt)

LINE_HEIGHT = 1.55 # PDF 본문 줄 높이 배율

# 코드 블록 표시

CODE_FONT_PT = 9.2

CODE_SYNTAX_HIGHLIGHT = True

11. Json 파일 읽고 출력

11.1 Json 파일을 직접 읽어서 PDF나 워드 파일을 생성

11.2 공유링크 레이블 위에 Json 체크박스를 만든다

11.3 Json 체크박스를 선택한 경우 공유링크 텍스트 박스 뒤에 찾기 버튼이 활성화 되어 Json 파일을 불러온다.

11.4 파일을 불러올 때 사용가능한 Json 파일인지 확인한다.

11.5 PDF 생성 버튼을 누르면 json 파일을 이용해서 PDF파일을 만든다.

11.6 PDF 생성 버튼 옆에 워드 생성 버튼을 누르면 WORD 파일을 생성한다.

11.7 WORD 파일버튼은 공유링크를 통해서도 워드 파일을 생성 가능하다.

12. 사용자 메시지

Word와 PDF의 경우 사용자 메시지는 Box등으로 ChatGTP 메시지와 구분하여 보여준다.

99. 기타

99.1 ChatGPT 페이지를 그대로 Ctrl+P로 인쇄하지 않음

- 긴 대화에서 후반부가 인쇄되지 않는 문제를 피하기 위함.

- 브라우저 화면 전체를 한 번에 PDF로 만드는 방식을 사용하지 않음.

99.2 전체 대화를 한 번에 거대한 HTML/PDF로 만들지 않는 방향

- 매우 긴 대화에서는 다시 메모리/렌더링 문제가 생길 수 있음.

- 수집된 원문 데이터에서 필요한 분량씩 독립 HTML을 만들어 PDF를 생성하는 방향이 더 안정적.

99.3 ChatGPT 웹 구조 변경 가능성은 감안

- PDF 생성 부분은 비교적 안정적이지만,

- ChatGPT의 DOM 구조나 메시지 선택자가 바뀌면 수집 부분은 수정이 필요할 수 있음.

99.4 현재 가장 중요한 우선순위

- 1순위: 메시지 누락 방지

- 2순위: 메시지 순서 유지

- 3순위: 경계 중복 확보

- 4순위: 표·코드·수식 블록 보존

- 5순위: 정확한 A4 페이지 분할

- 6순위: 최종 PDF 병합

로그인한 회원만 댓글 등록이 가능합니다.

개발한당

KR | ID | EN
  • IDR
  • KOR
7.52 ▼ -0.01

2026.10.09 KEB 하나은행 고시회차 2191회

다가오는 한인 행사일정

  • 등록 된 일정이 없어요!