{"id":28348123,"url":"https://github.com/xcrypt0r/watchdog","last_synced_at":"2026-05-18T17:02:40.196Z","repository":{"id":294299045,"uuid":"986504962","full_name":"xCrypt0r/Watchdog","owner":"xCrypt0r","description":"🐶 Dcinside image crawler that includes NSFW detection (Enhanced version of Hyacinth)","archived":false,"fork":false,"pushed_at":"2025-05-25T13:54:46.000Z","size":14611,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-20T18:43:36.420Z","etag":null,"topics":["crawler","crawling","dc","dcinside","nodejs","nsfw","parsing","tensorflow"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xCrypt0r.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-19T17:56:34.000Z","updated_at":"2025-05-25T13:54:49.000Z","dependencies_parsed_at":"2025-05-19T20:34:16.889Z","dependency_job_id":null,"html_url":"https://github.com/xCrypt0r/Watchdog","commit_stats":null,"previous_names":["xcrypt0r/watchdog"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/xCrypt0r/Watchdog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xCrypt0r%2FWatchdog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xCrypt0r%2FWatchdog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xCrypt0r%2FWatchdog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xCrypt0r%2FWatchdog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xCrypt0r","download_url":"https://codeload.github.com/xCrypt0r/Watchdog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xCrypt0r%2FWatchdog/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265327802,"owners_count":23747783,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crawler","crawling","dc","dcinside","nodejs","nsfw","parsing","tensorflow"],"created_at":"2025-05-27T18:10:18.519Z","updated_at":"2026-05-18T17:02:35.153Z","avatar_url":"https://github.com/xCrypt0r.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Watchdog\n[![Language](https://img.shields.io/badge/Language-Typescript-3178c6?style=for-the-badge\u0026logo=typescript)][typescript]\n[![GPL License](https://img.shields.io/badge/License-GPL--3.0-28a745?style=for-the-badge\u0026logo=github)](LICENSE)\n[![Repo Size](https://img.shields.io/github/languages/code-size/xCrypt0r/Watchdog?style=for-the-badge\u0026label=SIZE\u0026color=lightgrey\u0026logo=github)](/../../)\n[![Github Action](https://img.shields.io/github/actions/workflow/status/xcrypt0r/Watchdog/docker-build.yml?branch=main\u0026style=for-the-badge\u0026logo=githubactions)](https://github.com/xcrypt0r/Watchdog/actions/workflows/docker-build.yml)\n[![Image Size](https://img.shields.io/docker/image-size/xcrypt0r/watchdog?style=for-the-badge\u0026label=SIZE\u0026logo=docker)](https://hub.docker.com/r/xcrypt0r/watchdog)\n\n🐶 **Watchdog** is a Dcinside image crawler that includes NSFW detection.\n\n## 목차\n- [Watchdog](#watchdog)\n  - [목차](#목차)\n  - [소개](#소개)\n  - [설치](#설치)\n    - [빌드 결과](#빌드-결과)\n    - [공통](#공통)\n    - [로컬](#로컬)\n    - [도커](#도커)\n  - [사용법](#사용법)\n  - [저자](#저자)\n  - [라이선스](#라이선스)\n\n## 소개\n**Watchdog**은 Node.js를 사용하여 [디시인사이드](https://www.dcinside.com)에서 이미지를 크롤링하고   \n[TensorFlow](https://github.com/tensorflow/tfjs) 기반 NSFW 모델을 통해 이미지의 NSFW 여부를 판단하고 분류하는 프로그램입니다.\n\n![](https://i.imgur.com/cco1UO6.png)\n![](https://i.imgur.com/x5Jnzs5.png)\n\n## 설치\n### 빌드 결과\n|운영체제|결과|\n|---|:---:|\n|\u003cimg src=\"https://github.com/ngeenx/operating-system-logos/blob/master/src/128x128/WIN.png\" width=\"16\" alt=\"Windows logo\"\u003e Windows 11|✅ 성공|\n|\u003cimg src=\"https://github.com/ngeenx/operating-system-logos/blob/master/src/128x128/UBT.png\" width=\"16\" alt=\"Ubuntu logo\"\u003e Ubuntu 24.04|✅ 성공|\n|\u003cimg src=\"https://github.com/ngeenx/operating-system-logos/blob/master/src/128x128/MAC.png\" width=\"16\" alt=\"macOS logo\"\u003e macOS Sequoia|✅ 성공|\n\n### 공통\n1. 이 레포지토리를 [다운로드](https://github.com/xCrypt0r/Watchdog/releases)합니다.\n1. [Node.js][node.js]와 [npm][npm]을 설치합니다.\n    - 호환되는 버전은 **20.x** 또는 **22.x**입니다.[^1]\n    - 다른 Node.js 버전을 사용 중일 경우 [.nvmrc](.nvmrc) 파일을 참고해 권장 버전을 사용할 수 있습니다.  \n    [nvm](https://github.com/nvm-sh/nvm)을 설치하고 다음 명령어로 권장 버전을 사용합니다.\n        ```bash\n        nvm install 22\n        nvm use 22\n        node -v\n        ```\n2. `npm install`을 입력하여 의존성을 설치합니다.\n\n### 로컬\n1. [Python][python] **3.x** 버전을 설치합니다.\n2. TensorFlow 빌드 도구를 설치합니다.\n    #### Windows\n    [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/ko/visual-cpp-build-tools)를 설치합니다. ([링크](https://rinkesh-patel.medium.com/easy-way-to-install-tensorflow-tfjs-node-in-windows-11-machine-158f049d9efa) 참고)\n\n    #### Linux\n    `sudo apt-get install build-essential`\n\n    #### macOS\n    `xcode-select --install`\n1. [.env.example](.env.example)을 `.env`로, [targets.example.json](targets.example.json)을 `targets.json`으로 변경합니다.\n1. `npm start` 또는 `npm run pm2:start`를 입력하여 프로그램을 실행합니다.\n\n### 도커\n1. [Docker][docker]를 설치합니다.\n1. **(옵션)** Docker Desktop의 설정에서 최대 메모리 사용량을 조정합니다.\n    - 이 프로그램은 [ecosystem.config.js](ecosystem.config.js#L10)의 설정에 따라 pm2 사용 시 최대 16GB까지 메모리를 사용할 수 있으므로, Docker 메모리 제한을 이 이상으로 설정하거나 ecosystem.config.js를 수정하세요.[^2]\n\n    ![](https://i.imgur.com/R7QZi2d.png)\n\n2. 아래 두 가지 방법 중 하나를 선택하세요.\n    - **(권장)** Docker Hub에서 이미지를 내려받아 컨테이너를 실행합니다.\n        1. `npm run docker:up`\n    - 로컬에서 이미지를 빌드하고 실행합니다.\n        1. [.env.example](.env.example)을 `.env`로, [targets.example.json](targets.example.json)을 `targets.json`으로 변경합니다.\n        2. `npm run docker:build`\n\n## 사용법\n- 기본적으로 이미지는 레포지토리 하위의 archive 폴더 내에 저장됩니다.  \n  저장 위치는 [.env](.env.example)파일의 **LOCAL_ARCHIVE_DIR** 값을 수정하여 변경할 수 있습니다.\n- [targets.json](targets.example.json)을 수정하여 크롤링 대상 갤러리를 관리할 수 있습니다.[^3]\n    - 대상 갤러리는 다음과 같은 형식으로 입력합니다.  \n\n        ```json\n        \"갤러리 아이디\": {\n            \"name\": \"갤러리 이름\",\n            \"type\": \"갤러리 타입\"\n        }\n        ```\n        - 갤러리 아이디는 갤러리 URL에서 id=뒤에 나오는 부분입니다.  \n        예를 들어 국내야구 갤러리 URL `https://gall.dcinside.com/board/lists?id=baseball_new11`에서 갤러리 아이디는 `baseball_new11`입니다.\n        - 갤러리 타입은 메인: `main`, 마이너: `minor`, 미니: `mini`로 작성합니다.\n\n## 저자\nWatchdog © xCrypt0r  \nAuthored and maintained by xCrypt0r\n\n\u003e GitHub [**@xCrypt0r**][my github]   \n\u003e Discord [**@xcrypt0r**][my discord]\n\n## 라이선스\n이 프로젝트는 [**GNU 일반 공중 사용 허가서 버전 3.0 (GPLv3)**](LICENSE) 라이선스를 따릅니다.\n\n[^1]: 이외의 버전 설치 시 TensorFlow의 의존성 문제로 제대로 동작하지 않습니다.\n[^2]: Windows에서 `WSL 2`기반 Docker Desktop을 사용하는 경우 `.wslconfig`로 메모리 제한을 설정하세요.\n[^3]: 대상 갤러리가 많아질수록 메모리 사용량이 높아집니다.\n\n[typescript]: https://www.typescriptlang.org\n[node.js]: https://nodejs.org/ko\n[npm]: https://www.npmjs.com\n[python]: https://www.python.org/downloads\n[docker]: https://docs.docker.com/get-started/get-docker\n[my github]: https://github.com/xCrypt0r\n[my discord]: https://discord.com/users/282821913968115713","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxcrypt0r%2Fwatchdog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxcrypt0r%2Fwatchdog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxcrypt0r%2Fwatchdog/lists"}