من تجربه برنامه iOS Reddit را بهتر از نسخه وب یافتم، بنابراین به فکر افتادم که بررسی کنم چگونه داده ها را با این سرعت بارگیری می کند. در اینجا حذف برنامه iOS Reddit است.
در اینجا برخی از نکات برجسته وجود دارد:
در اینجا تجزیه و تحلیل دقیق فراخوان های API است. من از برنامه Desktop Requestly برای رهگیری برنامه iOS Reddit استفاده کردم، دستورالعملهای راهاندازی در اینجا ارائه شده است.
برنامه Reddit با ایجاد شده است
سوال اصلی من این بود که چگونه برنامه به این سرعت عمل می کند با بررسی پاسخ FeedPostDetailsByIds API پاسخ داده شد. این API در صفحه اصلی با شناسه پستهای نشان داده شده فراخوانی میشود و همراه با اطلاعات دقیقی است که پس از کلیک روی پست نشان داده میشود. این پیش بارگذاری پست های برتر به نمایش فوری صفحه جزئیات پست بدون هیچ بارگیری کمک کرد.
پرس و جوهای GraphQL شامل داده ها و ساختار پاسخ مورد نیاز است. نام عملیات عموما اختیاری است. اکثر API های Reddit فقط نام عملیات در جستارها دارند و متغیرها فقط زمانی در دسترس هستند که متغیرها/فیلترهایی مانند فید با گزینه های داغ و آخرین پست وجود داشته باشد.
این امر به توسعه دهندگان فرانت اند کنترل کمتری می دهد تا بتوانند به طور مستقل تغییراتی ایجاد کنند، اما کنترل بیشتری بر استفاده نادرست از API ها برای واکشی داده های غیر ضروری پس از تمام API های کاربر می دهد.
اجرای آزمایشها بر روی برنامههای اصلی iOS دشوار است و برای فعال یا غیرفعال کردن آزمایشها نیاز به استقرار مجدد دارد، اما Reddit برنامه را به گونهای تنظیم کرده است که آزمایشها را میتوان از راه دور کنترل کرد. همه آزمایشها به همراه مقادیر و وضعیتهایشان در یک API بارگذاری میشوند. برنامه به طور خودکار نوع آزمایشی را که اختصاص داده است فعال می کند.
با این همه کاربر، آزمایش و ویژگی، بهتر است آنها را از راه دور کنترل کنید. Reddit کار بسیار خوبی برای کنترل این ویژگی ها از راه دور انجام می دهد.
در هر راه اندازی برنامه، یک API پیکربندی برای بارگیری بیش از 400 متغیر پیکربندی فراخوانی می کند. بر اساس این متغیرها، ویژگی ها و انواع مختلفی از ویژگی ها را نشان می دهد.
API با نام عملیات GetTopKarmaSubreddits
فهرست زیرمجموعه های برتر را با امتیاز کارما کسب می کند. این API نشان میدهد که در هر زیر ردیت چه تعداد نظر و کارما از فعالیتهای خود به دست آوردهایم. من هرگز نتوانستم این اطلاعات را در رابط کاربری وب و موبایل Reddit پیدا کنم.
در حین خواندن APIها برای یافتن نوع دادههایی که به ارمغان میآورد، متوجه شدم SubredditFeedElements
API فید زیر reddit انتخاب شده را بارگیری میکند، اما با هر پست، یک JSON تودرتو از اطلاعات جزئی reddit دارد. این اطلاعات اضافی هستند و می توانند برای کاهش بار شبکه API و بهبود عملکرد آن حذف شوند.
توجه: SubredditFeedElements
API اکنون با SubredditFeedSdui
API جایگزین شده و مشکل برطرف شده است.
من سعی کردم از ChatGPT برای دریافت اطلاعاتی از APIها استفاده کنم. بنابراین یک فایل با تمام APIها با curl و پاسخ های آنها در آن ایجاد کرد. این فایل را در یک CustomGPT آپلود کردم تا بتوانم هر نوع درخواستی را قرار دهم. این اطلاعات بینش هایی را ارائه داد که مشهود بود مانند نوع استفاده از یک API و ساختار پاسخ، اما توهم زیادی داشت، به احتمال زیاد به دلیل تعداد زیادی API یا من متخصص در این امر نیستم. برخی از بینش های ارائه شده توسط AI:
GetAllExperimentVariants
API — بسیاری از آزمایشها دارای نامهای «نوعی» خاص هستند، از جمله گزینههایی مانند enabled
، variant_1
، control_model
، و one_feed_ph_bridge_new_users
. این تقسیم بندی نشان می دهد که Reddit در حال آزمایش ویژگی ها بر روی بخش های خاص کاربر برای تعیین تأثیر آنها است. به عنوان مثال، آزمایش d2x_avatar_in_comments_loggedin
دارای دو نوع است، loggedin
و loggedout
که به طور بالقوه این ویژگی را بر اساس وضعیت احراز هویت کاربر آزمایش می کند.GetAllExperimentVariants
API — آزمایشها شامل hybrid_video_rollout_android_v2
، active_sales
، و gql_google_maps_integration
هستند که به طیف گستردهای از تستهای ویژگی شامل عملکرد ویدیو، قرار دادن تبلیغات، بهبود رابط کاربری، و ادغام شخص ثالث اشاره میکنند.GetAccountDetails
API — پاسخ API حاوی فیلدهای مختلفی است که وضعیت حساب کاربر را شرح می دهد، مانند isSubredditCreationAllowed
، isNameEditable
، isPasswordSet
، و وضعیت ناظم کاربر. علاوه بر این، شامل suspensionExpiresAt
و isSuspended
می شود که نشان می دهد یک حساب در حال حاضر به حالت تعلیق یا محدود شده استلیستی از 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 خیلی واضح نیست، اما من بارها آن را دیده ام. پاسخ در تمام مواردی که آزمایش شد، |
| GetSubredditAchievementFlairsStatus | مشابه وضعیت ایموجی، شناسه زیر ردیت را می گیرد و به صورت isEnabled: false پاسخ می گیرد. هدف از این کار برای من روشن نیست. |
| PostInfoByIdComments | این API برای بارگیری نظرات پست با استفاده از شناسه پست ارسال شده در درخواست استفاده می شود. |
| CommentsPageAds | آگهی را درست بالای نظرات بارگیری می کند. |
| | |
صفحه نمایه | RedditorByName | جزئیات نمایه کاربری وارد شده را بارگیری می کند. |
| PostSetSettings | تعداد پست برای بارگذاری |
| GetTopKarmaSubreddits | فهرستی از زیرمجموعه های برتر با امتیاز کارما را در هر انجمن دریافت کنید، این API نشان می دهد که چه تعداد نظر و پست کارما از فعالیت خود در هر زیر ردیت به دست آورده ایم. |
| UserProfileFeed | فید نمایه کاربر حاوی نظرات و پستها. |
| UserPublicTrophies | فهرست دستاوردها و تروفی های کسب شده توسط نام کاربری که در درخواست ارسال شده با شناسه، نام و تصویر برای نمایش داده می شود. |
| TippingProfileMigrated | جزئیات مربوط به نمایه انعام، از این ویژگی زیاد استفاده نشده است. تو پروفایلم 0 موجودی نشون داد 😄. |
من می خواهم در پایان این آزمایش تخریب چند نکته را بیان کنم.