Osintgram

Osintgram fonctionne-t-il sur les comptes Instagram privés ?

Non. Face à un profil privé que le compte avec lequel vous êtes connecté ne suit pas, Osintgram refuse 18 de ses 21 commandes de données avant même de récupérer quoi que ce soit. La seule exception documentée, inscrite dans le README du projet lui-même, est un compte privé que vous suivez déjà.

20 min de lectureÉquipe Osintgram

La réponse courte

Non. Pointez Osintgram sur un compte Instagram privé que le profil avec lequel vous vous êtes connecté ne suit pas, et 18 de ses 21 commandes de données refusent de s'exécuter avant même d'aller chercher le moindre enregistrement. Ce n'est ni un problème de version, ni une limitation de débit, ni quelque chose qu'un fork corrige. C'est un contrôle délibéré, exécuté avant chacune de ces commandes.

Le projet le dit dans sa propre documentation. La question 1 de la FAQ du README d'Osintgram indique, mot pour mot : "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!" (Non, vous ne pouvez pas obtenir d'informations sur des profils privés. Vous ne pouvez en obtenir que depuis un profil public ou un profil que vous suivez. Les outils qui prétendent y arriver sont des arnaques.)

Cette proposition centrale résume tout l'article. "A profile you follow", un profil que vous suivez, est une exception réelle et vérifiable, et ce n'est pas un déverrouillage partiel. Si le compte avec lequel vous êtes connecté suit déjà la cible privée, chaque commande verrouillée se comporte exactement comme face à un profil public.

Osintgram ne peut pas lire un compte Instagram privé. L'exception est étroite et documentée : un compte privé que le compte Instagram avec lequel vous vous êtes authentifié suit déjà, auquel cas plus rien n'est verrouillé. Tout le reste s'arrête sur une seule fonction, check_private_profile(), qui retourne immédiatement dès que la cible est privée et que vous ne la suivez pas. Aucun fork, aucun flag, aucun mod ni service payant ne change cette condition, parce que la condition est celle d'Instagram.

Le verrou, lu directement dans le code source

Dix-neuf méthodes de src/Osintgram.py commencent par les deux mêmes lignes : appeler check_private_profile() et, si la fonction renvoie true, retourner. Voici cette fonction, sortie de l'indentation du corps de la classe mais inchangée par ailleurs.

def check_private_profile(self):
    if self.is_private and not self.following:
        pc.printout("Impossible to execute command: user has private profile\n", pc.RED)
        send = input("Do you want send a follow request? [Y/N]: ")
        if send.lower() == "y":
            self.api.friendships_create(self.target_id)
            print("Sent a follow request to target. Use this command after target accepting the request.")

        return True
    return False
src/Osintgram.py, lignes 1169-1178 sur la branche master.

Deux attributs décident de tout. self.is_private est défini dans setTarget() à partir de la recherche de la cible, qui ne renvoie que l'identifiant numérique et le drapeau de compte privé. self.following est défini juste après par check_following(), qui lit friendship_status.following dans la réponse du endpoint users/{user_id}/full_detail_info/ d'Instagram lui-même. L'outil ne déduit pas votre relation avec la cible : il pose la question à Instagram et croit la réponse.

La condition est un ET. Le caractère privé seul ne bloque pas. Le fait de ne pas suivre le compte, seul, ne bloque pas non plus. Seule la combinaison des deux bloque. C'est pour cela que la réponse est un non conditionnel, et pour cela que la condition est inutile à quiconque espère un contournement : elle revient à dire "le compte vous a déjà laissé entrer".

Vous voyez cet état avant même de taper quoi que ce soit. La bannière s'affiche à l'ouverture de la session, et chaque commande verrouillée affiche la même ligne rouge.

Logged as <you>. Target: <target> [1234567890] [PRIVATE PROFILE] [NOT FOLLOWING]

Run a command: followers
Impossible to execute command: user has private profile
Do you want send a follow request? [Y/N]:
Chaque ligne est une chaîne littérale de main.py ou de src/Osintgram.py, reconstituée à partir du code. Ce n'est pas une session réellement capturée.

Cette demande d'abonnement est une action bien réelle

Répondre Y appelle friendships_create(self.target_id). Cela envoie une véritable demande d'abonnement, depuis le compte qui se trouve dans config/credentials.ini, à la personne sur laquelle vous enquêtez, et elle la voit. Sur une mission réelle, c'est une divulgation. Si le plan consiste à la faire accepter avec un persona qui n'est pas le vôtre, vous avez complètement quitté le terrain de la recherche en sources ouvertes.

La détection des abonnements est le bug le plus signalé de l'outil

Des personnes qui suivent réellement la cible privée se voient malgré tout afficher [NOT FOLLOWING] et restent bloquées. Voir l'issue #174, "Can't check private account even if followed", et l'issue #1031. Aucune des deux n'a de résolution documentée. Si vous relevez de l'exception documentée et que l'outil vous contredit, il s'agit d'un défaut connu, pas d'un verrou caché.

Quelles commandes fonctionnent encore sur une cible privée

Sur les 21 commandes de données que distribue main.py, 18 sont placées derrière le verrou : addrs, captions, comments, commentdata, followers, followings, fwersemail, fwingsemail, fwersnumber, fwingsnumber, hashtags, likes, mediatype, photodes, photos, stories, wcommented et wtagged. Face à une cible privée que vous ne suivez pas, chacune d'elles affiche le message de blocage et retourne. (Le dix-neuvième point d'appel est une méthode interne que la table des commandes n'atteint jamais.)

Trois commandes n'ont aucune protection : info, propic et tagged. Les deux premières lisent directement users/{user_id}/full_detail_info/, c'est-à-dire le endpoint utilisé par la vérification d'abonnement. Ce endpoint répond pour les cibles privées, ce qui est précisément la raison pour laquelle check_following() fonctionne. Le document de profil est servi ; le contenu qui se trouve derrière ne l'est pas.

tagged relève de la bizarrerie plutôt que de la faille. get_people_tagged_by_user() saute la vérification, puis appelle __get_feed__(), qui parcourt le fil de publications de la cible elle-même, exactement les données que couvre le mur des abonnements. La protection manque ; ce qu'elle aurait protégé reste derrière le mur. Une protection absente n'est pas un accès.

Il existe un second backend, et il est plus strict. Si config/credentials.ini contient un hikerapi_token, ou si HIKERAPI_TOKEN est défini dans l'environnement, main.py construit à la place HikerCLI depuis src/hikercli.py. Cette classe embarque sa propre copie du verrou, moins la clause d'abonnement.

def check_private_profile(self):
    if self.is_private:
        pc.printout(
            "Impossible to execute command: user has private profile\n", pc.RED
        )
        return True
    return False
src/hikercli.py : le backend HikerAPI verrouille sur is_private seul.

Sur ce chemin, un profil privé est refusé que vous le suiviez ou non, parce que ce n'est pas vous qui faites la requête. C'est une API tierce, et elle n'a aucune relation avec la cible. Sa bannière abandonne d'ailleurs entièrement le tag [FOLLOWING], pour la même raison. Comme ce backend est le chemin encore conçu pour fonctionner, l'exception documentée se réduit : Osintgram fonctionne-t-il encore explique pourquoi la connexion par mot de passe a cessé de marcher.

La matrice des capacités

Voici ce que donne chacune des trois situations. La colonne du milieu est celle qui intéresse réellement les gens.

DonnéePublicPrivé, non suiviPrivé, que vous suivez
Nom d'utilisateur, ID, nom complet, bio (info)OuiOuiOui
Nombre d'abonnés et d'abonnements (info)OuiOuiOui
E-mail et téléphone professionnels publics (info)OuiOuiOui
Photo de profil (propic)OuiNon verrouillé par conceptionOui
Publications et légendes (photos, captions)OuiNonOui
Stories (stories)OuiNonOui
Listes d'abonnés et d'abonnementsOuiNonOui
Totaux de likes et de commentairesOuiNonOui
E-mails et numéros de téléphone des abonnésOuiNonOui
Géotags (addrs) et hashtagsOuiNonOui
Utilisateurs identifiés par la cible (tagged)OuiNon verrouillé, lit le fil de publicationsOui
Utilisateurs ayant identifié la cible (wtagged)OuiNonOui
Couverture des commandes par type de cible, déduite du verrou de confidentialité de src/Osintgram.py. Chaque "Oui" suppose que le backend parvient déjà à s'authentifier.

Deux réserves. propic n'est pas verrouillé dans le code, mais savoir si Instagram renvoie encore en 2026 le hd_profile_pic_url_info en pleine résolution pour une cible privée non suivie n'a pas été testé ici : Osintgram prévoit un repli lorsque cette clé est absente, et les utilisateurs d'instaloader signalent sa disparition. Lisez cette case comme un "par conception", pas comme une garantie. La troisième colonne suppose également que vous parveniez à vous connecter. Ce que renvoie chaque commande sur une cible non verrouillée est détaillé dans toutes les commandes Osintgram, expliquées.

Cet article ne contient aucune section sur le contournement

Si vous êtes venu chercher un fork, un flag, une build patchée ou une API payante qui lirait une grille privée, cette page n'en propose aucun. La raison est structurelle, pas éditoriale : le verrou est une décision prise côté serveur chez Instagram, et Osintgram ne fait que la répercuter. Tout ce qui prétend le contraire vend autre chose, et c'est l'objet de la section suivante.

Ce qu'Instagram publie malgré tout sur un compte privé

"Privé" sur Instagram signifie contenu privé, pas compte privé. Un profil privé sert malgré tout un document de métadonnées substantiel à une requête sans connexion et sans cookie. Les champs ci-dessous proviennent d'une consultation déconnectée effectuée le 8 août 2026 sur un compte privé, qui n'est pas nommé ici.

curl -s \
"https://www.instagram.com/api/v1/users/web_profile_info/?username=USERNAME" \
-H "x-ig-app-id: 936619743392459"
Consultation de profil sans connexion. A renvoyé un HTTP 200 avec environ 69 champs de profil.
Champ publicCe qu'il contientPourquoi c'est important
username, id, full_nameIdentité plus un ID numérique stableL'ID survit aux changements de nom d'utilisateur
biography, bio_links, external_urlTexte libre et liens sortantsLe champ public le plus riche, et un pivot inter-plateformes
edge_owner_to_timeline_media.countLe vrai nombre de publications, non masquéÀ relever dans le temps pour la cadence de publication
edge_followed_by, edge_followNombre d'abonnés et d'abonnementsCroissance, purges et périodes creuses
profile_pic_url_hdImage 320x320, malgré son nomPoint de départ pour une recherche d'image inversée
is_private, is_verified, category_nameDrapeaux de statut du compteConfirment à quoi vous avez affaire
edge_mutual_followed_byAbonnés en commun, variables selon le visiteurUn graphe d'abonnés partiel, sans aucune demande d'abonnement
edge_owner_to_timeline_media.edgesVide pour un compte privéLe contenu lui-même ne sort pas
Champs web_profile_info renvoyés sans connexion pour un profil privé, testés le 8 août 2026.

Deux de ces champs surprennent. Le nombre de publications n'est pas masqué : le chiffre réel est servi à quiconque le demande. Et profile_pic_url_hd porte mal son nom : sur tous les comptes vérifiés, publics comme privés, il plafonne à 320 par 320 pixels, avec profile_pic_url à 150. La véritable pleine résolution se trouve derrière le endpoint mobile authentifié, le seul endroit où propic peut battre un navigateur.

Les mêmes données parviennent aux robots d'indexation via du HTML brut. Une requête avec un user agent Googlebot obtient un titre de page rendu côté serveur, une description OpenGraph qui regroupe les trois compteurs dans une seule chaîne, et la bio dans la balise meta description. C'est pour cela que les profils privés apparaissent quand même dans Google, et que coller l'un d'eux dans Slack ou Discord déploie un aperçu avec le nom et la bio de la personne.

Rien de tout cela ne constitue une API sur laquelle s'appuyer. Après une vingtaine de consultations déconnectées successives, le endpoint se met à répondre "message":"Please wait a few minutes before you try again." et "require_login":true. Ce drapeau est révélateur : le chemin anonyme est une tolérance, pas une interface prise en charge.

Pourquoi les sites de "private viewer" sont des arnaques

Le README les qualifie d'arnaques, et le mécanisme est documenté. Une analyse de MalwareTips portant sur l'un de ces sites, publiée le 19 février 2026, décrit l'entonnoir habituel : vous saisissez un nom d'utilisateur, vous regardez de fausses barres de progression intitulées "Fetching profile" et "Decrypting", puis on vous annonce qu'une vérification humaine est requise. Selon les mots de l'analyse, "This isn't verification. It's monetization," et "Each completed offer can generate a payout." (Ce n'est pas de la vérification, c'est de la monétisation ; chaque offre complétée peut générer une commission.)

Ce que collectent ces offres : des adresses e-mail et des numéros de téléphone destinés à la revente, des autorisations de notifications navigateur pour de l'adware persistant, des données de carte bancaire pour des essais à reconduction automatique et, dans les variantes avec installation d'application, un accès à l'appareil via un APK installé hors magasin. La boucle est délibérée : le site annonce que la vérification a échoué pour pouvoir pousser une offre de plus. Aucune donnée de profil n'est jamais récupérée.

Les procédures judiciaires de Meta sont la version attestée devant les tribunaux du même schéma. En attaquant Octopus en juillet 2022 pour un logiciel de scraping à la demande, Meta a déclaré que "After paying for access to the scraping software, customers self-compromised their Facebook and Instagram accounts by providing their authentication information to Octopus" (actions against scraping-for-hire), autrement dit que les clients compromettaient eux-mêmes leurs comptes en confiant leurs identifiants à Octopus. La même série visait des sites clones qui republiaient des profils sans autorisation, touchant plus de 350 000 utilisateurs Instagram. En janvier 2023, Meta a poursuivi Voyager Labs, qui avait exploité environ 38 000 faux comptes pour collecter des données visibles uniquement par des visiteurs connectés.

Il ne reste par ailleurs aucune API légitime à invoquer. Meta a déprécié l'Instagram Basic Display API le 4 décembre 2024, et son remplaçant ne dessert que les comptes Business et Creator. Tout produit qui, en 2026, met en avant un accès de niveau API à un compte personnel, privé ou public, met en avant une API qui n'existe plus. Osintgram et instaloader n'utilisent pas davantage d'API : ils se font passer pour les clients mobile et web, ce qui explique qu'ils héritent du mur des abonnements au lieu de le contourner.

La meilleure preuve qu'il s'agit d'un comportement d'Instagram et non d'une limitation d'Osintgram, c'est qu'un projet distinct encode exactement la même règle. Instaloader répète une même phrase dans ses méthodes de publications, d'abonnés et d'abonnements, "To use this, one needs to be logged in and private profiles has to be followed", embarque une exception dédiée PrivateProfileNotFollowedException, et indique sur sa page de dépannage qu'il faut suivre un compte privé pour accéder à la plupart de ses informations.

La jurisprudence américaine a convergé vers une métaphore qui s'applique remarquablement bien à Instagram. Dans Van Buren v. United States (Cour suprême, juin 2021), la cour a jugé que la notion de "exceeds authorized access" au sens du CFAA ne vise pas ceux qui "have improper motives for obtaining information that is otherwise available to them", ceux dont les motifs sont illégitimes mais qui accèdent à des informations par ailleurs à leur disposition. Le Ninth Circuit a appliqué ce raisonnement dans hiQ Labs v. LinkedIn (avril 2022) : l'examen de l'accès "without authorization" "presupposes that there first be the equivalent of a gate that restricts access", il suppose d'abord l'équivalent d'un portail qui restreint l'accès.

Un compte Instagram privé est ce portail. Les métadonnées publiques d'un profil se situent du côté portail ouvert : collectez-les, notez leur provenance, passez à la suite. Passer derrière le mur des abonnements avec des identifiants volés, une session connectée empruntée, une demande d'abonnement trompeuse ou une session de scraping achetée, c'est se placer du côté portail fermé, et aucune finalité de recherche ne transforme l'un en l'autre.

Une seconde exposition concerne spécifiquement Osintgram. Dans Meta Platforms v. Bright Data (N.D. Cal., janvier 2024), la demande fondée sur les conditions d'utilisation reposait sur le point de savoir si le scraping avait eu lieu alors que l'auteur était connecté à un compte Meta. Le backend classique d'Osintgram s'authentifie avec un véritable compte Instagram, ce qui le place clairement dans la catégorie liée par les conditions. En pratique, la réponse d'Instagram se situe au niveau du compte plutôt qu'au niveau juridique, sous la forme de challenges et de blocages, et c'est pour cela que le README vous met en garde contre l'usage de votre compte principal.

Rien de tout cela n'est tranché à l'échelle mondiale. Van Buren, hiQ et Bright Data sont des décisions américaines et ne règlent rien au Royaume-Uni ni dans l'Union européenne. Au Royaume-Uni, l'article 1 du Computer Misuse Act 1990 érige en infraction pénale l'accès sciemment non autorisé à des données informatiques, passible de 12 mois d'emprisonnement en procédure sommaire et de deux ans sur mise en accusation. Dans l'UE, une donnée personnelle publiquement accessible reste une donnée personnelle : les lignes directrices 1/2024 de l'EDPB posent un test en trois volets pour l'intérêt légitime, et la limitation des finalités, la minimisation des données et la transparence continuent de s'appliquer à tout ce qui est collecté depuis une page publique.

Ce que fait la recherche autorisée autour d'un compte privé

Refuser le contournement ne vous laisse pas les mains vides. Un compte privé s'inscrit dans un graphe public, et ce graphe est parfaitement exploitable.

  • Les compteurs forment une série temporelle. Les nombres de publications, d'abonnés et d'abonnements sont servis pour les comptes privés. Relevés chaque semaine, ils vous donnent la cadence de publication, la croissance ou les purges d'abonnés, et les périodes d'inactivité, sans que vous voyiez jamais la moindre publication.
  • La bio est le champ public le plus riche. Elle contient couramment une URL externe, un agrégateur de liens, un employeur, une ville ou une adresse e-mail. C'est le pivot inter-plateformes standard, et Instagram n'offre aucun réglage pour la masquer.
  • Les abonnés en commun apparaissent à un visiteur connecté. Instagram affiche une ligne "Suivi par" au-dessus de la grille bloquée, et aucune option ne permet de la supprimer. C'est une tranche partielle du graphe d'abonnés, dépendante du visiteur, obtenue sans envoyer la moindre demande d'abonnement.
  • Les publications des autres appartiennent aux autres. Un contenu qui identifie un utilisateur privé ou le crédite comme co-auteur est servi selon le réglage de confidentialité du compte propriétaire, pas selon celui de l'utilisateur privé. C'est le fondement honnête de toute la catégorie de techniques dite "identifié par des tiers".
  • Faites une recherche d'image inversée sur la photo de profil, avec prudence. Avec un plafond de 320 pixels, vous êtes dans la zone dégradée pour la comparaison faciale. Traitez cela comme un "où ailleurs cette image exacte a-t-elle été publiée" plutôt que comme une identification. Yandex est le plus performant sur les visages et les recadrages ; TinEye ne trouve que des copies quasi identiques.

Sautez l'étape archive pour l'URL du profil

Les conseils OSINT classiques recommandent de vérifier la Wayback Machine. Pour les URL de profil instagram.com en particulier, cela ne fonctionne pratiquement pas : des instantanés existent, mais ils se résolvent en une coquille JavaScript sans balises meta, sans bio et sans compteurs, vérifié le 8 août 2026. Google a retiré son cache public de pages en février 2024. Les archives restent utiles pour les republications par des tiers et les articles de presse qui ont intégré le contenu.

Rien de tout cela ne vous donne le contenu, et c'est bien le propos. Le livrable d'une recherche autorisée autour d'un compte privé, c'est une empreinte publique documentée assortie d'une lacune explicite et signalée, pas une reconstitution de ce qui se trouve derrière le mur. Si le contenu est réellement l'exigence, les voies restantes passent par une personne : le titulaire du compte, une demande auprès de la plateforme ou une procédure judiciaire. Aucun outil ne répond à cette question.

Si le compte sur lequel vous travaillez est public, la question du verrou ne se pose jamais. Si vous n'avez pas encore Osintgram en état de marche, commencez par le guide d'installation, mais lisez d'abord Osintgram fonctionne-t-il encore : la couche de connexion échoue bien avant le verrou de confidentialité.

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.