Hier, j'ai regardé quelques trucs sur internet pour sniffer les requêtes HTTP sur Android. Cette pratique permet d'intercepter les données échangées entre un client (une application mobile par ex) et son serveur (la plateforme web associée). J'ai voulu tester ma petite installation sur des applications assez opaques, telles que les applis de rencontre. Alors que Tinder ne donnait rien d'intéressant, OkCupid s'est révélé au contraire très instructif :)
Intercepter les paquets HTTP des applications mobiles est bien plus intéressant que ceux partagés par les sites internet. En effet, ces derniers reposent plutôt sur la transmission de codes HTML préalablement préparées sur le serveur. Au contraire, les applications mobiles reçoivent par le réseau les données brutes de la plateforme numérique et mettent en page ces données en local.
Cette pratique nous arrange car il y a toujours plus de données transmises que d'informations affichées sur l'interface mobile. Sniffer les paquets échangés par l'application android permet ainsi d'accéder aux données non affichées. Obtenir tout cela demande de configurer un sniffeur de paquets, un émulateur et un proxy.
L'interception des paquets est possible grâce à mitmproxy, un sniffeur qui sert aussi de proxy. Une fois configuré sur l'émulateur (en ajoutant le certificat SSL puis en paramétrant le proxy), le programme affiche tous les paquets HTTP entrants et sortants de l'appareil android émulé. On peut indiquer à mitmproxy un script python pour filtrer et manipuler les paquets.
Ma question de départ était simple : puis-je savoir en avance si quelqu'un va matcher avec moi ou pas ? Dans son utilisation classique, ni Tinder ni OkCupid ne le permet : on le sait après le swipe, c'est la règle du jeu. L'interface ne le permet pas, mais peut-être que les données contiennent les informations à ce sujet ?
J'ai donc commencé par inspecter Tinder. Après quelques explorations, j'ai trouvé l'appel réseau permettant de récupérer les tuiles des utilisateurs, mais aussi l'appel effectué lors d'un swipe. Le bilan était amer : on ne sait pas à l'avance si une personne est intéressée par notre profil : cette information vient après le swipe, dans la réponse de l'appel réseau qui indique si on souhaite garder ou rejeter un profil (swipe à gauche ou droite).
Pas abattu, j'ai regardé du côté de OkCupid. Et là, bingo ! À chaque chargement des tuiles de la page principale, l'application exécute un appel HTTP vers le chemin /graphql/StackQuery de leur API. Celui-ci renvoie les profils à swiper avec, pour chaque, plein d'informations sur les utilisateurs. Parmi celles-ci, une est trèèèèès intéressante : la valeur booléenne targetLikesSender.
{
"data": {
"me": {
"__typename": "User",
"stack": {
"__typename": "Stack",
"id": "JUST_FOR_YOU",
"status": "OUT_FOR_THE_DAY",
"expireTime": null,
"votesRemaining": null,
"badge": null,
"data": [
{
"__typename": "StackMatch",
"stream": "8+g...sQ==",
"targetLikesSender": false,
"match": {...}
},
...
]
}
...
},
}
...
}
Cette petite variable nous indique ce que l'on veut savoir : l'utilisateur nous like. Si on swipe cette personne vers la droite, on est sûr de matcher avec elle :) J'ai testé ça marche tout le temps.
Parce que cette petite variable est bien cachée, cela rend son utilisation impossible sans automatiser tout ça. J'ai donc écrit un petit script python qui permet d'afficher dans le terminal si tel ou tel profil s'intéresse à moi. À présent, je fais tourner ce script quand j'utilise OkCupid et je peux anticiper, pour chaque profil, si cette personne matchera avec moi !