base on Osintgram is a OSINT tool on Instagram. It offers an interactive shell to perform analysis on Instagram account of any users by its nickname # Osintgram 🔎📸 [![version-1.3](https://img.shields.io/badge/version-1.3-green)](https://github.com/Datalux/Osintgram/releases/tag/1.3) [![GPLv3](https://img.shields.io/badge/license-GPLv3-blue)](https://img.shields.io/badge/license-GPLv3-blue) [![Python3](https://img.shields.io/badge/language-Python3-red)](https://img.shields.io/badge/language-Python3-red) [![Telegram](https://img.shields.io/badge/Telegram-Channel-blue.svg)](https://t.me/osintgram) [![Docker](https://img.shields.io/badge/Docker-Supported-blue)](https://img.shields.io/badge/Docker-Supported-blue) Osintgram is an **OSINT** tool on Instagram to collect, analyze, and run reconnaissance. <p align="center"> <img align="center" src=".img/carbon.png" width="900"> </p> Disclaimer: **FOR EDUCATIONAL PURPOSE ONLY! The contributors do not assume any responsibility for the use of this tool.** $${\color{red}Warning:}$$ It is advisable to **not** use your own/primary account when using this tool. $${\color{red}Warning:}$$ If you fork the project and add your instagram credentials to you home repository do not upload them to github. You can disable uploading a certain file by adding it to ignore list. ## Tools and Commands 🧰 Osintgram offers an interactive shell to perform analysis on Instagram account of any users by its nickname. You can get: ```text - addrs Get all registered addressed by target photos - captions Get user's photos captions - comments Get total comments of target's posts - followers Get target followers - followings Get users followed by target - fwersemail Get email of target followers - fwingsemail Get email of users followed by target - fwersnumber Get phone number of target followers - fwingsnumber Get phone number of users followed by target - hashtags Get hashtags used by target - info Get target info - likes Get total likes of target's posts - mediatype Get user's posts type (photo or video) - photodes Get description of target's photos - photos Download user's photos in output folder - propic Download user's profile picture - stories Download user's stories - tagged Get list of users tagged by target - wcommented Get a list of user who commented target's photos - wtagged Get a list of user who tagged target ``` You can find detailed commands usage [here](doc/COMMANDS.md). [**Latest version**](https://github.com/Datalux/Osintgram/releases/tag/1.3) | [Commands](doc/COMMANDS.md) | [CHANGELOG](doc/CHANGELOG.md) ## FAQ 1. **Can I access the contents of a private profile?** No, you cannot get information on private profiles. You can only get information from a public profile or a profile you follow. The tools that claim to be successful are scams! 2. **What is and how I can bypass the `challenge_required` error?** The `challenge_required` error means that Instagram notice a suspicious behavior on your profile, so needs to check if you are a real person or a bot. To avoid this you should follow the suggested link and complete the required operation (insert a code, confirm email, etc) ## Installation ⚙️ 1. Fork/Clone/Download this repo `git clone https://github.com/Datalux/Osintgram.git` 2. Navigate to the directory `cd Osintgram` 3. Create a virtual environment for this project `python3 -m venv venv` 4. Load the virtual environment - On Windows Powershell: `.\venv\Scripts\activate.ps1` - On Linux and Git Bash: `source venv/bin/activate` 5. Run `pip install -r requirements.txt` 6. Open the `credentials.ini` file in the `config` folder and write your Instagram account username and password in the corresponding fields. Or use `hikerapi_token` from https://hikerapi.com/tokens (first 100 requests are free after registration and confirmation of your tg) Alternatively, you can run the `make setup` command to populate this file for you. 7. Run the main.py script in one of three ways * As an interactive prompt `python3 main.py <target username>` * Or execute your command straight away `python3 main.py <target username> --command <command>` * Or execute using HikerAPI token via env `HIKERAPI_TOKEN=<hikerapi token> python3 main.py <target username> -c <command>` ### Use Osintgram v2 (beta) You can use Osintgram2 beta just switching to `v2` [branch](https://github.com/Datalux/Osintgram/tree/v2). The v2 has some improvements and is faster with a new command execution interface. Try it just running `git checkout v2`. ## Docker Quick Start 🐳 This section will explain how you can quickly use this image with `Docker` or `Docker-compose`. ### Prerequisites Before you can use either `Docker` or `Docker-compose`, please ensure you do have the following prerequisites met. 1. **Docker** installed - [link](https://docs.docker.com/get-docker/) 2. **Docker-composed** installed (if using Docker-compose) - [link](https://docs.docker.com/compose/install/) 3. **Credentials** configured - This can be done manually or by running the `make setup` command from the root of this repo **Important**: Your container will fail if you do not do step #3 and configure your credentials ### Docker If docker is installed you can build an image and run this as a container. Build: ```bash docker build -t osintgram . ``` Run: ```bash docker run --rm -it -v "$PWD/output:/home/osintgram/output" osintgram <target> ``` - The `<target>` is the Instagram account you wish to use as your target for recon. - The required `-i` flag enables an interactive terminal to use commands within the container. [docs](https://docs.docker.com/engine/reference/commandline/run/#assign-name-and-allocate-pseudo-tty---name--it) - The required `-v` flag mounts a volume between your local filesystem and the container to save to the `./output/` folder. [docs](https://docs.docker.com/engine/reference/commandline/run/#mount-volume--v---read-only) - The optional `--rm` flag removes the container filesystem on completion to prevent cruft build-up. [docs](https://docs.docker.com/engine/reference/run/#clean-up---rm) - The optional `-t` flag allocates a pseudo-TTY which allows colored output. [docs](https://docs.docker.com/engine/reference/run/#foreground) ### Using `docker-compose` You can use the `docker-compose.yml` file this single command: ```bash docker-compose run osintgram <target> ``` Where `target` is the Instagram target for recon. Alternatively, you may run `docker-compose` with the `Makefile`: `make run` - Builds and Runs with compose. Prompts for a `target` before running. ### Makefile (easy mode) For ease of use with Docker-compose, a `Makefile` has been provided. Here is a sample work flow to spin up a container and run `osintgram` with just two commands! 1. `make setup` - Sets up your Instagram credentials 2. `make run` - Builds and Runs a osintgram container and prompts for a target Sample workflow for development: 1. `make setup` - Sets up your Instagram credentials 2. `make build-run-testing` - Builds an Runs a container without invoking the `main.py` script. Useful for an `it` Docker session for development 3. `make cleanup-testing` - Cleans up the testing container created from `build-run-testing` ## Development version 💻 To use the development version with the latest feature and fixes just switch to `development` branch using Git: `git checkout development` and update to last version using: `git pull origin development` ## Updating ⬇️ To update Osintgram with the stable release just pull the latest commit using Git. 1. Make sure you are in the master branch running: `git checkout master` 2. Download the latest version: `git pull origin master` ## Contributing 💡 You can propose a feature request opening an issue or a pull request. Here is a list of Osintgram's contributors: <a href="https://github.com/Datalux/Osintgram/graphs/contributors"> <img src="https://contributors-img.web.app/image?repo=Datalux/Osintgram" /> </a> ## External library 🔗 [Instagram API](https://github.com/ping/instagram_private_api) ", Assign "at most 3 tags" to the expected json: {"id":"6280","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"