OpenSource-Hub

user-scanner

CLI 도구

kaifcodec/user-scanner

심층 이메일 및 사용자 이름 OSINT 스위트로, 465+ 스캔 벡터를 지원합니다.

개요

User Scanner는 보안 연구 및 조사를 위한 Python 기반 OSINT 스위트입니다. 465개 이상의 활성 플랫폼을 스캔하고, 메타데이터를 추출하며, 계정 등록을 확인하고, 핸들과 이메일을 통해 자동으로 연관 확장을 수행합니다. 교차 스캔, 프록시 로테이션, 다중 형식 보고서 및 AI 에이전트 통합을 위한 MCP 서버를 지원합니다.

README 미리보기

# User Scanner\n\n\n  \n\n\n\n  \n  \n  \n  \n  \n  \n  \n     \n  \n\n\n\n  \n    \n  \n\n\n---\n\nA powerful **2-in-1 OSINT suite** engineered for deep **Email and Username Intelligence**.\n\nWith **465+ total scan vectors**—including **175+ email-integrated sites** and **290+ username platforms**—you can map digital footprints, analyze target behavior, uncover interests, full metadata of usernames and verify account registrations in seconds.\n\n---\n\n## 💖 Sponsored by\n\n\n  \n    \n  \n  \n  Go beyond account enumeration. WebVetted turns an email or username into a complete identity investigation with deep OSINT enrichment, breach intel, AI analysis, and an interactive identity graph.\n  \n  Start an Investigation →\n\n\n---\n\n\n  \n    \n  \n  \n  Comprehensive OSINT platform for professional investigators and analysts. Reverse email, phone number, and username search across 250+ modules. Automate your intelligence gathering with our powerful tools.\n  \n  Get Started →\n\n\n---\n\n## ✨ Key Features\n\n- 🔎 **Deep Email & Username OSINT:** Look up email registrations and perform advanced username profiling across 465+ platforms.\n- 👤 **Rich Metadata Scraping:** Scrapes avatars, bio descriptions, follower counts, UID numbers, seller statuses, and account attributes.\n- 🔀 **Cross-Scan & Pivot Engine:** Mines handles, profile links, and exposed email addresses from initial scans, automatically pivoting across secondary target vectors.\n- 🤖 **Model Context Protocol (MCP) Server:** Native AI agent integration for Claude Desktop, Cursor, Antigravity, and LLMs to run autonomous OSINT scans and recursive pivots.\n- 🛡️ **Hudson Rock Infostealer Breach Intel:** Query infostealer malware breach logs using the `--hudson` flag for high-priority target correlation.\n- ⚡ **High-Throughput Parallel Engine:** Powered by `httpx` and `curl_cffi` for maximum concurrency with automated TLS fingerprint impersonation.\n- 🔀 **Permutation & Alias Generator:** Wildcard-based use

FAQ (5)

문제 해결
Python URL 쿼리 문자열에서 사용자 이름이나 이메일에 &, #, %, +, 공백 또는 non-ASCII 문자가 포함되어 API 요청이 깨지거나 올바르지 않게 되는 문제를 어떻게 해결하나요?

사용자가 제어하는 원시 값을 f-string URL에 직접 삽입하지 마세요. 각 쿼리 값은 urllib.parse.quote로 퍼센트 인코딩하세요:

from urllib.parse import quote

url = f"{base_url}{endpoint}?{param}={quote(target, safe='')}"
api_url = f"https://www.instagram.com/api/v1/users/web_profile_info/?username={quote(user, safe='')}"

파라미터가 여러 개인 경우 urlencode를 사용하는 것이 좋습니다:

from urllib.parse import urlencode

params = {"username": user, "email": email}
url = f"{base_url}{endpoint}?{urlencode(params)}"

core/, email_scan/, user_scan/ 하위 모듈을 포함하여 모든 f-string 쿼리 URL을 감사하고, 보간된 user, username, email, target 또는 유사한 값을 모두 인코딩하세요. 전체 URL이 아닌 파라미터 값만 인코딩하세요. &, #, %, +, 공백, 비ASCII 문자가 포함된 입력을 사용하여 회귀 테스트를 추가하세요. 기존 leetcode.py의 urllib.parse.quote() 사용 방식을 참조 패턴으로 사용할 수 있습니다.

원본 Issue #574
문제 해결
-C 또는 MCP와 함께 concurrency를 0으로 설정하면 user-scanner가 왜 멈추나요?

concurrency를 0으로 설정하면 asyncio.Semaphore(0)이 생성되어, 모듈별 타임아웃이 시작되기 전에 모든 모듈이 무한히 대기하게 됩니다. MCP 모드에서는 이로 인해 스캔 잠금이 유지되고 큐가 차단될 수도 있습니다. 영향을 받는 버전(1.5.2.1 포함)에서는 해결 방법으로 -C 1과 같이 양의 concurrency 값으로 스캔을 실행하거나 MAX_CONCURRENT_REQUESTS=1을 설정하세요. 0이나 음수 값은 사용하지 마세요. 이 수정 사항은 CLI/MCP 경계와 orchestrator.set_concurrency 및 email_orchestrator.set_concurrency 모두에 유효성 검사를 추가하여 1 미만의 값에 대해 ValueError를 발생시키며, MCP 스키마에는 minimum: 1이 포함됩니다. 사용자명 및 이메일 스캔에 대한 조기의 일관된 유효성 검사를 위해 이 수정 사항이 포함된 릴리스로 업그레이드하세요.

원본 Issue #690
문제 해결
user-scanner에서 -P/--proxy-file로 설정된 프록시를 PDF 미디어 다운로드가 우회하는 문제를 어떻게 해결하나요?

이 문제는 PR #692에서 수정되었습니다. 버전 1.5.2.1(커밋 780d077a468035c6afd6b4a0f987317db651528b)에서 pdf_generator.fetch_and_resize_image()는 httpx.get()을 직접 호출합니다. httpx 0.28.1에서는 이 호출이 proxy=None으로 클라이언트를 생성하므로, get_proxy()/set_proxy_manager()에 구성된 프록시가 사용되지 않으며 PDF 이미지 요청이 운영자의 IP를 노출할 수 있습니다.

PR #692가 포함된 릴리스로 업그레이드하거나, 소스에서 해당 패치를 적용하세요:

git fetch origin pull/692/head:pr-692
git checkout pr-692
python -m pip install -e ".[pdf]"

이 패치는 PDF 미디어 다운로드를 get_proxy()를 통해 라우팅하고, get_global_timeout()을 준수하며, 프록시가 실패할 때 조용히 직접 연결로 폴백하지 않습니다. http://127.0.0.1:1과 같이 도달할 수 없는 프록시를 설정하여 수정 사항을 확인하세요. 미디어 다운로드가 실패하거나 건너뛰어져야 하며, 대상 서버는 어떠한 직접 요청도 받아서는 안 됩니다. 포크를 유지 관리하는 경우, user_scanner/core/pdf_generator.py에서 직접적인 httpx.get() 호출을 스캐너의 공유 프록시 요청 헬퍼 또는 get_proxy()와 get_global_timeout()을 사용하는 명시적 클라이언트로 교체하세요.

원본 Issue #688
문제 해결
멀티사이트 user-scanner 스캔에서 warmup_url이 첫 번째 사이트에서만 실행되는 문제를 해결하는 방법은?

이 문제는 커밋 780d077a468035c6afd6b4a0f987317db651528b의 user-scanner 1.5.2.1에 영향을 줍니다. _warmed 캐시는 (impersonate, proxy)만을 키로 사용하므로, 한 origin에 대한 워밍업이 성공하면 clearance 쿠키가 사이트별로 다름에도 불구하고 공유 세션이 다른 모든 origin에 대해 워밍업된 것으로 표시됩니다.

영향을 받는 커밋 이후 두 커밋 뒤에 병합된 PR #680이 포함된 main 브랜치 버전으로 업그레이드하여 수정하세요:

python -m pip install -U git+https://github.com/kaifcodec/user-scanner.git@main

체크아웃에서 작업하는 경우:

git pull origin main
python -m pip install -e .

업그레이드할 수 없는 경우 PR #680을 cherry-pick/병합하세요. 수정 사항은 워밍업 상태의 범위를 브라우저/프록시만으로 지정하는 것이 아니라 세션/브라우저와 warmup_url 또는 origin별 clearance 컨텍스트를 기준으로 지정해야 합니다. 실패한 워밍업은 다른 사이트의 상태를 지우지 않고 재시도할 수 있는 상태로 유지되어야 합니다. 임시 해결 방법으로, 공유 _warmed 집합이 사이트 간에 재사용되지 않도록 각 origin을 별도의 프로세스에서 실행하세요.

동일한 브라우저에서 프록시 없이 서로 다른 두 origin을 요청하여 확인하세요: 각 origin은 일반 요청 전에 자체 워밍업 요청을 한 번 보내야 하고, 반복되는 요청은 워밍업된 상태를 재사용해야 하며, 동시/실패한 워밍업은 안전하게 처리되어야 합니다.

원본 Issue #689
문제 해결
user-scanner Screener가 모든 이메일 주소에 대해 "Unexpected response body structure"를 반환하는 문제를 어떻게 해결하나요?

v1.5.1에서 screener.in이 오류 마크업을 <ul class="errorlist">에서 <ul class="errorlist" id="id_password_error">로 변경했기 때문에 email_scan/other/screener.py의 문자열 정확 일치 검사가 실패합니다. 68번째 줄 부근의 마커 검사를 추가 속성을 허용하는 정규식으로 교체하십시오:

import re

_REQUIRED = re.compile(r'<ul class="errorlist"[^>]*>\s*<li>This field is required\.</li>')

if _REQUIRED.search(res_text):
    return Result.available(url=show_url)

이전 검사 코드는 다음과 같습니다:

if '<ul class="errorlist"><li>This field is required.</li>' in res_text:
    return Result.available(url=show_url)

설치된 패키지 파일을 패치한 후 다음을 다시 실행하십시오:

user-scanner -e john.smith.4471@gmail.com -m screener --all

taken 분기는 일반 텍스트 User account with this Email already exists와 일치하므로 영향을 받지 않을 가능성이 높습니다. 모듈을 유지 관리하는 경우, 향후 마크업 변경을 더 쉽게 진단할 수 있도록 CSRF/token 누락과 분류할 수 없는 POST 응답에 대해 별도의 오류 메시지를 사용하십시오.

원본 Issue #611