Osintgram

Comment installer Osintgram en 2026

Six commandes : clone, cd, création d'un virtualenv, activation, pip install -r requirements.txt, puis remplissage de config/credentials.ini. Cette séquence s'installe proprement dans un environnement Python 3.11 neuf. Ce qui casse, c'est pip lancé hors virtualenv sur les distributions dérivées de Debian, et pyreadline sur Windows natif.

18 min de lectureÉquipe Osintgram

Osintgram s'installe en six commandes : git clone, cd Osintgram, python3 -m venv venv, l'activation du venv, pip install -r requirements.txt, puis le remplissage de config/credentials.ini. L'installation de requirements.txt dans un virtualenv Python 3.11 propre réussit sans la moindre erreur avec un pip à jour. Les échecs d'installation rapportés se ramènent à quatre causes : pip lancé au niveau système sur Debian, Ubuntu ou Kali ; un prettytable ou un urllib3 fourni par le système qui bloque le passage ; gnureadline qui refuse de compiler ; ou pyreadline qui plante sur Windows natif.

Avant de commencer

Il vous faut un interpréteur Python 3, git, et une décision sur la façon dont Osintgram va s'authentifier. C'est le troisième point que tout le monde saute, et c'est pour cela que l'installation semble réussir avant que l'outil ne s'arrête au bout d'une ligne au premier lancement.

Le README n'indique aucune version minimale de Python ; il affiche un badge Python3 et rien d'autre. La seule version figée dans le dépôt est la première ligne du Dockerfile, FROM python:3.9.2-alpine3.13, et la dépendance la plus récente, hikerapi 1.7.1, déclare requires_python >=3.8. L'installation de requirements.txt dans un virtualenv Python 3.11 neuf fonctionne avec un pip à jour : prettytable 0.7.2, pyreadline 2.1 et hikerapi 1.7.1 ne sont publiés que sous forme de paquets source, et tous les trois se construisent sans broncher. Voyez 3.9-3.11 comme une zone de confort plutôt que comme une exigence.

  • Python 3.9 à 3.11. C'est sur 3.12 et 3.13 que se concentrent les pannes rapportées, et il s'agit presque toujours d'un conflit de paquets plutôt que d'une incompatibilité du langage.
  • git, ou un ZIP de la branche master. Il n'existe ni paquet PyPI ni script d'installation : le dépôt ne contient aucun setup.sh.
  • Un compilateur et les en-têtes ncurses sous Linux, mais uniquement si pip doit compiler gnureadline. Sur les distributions glibc grand public, il trouve une wheel manylinux et évite la compilation.
  • Des identifiants. Soit un compte Instagram que vous acceptez de perdre, soit un token HikerAPI. Décidez avant l'étape six : les deux mènent à des chemins de code différents.

Une plateforme a droit à sa propre page, parce que son interpréteur par défaut et son pip se comportent tous deux différemment de ceux d'une machine Debian ou Ubuntu standard : Osintgram sur Kali Linux.

Les six commandes

C'est la séquence du README elle-même, sans retouche. Exécutez-la entièrement depuis un seul shell : le virtualenv comme le répertoire de travail auront leur importance plus tard.

  1. 1

    Cloner le dépôt

    La branche par défaut est master. Il existe aussi des branches development et v2 ; ignorez-les tant que vous ne savez pas précisément pourquoi vous en auriez besoin.

    git clone https://github.com/Datalux/Osintgram.git
  2. 2

    Se placer dans le répertoire

    Pas seulement pour cette étape. Osintgram lit sa configuration via le chemin relatif config/credentials.ini : la racine du dépôt est donc le seul répertoire depuis lequel il fonctionne correctement.

    cd Osintgram
  3. 3

    Créer un virtualenv

    Sur Debian, Ubuntu et Kali, vous aurez peut-être besoin de sudo apt install python3-venv au préalable. C'est le fait de sauter cette étape qui produit les trois premières erreurs du tableau plus bas.

    python3 -m venv venv
  4. 4

    L'activer

    Votre prompt doit désormais être préfixé par (venv). Si ce n'est pas le cas, la commande suivante installera dans le mauvais interpréteur.

    # Linux, macOS, Git Bash
    source venv/bin/activate
    
    # Windows PowerShell
    .\venv\Scripts\activate.ps1
  5. 5

    Installer les dépendances

    Le flag est -r. Taper -t à la place vous vaut ERROR: Target path exists but is not a directory, will not continue., parce que -t signifie --target.

    pip install -r requirements.txt
  6. 6

    Renseigner vos identifiants

    Éditez le fichier INI à la main, ou laissez le Makefile vous poser les questions. Les deux ne sont pas équivalents. La section suivante explique pourquoi.

    nano config/credentials.ini
    
    # or, with GNU make and bash available:
    make setup
requests-toolbelt==0.9.1
geopy>=2.0.0
prettytable==0.7.2
instagram-private-api==1.6.0
gnureadline>=8.0.0; platform_system != "Windows"
pyreadline==2.1; platform_system == "Windows"
hikerapi==1.7.1
requirements.txt sur master, à l'identique. Notez les deux marqueurs d'environnement : gnureadline partout sauf sous Windows, pyreadline uniquement sous Windows.

Deux absences dans ce fichier vous dérouteront plus tard. requests n'y figure pas ; il arrive de façon transitive. httpx non plus, alors que src/Osintgram.py l'importe à la ligne 9 : il ne se résout que parce que hikerapi en dépend.

Configurer les identifiants

Le dépôt fournit config/credentials.ini déjà créé et vide. Trois champs, une seule section :

[Credentials]
username =
password =
hikerapi_token =
config/credentials.ini exactement tel qu'il arrive dans un clone tout neuf.

src/config.py le charge avec configparser et l'appel littéral config.read("config/credentials.ini"). C'est à cause de ce chemin relatif que l'étape deux existe : lancez python3 ~/Osintgram/main.py sometarget depuis votre répertoire personnel et configparser ne lira silencieusement rien du tout.

Laissez le fichier tel qu'il est livré et le premier lancement s'arrête immédiatement. Avec le credentials.ini vide d'un clone tout neuf, main.py affiche une seule ligne et rien d'autre : Error: "username" field cannot be blank in "config/credentials.ini". Sont codés en dur à côté le même message pour password, ainsi que Error: missing "username" field in "config/credentials.ini" et Error: file "config/credentials.ini" not found!.

Il affiche une erreur, puis sort avec le code 0

Chaque vérification d'identifiants dans src/config.py appelle sys.exit(0), un statut de succès. Si vous pilotez Osintgram depuis un script shell ou depuis une CI, un fichier d'identifiants mal configuré ressemble exactement à une exécution réussie pour tout ce qui inspecte le code de sortie. Surveillez la sortie affichée, pas le statut.

Ce que `make setup` écrit réellement

La cible setup du Makefile est courte et en fait plus qu'elle ne l'annonce. Elle demande Instagram Username: avec read -p et Instagram Password: avec read -sp, si bien que seul le mot de passe est masqué, puis écrit elle-même le fichier. Trois conséquences non documentées. Elle réécrit credentials.ini avec uniquement [Credentials], username et password, donc tout hikerapi_token que vous aviez disparaît. Elle exécute d'abord echo -n "{}" > config/settings.json, ce qui efface toute session mise en cache. Et elle déclare SHELL := /bin/bash et utilise read -sp, donc elle a besoin de GNU make et de bash. Elle ne tournera ni dans cmd ni dans PowerShell.

Le champ hikerapi_token

Ce troisième champ change le programme que vous exécutez. src/config.py expose getHikerToken(), qui renvoie la valeur de hikerapi_token ou la variable d'environnement HIKERAPI_TOKEN. main.py se branche dessus : avec un token, il construit HikerCLI, et seulement sinon le client Osintgram classique. Avec un token défini, l'outil ne construit jamais de client Instagram et n'envoie aucun mot de passe nulle part. Vous n'avez besoin d'aucun compte Instagram. La ligne de démarrage devient Connect to HikerAPI... au lieu de Attempt to login....

HIKERAPI_TOKEN=<hikerapi token> python3 main.py <target> -c info
La forme par variable d'environnement documentée dans le README, avec une commande renseignée. Le champ et la variable sont interchangeables.

Le README renvoie vers hikerapi.com/tokens et indique que les « first 100 requests are free after registration and confirmation of your tg » (les 100 premières requêtes sont gratuites après inscription et confirmation de votre tg). Ensuite, c'est une API tierce payante, et chaque nom d'utilisateur que vous consultez passe par elle. C'est le compromis. C'est le chemin encore conçu pour fonctionner, et les utilisateurs rapportent qu'il fonctionne, mais l'issue ouverte #2664 (21 juin 2026) existe précisément pour gérer des formats de réponse HikerAPI alternatifs.

Méthode de configurationCe qui atterrit dans credentials.iniCompte Instagram nécessaire
Éditer le fichier à la mainCeux des trois champs que vous renseignezUniquement si vous renseignez username et password
make setupusername et password ; la ligne du token sauteOui, et il réinitialise config/settings.json
hikerapi_token ou variable d'environnementUn token ; username et password ne sont jamais lusNon : main.py construit HikerCLI
Ce que chaque méthode de configuration écrit réellement dans le fichier.

Utilisez un compte jetable, et gardez-le hors de git

Le README affiche ceci en rouge : « It is advisable to not use your own/primary account when using this tool. » (il est déconseillé d'utiliser votre compte personnel ou principal avec cet outil). Un second avertissement en rouge vous dit de ne pas envoyer vos identifiants sur GitHub si vous forkez le projet. Celui-là compte plus qu'il n'y paraît : config/credentials.ini est committé dans le dépôt, donc bien que .gitignore le mentionne, Git n'ignore rien de ce qu'il suit déjà. Vérifiez git status avant de pousser un fork. Osintgram s'authentifie en votre nom et se comporte comme un client automatisé ; tout ce qu'Instagram décidera à ce sujet retombera sur le compte inscrit dans ce fichier.

Vérifier que tout a fonctionné

Deux vérifications, dans l'ordre : la première prouve que l'arbre de dépendances s'est résolu, la seconde que l'outil sait lire votre configuration. Lancez-les toutes les deux depuis la racine du dépôt, venv actif.

cd Osintgram
source venv/bin/activate

# 1. does the package tree import?
python -c "from src.Osintgram import Osintgram; print('ok')"

# 2. does it read your credentials and reach login?
python3 main.py <target username> --command info
La vérification d'import est celle qui repère un venv à moitié installé. C'est le même import que main.py exécute avant même qu'argparse ne voie vos arguments.

Si la première affiche ok, votre installation est terminée. Si la seconde affiche une erreur de champ vide, revenez à la section sur les identifiants. Si elle affiche Attempt to login... ou Connect to HikerAPI..., l'installation est bel et bien faite et tout ce qui suit cette ligne relève d'Instagram.

Une dernière à anticiper : ModuleNotFoundError: No module named 'src.Osintgram' signifie que vous avez lancé main.py depuis un autre endroit que la racine du dépôt. C'est l'issue #105, et le correctif est cd Osintgram, à chaque fois.

Les erreurs d'installation et ce qu'elles signifient vraiment

Chaque chaîne de la colonne de gauche provient du tracker d'issues du projet ou a été reproduite localement sur un clone propre. Aucune ne vient d'Instagram : elles surviennent toutes avant qu'une seule requête ne quitte votre machine.

Texte de l'erreurCe que cela signifie vraimentCorrectif
error: externally-managed-environmentPEP 668. Debian 12+, Ubuntu 23.04+ et Kali refusent les installations pip à l'échelle du système.Faites l'étape du venv. Kali le documente ; sudo apt install python3-venv si venv est absent.
ModuleNotFoundError: No module named 'urllib3.packages.six.moves'Le python3-requests d'apt mélangé à l'urllib3 2.x de pip. L'indice, c'est un chemin sous ~/.local/lib/python3.12/site-packages/, qui trahit un --break-system-packages.Supprimez les paquets du user-site, réinstallez dans un venv propre (#1766).
Cannot uninstall prettytable 3.10.1 / no RECORD file was found for prettytablepip tente de supprimer le python3-prettytable d'apt pour satisfaire la version figée prettytable==0.7.2.Un venv sans --system-site-packages évite le problème (#1126).
/usr/bin/ld: cannot find -lncursesgnureadline compile depuis les sources sans en-têtes ncurses présents.sudo apt install -y build-essential libncurses-dev (#183).
ModuleNotFoundError: No module named 'pyreadline' sous LinuxTrompeur. main.py rattrape un import gnureadline en échec avec un except nu et bascule sur pyreadline, que requirements.txt n'installe que sous Windows.Ignorez pyreadline ; corrigez la compilation de gnureadline ci-dessus.
AttributeError: module 'collections' has no attribute 'Callable'pyreadline 2.1 sur Python 3.10+ sous Windows natif. Plante à la ligne 108 de main.py.Voir la section Windows : pip install pyreadline3 n'est pas le correctif (#2668).
AttributeError: 'HTMLParser' object has no attribute 'unescape'prettytable 0.7.2 se construit contre un setuptools trop ancien ; HTMLParser.unescape() a disparu en Python 3.9.pip install --upgrade pip setuptools wheel d'abord (issue #334).
ModuleNotFoundError: No module named 'src.Osintgram'main.py lancé en dehors de la racine du dépôt.cd Osintgram d'abord.
ERROR: Target path exists but is not a directory, will not continue.pip install -t requirements.txt ; -t, c'est --target, une destination d'installation.Le flag est -r (#2666).
L'inventaire complet des échecs d'installation, avec les chaînes réelles plutôt que des paraphrases.

Les trois premières lignes ne surviennent que lorsque pip s'exécute contre l'interpréteur système : elles disparaissent dès l'instant où vous utilisez réellement le venv. C'est pour cela que l'étape trois n'est pas une formalité.

Windows et WSL

Sous Windows natif, l'installation des dépendances se passe bien. Cloner master et installer requirements.txt dans un venv Python 3.11 réussit, et le pyreadline 2.1 réservé à Windows se compile depuis les sources sans erreur. Ce qui échoue, c'est l'étape juste après, avant même qu'argparse n'ait lu vos arguments :

File "...\Osintgram\main.py", line 108, in <module>
    pyreadline.Readline().parse_and_bind("tab: complete")
  File "...\pyreadline\py3k_compat.py", line 8, in callable
    return isinstance(x, collections.Callable)
AttributeError: module 'collections' has no attribute 'Callable'
Reproduit sous Windows avec Python 3.11 ; la même trace correspond à l'issue #2668, ouverte le 28 juillet 2026.

collections.Callable a été supprimé dans Python 3.10 et déplacé vers collections.abc ; la dernière publication de pyreadline 2.1 remonte à 2020. main.py atteint cette ligne parce que son import de readline est un try: import gnureadline / except: import pyreadline, et que requirements.txt n'installe pyreadline que sous Windows. Windows est donc le seul chemin qui touche le module cassé.

pyreadline3 n'est pas un remplaçant direct

C'est le conseil que l'on lit dans tous les fils de forum, et il ne marche pas ici. Dans un venv propre, après pip install pyreadline3, python -c "import pyreadline" lève toujours ModuleNotFoundError: No module named 'pyreadline' alors que import pyreadline3 réussit. Le paquet s'installe sous un autre nom de module, et main.py code en dur import pyreadline.

Quatre choses qui, elles, fonctionnent :

  1. Patcher pyreadline. Dans venv\Lib\site-packages\pyreadline\py3k_compat.py, remplacez collections.Callable à la ligne 8 par collections.abc.Callable. Vérifié : main.py va alors jusqu'à la vérification des identifiants.
  2. Patcher main.py à la place. Remplacez le repli par import pyreadline3 as pyreadline. Même résultat, mais c'est une modification de code suivi par git, que git pull viendra vous disputer.
  3. Passer par WSL. Dans un shell Ubuntu ou Debian sous WSL, vous êtes sur le chemin Linux : le marqueur d'environnement sélectionne gnureadline, pyreadline n'est jamais installé, et les six mêmes commandes s'appliquent telles quelles. PEP 668 s'y applique aussi, donc gardez le venv.
  4. Utiliser Python 3.9 sous Windows, où collections.Callable existe encore. Ça marche, mais ça vieillit mal.

WSL est la recommandation honnête : chaque chemin de code, chaque trace du tracker et le conteneur du projet lui-même supposent Linux. Git Bash est un demi-compromis (le README y documente source venv/bin/activate), mais il exécute quand même l'interpréteur Windows, et se heurte donc toujours à la ligne 108.

Docker

Le dépôt fournit un Dockerfile, un docker-compose.yml et un Makefile. Docker est le seul chemin qui contourne entièrement la question de la version de Python, parce que l'image fige son propre interpréteur.

make setup
docker build -t osintgram .
docker run --rm -it \
  -v "$PWD/output:/home/osintgram/output" osintgram <target>
make setup doit venir en premier, et pas pour une question de confort.

L'image contient votre mot de passe Instagram

Le troisième COPY du Dockerfile est COPY --chown=osintgram:osintgram config/ /home/osintgram/config : credentials.ini est donc cuit dans les couches de l'image au moment du build. C'est ce que veut dire le README avec « Your container will fail if you do not do step #3 and configure your credentials » (votre conteneur échouera si vous ne faites pas l'étape 3 et ne configurez pas vos identifiants). Traitez le build comme un artefact porteur de secrets : ne le poussez jamais vers un registry, ne partagez jamais le tar exporté.

Deux autres faits côté Docker. L'image de base est python:3.9.2-alpine3.13, une build de mars 2021. C'est exactement pour cela que le conteneur esquive les conflits de 3.12 et 3.13, et aussi pour cela qu'il est l'élément le moins patché de votre machine. Et les cibles run, build-run-testing et cleanup-testing du Makefile appellent toutes docker-compose, le binaire v1 avec tiret que les installations Docker modernes ne fournissent plus.

Les mythes qui vous font perdre du temps

Quatre affirmations reviennent en boucle dans les guides d'installation d'Osintgram. Toutes les quatre sont vérifiables dans le code source, et toutes les quatre sont fausses.

  • « Python 3.12 a supprimé distutils, donc Osintgram ne peut pas s'installer. » Le setup.py de prettytable 0.7.2 commence par from setuptools import setup : aucun import de distutils nulle part, et l'isolation de build par défaut de pip fournit son propre setuptools. Tout le tracker d'issues contient une seule mention de distutils, et la vraie trace de cette issue est une erreur d'expiration de cookie.
  • « Il vous faut geckodriver, Selenium ou Pillow. » Un grep sur src/Osintgram.py (le moteur en entier, ses 60 586 octets) à la recherche de selenium, geckodriver, webdriver, Pillow ou PIL ne renvoie aucune correspondance. Il n'y a aucune couche d'automatisation de navigateur : l'outil parle HTTP à l'API mobile privée d'Instagram, et à HikerAPI via httpx. Les téléchargements passent par urllib.request.urlretrieve.
  • « Il suffit de lancer sudo apt install osintgram. » Debian ne package pas Osintgram, et le catalogue d'outils de Kali non plus. Il n'existe pas non plus de paquet PyPI : cloner le dépôt est donc le seul canal de distribution.
  • « Éditez config.py et mettez-y vos identifiants. » Il n'y a pas de config.py à la racine du dépôt. Il y a src/config.py, qui est du code auquel vous ne touchez pas ; les identifiants vivent dans config/credentials.ini.

Un cinquième : python3 main.py tout seul ne lance rien. argparse déclare id comme un positionnel obligatoire, vous obtenez donc usage: main.py [-h] [-C] [-j] [-f] [-c COMMAND] [-o OUTPUT] id puis une sortie. Osintgram ne peut pas être lancé sans nom d'utilisateur cible.

C'est installé, mais la connexion échoue

L'échec de connexion est le plus gros obstacle pratique en 2026, et ce n'est pas un problème d'installation. Votre installation s'est terminée à l'instant où pip a fini et où la vérification d'import est passée. Tout ce qui s'affiche après Attempt to login... appartient à Instagram.

L'issue #2627, ouverte le 4 mars 2026, rapporte ClientError checkpoint_required avec une checkpoint_url valant https://i.instagram.com/web/unsupported_version/ : Instagram rejette la version d'API de la bibliothèque, pas votre mot de passe. L'issue #2630 (2 avril 2026) rapporte ClientError Bad Request: block_eu_user_login_in_old_app. L'auteur de la PR #2660 décrit la réponse bad_password comme « actually a bot detection, not wrong password » (en réalité une détection de bot, pas un mauvais mot de passe). Aucune commande pip ne corrige quoi que ce soit là-dedans ; le tableau complet est dans Osintgram fonctionne-t-il encore en 2026 ?.

Si vous vous retrouvez au contraire avec un shell fonctionnel, la suite logique est la référence des commandes : ce que chacune renvoie, où atterrissent les fichiers produits, et lesquelles vous font limiter. C'est comment utiliser Osintgram. Si votre cible est privée, lisez d'abord ce qu'Osintgram peut et ne peut pas y faire.

Questions fréquentes

Osintgram est un outil OSINT indépendant, sans aucune affiliation avec Instagram ni Meta. Ces guides décrivent uniquement des logiciels open source publiquement documentés et de la recherche en sources ouvertes. Utilisez ces techniques dans le respect de la loi, sur des cibles que vous êtes autorisé à investiguer, et jamais pour harceler ou surveiller des particuliers.