paint-brush
Rušení aplikace Reddit pro iOS – statistiky o API, výkonu, zabezpečení a experimentech A/Bpodle@hackercm3ebf0le00003b7n7h2a5k7d
Nová historie

Rušení aplikace Reddit pro iOS – statistiky o API, výkonu, zabezpečení a experimentech A/B

podle 7m2024/11/26
Read on Terminal Reader

Příliš dlouho; Číst

Moje zvědavost mě přivedla k analýze zákulisí fungování aplikace Reddit iOS a odhalila několik dobrých postřehů o rozhraních Reddit API.
featured image - Rušení aplikace Reddit pro iOS – statistiky o API, výkonu, zabezpečení a experimentech A/B
undefined HackerNoon profile picture
0-item

Zjistil jsem, že aplikace Reddit pro iOS je lepší než webová verze, takže mě napadlo zkontrolovat, jak rychle načítá data. Zde je zrušení aplikace Reddit pro iOS.


Zde jsou některé důležité body:

  • Používá autentizaci založenou na tokenech.
  • Využívá rozhraní GraphQL API pro téměř vše od konfigurace a experimentů po zveřejňování informací.
  • Monitoruje výkon svého systému API, jak jej zažívají jeho uživatelé, pomocí rozhraní API s názvem w3-reporting.
  • Ve většině volání GraphQL API je předán pouze název operace bez proměnných, předpokládám, že používají middleware k abstrahování konfigurace proměnných z front-endu. Backendová služba vyplňuje informace na základě názvu operace.
  • Reddit používá Web Socket pro funkci živých komentářů.


Zde je podrobný popis volání API. K zachycení aplikace Reddit pro iOS jsem použil desktopovou aplikaci Requestly , pokyny k nastavení jsou uvedeny zde .

Použitá technologie

Aplikace Reddit je vytvořena pomocí

  • Aplikace Reddit pro iOS používá k načtení veškerého obsahu rozhraní GraphQL API.
  • K ověřování uživatelů se používá autentizace založená na tokenech.
  • Sledování výkonu hlášením výkonu API na straně uživatele.
  • Živé komentování je podporováno pomocí WebSocket.
  • Dynamická konfigurace pro vzdálené ovládání chování aplikace bez nasazování nových verzí.
  • Dynamické experimenty pro vzdálené ovládání experimentů, které nevyžadují nové nasazení ke změně stavu experimentu.

Lepší uživatelské rozhraní s preloadingem

Hlavní otázka, kterou jsem měl, byla, jak aplikace funguje tak rychle, byla zodpovězena při kontrole odpovědi FeedPostDetailsByIds API. Toto API se volá na domovské obrazovce s ID zobrazených příspěvků a přichází s podrobnými informacemi, které se zobrazí po kliknutí na příspěvek. Toto předběžné načtení horních příspěvků pomohlo k okamžitému zobrazení obrazovky s podrobnostmi příspěvku bez jakéhokoli nakladače.


  • Předběžné načítání příspěvků se zobrazuje ve zdroji.
  • Doba odezvy API je také velmi rychlá.

Zabezpečení rozhraní GraphQL API

Dotazy GraphQL se skládají z dat a struktury potřebné odpovědi. Název operace je obecně volitelný. Většina rozhraní Reddit API má v dotazech pouze názvy operací a proměnné jsou dostupné pouze tehdy, když jsou na obrazovce proměnné/filtry, jako je zdroj s horkými a nejnovějšími možnostmi příspěvků.


To poskytuje vývojářům frontendu menší kontrolu, aby mohli provádět změny nezávisle, ale větší kontrolu nad zneužitím rozhraní API k načítání nepotřebných dat po všech jeho rozhraních API pro uživatele.

Dálkově ovládané experimenty

Spouštění experimentů na nativních aplikacích pro iOS je obtížné, je třeba je znovu nasadit, aby bylo možné experimenty povolit nebo zakázat, ale Reddit nastavil aplikaci takovým způsobem, že experimenty lze ovládat na dálku. Všechny experimenty se načítají do rozhraní API spolu s jejich hodnotami a stavy. Aplikace automaticky aktivuje variantu experimentu, kterou přiřadila.

Ovládání funkcí na základě příznaku

S tolika uživateli, experimenty a funkcemi je lepší je ovládat na dálku. Reddit odvádí skvělou práci při ovládání těchto funkcí na dálku.

GetAllDynamicConfigs API volání, jak je znázorněno v Requestly


Při každém spuštění aplikace zavolá konfigurační API pro načtení více než 400 konfiguračních proměnných. Na základě těchto proměnných ukazuje různé rysy a varianty vlastností.

Odpověď API konfigurace

Tajemství karmy

API s názvem operace GetTopKarmaSubreddits získá seznam nejlepších subredditů s karma body získanými v každém z nich. Toto API odhaluje, kolik komentářů a post karmy jsme získali z naší činnosti v každém dílčím redditu. Tyto informace jsem nikdy nemohl najít ve webovém a mobilním uživatelském rozhraní Reddit.


Karma pro každý Subreddit

Rozsah vylepšení

Při čtení rozhraní API, abych zjistil, jaký typ dat přináší, jsem zjistil, že SubredditFeedElements API načítá zdroj vybraného sub-redditu, ale s každým příspěvkem má vnořený JSON s podrobnými informacemi o sub-reddit. Tyto informace jsou nadbytečné a lze je odstranit, aby se snížilo zatížení sítě API a dále se zlepšil jeho výkon.


Poznámka: SubredditFeedElements API je nyní nahrazeno SubredditFeedSdui API a problém je vyřešen.

Použijte AI pro statistiky

Zkusil jsem použít ChatGPT, abych získal nějaké postřehy z API. Vytvořil tedy soubor se všemi API s jejich curl a jejich odpověďmi v něm. Nahrál jsem tento soubor do CustomGPT, abych mohl zadat jakýkoli typ dotazu. Poskytlo to několik poznatků, které byly zřejmé, jako jaký typ použití by API mohlo mít a strukturu odpovědi, ale hodně to halucinovalo, s největší pravděpodobností kvůli spoustě API nebo nejsem odborník na nabádání. Některé poznatky poskytnuté AI:


  1. GetAllExperimentVariants API – Mnoho experimentů má specifické názvy „variant“, včetně možností jako enabled , variant_1 , control_model a one_feed_ph_bridge_new_users . Tato segmentace naznačuje, že Reddit testuje funkce na konkrétních uživatelských segmentech, aby zjistil jejich dopad. Například experiment d2x_avatar_in_comments_loggedin má dvě varianty, loggedin a loggedout , které potenciálně testují funkci na základě stavu ověření uživatele.
  2. GetAllExperimentVariants API – Experimenty zahrnují hybrid_video_rollout_android_v2 , active_sales a gql_google_maps_integration , které poukazují na širokou škálu testů funkcí zahrnujících funkce videa, umístění reklam, vylepšení uživatelského rozhraní a integrace třetích stran.
  3. GetAccountDetails API — Odpověď API obsahuje různá pole s podrobnostmi o stavu účtu uživatele, jako je isSubredditCreationAllowed , isNameEditable , isPasswordSet a stav moderátora uživatele. Kromě toho zahrnuje suspensionExpiresAt a isSuspended , které udávají, zda je účet aktuálně pozastaven nebo omezen.

Seznam API

Existuje seznam GraphQL API, které jsem studoval, abych pochopil, jak funguje Reddit. Existovala některá další API, stejně jako autentizace, reporting atd. Nezahrnul jsem je do tohoto seznamu.

Obrazovka

GraphQL API
(název operace)

Popis

Domov

GetAllDynamicConfigs

Načte více než 400 konfiguračních parametrů, na základě kterých fungují různé funkce aplikace. Konfigurace je v typickém formátu klíčové hodnoty spolu s typem hodnoty, kterou může být JSON, float, řetězec atd.


GetAllExperimentVariants

Požadavek obsahuje informace o aplikaci a zařízení k přiřazení experimentů určených pro zařízení a verzi aplikace. Odpověď obsahuje seznam všech experimentů s id, název experimentu, verze a stav.


GetAccount

Načte všechny podrobnosti o přihlášeném uživateli.


HomeFeedSdui

Načte prvních několik příspěvků s minimálními podrobnostmi, které se zobrazí na domovské stránce.


FeedPostDetailsByIds

Předem načte příspěvky pomocí ID se všemi podrobnostmi pro případ, že uživatel na příspěvek klikne.


DiscoverBarRecommendations

Objevte data lišty.


Předplatné UserPremium

Údaje související s uživatelským prémiovým předplatným


GetUserAdEligibility

Získá způsobilost uživatele pro reklamy a případné preference.


BadgeCounts

Informace o odznakech, které uživatel získal.




Stránka Subreddit

SubredditChannels

Načte všechny základní podrobnosti o komunitě, jako je popis, ikony, počítadla, povolené typy příspěvků a barvy.


SubredditTaxonomyTopics

Načte kategorii komunity a zobrazí text, jako když načtu komunitu r/software, zobrazí se #20 v Software & Apps.


IsInvitePending

Jak název napovídá, zkontrolujte nevyřízenou pozvánku, ale nejste si jisti, která pozvánka přesně.


SubredditChannels

Načte chatovací kanály sub-redditu, zkontroloval jsem mnoho subredditů, ale žádné jsem nenašel.


BlockedRedditors

Přináší data, pokud je uživatel blokován.


GetModerators

Získá seznam modů.


FetchStructuredStyleAndWidgets

Toto API přináší informace o stylu, pravidlech a detailech komunity.


FetchRelatedCommunityRecommendations

Toto API přináší související komunity.


SubredditMuting

Zkontroluje, zda je sub reddit ztlumený.


SubredditFeedElements

Načte zdroj sub-reddit. Přebírá možnosti filtrů a rozložení vybrané pro dílčí reddit. Přináší všechny podrobnosti o příspěvcích, které se mají zobrazit ve zdroji.


Komentáře PostInfoById

Tento požadavek předem načte pouze komentáře prvního příspěvku.




Stránka příspěvku

GetCustomEmojisStatus

Toto API bylo voláno s id sub-reddit a načítá stav vlastních emotikonů na sub-reddit. Není příliš jasné, proč se toto API nazývá, ale viděl jsem to při mnoha příležitostech. Odpověď byla isEnabled: false ve všech testovaných případech.


GetSubredditAchievementFlairsStatus

Podobně jako stav emotikonu převezme sub-reddit id a dostane odpověď isEnabled: false . Účel toho mi není jasný.


Komentáře PostInfoById

Toto rozhraní API se používá k načtení komentářů k příspěvku pomocí ID příspěvku předaného v požadavku.


CommentsPageAds

Načte reklamu těsně nad komentáře.




Stránka profilu

RedditorByName

Načte detaily profilu přihlášeného uživatele.


PostSetSettings

Počet příspěvků k načtení.


GetTopKarmaSubreddits

Získejte seznam nejlepších subredditů s body karmy v každé komunitě, toto API odhaluje, kolik komentářů a post karmy jsme získali z naší aktivity v každém sub-redditu.


UserProfileFeed

Zdroj pro uživatelský profil obsahující komentáře a příspěvky.


UserPublicTrophy

Seznam úspěchů a trofejí získaných uživatelským jménem předaným v žádosti s ID, jménem a obrázkem, které se mají zobrazit.


TippingProfileMigred

Podrobnosti o profilu sklápění, tuto funkci jsem příliš nevyužíval. Na mém profilu to ukazovalo 0 zůstatek 😄.

Závěr

Na závěr tohoto experimentu bych rád uvedl několik poznámek.

  • Rozhraní API Redditu nejsou příliš rychlá, místo toho používají předběžné načítání, aby poskytovaly lepší uživatelský zážitek.
  • Práce s rozhraními API není nikdy dokončena, dokonce i inženýr Reddit má co dělat, aby ji dále vylepšil.
  • Udržování konfigurací aplikací a experimentů na dálku může poskytnout dobrou kontrolu nad uživatelským zážitkem.
  • Inženýři společnosti Requestly odvedli skvělou práci při zobrazování názvu operace s každým požadavkem GraphQL, což vývojářům výrazně usnadnilo život.