paint-brush
از بین بردن برنامه iOS Reddit - اطلاعات بینش در مورد API ها، عملکرد، امنیت و آزمایش های A/Bتوسط@hackercm3ebf0le00003b7n7h2a5k7d
تاریخ جدید

از بین بردن برنامه iOS Reddit - اطلاعات بینش در مورد API ها، عملکرد، امنیت و آزمایش های A/B

توسط 7m2024/11/26
Read on Terminal Reader

خیلی طولانی؛ خواندن

کنجکاوی من من را به تجزیه و تحلیل پشت صحنه عملکرد برنامه Reddit iOS سوق داد و بینش خوبی در مورد Reddit APIها نشان داد.
featured image - از بین بردن برنامه iOS Reddit - اطلاعات بینش در مورد API ها، عملکرد، امنیت و آزمایش های A/B
undefined HackerNoon profile picture
0-item

من تجربه برنامه iOS Reddit را بهتر از نسخه وب یافتم، بنابراین به فکر افتادم که بررسی کنم چگونه داده ها را با این سرعت بارگیری می کند. در اینجا حذف برنامه iOS Reddit است.


در اینجا برخی از نکات برجسته وجود دارد:

  • از احراز هویت مبتنی بر توکن استفاده می کند.
  • تقریباً برای همه چیز از پیکربندی و آزمایش‌ها گرفته تا اطلاعات ارسالی از GraphQL API استفاده می‌کند.
  • با استفاده از یک API به نام w3-reporting، عملکرد سیستم API خود را همانطور که توسط کاربران تجربه شده است، نظارت می کند.
  • در بیشتر فراخوانی‌های GraphQL API فقط نام عملیات بدون متغیر ارسال می‌شود، من فرض می‌کنم که آنها از میان‌افزار برای انتزاع پیکربندی متغیرها از front-end استفاده می‌کنند. یک سرویس پشتیبان در حال پر کردن اطلاعات بر اساس نام عملیات است.
  • Reddit از Web Socket برای ویژگی نظرات زنده استفاده می کند.


در اینجا تجزیه و تحلیل دقیق فراخوان های API است. من از برنامه Desktop Requestly برای رهگیری برنامه iOS Reddit استفاده کردم، دستورالعمل‌های راه‌اندازی در اینجا ارائه شده است.

تکنولوژی مورد استفاده

برنامه Reddit با ایجاد شده است

  • برنامه iOS Reddit از API های GraphQL برای بارگیری تمام محتوا استفاده می کند.
  • احراز هویت مبتنی بر توکن برای اعتبارسنجی کاربران استفاده می شود.
  • نظارت بر عملکرد با گزارش عملکرد API در انتهای کاربر.
  • نظر دادن زنده با استفاده از WebSocket پشتیبانی می شود.
  • پیکربندی پویا برای کنترل از راه دور رفتار برنامه بدون استقرار نسخه های جدید.
  • آزمایش‌های پویا برای کنترل آزمایش‌ها از راه دور، بدون نیاز به استقرار جدید برای تغییر وضعیت آزمایش.

UX بهتر با پیش بارگیری

سوال اصلی من این بود که چگونه برنامه به این سرعت عمل می کند با بررسی پاسخ FeedPostDetailsByIds API پاسخ داده شد. این API در صفحه اصلی با شناسه پست‌های نشان داده شده فراخوانی می‌شود و همراه با اطلاعات دقیقی است که پس از کلیک روی پست نشان داده می‌شود. این پیش بارگذاری پست های برتر به نمایش فوری صفحه جزئیات پست بدون هیچ بارگیری کمک کرد.


  • پست های پیش بارگذاری در فید نشان داده می شوند.
  • زمان پاسخگویی APIها نیز بسیار سریع است.

امنیت GraphQL APIs

پرس و جوهای GraphQL شامل داده ها و ساختار پاسخ مورد نیاز است. نام عملیات عموما اختیاری است. اکثر API های Reddit فقط نام عملیات در جستارها دارند و متغیرها فقط زمانی در دسترس هستند که متغیرها/فیلترهایی مانند فید با گزینه های داغ و آخرین پست وجود داشته باشد.


این امر به توسعه دهندگان فرانت اند کنترل کمتری می دهد تا بتوانند به طور مستقل تغییراتی ایجاد کنند، اما کنترل بیشتری بر استفاده نادرست از API ها برای واکشی داده های غیر ضروری پس از تمام API های کاربر می دهد.

آزمایش های کنترل از راه دور

اجرای آزمایش‌ها بر روی برنامه‌های اصلی iOS دشوار است و برای فعال یا غیرفعال کردن آزمایش‌ها نیاز به استقرار مجدد دارد، اما Reddit برنامه را به گونه‌ای تنظیم کرده است که آزمایش‌ها را می‌توان از راه دور کنترل کرد. همه آزمایش‌ها به همراه مقادیر و وضعیت‌هایشان در یک API بارگذاری می‌شوند. برنامه به طور خودکار نوع آزمایشی را که اختصاص داده است فعال می کند.

کنترل ویژگی های مبتنی بر پرچم

با این همه کاربر، آزمایش و ویژگی، بهتر است آنها را از راه دور کنترل کنید. Reddit کار بسیار خوبی برای کنترل این ویژگی ها از راه دور انجام می دهد.

همانطور که در Requestly نشان داده شده است، GetAllDynamicConfigs API را فراخوانی می کند


در هر راه اندازی برنامه، یک API پیکربندی برای بارگیری بیش از 400 متغیر پیکربندی فراخوانی می کند. بر اساس این متغیرها، ویژگی ها و انواع مختلفی از ویژگی ها را نشان می دهد.

پاسخ API را پیکربندی می کند

راز کارماس

API با نام عملیات GetTopKarmaSubreddits فهرست زیرمجموعه های برتر را با امتیاز کارما کسب می کند. این API نشان می‌دهد که در هر زیر ردیت چه تعداد نظر و کارما از فعالیت‌های خود به دست آورده‌ایم. من هرگز نتوانستم این اطلاعات را در رابط کاربری وب و موبایل Reddit پیدا کنم.


کارما برای هر Subreddit

دامنه بهبود

در حین خواندن APIها برای یافتن نوع داده‌هایی که به ارمغان می‌آورد، متوجه شدم SubredditFeedElements API فید زیر reddit انتخاب شده را بارگیری می‌کند، اما با هر پست، یک JSON تودرتو از اطلاعات جزئی reddit دارد. این اطلاعات اضافی هستند و می توانند برای کاهش بار شبکه API و بهبود عملکرد آن حذف شوند.


توجه: SubredditFeedElements API اکنون با SubredditFeedSdui API جایگزین شده و مشکل برطرف شده است.

از هوش مصنوعی برای Insights استفاده کنید

من سعی کردم از ChatGPT برای دریافت اطلاعاتی از APIها استفاده کنم. بنابراین یک فایل با تمام APIها با curl و پاسخ های آنها در آن ایجاد کرد. این فایل را در یک CustomGPT آپلود کردم تا بتوانم هر نوع درخواستی را قرار دهم. این اطلاعات بینش هایی را ارائه داد که مشهود بود مانند نوع استفاده از یک API و ساختار پاسخ، اما توهم زیادی داشت، به احتمال زیاد به دلیل تعداد زیادی API یا من متخصص در این امر نیستم. برخی از بینش های ارائه شده توسط AI:


  1. GetAllExperimentVariants API — بسیاری از آزمایش‌ها دارای نام‌های «نوعی» خاص هستند، از جمله گزینه‌هایی مانند enabled ، variant_1 ، control_model ، و one_feed_ph_bridge_new_users . این تقسیم بندی نشان می دهد که Reddit در حال آزمایش ویژگی ها بر روی بخش های خاص کاربر برای تعیین تأثیر آنها است. به عنوان مثال، آزمایش d2x_avatar_in_comments_loggedin دارای دو نوع است، loggedin و loggedout که به طور بالقوه این ویژگی را بر اساس وضعیت احراز هویت کاربر آزمایش می کند.
  2. GetAllExperimentVariants API — آزمایش‌ها شامل hybrid_video_rollout_android_v2 ، active_sales ، و gql_google_maps_integration هستند که به طیف گسترده‌ای از تست‌های ویژگی شامل عملکرد ویدیو، قرار دادن تبلیغات، بهبود رابط کاربری، و ادغام شخص ثالث اشاره می‌کنند.
  3. GetAccountDetails API — پاسخ API حاوی فیلدهای مختلفی است که وضعیت حساب کاربر را شرح می دهد، مانند isSubredditCreationAllowed ، isNameEditable ، isPasswordSet ، و وضعیت ناظم کاربر. علاوه بر این، شامل suspensionExpiresAt و isSuspended می شود که نشان می دهد یک حساب در حال حاضر به حالت تعلیق یا محدود شده است

لیست API ها

لیستی از API های GraphQL وجود دارد که من برای درک نحوه عملکرد Reddit مطالعه کردم. برخی از APIهای دیگر نیز وجود داشت، مانند احراز هویت، گزارش‌گیری و غیره. من آنها را در این لیست قرار ندادم.

صفحه نمایش

GraphQL API
(نام عملیات)

توضیحات

صفحه اصلی

GetAllDynamicConfigs

بیش از 400 پارامتر پیکربندی را بارگیری می کند که بر اساس آنها ویژگی های مختلف برنامه کار می کند. پیکربندی در قالب مقدار کلید معمولی همراه با نوع مقدار است که می تواند JSON، float، رشته و غیره باشد.


GetAllExperimentVariants

درخواست حاوی اطلاعاتی درباره برنامه و دستگاه برای تخصیص آزمایش‌های مربوط به دستگاه و نسخه برنامه است. پاسخ شامل فهرستی از تمام آزمایش‌ها با شناسه، نام آزمایش، نسخه و وضعیت است.


GetAccount

تمام جزئیات کاربر وارد شده را بارگیری می کند.


HomeFeedSdui

چند پست اول را با حداقل جزئیات برای نمایش در صفحه اصلی بارگیری می کند.


FeedPostDetailsByIds

در صورتی که کاربر روی پست کلیک کند، پست ها را با استفاده از شناسه با تمام جزئیات بارگذاری می کند.


DiscoverBarRecommendations

داده های نوار را کشف کنید.


اشتراک UserPremium

داده های مربوط به اشتراک حق بیمه کاربر


GetUserAdEligibility

واجد شرایط بودن آگهی کاربر و هر اولویت را دریافت می کند.


BadgeCounts

اطلاعات در مورد نشان های به دست آمده توسط کاربر.




صفحه Subreddit

SubredditChannels

همه جزئیات اساسی درباره انجمن مانند توضیحات، نمادها، شمارنده‌ها، انواع پست‌های مجاز و رنگ‌ها را بارگیری می‌کند.


SubredditTaxonomyTopics

دسته انجمن و یک متن نمایشگر را بارگیری می کند، مانند اینکه اگر انجمن را/نرم افزار بارگیری کنم، شماره 20 را در نرم افزار و برنامه ها نشان می دهد.


IsInvitePending

همانطور که از نام آن پیداست، دعوت‌نامه‌ای در انتظار را بررسی کنید، اما مطمئن نیستید که دقیقاً کدام دعوت است.


SubredditChannels

کانال‌های چت ساب‌ردیت را بار می‌کند، بسیاری از ساب‌ردیت‌ها را بررسی کردم اما نتوانستم هیچ کدام را پیدا کنم.


BlockedRedditors

در صورت مسدود شدن کاربر، داده را می آورد.


GetModerators

لیست مدها را دریافت می کند.


FetchStructuredStyleAndWidgets

این API اطلاعاتی در مورد سبک، قوانین و جزئیات جامعه به ارمغان می آورد.


FetchRelatedCommunityRecommendations

این API جوامع مرتبط را به ارمغان می آورد.


Subreddit Muting

بررسی می‌کند که آیا Sub reddit خاموش است یا خیر.


SubredditFeedElements

فید sub-reddit را بارگیری می کند. فیلترها و گزینه‌های طرح‌بندی انتخاب‌شده برای reddit فرعی را می‌گیرد. تمام جزئیات مربوط به پست ها را برای نمایش در فید به ارمغان می آورد.


PostInfoByIdComments

این درخواست فقط نظرات اولین پست را از قبل بارگذاری می کند.




صفحه پست

GetCustomEmojisStatus

این API با شناسه sub-reddit فراخوانی شد و وضعیت ایموجی های سفارشی را در sub-reddit بارگیری می کند. دلیل نامگذاری این API خیلی واضح نیست، اما من بارها آن را دیده ام. پاسخ در تمام مواردی که آزمایش شد، isEnabled: false .


GetSubredditAchievementFlairsStatus

مشابه وضعیت ایموجی، شناسه زیر ردیت را می گیرد و به صورت isEnabled: false پاسخ می گیرد. هدف از این کار برای من روشن نیست.


PostInfoByIdComments

این API برای بارگیری نظرات پست با استفاده از شناسه پست ارسال شده در درخواست استفاده می شود.


CommentsPageAds

آگهی را درست بالای نظرات بارگیری می کند.




صفحه نمایه

RedditorByName

جزئیات نمایه کاربری وارد شده را بارگیری می کند.


PostSetSettings

تعداد پست برای بارگذاری


GetTopKarmaSubreddits

فهرستی از زیرمجموعه های برتر با امتیاز کارما را در هر انجمن دریافت کنید، این API نشان می دهد که چه تعداد نظر و پست کارما از فعالیت خود در هر زیر ردیت به دست آورده ایم.


UserProfileFeed

فید نمایه کاربر حاوی نظرات و پست‌ها.


UserPublicTrophies

فهرست دستاوردها و تروفی های کسب شده توسط نام کاربری که در درخواست ارسال شده با شناسه، نام و تصویر برای نمایش داده می شود.


TippingProfileMigrated

جزئیات مربوط به نمایه انعام، از این ویژگی زیاد استفاده نشده است. تو پروفایلم 0 موجودی نشون داد 😄.

نتیجه گیری

من می خواهم در پایان این آزمایش تخریب چند نکته را بیان کنم.

  • API های Reddit خیلی سریع نیستند، در عوض از پیش بارگذاری برای ارائه تجربه کاربری بهتر استفاده می کنند.
  • کار API ها هرگز کامل نمی شود، حتی مهندس Reddit باید برای بهبود بیشتر آن کار انجام دهند.
  • حفظ تنظیمات برنامه و آزمایش از راه دور می تواند کنترل خوبی بر تجربه کاربر داشته باشد.
  • مهندسان Requestly در نشان دادن نام عملیات با هر درخواست GraphQL کار بزرگی انجام دادند و زندگی توسعه دهندگان را بسیار آسان‌تر کردند.