The Problem

Open‑source IP cameras are often left unsecured, creating privacy and security risks for owners. Security auditors and researchers need a fast way to locate such cameras at scale without manually combing through directories or search results.

What This Does

eyes.py implements the core OSINT engine. It launches multiple threads that (1) scrape public directories like Insecam and (2) issue Google/Yahoo dork queries, then de‑duplicates and enriches results with GeoIP data. The repository supplies two installer wrappers (install.sh for *nix, install.bat for Windows) that copy the script to a system location and expose a eyeson command that simply runs python eyes.py. The requirements.txt lists the three third‑party packages needed at runtime.

How It Is Wired

FileResponsibilityKey Functions / Flow
install.sh / install.batInstalls the Python runtime dependencies (pip install -r requirements.txt) and creates a system‑wide shortcut (eyeson / eyeson.bat) that invokes eyes.py.No internal Python calls; just OS‑level copy and permission steps.
eyes.pySingle‑module engine; owns all network I/O, threading, parsing, and output.Entry point: if __name__ == "__main__": main()main() parses CLI commands (/scrape, /scan, /country, /mode, /exit).<br> • Thread pool created via threading.Thread for parallel queries.<br> • Functions scrape_insecam(), search_dorks(), geoip_lookup(), and deduplicate() are called directly from the command handlers.<br> • Results are printed to stdout; no external database or file writes.
requirements.txtDeclares runtime libraries (e.g., requests, geocoder, beautifulsoup4).Imported in eyes.py at top‑level; no dynamic loading.
README.mdDocuments usage; defines the command syntax that eyes.py expects.Mirrors the CLI strings parsed in eyes.py.

There is one internal module (eyes.py) and zero import cycles. All external effects are limited to HTTP requests and console output, keeping the blast radius small—only changes to eyes.py affect the whole tool.

How To Use It

# Clone the exact repo
git clone https://github.com/moses-y/Project-Eyes-On.git
cd Project-Eyes-On

# Linux / macOS install
chmod +x install.sh
sudo ./install.sh   # installs deps and creates `eyeson` command

# Windows install (run in a CMD with admin rights)
install.bat          # same effect as the shell script

# Run the scanner
sudo eyeson          # or `eyeson` on Windows

The tool then accepts the documented slash commands, e.g.:

/scrape 3          # scrape first 3 Insecam pages
/scan 50           # perform 50 Google/Yahoo dork queries
/country US        # limit results to United States IPs
/mode STREAM       # show only live stream URLs
/exit

No additional configuration files or environment variables are required.

Real‑World Use

A security consulting firm could schedule the scanner on a hardened VM:

#!/bin/bash
sudo eyeson <<EOF
/country DE
/scrape 10
/scan 100
/mode ALL
/exit
EOF > /tmp/open_cams_de.txt

The output file feeds directly into a reporting pipeline that flags any public cameras found in the German IP range.

Code Health & Issues

  • HIGH (cognitive_load)Deep nesting in eyes.py (max indentation depth 9). Fix: Refactor with early returns and guard clauses.
  • MEDIUM (resilience)Broad exception handling (except: without specifying type) in eyes.py. Fix: Catch specific exceptions; log or re‑raise unexpected errors.
  • MEDIUM (cognitive_load)Oversized file (eyes.py ≈ 649 lines). Fix: Split by responsibility (scraper, dork engine, GeoIP, CLI).

Additional SDLC observations (not part of measured findings):

  • No test suite present.
  • No CI/CD configuration (no .github/ workflows).
  • No lockfile; requirements.txt alone may lead to non‑reproducible builds.
  • License file exists (MIT).
  • No secrets detected in the repository.

Code Health AuditMedium: Enable Dependabot or Renovate. Evidence: single manifest (requirements.txt) without an update bot. Why it matters: advisory fixes would otherwise require manual review across many forks. Fix: add .github/dependabot.yml covering the Python ecosystem.

The Bottom Line

Project‑Eyes‑On delivers a fast, single‑file OSINT scanner that works out‑of‑the‑box for locating unsecured cameras. Its monolithic design and lack of tests make maintenance risky; refactoring the core script and adding automated testing/CI would greatly improve reliability. Suitable for security researchers comfortable with Python and willing to extend the codebase.