{"id":32490044,"url":"https://github.com/bm-github/owasp-social-osint-agent","last_synced_at":"2026-02-12T00:37:26.509Z","repository":{"id":320100825,"uuid":"1071451839","full_name":"bm-github/owasp-social-osint-agent","owner":"bm-github","description":"An autonomous OSINT agent for social media using any OpenAI-compatible API for deep analysis and reporting.","archived":false,"fork":false,"pushed_at":"2026-02-04T23:10:13.000Z","size":279,"stargazers_count":49,"open_issues_count":0,"forks_count":4,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-05T11:37:06.372Z","etag":null,"topics":["api","mastodon","openai-api","python","reddit","twitter"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bm-github.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-07T11:18:22.000Z","updated_at":"2026-01-31T19:21:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"bc90b548-f1e1-4c0d-976b-9bf3d37b82ee","html_url":"https://github.com/bm-github/owasp-social-osint-agent","commit_stats":null,"previous_names":["bm-github/owasp-social-osint-agent"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/bm-github/owasp-social-osint-agent","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bm-github%2Fowasp-social-osint-agent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bm-github%2Fowasp-social-osint-agent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bm-github%2Fowasp-social-osint-agent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bm-github%2Fowasp-social-osint-agent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bm-github","download_url":"https://codeload.github.com/bm-github/owasp-social-osint-agent/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bm-github%2Fowasp-social-osint-agent/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29351055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T20:11:40.865Z","status":"ssl_error","status_checked_at":"2026-02-11T20:10:41.637Z","response_time":97,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["api","mastodon","openai-api","python","reddit","twitter"],"created_at":"2025-10-27T08:19:16.323Z","updated_at":"2026-02-12T00:37:26.495Z","avatar_url":"https://github.com/bm-github.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n[![GitHub release (latest by date)](https://img.shields.io/github/v/release/bm-github/owasp-social-osint-agent)](https://github.com/bm-github/owasp-social-osint-agent/releases/latest)\n# 🕵️ owasp-social-osint-agent\n\n**OWASP Social OSINT Agent** is an intelligent, autonomous agent designed for open-source intelligence (OSINT) investigations. It leverages both text and vision-capable Large Language Models (LLMs) via any OpenAI-compatible API to autonomously gather, analyze, and synthesize user activity across single or multiple social media platforms. The final output is a structured analytical report that turns scattered public data into coherent, actionable intelligence.\n\n## 🌟 Key Features\n\n✅ **Multi-Platform Data Collection:** Aggregates data from Twitter/X, Reddit, Bluesky, GitHub, Hacker News, and Mastodon. Captures immutable identifiers (e.g., Bluesky DIDs) to ensure targets can be tracked even if they change their handles.\n\n✅ **High-Fidelity OSINT Extraction:** Goes beyond basic text to capture platform-specific intelligence, including GitHub commit messages/star events, Reddit karma breakdowns/subreddit contexts, Twitter location/verified status, and HackerNews user reputation.\n\n✅ **AI-Powered Analysis:** Utilises configurable models via OpenAI-compatible APIs for sophisticated text and image analysis. Employs externalized, easily editable prompt files.\n\n✅ **Efficient Two-Phase Analysis:** The agent first fetches all textual data and downloads all media across all targets. Only after all data collection is complete does it begin the (slower) vision analysis phase, ensuring maximum efficiency.\n\n✅ **Cross-Account Comparison:** Analyze profiles across multiple selected platforms simultaneously.\n\n✅ **Robust Error Handling:** Individual fetch or image analysis failures don't crash the entire pipeline. The agent gracefully degrades, providing partial results when some targets are unavailable.\n\n✅ **Unified Platform Architecture:** All platform fetchers use a consistent base class pattern, ensuring uniform error handling, pagination, and caching behavior across Twitter, Reddit, Bluesky, GitHub, Mastodon, and HackerNews.\n\n✅ **Indirect Injection Mitigation:** Robustly wraps untrusted social media data in structured XML tags within the LLM prompt. This clarifies the boundary between \"system instructions\" and \"untrusted data,\" helping to mitigate indirect prompt injection attacks hidden in social posts or image descriptions.\n\n✅ **Accurate Temporal Analysis:** Injects the current, real-world UTC timestamp into every analysis prompt, forcing the LLM to understand the timeline of events correctly.\n\n✅ **Structured AI Prompts:** Employs detailed system prompts for objective, evidence-based analysis focusing on behavior, semantics, interests, and communication style.\n\n✅ **Vision-Capable Image Analysis:** Analyzes downloaded images (`JPEG, PNG, GIF, WEBP`) for OSINT insights using a vision-enabled LLM.\n\n✅ **Flexible Fetch Control:** Interactively set a default fetch count for all targets and use the `loadmore` command to incrementally fetch more data for specific users.\n\n✅ **Linked Image Analysis:** Each AI-generated image analysis in the final report includes a direct, clickable link to the source image, making it easy to cross-reference and verify findings.\n\n✅ **Shared Domain Analysis:** Automatically extracts all external links shared by a user, counts the frequency of each domain, and includes a \"Top Shared Domains\" summary in the final report.\n\n✅ **Offline Mode (`--offline`):** Run analysis using only locally cached data. Skips all external network requests.\n\n✅ **Intelligent Rate Limit Handling:** Detects API rate limits from social platforms and LLM providers, provides informative feedback, and prevents excessive requests.\n\n✅ **Robust Caching System:** Caches fetched text data for 24 hours (`data/cache/`) and media files (`data/media/`) to reduce API calls and speed up subsequent analyses. Vision analysis results are also cached.\n\n✅ **Cache Management:** Interactive commands (`cache status`, `purge data`) to display a summary of all cached data or to purge specific types of data.\n\n✅ **Interactive CLI \u0026 Docker Support:** User-friendly command-line interface with rich formatting that runs both locally and within a fully containerized Docker environment.\n\n✅ **Programmatic/Batch Mode:** Supports input via JSON from stdin for automated workflows (`--stdin`).\n\n✅ **Secure Environment Variable Configuration:** All secrets and configurations are managed via a `.env` file.\n\n## 🗺️ Visual Workflow: How the Agent Thinks\n\nTo understand the agent's decision-making process from start to finish, you can explore the detailed workflow flowchart below.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e➡️ Click to expand the full interactive flowchart\u003c/b\u003e\u003c/summary\u003e\n\n```mermaid\nflowchart TD\n    %% Initialization\n    A([Start owasp-social-osint-agent]) --\u003e AA{{Setup Directories \u0026 API Clients\u003cbr/\u003eVerify Environment}}\n    \n    %% Mode Selection\n    AA --\u003e B{Interactive or\u003cbr/\u003eStdin Mode?}\n    \n    %% Interactive Mode Path\n    B --\u003e|Interactive| C[/Display Platform Menu/]\n    C --\u003e D{Platform\u003cbr/\u003eSelection}\n    \n    %% Platform-Specific Branches\n    D --\u003e|Twitter| E1([Twitter])\n    D --\u003e|Reddit| E2([Reddit])\n    D --\u003e|HackerNews| E3([HackerNews])\n    D --\u003e|Bluesky| E4([Bluesky])\n    D --\u003e|Mastodon| E5([Mastodon])\n    D --\u003e|GitHub| E7([GitHub])\n    D --\u003e|Cross-Platform| E6([Multiple Platforms])\n    D --\u003e|Purge Data| PD([Purge Data])\n    PD --\u003e C\n    D --\u003e|Cache Status| CS([Cache Status])\n    CS --\u003e C\n    \n    %% Stdin Mode Path\n    B --\u003e|Stdin| F([Parse JSON Input])\n    F --\u003e G([Extract Platforms \u0026 Query])\n    \n    %% Analysis Loop Entry Points\n    E1 --\u003e H([Enter Analysis Loop])\n    E2 --\u003e H\n    E3 --\u003e H\n    E4 --\u003e H\n    E5 --\u003e H\n    E7 --\u003e H\n    E6 --\u003e H\n    G --\u003e J([Run Analysis])\n    \n    %% Command Processing in Analysis Loop\n    H --\u003e|Query Input| I{Command\u003cbr/\u003eType}\n    I --\u003e|Analysis Query| J\n    I --\u003e|exit| Z([End Session])\n    I --\u003e|refresh| Y([Force Refresh Cache])\n    Y --\u003e H\n    \n    %% PHASE 1: Data Fetching and Caching\n    J --\u003e K{Cache\u003cbr/\u003eAvailable?}\n    K --\u003e|Yes| M([Load Cached Data])\n    K --\u003e|No| L([Fetch Platform Data\u003cbr/\u003e\u0026 Download Media])\n    \n    %% API \u0026 Rate Limit Handling for Fetching\n    L --\u003e L1{Rate\u003cbr/\u003eLimited?}\n    L1 --\u003e|Yes| L2([Handle Rate Limit])\n    L2 --\u003e L5([Abort or Retry])\n    L1 --\u003e|No| L3([Extract Text \u0026 URLs])\n    L3 --\u003e L4([Save to Cache])\n    L4 --\u003e M\n    \n    %% Data Consolidation Point\n    M --\u003e N([Consolidate All\u003cbr/\u003eFetched Data])\n    \n    %% PHASE 2: Vision Analysis\n    N --\u003e O{Any Images\u003cbr/\u003eNeed Analysis?}\n    O --\u003e|Yes| P([Analyze Images via Vision LLM])\n    P --\u003e P1([Update Cache with\u003cbr/\u003eVision Analysis Results])\n    P1 --\u003e Q\n    O --\u003e|No| Q\n    \n    %% Data Formatting \u0026 Final Synthesis\n    Q([Format Text, Links \u0026\u003cbr/\u003eVision Data for LLM]) --\u003e S([Call Text Analysis LLM\u003cbr/\u003ewith Query and All Data])\n    \n    %% Output Generation\n    S --\u003e T([Format Final Report])\n    T --\u003e V1{Auto-Save\u003cbr/\u003eEnabled?}\n    \n    %% Handle Saving\n    V1 --\u003e|Yes| WA([Save Results Automatically])\n    WA --\u003e H\n    V1 --\u003e|No| WB{Prompt User to Save?}\n    WB --\u003e|Yes| WC([Save Results])\n    WC --\u003e H\n    WB --\u003e|No| H\n    \n    classDef startClass fill:#E8F5E8,stroke:#4CAF50,stroke-width:3px,color:#2E7D32\n    classDef setupClass fill:#E3F2FD,stroke:#2196F3,stroke-width:2px,color:#1565C0\n    classDef decisionClass fill:#FFF3E0,stroke:#FF9800,stroke-width:2px,color:#E65100\n    classDef inputClass fill:#F3E5F5,stroke:#9C27B0,stroke-width:2px,color:#6A1B9A\n    classDef menuClass fill:#E8EAF6,stroke:#3F51B5,stroke-width:2px,color:#283593\n    classDef twitterClass fill:#1DA1F2,stroke:#0D47A1,stroke-width:3px,color:#FFF\n    classDef redditClass fill:#FF4500,stroke:#CC3600,stroke-width:3px,color:#FFF\n    classDef hnClass fill:#FF6600,stroke:#E55A00,stroke-width:3px,color:#FFF\n    classDef bskyClass fill:#00D4FF,stroke:#0099CC,stroke-width:3px,color:#FFF\n    classDef mastodonClass fill:#6364FF,stroke:#4F50CC,stroke-width:3px,color:#FFF\n    classDef githubClass fill:#24292e,stroke:#000,stroke-width:3px,color:#FFF\n    classDef multiClass fill:#4CAF50,stroke:#388E3C,stroke-width:3px,color:#FFF\n    classDef purgeClass fill:#F44336,stroke:#D32F2F,stroke-width:3px,color:#FFF\n    classDef cacheStatusClass fill:#A5D6A7,stroke:#388E3C,stroke-width:2px,color:#1B5E20\n    classDef loopClass fill:#E1BEE7,stroke:#8E24AA,stroke-width:2px,color:#4A148C\n    classDef analysisClass fill:#BBDEFB,stroke:#1976D2,stroke-width:2px,color:#0D47A1\n    classDef cacheClass fill:#B2DFDB,stroke:#00695C,stroke-width:2px,color:#004D40\n    classDef apiClass fill:#C8E6C9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20\n    classDef errorClass fill:#FFCDD2,stroke:#D32F2F,stroke-width:2px,color:#B71C1C\n    classDef dataClass fill:#DCEDC8,stroke:#689F38,stroke-width:2px,color:#33691E\n    classDef llmClass fill:#FFF8E1,stroke:#FFA000,stroke-width:2px,color:#E65100\n    classDef outputClass fill:#F1F8E9,stroke:#558B2F,stroke-width:2px,color:#33691E\n    classDef endClass fill:#FFEBEE,stroke:#E53935,stroke-width:2px,color:#C62828\n    classDef refreshClass fill:#E0F2F1,stroke:#00796B,stroke-width:2px,color:#004D40\n    \n    class A startClass; class AA setupClass; class B,D,I,K,L1,O,V1,WB decisionClass\n    class C menuClass; class H loopClass; class J,P,S llmClass; class L,L4 apiClass\n    class M,P1 cacheClass; class L2,L5 errorClass; class N,Q dataClass\n    class T,WA,WC outputClass; class Z endClass; class Y refreshClass\n    class E1 twitterClass; class E2 redditClass; class E3 hnClass; class E4 bskyClass; class E5 mastodonClass; class E6 multiClass; class E7 githubClass\n    class PD purgeClass; class CS cacheStatusClass; class F,G inputClass\n```\n*Flowchart Description Note:* In **Offline Mode (`--offline`)**, the \"Fetch Platform Data\" step and the \"Analyze Images\" step are both *bypassed*. The analysis proceeds only with information already available in the local cache.\n\u003c/details\u003e\n\n## 🛠 Installation\n\n### Prerequisites\n*   **Docker and Docker Compose** (Recommended)\n*   **Python 3.11+** and Pip (for local development)\n\n### 1. Clone the Repository\n```bash\ngit clone https://github.com/bm-github/owasp-social-osint-agent.git\ncd owasp-social-osint-agent\n```\n\n### 2. Configure Environment Variables\nCreate a `.env` file in the project root by copying the example file (`env.example`). Then, fill in your own API keys and credentials.\n```bash\ncp env.example .env\n# Now edit the .env file with your secrets\n```\n\n```dotenv\n# .env\n\n# --- LLM Configuration (Required) ---\nLLM_API_KEY=\"your_llm_api_key\"\nLLM_API_BASE_URL=\"https://api.example.com/v1\" # e.g., https://openrouter.ai/api/v1\nANALYSIS_MODEL=\"your_text_analysis_model_name\"\nIMAGE_ANALYSIS_MODEL=\"your_vision_model_name\"\n\n# --- Optional: OpenRouter Specific Headers ---\n# OPENROUTER_REFERER=\"http://localhost:3000\"\n# OPENROUTER_X_TITLE=\"owasp-social-osint-agent\"\n\n# --- Platform API Keys (as needed) ---\n# Twitter/X\nTWITTER_BEARER_TOKEN=\"your_twitter_v2_bearer_token\"\n# Reddit\nREDDIT_CLIENT_ID=\"your_reddit_client_id\"\nREDDIT_CLIENT_SECRET=\"your_reddit_client_secret\"\nREDDIT_USER_AGENT=\"YourAppName/1.0 by YourUsername\"\n# Bluesky\nBLUESKY_IDENTIFIER=\"your-handle.bsky.social\"\nBLUESKY_APP_SECRET=\"xxxx-xxxx-xxxx-xxxx\"\n# GitHub\nGITHUB_TOKEN=\"your_github_personal_access_token\"\n# Mastodon Multi-Instance Support\n# Configure credentials for each Mastodon instance you want to access\n# The DEFAULT instance is used as a fallback when looking up users from unconfigured instances\n# Recommendation: Set a large, well-federated instance (like mastodon.social) as default\n\nMASTODON_INSTANCE_1_URL=\"https://mastodon.social\"\nMASTODON_INSTANCE_1_TOKEN=\"YOUR_ACCESS_TOKEN_FOR_MASTODON_SOCIAL\"\nMASTODON_INSTANCE_1_DEFAULT=\"true\"  # Use this instance for cross-instance lookups\n\n# Add more instances as needed (increment the number)\n# MASTODON_INSTANCE_2_URL=\"https://infosec.exchange\"\n# MASTODON_INSTANCE_2_TOKEN=\"YOUR_ACCESS_TOKEN_FOR_INFOSEC_EXCHANGE\"\n\n# MASTODON_INSTANCE_3_URL=\"https://fosstodon.org\"\n# MASTODON_INSTANCE_3_TOKEN=\"YOUR_ACCESS_TOKEN_FOR_FOSSTODON\"\n\n# Security: Media Download Restrictions\n# By default, only trusted CDNs are allowed. Override with additional domains:\n# EXTRA_TWITTER_CDNS=\"custom.cdn.example.com\"\n# EXTRA_REDDIT_CDNS=\"i.imgur.com,custom.cdn2.com\"\n# EXTRA_BLUESKY_CDNS=\"custom.bsky.cdn.com\"\n# EXTRA_MASTODON_CDNS=\"media.myinstance.org\"\n```\n*Note: HackerNews does not require API keys. GitHub can run in a limited, unauthenticated mode but a token is recommended.*\n\n## 🚀 Usage\n\nThere are two ways to run the agent: via Docker (recommended) or locally in a Python environment.\n\n### Recommended: Docker Mode\nThis is the most stable and reproducible way to run the agent. It ensures all dependencies are handled correctly.\n\n1.  **Build the Docker image:**\n    ```bash\n    docker-compose build\n    ```\n2.  **Run in Interactive Mode:**\n    This starts the interactive command-line interface.\n    ```bash\n    docker-compose run --rm social-osint-agent\n    ```\n3.  **Run in Programmatic Mode (via Stdin):**\n    Pipe a JSON object to the agent for automated workflows.\n    ```bash\n    echo '{\n      \"platforms\": { \"hackernews\": [\"pg\"], \"github\": [\"torvalds\"] },\n      \"query\": \"What are the primary technical interests and contributions of these users?\"\n    }' | docker-compose run --rm -T social-osint-agent --stdin\n    ```\n\n### Local Development Mode\nThis is useful for development and debugging if you prefer not to use Docker.\n\n1.  **Create a Virtual Environment (Recommended):**\n    ```bash\n    python -m venv .venv\n    source .venv/bin/activate  # On Windows, use `.venv\\Scripts\\activate`\n    ```\n2.  **Install Dependencies:**\n    ```bash\n    pip install -r requirements-dev.txt\n    ```\n3.  **Run the Agent:**\n    (Ensure your `.env` file is in the project root)\n    ```bash\n    python -m socialosintagent.main\n    ```\n\n### Command-line Arguments\n*   `--stdin`: Read analysis configuration from standard input as a JSON object.\n*   `--format [json|markdown]`: Specifies the output format when saving results (default: `markdown`).\n*   `--no-auto-save`: Disable automatic saving of reports.\n*   `--log-level [DEBUG|INFO|WARNING|ERROR|CRITICAL]`: Set the logging level (default: `WARNING`).\n*   `--offline`: Run in offline mode. Uses only cached data.\n*   `--unsafe-allow-external-media`: **Security:** Allow downloading media from domains outside of known social media CDNs (e.g., personal servers or third-party websites).\n\n### Special Commands (Interactive Mode)\nWithin the analysis session, you can use these commands instead of an analysis query:\n*   `/loadmore [\u003cplatform/user\u003e] \u003ccount\u003e`: Fetch additional items for a target. If the target is unambiguous, you can omit `\u003cplatform/user\u003e`.\n*   `/refresh`: Re-fetch data for all targets, ignoring the 24-hour cache.\n*   `/help`: Displays available commands.\n*   `/exit`: Returns to the main platform selection menu.\n**Note:** Commands can be prefixed with `/` for clarity (e.g., `/help`, `/exit`), though the unprefixed versions still work for backward compatibility.\n\n## ⚡ Cache System\n*   **Text/API Data:** Fetched platform data is cached for **24 hours** in `data/cache/` as JSON files.\n*   **Media Files:** Downloaded images and media are stored in `data/media/`.\n*   **Vision Analysis:** AI-generated image analyses are saved back into the corresponding user's cache file, preventing re-analysis of the same image.\n*   Use the `refresh` command in interactive mode to force a re-fetch of text data. Use \"Purge Data\" to clear media files.\n\n## 🤖 AI Analysis Details\n*   **Efficient Architecture:** The agent uses a two-phase process. It first rapidly collects all text data and downloads media from all specified targets. Only after this data gathering is complete does it begin the vision analysis phase.\n*   **Externalized Prompts:** All prompts used to guide the LLM are stored in the `socialosintagent/prompts/` directory, allowing for easy customization without changing code.\n*   **Accurate Timestamps:** The tool injects the current, real-world UTC timestamp into the analysis prompt, preventing the LLM from making temporal errors due to its fixed knowledge cutoff date.\n*   **Data Synthesis:** The final analysis is performed by an LLM guided by a detailed system prompt. It synthesizes insights from the user's text, image analyses, and shared domain summary to build a comprehensive profile.\n\n## 🛡️ Error Handling \u0026 Resilience\n- **Individual Target Failures**: If one user's data can't be fetched (deleted account, rate limit, permissions), analysis continues for other targets\n- **Image Analysis Failures**: Individual image processing errors don't stop the entire vision analysis batch\n- **Rate Limit Management**: The agent detects rate limits, provides informative feedback with reset times, and continues with cached data when available\n- **Partial Results**: You'll receive analysis based on whatever data was successfully collected, with clear indication of any failures\n\n## 🔒 Security Considerations\n*   **API Keys:** All secrets should be stored in the `.env` file. This file should be secured and **never** committed to version control.\n*   **Data Caching:** Fetched data and downloaded media are stored locally in the `data/` directory. Be mindful of the sensitivity of the data being analyzed and secure the directory appropriately.\n*   **Terms of Service:** Ensure your use of the tool complies with the Terms of Service of each social media platform and your chosen LLM API provider.\n\n## 🤝 Contributing\nContributions are welcome! Please feel free to submit pull requests, report issues, or suggest enhancements via the project's issue tracker.\n\n## 📜 License\nThis project is licensed under the **MIT License**.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbm-github%2Fowasp-social-osint-agent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbm-github%2Fowasp-social-osint-agent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbm-github%2Fowasp-social-osint-agent/lists"}