이 프로그램은 기존의 안전신문고 크롤러를 기반으로 GUI를 제거하고 사용자에게 좀 더 친숙한 웹 기반 UI로 리뉴얼한 프로그램입니다.
안전신문고에서 나의 신고 내역을 크롤링하여 처리 상태(수용, 일부수용, 불수용, 기타 등)으로 분류한 뒤 신고 내용과 답변 내용을 파싱하여 과태료/경고 등의 처분내역까지 정리하여 DB화하는 프로그램입니다.
기존 프로그램 사용자들로부터 스프레드 시트 연결과정이 복잡하다는 평가에 따라 웹에서도 표와 통계 기반의 데이터를 볼 수 있도록 기능 개선 및 부가 기능 등을 추가했습니다.
윈도우, 리눅스(데비안 계열) 버전 파일을 배포하고 있으며, 도커로도 사용 가능합니다.

설치
윈도우
OS가 윈도우일 경우 mysafereport-win.zip을 다운 후 압축을 풀고 mysafetyreport.exe를 바로 실행하면 됩니다.
자체 웹서버를 실행하기 때문에 아래처럼 보안 경고가 나올 수 있는데, 허용 해주시면 됩니다.


리눅스
리눅스일 경우 mysafetyreport-linux.zip를 다운받아 압축해제 후 아래 명령어로 실행하면 됩니다.
chmod +x ./run.sh
./run.sh실행할 경우 웹서버 실행 후 아래처럼 알아서 브라우저를 띄워 접속해 줍니다.
프로그램 종료 시엔 터미널 창을 닫으면 알아서 종료됩니다.

도커
도커의 경우 레포지토리에 있는 docker-compose.yml처럼 실행하시면 됩니다. 집에 놀고 있는 시놀로지 등 NAS가 있거나 N100등의 저전력 컴퓨터를 놀리고 있을 경우 적합합니다.
services:
mysafetyreport:
container_name: safetyreport
image: ghcr.io/fentanest/safetyreport:latest
ports:
- 6819:6819
environment:
- TZ=Asia/Seoul
volumes:
- ./data:/app/data
restart: unless-stopped
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- 4444:4444
restart: always
chrome:
container_name: chrome
image: selenium/node-chrome:latest
platform: linux/amd64
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_JAVA_OPTS=-Xmx512m
restart: always도커일 경우 자체 브라우저가 없으므로, IP:6819로 직접 접속하시면 됩니다.
최초 설정
관리자 계정 생성
최초 실행 시 아래처럼 관리용 계정을 생성하도록 묻습니다. 이 계정은 안전신문고 관리자 계정과는 무관하므로 편하신 ID/PW를 이용해서 생성하면 됩니다.

계정을 생성한 후엔 바로 로그인 창으로 넘어갑니다.

실행 후 아직 아무런 데이터도 없어 전부 ‘0’이 표기된 초기 화면이 표시됩니다. 정상입니다.

추후 관리용 계정을 변경하려고 할 땐, 설정 페이지의 0.관리자 계정 변경 항목을 이용해서 변경하시면 됩니다.

복잡한 설정 없이 우선 사용해 보고 싶다면 설정 페이지에서 안전신문고 계정 입력, ‘로컬 데스크톱 크롬’을 선택 후 저장을 클릭하고

크롤링 제어 페이지에 가서 ‘크롤링 시작’ 버튼을 클릭하면 알아서 시작됩니다.
절.대. 자동작동중인 크롬 창의 사이즈를 변경하거나 클릭하거나 키보드 입력을 넣는 등 방해하지 마세요

기능 설명
프로그램 기본 설정
설정 페이지에 진입하면 아래와 같이 1. 시스템 및 서버 설정 항목을 볼 수 있습니다.

이 프로그램은 기본적으로 안전신문고에 로그인해 나의 신고내역을 크롤링 및 파싱하는 프로그램이기 때문에 안전신문고 계정 정보를 입력해야 합니다. 입력된 비밀번호는 암호화해서 저장됩니다.

크롬 구동 방식의 경우 총 3가지가 있습니다.
윈도우나 리눅스용을 다운받아 사용하는 경우 2. 로컬 데스크톱 크롬이 가장 편한 선택입니다. 이 경우 프로그램에서 알아서 크롬 드라이버를 다운받은 뒤 로컬에서 크롬을 실행하여 크롤링을 시작합니다. Headless 모드를 선택할 경우 크롬창이 나타나지 않고 작업이 시작됩니다. Headless 없이 두어번 실행하여 정상작동 되는 것을 확인 후 Headless를 키면 됩니다.
Selenium Hub는 NAS, 서버, N100저전력 등의 환경을 염두에 둔 모드입니다. 위의 예시의 docker-compose.yml에도 Selenium Hub가 포함되어 있습니다. GUI환경이 없어도 크롬을 이용한 자동화를 돌릴 수 있는 매력적인 선택지입니다.
당연하지만, 크롬이 없거나 GUI환경이 아닌 곳에서 로컬 데스크톱 크롬으로 작동시키려고 하면 아래처럼 에러가 발생합니다. 하지 마세요.

안전신문고 크롤링
이 프로그램의 기본 기능입니다. 실행하면 안전신문고 로그인 후 나의 신고내역을 30개씩 보기로 맞춘 후 페이지 끝까지 순회하며 모든 신고내역을 리스트화 한 후 개별 신고내역을 하나씩 전부 순회하며 신고내용, 처리내용 등을 긁고 파싱해서 DB화 합니다.

각 항목별 기능 설명은 아래와 같습니다.
| 메뉴명 | 항목명 | 설명 |
|---|---|---|
| 로그인 모드 | 회원 로그인 모드 | 설정값에 저장한 계정을 이용해 자동으로 로그인 후 크롤링 |
| 비회원(수동) 로그인 모드 | 안전신문고 로그인 페이지에서 일시정지. 사용자가 직접 크롬을 조작하여 로그인 후 수동조작 완료 (계속하기) 버튼을 클릭해 크롤링 재개 | |
| 크롤링 범위 | 전체 크롤링 | 나의 신고내역에서 마지막 페이지까지 전부 순회 |
| 최소 크롤링 | ‘처리중’ 상태가 하나도 없는 페이지를 탐색 페이지 한도만큼 만날 경우 리스트 순회를 중지, 개별 신고건을 크롤링 시작 (기존 안전신문고 크롤러의 조건부 탐색과 동일한 기능) | |
| DB 초기화 후 새로 크롤링 | 모종의 이유로 DB를 스스로 수정, 정리할 수 없거나 데이터가 망가졌을 경우 DB를 초기화하고 처음부터 완전히 크롤링 | |
| 큐 기능 | 특정 신고번호를 행으로 구분하여 입력 시 해당 신고건만 개별 크롤링. DB에 없는 신고번호를 크롤링할 순 없음 이미 존재하는 개별 신고건 중 일부에 대해 특정 사유로 크롤링 할 때 필요(잦은 보완 요청 등) | |
| 수동 데이터 내보내기 | 현재 DB 엑셀 저장 | mysafetyreport.exe 가 위치한 경로의 하위 경로인 ./data/results아래에 일시_시간.xlsx 형식으로 엑셀 파일 저장매 크롤링 작업마다 자동으로 생성 |
| 구글 시트에 업로드 | 스프레드시트 주소와 JSON키 업로드 시 활성화됨. 엑셀파일 저장 외에도 지정한 구글 스프레드 시트에서 data 시트에 데이터를 업로드매 크롤링 작업마다 자동으로 수행됨 | |
| 크롤링 시작 | 선택한 옵션대로 크롤링 시작, 엑셀 저장 작업까지 완료 | |
| 수동조작 완료(계속하기) | 비회원(수동) 로그인 모드 선택 시, 직접 로그인을 수행한 후 클릭해야 크롤링 재개됨 | |
| 강제 중지 | 작업중인 크롤링 강제 중지 |
데이터 조회

크롤링 작업이 완료되면 DB에 적재한 데이터를 바로 가시적으로 볼 수 있는 페이지를 제공합니다.
교통위반 내역
먼저 교통위반 내역은 안전신문고에서 신고할 때, 교통위반 탭을 이용한 신고건이 해당됩니다.


| 항목 | 기능 설명 |
|---|---|
| (1)감시목록 추가 | 체크박스로 선택된 신고건들을 ‘감시 목록 관리’ 페이지에 추가합니다. 이렇게 추가된 신고대상건들은 접속하자마자 대시보드에서 상태를 확인할 수 있어, 신고 후 답변 추이를 관찰해야 하는 건에 유용합니다. |
| (1)엑셀 다운로드 | 검색 결과에 따른 신고건들을 엑셀 형식으로 내려받습니다. |
| (1)선택된 신고번호 복사 | 체크박스로 선택된 신고건들의 신고번호(SPP-…)를 클립보드에 복사합니다. |
| (1)현재 페이지 신고번호 복사 | 검색 결과 현재 페이지에 나타나고 있는 신고건들의 신고번호를 클립보드에 복사합니다. |
| (1)전체 신고번호 복사 | 교통위반에 해당되는 모든 신고번호(2000건일 경우 2000건..)를 복사합니다. |
| (2)검색창 | 표 내부 내용 중 검색하려는 텍스트가 일치하는 모든 건을 모조리 추려내는 단순검색창입니다. |
| (3)상세 검색 및 도구 | 오른쪽 사이드바를 통해 검색 조건을 구체화합니다. |
상세 검색 및 도구를 클릭 시 아래 사진처럼 검색을 위한 사이드바가 열립니다.
특별한 내용은 없고, 처리기관 하단의 ‘경찰기관 제외, 경찰기관만 포함’ 기능의 경우 처리기관에 ‘서울’이라고 검색할 경우 처리기관에 서울특별시, 서울관할경찰서등이 섞여나오는 것을 방지하기 위함입니다.


예시로 아래처럼 ‘인천계양’을 검색(단축키 Enter)할 경우

아래처럼 처리기관이 인천계양인 신고건만 추려집니다.

기타 위반 조회
교통위반 이외의 탭을 이용해 신고한 건들을 모아서 보여줍니다.
이 탭에서 신고할 땐, 차량번호, 발생일, 발생 시간 등을 입력하는 항목이 없습니다.

따라서, 크롤러도 해당 정보는 가져올 수가 없습니다.

만일 쓰레기, 폐기물 탭으로 담배꽁초를 버리는 운전자를 신고하거나 불법 주정차 신고 등에 대해 크롤러에서 해당 정보를 보고 싶다면 신고할 때 신고내용에 아래 내용을 직접 입력하면 됩니다(콜론 : 앞뒤로 띄어쓰기 한 칸 주의)
* 차량번호 : 서울99가9999
* 발생일자 : 2026.12.31.
* 발생시각 : 23:59그러면 크롤러에서 해당 텍스트를 파싱할 수 있습니다.
중복차량 내역
사실 운전하다 보면, 위반하는 운전자는 따로 있습니다. 늘 위반하는 차가 위반합니다.. 저도 운전하기 전까지는 이런 사실을 몰랐습니다.
어느날부터 신고하다보면 차량번호 입력칸에서 자동완성이 되더군요…… =ㅅ=
그런 차량들에 대한 신고 내역을 추적관찰하기 위한 메뉴입니다. 제가 다니는 구역의 모 경찰서는 상습범을 계속 신고해도 계속 경고만 줘서 화딱지나더라구요.
이 페이지에서는 동일한 차량을 그룹화하여 신고번호 역순으로 보여줍니다. 즉, 가장 최근에 신고한 차량이 제일 위로 올라오는 구조입니다.

뒤의 두 페이지와 다른 점은 ‘중복횟수’ 컬럼이 있다는 점입니다.
전체는 ‘취하’상태의 신고건을 포함한 수, 유효는 취하 신고를 제외한 신고수입니다.
만일 설정 페이지에서 ‘취하 데이터 숨기기’를 끈다면, 이 표에서도 취하 건이 같이 나타납니다.
처리 부서 통계
교통위반과 기타 위반에 대해 각각 기관별/담당자별로 처분율을 나타내는 통계페이지입니다.


기관별/담당자별 표의 각 행을 클릭 시 교통위반 내역 혹은 기타 위반 조회 페이지에서 기관 및 담당자를 추려서 보여줍니다.
아래 예시는 서울강서경찰서 행을 클릭했을 경우 알아서 페이지를 이동해주는 모습입니다.

이 페이지의 상세 검색 기능은 비교적 단촐합니다.

신고명이나 위반법규명을 이용해 특정 위반행위에 대한 통계도 따로 산출할 수 있습니다.
예를 들어 ‘5조’라고 검색할 경우 신호 위반이나 지시 위반에 대한 통계를 확인할 수 있습니다(도로교통법 제5조).

세부 설정
시스템 및 서버 설정
설정 페이지에서 1. 시스템 및 서버 설정 하단에 프로그램 작동 방식에 대한 몇 가지 설정이 있습니다.

경찰소속기관명 정규화의 경우 안전신문고 답변에 중구난방으로 달려나오던 처리기관을 통일하여 통계자료 산출에 도움을 줍니다.
예를 들어, 같은 ‘서울강서경찰서’ 소속이라도 아래처럼 언제 답변했냐에 따라 처리기관명에 사소한 차이가 있는 부분을 ‘경찰청 서울특별시경찰청 서울경찰서’로 통일해 줍니다.


통계 페이지에서도 동일기관, 동일인이 불필요하게 분리되어 데이터를 보기 어려워지기 때문에 켜두는 것을 추천합니다.




취하 데이터 숨기기의 경우 웹UI 혹은 엑셀 추출 시 ‘취하’상태의 신고건을 제외하고 대시보드의 막대 그래프 비율 산정에서도 제외시킵니다.


취하 신고건의 경우 유의미한 데이터가 되지 못하므로 켜두는 것을 추천합니다.
재시도 간격(초)와 최대 재시도 횟수는 크롤링이나 자동 별점 기능 중 오류 발생 시 동일 시도를 시행할 간격과 횟수를 정하는 옵션입니다.
외부 연동 키 설정

텔레그램 봇
텔레그램 봇을 생성하는 방법은 잘 알려져 있는 관계로 외부 블로그 링크로 대체합니다.. 봇 생성 후 두 가지 값만 채워놓으면, 크롤링 마다 주요 변경내역에 대한 알람을 받아볼 수 있고,

차량번호나 신고번호 등을 통한 간단한 검색결과도 받아볼 수 있습니다.

봇은 ㅇ, /ㅇ, /h를 통해 호출할 수 있습니다.

구글 스프레드시트 연동
구글 스프레드 시트 연동은 외부 블로그에 잘 설명된 곳이 있어 링크로 대체합니다.
이 기능을 활성화하면, 매 크롤링 작업 이후 DB에 저장된 데이터를 엑셀로 저장할 때, 지정된 스프레드 시트의 data시트에도 데이터를 함께 업로드하고 스프레드 시트의 =image()함수를 이용하여 첨부사진도 바로 볼 수 있는 기능을 제공합니다.

링크된 블로그 글들 중 ‘서비스 계정 생성, 키 파일 다운로드, API 권한 설정, 사용할 구글 스프레드 시트 권한 공유 ‘2. 파이썬으로 구글 스프레드 시트 가져오기 – 1. 구글 스프레드 시트 권한 공유’까지 진행해야 합니다.
키 파일은 설정 페이지 맨 마지막 3. 구글 연동 인증 파일 (JSON) 업로드에 업로드하시면 됩니다. 잘 업로드 되었다면 아래 스샷의 우측 상단처럼 ‘인증 파일 있음’으로 변경됩니다.


이후 사용할 구글 스프레드시트의 주소를 아래 중 하나의 예시처럼 통째로 붙여넣던지, 스프레드시트 문서의 키값만 붙여넣으시면 됩니다.
https://docs.google.com/spreadsheets/d/1Gn3Yy9upbxGTIXzYBgopQfNcRqPHC6vnej7lgPbGsC0/edit?gid=694146024#gid=694146024
https://docs.google.com/spreadsheets/d/1Gn3Yy9upbxGTIXzYBgopQfNcRqPHC6vnej7lgPbGsC0
1Gn3Yy9upbxGTIXzYBgopQfNcRqPHC6vnej7lgPbGsC0
휴대폰 번호
안전신문고 신고 건에 대해 답변이 달린 후엔 만족도 평가에 참여할 수 있습니다. 해당 만족도 평가 페이지 주소는 신고번호와 신고자의 휴대폰 번호로 이루어져 있어, 이를 자동으로 순회하기 위해선 휴대폰 번호가 필수적으로 입력되어야 합니다.

휴대폰 번호가 입력되지 않을 시 아래처럼 오류 메세지가 나타납니다.
혹은 잘못된 휴대폰 번호를 입력하면 기능 작동 중 에러만 띄우다가 끝나버리니 제대로 입력해주세요. 어차피 모든 설정값은 로컬에 저장될 뿐입니다.

크롤링 자동 스케쥴러
스케쥴러는, 사용자가 일일히 크롤링 지시를 내리지 않아도 프로그램이 켜져있기만 하다면 설정된 시간에 자동적으로 크롤링을 수행하도록 하는 기능입니다.
방식은 인터벌과 시간 지정 두 가지입니다.
인터벌의 경우 시작시간과 실행 간격을 지정할 수 있고

시간 지정은 24시간 형식으로 시간을 기록 후 콤마(,) 로 구분하여 최대 10개의 시간대까지 입력하면 됩니다.

리버스 프록시 등을 이용해 나만의 안전신문고를 외부도메인으로 연결하고 텔레그램 봇 등과 함께 병행할 경우 외부에서도 괜찮은 사용성을 얻을 수 있습니다.
그래서 NAS등을 이용해 도커 형식으로 작동시키는 것이 가장 추천되는 방식입니다.
그 외 기타 기능
자동 별점 주기
신고건 수가 늘어날 경우 만족도 조사를 전부 눌러주기가 어려워 만든 기능입니다. 이 기능은 아직까지는 크롬 직접 조작 없이 작동합니다(언제 막힐지 모름, 막힐 경우 크롬 조작 방식으로 배포할 예정).
페이지의 하단에는 만족도 조사를 참여할 수 있는(답변 완료, 만족도 조사 참여 안한) 신고건들만 나타나는 표가 있으며,

4가지 검색 항목을 통해 조건에 맞는 신고건을 추려낼 수 있습니다.

왼쪽의 ID부분의 8자리 숫자를 클릭 시 알아서 상단에 하나씩 입력되기도 하지만,

‘검색 결과 자동 입력’ 버튼 클릭 시 일괄 입력됩니다.

이후 원하는 별점 클릭 후 ‘선택 건 별점 처리 시작’을 클릭하면 알아서 과정이 진행됩니다.

아래처럼 실시간으로 로그가 출력되며, 실행 후 실제로 해당 신고건에 가보면 이미 만족도 조사가 완료되어있음을 확인할 수 있습니다.



감시 목록 관리
‘즐겨찾기’라고 표현해도 될텐데 Watchlist의 느낌을 강하게 주기 위해 감시 목록이라고 이름 지었습니다.
교통/기타 위반 페이지에서 신고건들을 선택해 감시목록에 추가할 수 있습니다. 상세 검색 등을 활용해 조건에 맞는 걸 추려서 등록하시면 되고,

감시 목록에 추가된 신고건은 감시 목록 관리 페이지에서 할 수 있습니다.

파일 브라우저
크롤링마다 자동으로 저장되는 엑셀 파일이나 작동 로그를 직접 다운로드 할 수 있는 곳입니다.

윈도우, 리눅스, 도커 모두 하위 경로 ./data/logs와 ./data/results폴더에서 다운받을 수 있지만, 웹에서 바로 확인하면 편할 것 같다는 생각에 만들었습니다.
로그의 경우 crawl_, core_, star_ 3가지 형식의 로그로 나뉘어지고 각각 크롤링 로그, 웹서버 관련 로그, 자동 별점 주기 로그를 기록합니다.
대시보드
가장 최근 크롤링 시각 표시, 모든 신고건의 퍼센테이지(%)화, 교통위반 신고건에 대한 실제 과태료 처분율 등을 간략하게 표기합니다.

페이지 하단에는 Watchlist와 최근 3일 내 답변된 신고건들이 간략하게 표로 나타납니다.

변경 이력
2026-03-24 – v2 리뉴얼
- v2 리뉴얼
- 리눅스 cron방식에서 파이썬을 이용한 자체 스케쥴링 기능 추가
- PySide6기반 GUI에서 웹 UI로 변경, 로그인 기능 추가하여 외부 공개 리스크 감소
- 교통 위반, 기타 위반, 중복차량 등 웹 UI에서 자체적으로 Datatables를 활용하여 dataview 제공
- 다양한 컬럼명을 통한 상세 검색 기능
- 엑셀을 활용해야 했던 처리기관/담당자 별 처분율 통계 자체 제공
- 자동 별점 주기 기능을 통해 만족도 조사 일괄(batch) 수행 가
- 원격 디버깅 크롬 사용가능
- 필요없는 취하 데이터 숨기기 가능
- 로그 3분화를 통해 사용자에게 가시적인 로그 제공

