Python library designed for OSINT, information gathering.
Project description
๐ Table of Contents
๐ Overview
- Osixr is a modular Python library designed for OSINT information gathering. It ships with two powerful engines:
| Engine | Description |
|---|---|
| IP | Async IP geo-lookup, VPN/Proxy detection, and Google Maps link generation |
| ExiF | Deep EXIF metadata extraction from JPEG/TIFF images โ camera, GPS, lens, capture settings |
- Both modules output styled, animated terminal reports using random ASCII art banners.
๐ฆ Modules
osixr/
โโโ IP/ โ Async IP intelligence & VPN/Proxy detection
โโโ Exif/ โ JPEG/TIFF EXIF metadata parser
โโโ Banners/ โ ASCII art banners + colored terminal output
โ๏ธ Installation
- Via PyPi:
# Windows
$ pip install --upgrade osixr
# Linux
$ pipx install --upgrade osixr
- Via Git:
$ pip install git+https://github.com/DevZ44d/Osixr.git
๐ Quick Start
import asyncio
from osixr import IPlock, ExiF
# IP Intelligence
async def run():
#replace "8.8.8.8" to "me" to get your ip and scanning it
scanner = IPlock(ip="8.8.8.8", timeout=8)
# Get clean JSON output (without banner: False)
result = await scanner.get(banner=False, void_firewall=False)
print(result)
asyncio.run(run())
# EXIF Metadata
async def _demo():
e = ExiF("WIN.jpg")
print(e.print_all()) # print banner and full-information .
print((e.to_dict(banner=False))) # banner: bool = False -> Skip ASCII banner .
if __name__ == "__main__":
asyncio.run(_demo())
๐ Usage
1. IPlock Module โ IP Intelligence & VPN Detection
- The
IPlockclass is the high-level interface for async IP analysis. - It queries geo-IP APIs, detects VPN/Proxy usage, and generates a Google Maps link from the IP coordinates.
Basic Usage
import asyncio
from osixr import IPlock
async def main():
#replace "8.8.8.8" to "me" to get your ip and scanning it
scanner = IPlock(ip="8.8.8.8", timeout=8)
result = await scanner.get(banner=False, void_firewall=False)
print(result)
asyncio.run(main())
IPlock.__init__(ip, timeout)
| Parameter | Type | Default | Description |
|---|---|---|---|
ip |
str | None |
โ | Target IP address to analyze |
timeout |
int | None |
10 |
Request timeout in seconds |
await IPlock.get() โ str
- Runs the full async IP analysis pipeline and returns a formatted terminal output string including a random ASCII art banner.
scanner = IPlock("1.1.1.1")
output = await scanner.get()
# Returns: banner + JSON result with geo data, VPN flag, Google Maps link
Sample output fields:
{
"ip": "8.8.8.8",
"success": true,
"type": "IPv4",
"continent": "North America",
"continent_code": "NA",
"country": "United States",
"country_code": "US",
"region": "California",
"region_code": "CA",
"city": "Mountain View",
"latitude": 37.3860517,
"longitude": -122.0838511,
"is_eu": false,
"postal": "94039",
"calling_code": "1",
"capital": "Washington D.C.",
"borders": "CA,MX",
"flag": {
"img": "https://cdn.ipwhois.io/flags/us.svg",
"emoji": "๐บ๐ธ",
"emoji_unicode": "U+1F1FA U+1F1F8"
},
"connection": {
"asn": 15169,
"org": "Google LLC",
"isp": "Google LLC",
"domain": "google.com"
},
"timezone": {
"id": "America/Los_Angeles",
"abbr": "PDT",
"is_dst": true,
"offset": -25200,
"utc": "-07:00"
},
"Takes": "2.22 s",
"VPN/PROXY": true,
"GooGle Map": "https://www.google.com/maps?q=37.3860517,-122.0838511"
}
Low-level: AsyncFetchDict (direct access)
import asyncio
from osixr.IP.utails import AsyncFetchDict
async def main():
engine = AsyncFetchDict(ip="8.8.8.8", timeout=10)
# Full formatted output (banner + JSON)
#takes one arg : void_firewall: bool | None = False
output = await engine.get_all()
print(output)
# Raw analysis dict only
data = await engine.analyze()
print(data)
asyncio.run(main())
| Method | Returns | Description |
|---|---|---|
await analyze(void_firewall=False) |
dict |
Raw IP analysis result with VPN flag, timing, map link |
await get_all(banner=True, void_firewall=False) |
str |
Formatted terminal output with optional banner and firewall bypass support |
clean_dict(data) |
dict |
Strips empty/null keys from any dictionary |
Low-level: FirewallSafeVPNDetector (synchronous)
from osixr.IP.detector import FirewallSafeVPNDetector
vpn = FirewallSafeVPNDetector(timeout=6)
# Check if IP is VPN/Proxy/Hosting
is_vpn = vpn.detect("192.168.1.1") # โ True / False
# Get raw data from multiple APIs
raw_data = vpn.gather_data("8.8.8.8") # โ List[dict]
| Method | Returns | Description |
|---|---|---|
detect(ip) |
bool |
True = VPN/Proxy/Hosting detected, False = Clean IP |
gather_data(ip) |
List[dict] |
Raw responses from multiple geo-IP APIs |
is_vpn_isp(isp) |
bool |
Checks ISP name against known cloud/hosting keywords |
Detection scoring logic:
| Signal | Score |
|---|---|
| ISP matches cloud/hosting keywords | +60 |
API returns proxy: true flag |
+40 |
| Threshold to flag as VPN/Proxy | โฅ 60 |
2. ExiF Module โ Photo Metadata Extraction
- The
ExiFclass extracts and displays complete EXIF metadata from JPEG or TIFF images.
Basic Usage
from osixr.main import ExiF
exif = ExiF("photo.jpg")
exif.print_all() # Prints full report with animated banner to terminal
ExiF.__init__(img)
| Parameter | Type | Description |
|---|---|---|
img |
str |
Path to the image file (.jpg, .jpeg, .tif, .tiff) |
ExiF.print_all() โ None
- Displays a full formatted metadata report in the terminal with an animated ASCII banner.
exif = ExiF("photo.jpg")
exif.print_all()
ExiF.to_dict โ str | Any
- Displays a full formatted metadata report in the terminal with or without an animated ASCII banner.
exif = ExiF("photo.jpg")
exif.get(banner=False) # without an animated ASCII banner, default is True .
Low-level: Exif (direct access)
- For programmatic access without terminal output:
from osixr.Exif.core.photo_info import Exif
info = Exif("photo.jpg")
# Get full formatted text report
report = info.print_all()
print(report)
# Get structured dict (8 sections)
data = info.to_dict()
print(data["gps_info"])
print(data["camera_info"])
| Method | Returns | Description |
|---|---|---|
print_all() |
str |
Full human-readable metadata report |
to_dict() |
dict |
All metadata as structured nested dictionaries |
to_dict() output structure:
{
"file_info": {
"File Name": "WIN.jpg",
"File Path": "C:\\Users\\MF\\Desktop\\Osixr\\osixr\\src\\WIN.jpg",
"File Size": "57.2 KB",
"File Size (bytes)": "58,592",
"File Extension": ".JPG",
"File Modified": "2026-04-12 21:12:01",
"File Created": "2026-04-12 23:32:42",
"Dimensions (from header)": "1280 ร 720 px"
},
"camera_info": {
"Software": "Windows 11"
},
"image_info": {},
"capture_settings": {},
"datetime_info": {
"Date/Time Original (Capture)": "Sunday, April 12, 2026 at 21:12:01"
},
"gps_info": {},
"lens_info": {},
"processing_info": {}
}
3. CLI โ Command-Line Interface
- osixr ships with a full CLI so you can run every feature directly from the terminal โ no Python code needed.
- Supports both
osixr(after install) andpython -m osixr(from source).
Installation check
$ osixr -c
Info Flags โ -v -c -o
- Quick one-shot flags that don't require a subcommand.
| Flag | Long form | Description |
|---|---|---|
-v |
--version |
Show osixr version, author, and project links |
-c |
--check |
Check PyPI for a newer release |
-o |
--osixr |
Show the full osixr help & usage guide |
-h |
--help |
Show the argparse help message |
# Show version + author info
osixr -v
# Check if a new version is available on PyPI
osixr -c
# Show full help & usage guide
osixr -o
ip โ Full IP Geo-Lookup + VPN Detection
osixr ip <IP> [--timeout SEC] [--json] [--silent] [--save FILE]
| Flag | Default | Description |
|---|---|---|
ip |
โ | Target IP address |
--timeout SEC |
10 |
Request timeout in seconds |
--json |
off | Print raw JSON output instead of styled report |
--silent |
off | Skip the ASCII art banner |
--save FILE |
โ | Save output to a JSON file |
# Styled terminal report
#replace "8.8.8.8" to "me" to get your ip and scanning it .
osixr ip 8.8.8.8
# Raw JSON output
osixr ip 8.8.8.8 --json
# Save result to file
osixr ip 8.8.8.8 --save result.json
# Silent mode (no banner) with custom timeout
osixr ip 8.8.8.8 --silent --timeout 5
# Also works with python -m
python -m osixr ip 8.8.8.8 --silent
batch โ Scan Multiple IPs Concurrently
osixr batch <IP> [<IP> ...] [--timeout SEC] [--save FILE]
| Flag | Default | Description |
|---|---|---|
ips |
โ | One or more IP addresses (space-separated) |
--timeout SEC |
10 |
Request timeout in seconds |
--save FILE |
โ | Save all results to a JSON file |
# Scan three IPs at once
osixr batch 8.8.8.8 1.1.1.1 196.219.54.141
# Save batch results
osixr batch 8.8.8.8 1.1.1.1 --save batch.json
# Also works with python -m
python -m osixr batch 8.8.8.8 1.1.1.1 196.219.54.141
vpn โ Quick VPN / Proxy Detection Only
osixr vpn <IP>
| Flag | Default | Description |
|---|---|---|
ip |
โ | Target IP address to check |
# Check a single IP
osixr vpn 192.168.1.1
# Also works with python -m
python -m osixr vpn 8.8.8.8
Output:
โ VPN / PROXY / HOSTING DETECTED โ suspicious IP
โ Clean residential IP โ clean IP
exif โ Extract EXIF Metadata from Image
osixr exif <FILE> [--section NAME] [--json] [--silent] [--save FILE]
| Flag | Default | Description |
|---|---|---|
file |
โ | Path to JPEG or TIFF image |
--section NAME |
โ | Show one section only (see table below) |
--json |
off | Print raw JSON output instead of styled report |
--silent |
off | Skip the ASCII art banner |
--save FILE |
โ | Save metadata to a JSON file |
Available --section values:
| Name | Description |
|---|---|
file |
File name, size, path, dimensions |
camera |
Camera make, model, software |
image |
Resolution, color space, orientation |
capture |
Shutter speed, aperture, ISO, flash |
datetime |
Original capture date & time |
gps |
GPS coordinates + Google Maps link |
lens |
Lens make, model, focal length |
processing |
White balance, contrast, saturation |
# Full metadata report
osixr exif photo.jpg
# GPS section only
osixr exif photo.jpg --section gps
# Camera info as JSON
osixr exif photo.jpg --section camera --json
# Save full metadata to file
osixr exif photo.jpg --save meta.json
# Silent mode (no banner)
osixr exif photo.jpg --silent
# Also works with python -m
python -m osixr exif photo.jpg --section gps --json
๐ Project Structure
osixr/
โโโ pyproject.toml โ Build system & project metadata (PEP 517/518)
โโโ README.md โ Documentation & usage guide
โโโ LICENSE โ Project license
โโโ src/
โ โโโ osixr/
โ โโโ forward.py โ Version info, help message & update checker
โ โโโ __init__.py โ Package initializer (public exports)
โ โโโ main.py โ High-level entry point (IPlock, ExiF classes)
โ โโโ cli.py โ Command-line interface (argparse / user input handling)
โ โ
โ โโโ IP/
โ โ โโโ __init__.py โ IP module initializer
โ โ โโโ detector.py โ FirewallSafeVPNDetector (sync, multi-source VPN detection)
โ โ โโโ utails.py โ AsyncFetchDict (async geo-IP fetching + formatting via aiohttp)
โ โ
โ โโโ Exif/
โ โ โโโ __init__.py โ Exif module initializer
โ โ โโโ core/
โ โ โ โโโ jpeg_reader.py โ Low-level JPEG segment parser (APP markers extraction)
โ โ โ โโโ tiff_parser.py โ TIFF/EXIF binary decoder (endianness + tag parsing)
โ โ โ โโโ photo_info.py โ High-level metadata engine (Exif class abstraction)
โ โ โโโ utils/
โ โ โโโ tags.py โ EXIF/GPS tag ID mappings (raw โ readable names)
โ โ โโโ mapping.py โ Value decoding maps (flash, orientation, exposure, etc.)
โ โ
โ โโโ Banners/
โ โโโ __init__.py
โ โโโ banners.py โ ASCII art banner collection (15+ styles)
โ โโโ utils.py โ BannerSplitLines (animated / line-by-line rendering)
โ โโโ helper.py โ Color constants wrapper (colorama abstraction)
Made with AhMed โ Pull requests welcome
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
osixr-2.0.1.tar.gz
(47.2 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
osixr-2.0.1-py3-none-any.whl
(43.2 kB
view details)
File details
Details for the file osixr-2.0.1.tar.gz.
File metadata
- Download URL: osixr-2.0.1.tar.gz
- Upload date:
- Size: 47.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1378f7ba44ec17d7825ed12d1aae4788be21efdd11af2de1f0bccdd56588dbe0
|
|
| MD5 |
3531280ba31bd4512d51889a99e37ad8
|
|
| BLAKE2b-256 |
decf67c815e6cab2642f6aa2eceb15cec46ae313ba5fd6c191af72bb1cee0ddf
|
File details
Details for the file osixr-2.0.1-py3-none-any.whl.
File metadata
- Download URL: osixr-2.0.1-py3-none-any.whl
- Upload date:
- Size: 43.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
853b7d3634c351881593a9ee2be382c6f6115c54dea31669e6c3e07231a49f6d
|
|
| MD5 |
82f1517523bef6af51c9f3efec1d5b19
|
|
| BLAKE2b-256 |
d6bae3a8b8757f03578dbcf0106c08b8e9475d7d39e5158773f41d62571f0ff9
|