paint-brush
Démantèlement de l'application iOS de Reddit - Informations sur les API, les performances, la sécurité et les expériences A/Bpar@hackercm3ebf0le00003b7n7h2a5k7d
Nouvelle histoire

Démantèlement de l'application iOS de Reddit - Informations sur les API, les performances, la sécurité et les expériences A/B

par 7m2024/11/26
Read on Terminal Reader

Trop long; Pour lire

Ma curiosité m'a conduit à analyser les coulisses du fonctionnement de l'application iOS Reddit et m'a révélé quelques bonnes informations sur les API Reddit.
featured image - Démantèlement de l'application iOS de Reddit - Informations sur les API, les performances, la sécurité et les expériences A/B
undefined HackerNoon profile picture
0-item

J'ai trouvé l'application iOS de Reddit meilleure que la version Web, j'ai donc pensé à vérifier la rapidité avec laquelle elle charge les données. Voici le démontage de l'application iOS de Reddit.


Voici quelques points saillants :

  • Il utilise une authentification basée sur des jetons.
  • Il utilise les API GraphQL pour presque tout, de la configuration et des expériences à la publication d'informations.
  • Il surveille les performances de son système API telles qu'elles sont vécues par ses utilisateurs à l'aide d'une API nommée w3-reporting.
  • Dans la plupart des appels d'API GraphQL, seul le nom de l'opération est transmis sans variables. Je suppose qu'ils utilisent un middleware pour extraire la configuration des variables du front-end. Un service back-end renseigne les informations en fonction du nom de l'opération.
  • Reddit utilise Web Socket pour la fonctionnalité de commentaires en direct.


Voici le démontage détaillé des appels d'API. J'ai utilisé l'application de bureau de Requestly pour intercepter l'application iOS de Reddit, les instructions de configuration sont fournies ici .

Technologie utilisée

L'application Reddit est créée avec

  • L'application iOS de Reddit utilise les API GraphQL pour charger tout le contenu.
  • L’authentification basée sur des jetons est utilisée pour valider les utilisateurs.
  • Surveillance des performances en signalant les performances de l'API côté utilisateur.
  • Les commentaires en direct sont pris en charge via WebSocket.
  • Configuration dynamique pour contrôler à distance le comportement des applications sans déployer de nouvelles versions.
  • Expériences dynamiques pour contrôler les expériences à distance, sans nécessiter de nouveau déploiement pour modifier le statut d'une expérience.

Meilleure expérience utilisateur grâce au préchargement

La principale question que je me posais était de savoir comment l'application fonctionnait si rapidement. La réponse a été trouvée en vérifiant la réponse de l'API FeedPostDetailsByIds . Cette API est appelée sur l'écran d'accueil avec les identifiants des publications affichées et est accompagnée d'informations détaillées qui s'affichent après avoir cliqué sur la publication. Ce préchargement des publications les plus populaires a permis d'afficher instantanément l'écran des détails de la publication sans aucun chargeur.


  • Les messages de préchargement sont affichés dans le flux.
  • Le temps de réponse des API est également très rapide.

Sécurité des API GraphQL

Les requêtes GraphQL se composent des données et de la structure de la réponse requise. Le nom de l'opération est généralement facultatif. La plupart des API Reddit n'ont que des noms d'opération dans les requêtes et les variables ne sont disponibles que lorsqu'il existe des variables/filtres à l'écran comme un flux avec des options de publication populaires et récentes.


Cela donne moins de contrôle aux développeurs front-end pour apporter des modifications de manière indépendante, mais plus de contrôle sur l'utilisation abusive des API pour récupérer des données inutiles après tout son API orientée utilisateur.

Expériences télécommandées

Il est difficile d'exécuter des expériences sur des applications iOS natives. Il faut des redéploiements pour activer ou désactiver les expériences, mais Reddit a configuré l'application de manière à ce que les expériences puissent être contrôlées à distance. Toutes les expériences sont chargées dans une API avec leurs valeurs et leurs statuts. L'application active automatiquement la variante de l'expérience qui lui a été attribuée.

Contrôle des fonctionnalités basées sur les drapeaux

Avec autant d'utilisateurs, d'expériences et de fonctionnalités, il est préférable de les contrôler à distance. Reddit fait un excellent travail en contrôlant ces fonctionnalités à distance.

Appel d'API GetAllDynamicConfigs comme indiqué dans Requestly


À chaque lancement de l'application, celle-ci appelle une API de configuration pour charger plus de 400 variables de configuration. Sur la base de ces variables, elle affiche différentes fonctionnalités et variantes de fonctionnalités.

Réponse de l'API de configuration

Le secret du karma

L'API avec le nom d'opération GetTopKarmaSubreddits obtient la liste des meilleurs subreddits avec les points de karma gagnés dans chacun. Cette API révèle le nombre de commentaires et de karma de publication que nous avons gagnés grâce à notre activité dans chaque subreddit. Je n'ai jamais pu trouver ces informations dans l'interface utilisateur Web et mobile de Reddit.


Karma pour chaque subreddit

Portée de l'amélioration

En lisant les API pour savoir quel type de données elles apportent, j'ai découvert que l'API SubredditFeedElements charge le flux du sous-reddit sélectionné, mais qu'à chaque publication, elle contient un JSON imbriqué d'informations détaillées sur le sous-reddit. Ces informations sont redondantes et peuvent être supprimées pour réduire la charge réseau de l'API et améliorer encore ses performances.


Remarque : l'API SubredditFeedElements est désormais remplacée par l'API SubredditFeedSdui et le problème est résolu.

Utiliser l'IA pour obtenir des informations

J'ai essayé d'utiliser ChatGPT pour obtenir des informations sur les API. J'ai donc créé un fichier avec toutes les API avec leur boucle et leurs réponses. J'ai téléchargé ce fichier sur un CustomGPT afin de pouvoir placer n'importe quel type de requête. Il a donné des informations évidentes, comme le type d'utilisation qu'une API pourrait avoir et la structure de la réponse, mais il y avait beaucoup d'hallucinations, probablement à cause du grand nombre d'API ou parce que je ne suis pas un expert en matière d'invite. Quelques-unes des informations fournies par l'IA :


  1. API GetAllExperimentVariants — De nombreuses expériences ont des noms de « variantes » spécifiques, notamment des options telles que enabled , variant_1 , control_model et one_feed_ph_bridge_new_users . Cette segmentation suggère que Reddit teste des fonctionnalités sur des segments d'utilisateurs particuliers pour déterminer leur impact. Par exemple, l'expérience d2x_avatar_in_comments_loggedin comporte deux variantes, loggedin et loggedout , qui testent potentiellement la fonctionnalité en fonction de l'état d'authentification de l'utilisateur.
  2. API GetAllExperimentVariants — Les expériences incluent hybrid_video_rollout_android_v2 , active_sales et gql_google_maps_integration , qui pointent vers une large gamme de tests de fonctionnalités couvrant la fonctionnalité vidéo, les placements d'annonces, les améliorations de l'interface utilisateur et les intégrations tierces
  3. API GetAccountDetails — La réponse de l'API contient divers champs détaillant l'état du compte de l'utilisateur, tels que isSubredditCreationAllowed , isNameEditable , isPasswordSet et l'état de modérateur de l'utilisateur. En outre, elle inclut suspensionExpiresAt et isSuspended , qui indiquent si un compte est actuellement suspendu ou restreint

Liste des API

Voici la liste des API GraphQL que j'ai étudiées pour comprendre le fonctionnement de Reddit. Il y avait également d'autres API comme l'authentification, la création de rapports, etc. Je ne les ai pas incluses dans cette liste.

Écran

API GraphQL
(nom de l'opération)

Description

Maison

Obtenir toutes les configurations dynamiques

Charge plus de 400 paramètres de configuration en fonction des différentes fonctionnalités de l'application. La configuration est au format clé-valeur typique avec le type de valeur qui peut être un JSON, un float, une chaîne, etc.


Obtenir toutes les variantes d'expérience

La requête contient des informations sur l'application et l'appareil pour attribuer des expériences destinées à l'appareil et à la version de l'application. La réponse contient une liste de toutes les expériences avec l'ID, le nom de l'expérience, la version et le statut.


Obtenir un compte

Charge tous les détails de l'utilisateur connecté.


AccueilFeedSdui

Charge les premiers messages avec un minimum de détails à afficher sur la page d'accueil.


FeedPostDetailsByIds

Précharge les publications à l'aide d'identifiants avec tous les détails, au cas où un utilisateur clique sur la publication.


DiscoverBarRecommandations

Découvrez les données de la barre.


Abonnement UserPremium

Données relatives à l'abonnement premium de l'utilisateur


Obtenir l'éligibilité de l'utilisateur

Obtient l'éligibilité publicitaire de l'utilisateur et ses préférences.


Nombre de badges

Informations sur les badges gagnés par l'utilisateur.




Page de sous-reddit

Canaux Subreddit

Charge tous les détails de base sur la communauté comme la description, les icônes, les compteurs, les types de publication autorisés et les couleurs.


SubredditTaxonomieSujets

Charge la catégorie de la communauté et un texte d'affichage comme si je charge la communauté r/software, il affichera #20 dans Logiciels et applications.


EstInvitePending

Comme son nom l'indique, vérifiez s'il y a une invitation en attente, mais vous ne savez pas exactement quelle invitation.


Canaux Subreddit

Charge les canaux de discussion du sous-reddit, j'ai vérifié de nombreux sous-reddits mais je n'en ai trouvé aucun.


Redditeurs bloqués

Apporte des données si l'utilisateur est bloqué.


Obtenir des modérateurs

Obtient la liste des mods.


RécupérerStructuredStyleAndWidgets

Cette API apporte des informations sur le style, les règles et les détails de la communauté.


FetchRelatedRecommandations de la communauté

Cette API rassemble des communautés associées.


SubredditMise en sourdine

Vérifie si le sous-reddit est désactivé.


Éléments de flux de subreddit

Charge le flux du sous-reddit. Il prend en compte les filtres et les options de mise en page sélectionnés pour le sous-reddit. Il récupère tous les détails sur les publications à afficher dans le flux.


PostInfoByIdComments

Cette demande précharge uniquement les commentaires du premier message.




Page de publication

Obtenir le statut des emojis personnalisés

Cette API a été appelée avec l'ID du sous-reddit et charge le statut des émojis personnalisés sur le sous-reddit. La raison pour laquelle cette API est appelée n'est pas très claire, mais je l'ai vu à de nombreuses reprises. La réponse était isEnabled: false dans tous les cas testés.


Obtenir le statut SubredditAchievementFlairs

Similaire au statut emoji, il prend l'identifiant du sous-reddit et obtient une réponse du type isEnabled: false . Le but de cette opération ne m'est pas clair.


PostInfoByIdComments

Cette API est utilisée pour charger les commentaires de la publication en utilisant l'ID de publication transmis dans la requête.


CommentairesPageAnnonces

Charge l'annonce juste au dessus des commentaires.




Page de profil

RedditorParNom

Charge les détails du profil de l'utilisateur connecté.


Paramètres de PostSet

Nombre de messages à charger.


Sous-reddits GetTopKarma

Obtenez la liste des meilleurs subreddits avec des points de karma sur chaque communauté, cette API révèle combien de commentaires et de karma de publication nous avons gagné grâce à notre activité dans chaque sous-reddit.


Flux de profils d'utilisateurs

Le flux du profil utilisateur contenant des commentaires et des publications.


Trophées UserPublic

Liste des réalisations et trophées gagnés par le nom d'utilisateur passé dans la demande avec identifiant, nom et image à afficher.


Profil de basculement migré

Détails sur le profil de pourboire, je n'ai pas beaucoup utilisé cette fonctionnalité. Il affichait un solde de 0 sur mon profil 😄.

Conclusion

J’aimerais souligner quelques points en conclusion de cette expérience de démolition.

  • Les API de Reddit ne sont pas très rapides, elles utilisent plutôt le préchargement pour offrir une meilleure expérience utilisateur.
  • Le travail des API n'est jamais terminé, même les ingénieurs de Reddit ont du travail à faire pour l'améliorer encore.
  • Conserver les configurations d'applications et d'expériences à distance peut donner un bon contrôle sur l'expérience utilisateur.
  • Les ingénieurs de Requestly ont fait un excellent travail en affichant le nom de l'opération avec chaque requête GraphQL, rendant ainsi la vie des développeurs beaucoup plus facile.