اقبال شیراسب
اقبال شیراسب
خواندن ۹ دقیقه·۳ سال پیش

جدال برنامه نویسان و دیجیکالا. کدام یک راست میگویند؟

ماجرا از کجا شروع شد؟

دیجی‌کالا طی روزهای گذشته به مناسبت بلک فرایدی یا همان جمعه سیاه، کمپینی را با نام «شکار گنج» به راه‌انداخت که با واکنش‌های زیادی در شبکه‌های اجتماعی مطرح شد. در این کمپین، طی ساعات خاص اعلام شده، کد تخفیفی در تصویر یکی از کالاهای لیست منتخب اعلام شده پنهان و کاربران دیجی‌کالا بایستی آن را کشف می‌کردند. هر شخصی که سریع‌تر از این کد استفاده می‌کرد می‌توانست از تخفیف ۹۹ درصدی روی کالا بهره‌مند شود. اما این تنها شروع یک ماجرا بود چرا که حواشی این کمپین آن قدر زیاد بود که صداقت دیجی‌کالا را تا حدی زیر سوال برد.





هدف دیجیکالا از این کمپین چه بود؟


شکار گنج یک کمپین مبتنی بر گیمیفیکیشن (Gamification) بود که با قرار دادن المان های بازی در یک محیط غیر بازی مثل یک فروشگاه اینترنتی، کاربران را برای انجام یک سری کار ها تهییج می‌کرد. در واقع می‌توان گفت این یک بازی برد برد است. هم برای کاربران و هم برای دیجی‌کالا.

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


اشکال کار کجا بود؟

بگذارید برگردیم به نقطه اول ماجرا یعنی تعریف کمپین. در این کمپین، طی ساعات خاص اعلام شده، کد تخفیفی در تصویر یکی از کالاهای لیست منتخب اعلام شده پنهان و کاربران دیجی‌کالا بایستی آن را کشف می‌کردند. یعنی برای مثال بین 1650محصول دیجیکالا و مجموعا 17230 عکس موجود، یک عکس، حاوی یک کد تخفیف 99 درصدی است. حل این مسئله شاید برای انسان، آنچنان ساده نباشد اما برای یک قطع کد کامپیوتری بسیار آسان به نظر می‌رسد. به طوری که اگر از کل بهینه سازی‌ها نیز صرف نظر کنیم و صرفا تمام عکس های موجود در سایت را دریافت کنیم و آن ها را با عکس های بعد شروع کمپین مقایسه کنیم، قطعا کد تخفیف را پیدا خواهیم کرد . حال سوال اینجاست که چرا یک کمپین باید به نحوی طراحی شود که به این سادگی با تکه کد ساده‌‌ای قابل دور زدن باشد؟

حل مسئله از آنچه فکر میکنید هم ساده تر بود!

آرمین شیرزاد یکی از برنامه نویسانی که برای حل این مسئله دست به کد شده بود، در صفحه شخصی خود این طور روش خود را بازگو می‌کند:

اسم عکس رو نگاه کردم، یه Hash بود و یک عدد
4003f5e3e481c7bc8a32635226985cb4ddc85eda_1637909121.jpg
این اولین نشانه بود، عکسای بیشتری رو چک کردم، هر چی عکس جدید تر بود این عدد "1637909121" هم بزرگتر بود

این جمله برای افراد فنی، به این معنی است که دیجیکالا به دلیل سیستم کشینگ (Caching) قوی که در سایت خود دارد، برایش آنچنان ساده نیست که یک عکس را با همان آدرس، با عکس دیگری جا به جا کند.

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

و باز هم پیدا کردن عکس، ساده تر از این حرف‌ها بود، آرمین در ادامه می‌گوید:

قسمت دومش رو فکر میکردیم که یه عدده که پشت سر هم دونه دونه اضافه میشه، ولی در واقع Unix Time بود

این جمله یعنی آن که اگر عدد 1637909121 که بعد از قسمت اول آدرس آمده است را از Unix به فرمت اصلی زمان برگردانیم، به ساعت آپلود عکس می‌رسیم!

پس فرضیه این بوده است که عکس های کد دار، همان روز و در همان ساعت ها آپلود شده اند!

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


این که برای این مسابقه همچنان از همین سیستم آپلود استفاده شده، احتمالا به دلیل محدودیت های فنی موجود در پلتفرم دیجیکالا بوده که به نظر می‌رسه کار را برای بات ها آسان تر از قبل کرده است.

مسابقه زیر سوال رفت

اگر بخواهم نظر شخصی ام را بگویم، استفاده از این بات ‌ها آنچنان کار منطبق بر اخلاقیات نیست . اما موضوع از آن فراتر رفته و سلامت مسابقه را زیر سوال می‌برد . ما به این موضوع می‌خواهیم پاسخ دهیم که آیا جایزه‌ای در کار بوده یا خیر؟ و دیجیکالا چه اشتباهات اخلاقی در طول این مسابقه کرده است.


آرمین پس از پیداکردن کد‌های تخفیف آن‌ها را تست می‌کند اما نتیجه بسیار قابل تامل است!

مطمئن بودیم که اولین نفریم، زیر 1 دقیقه هم شاید نگذشته بود که فایل جدید رو گذاشته بودن
ولی ای دل غافل
کد تخفیف باز هم کار نکرد! کد اشتباه

این امر درصورتی اتفاق افتاده که همچنان روی محصول کلمه "شکار شد" نوشته نشده بود و این یعنی آرمین اولین نفر بوده است!

پاسخ دیجیکالا به این موضوع چه بوده است؟

ما به طور معمول در دیجی‌کالا بات کنترل، ریت لیمیت و سکوریتی چک روی رکوئست‌های ارسالی از سوی کاربر داریم. اما برای این کمپین در کنار موارد ذکر شده راه‌حل‌های دیگری را نیز در نظر گرفتیم. یکی از راه‌های کشف کد، چک زمان عکس‌ها بود که آن را اصلاح کردیم. در دقایق ابتدایی اجرای کمپین شاهد افزایش پیک رکوئست‌ها بودیم که پس از ۲ تا ۳ دقیقه کاهش می‌یافت. از همین روی تصمیم گرفتیم عکس کد را با تاخیر حدود ۱۰ دقیقه آپلود کنیم تا بات‌هایی که سر ساعت مشخص شده فعال می‌شدند بیخیال شده و فقط کاربر واقعی که همچنان به جستجو ادامه می‌داد تصویر جدید را پیدا کند. دستکاری کش CDN نیز از دیگر اقدامات ما در این زمینه بود.

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

از طرفی آرمین ، برای ثبت سفارش به صورت دستی اقدام می‌کرده و به همین جهت آیپی، دیوایس و مابقی موارد کاملا با ربات ساخته شده توسط او متفاوت بوده و به هیچ عنوان قابل تشخیص نمی‌باشد. این یعنی آرمین مانند یک فرد معمولی با دیجیکالا برخورد می‌کرده که مستقیما وارد صفحه محصول شده و می‌خواهد کد تخفیف را وارد کند. محصول همچنان شکار نشده است و از طرفی سایت به آرمین اجازه استفاده از کد تخفیف را نمی‌دهد!

محصولات فرار می‌کنند!


آرمین یکی پس از دیگری کدتخفیف محصولات جدید را تست می‌کرد و موارد عجیب تر می‌شدند!

در یکی از این موراد، پس از آن که کد تخفیف وارد شد، با خطای کد تخفیف وارد شده صحیح نمی‌باشد مواجه شد و محصولی که آیتم تخفیف دار در آن وجود داشت به کلی از دیجیکالا حذف شد!

درواقع می‌توان این طور گفت :

  • ساعت 10 مسابقه شروع شد!
  • ساعت 10:10 دقیقه، تازه تخفیف روی سایت قرار داده شد. یعنی قبل از آن افراد به دنبال گنجی بودند که اصلا وجود خارجی نداشت!
  • ساعت 10:10 دقیقه، کد توسط آرمین پیدا شد و با پیغام خطا مواجه شد!
  • ساعت 10:10 دقیقه، محصول فرار کرد و کلا در دیجیکالا نبود و باز هم افراد به دنبال چیزی که وجود نداشت میگشتند.
  • ساعت 10:38 دقیقه، محصول با برچسب شکار شد، ظاهر شد.

همچنین درمورد مسائل اخلاقی دیگر، عباس جابرخانی یکی دیگر از برنامه نویسانی که در این کمپین دست به کد شده بود این طور می‌گوید:

حتی اگر با مالتی تردینگ های چند لایه فرضا فرد دیگه ای تونسته زودتر از من به کد برسه چرا بعد از حدود سه ساعت تازه به کاربران اعلام میشه تا کاربران عادی که مشتاقانه صفحات رو جستجو میکنند وقتشونو برای کار پوچی هدر ندن !! طبق بیان صریح شما و البته آبزرویشن دائمی سرور ، برخی کدها حتی یک ساعت بعد از شروع کمپین اپلود شده اند، یعنی مردم عادی بیشتر از یک ساعت دنبال پوچ میگشتند !!

وقت کاربران، ارزشش رو داشت؟

دیجی‌کالا در ادامه برای توجیح تاخیر در قرار دادن کلمه شکار شد، روی محصولات این طور می‌گوید:

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

اول از همه کمی روی ادعای دیجی‌کالا تامل کنیم.

به نظر شما اگر من در دیجی‌کالا کار می‌کردم و این کد تخفیف را به دوستم می‌دادم چه میزان احتمال داشت که دیجی‌کالا این موضوع را تشخیص دهد؟

اول از همه در ثبت نام دیجی‌کالا هیچ احراز هویت مبتنی بر کارت ملی وجود ندارد یعنی هر اسمی را می‌توانید به عنوان نام خود بنویسید.

دوم آن که مگر می‌شود که شما تمام دوستان، فامیل ها و اقوام نزدیک یک فرد را بشناسید؟

برای مثال من در دوران تحصیلم در طی مقطع لیسانس و 12 سال تحصیلی قبل از آن حدود 50 دوست دارم که حتی خانواده نزدیکم نیز نام آن‌ها را نمی‌دانند.

همچنین این سوال مطرح می‌شود که دیجی‌کالا مگر اسم چند نفر از اقوام یک کارمند خود را می‌داند؟ اسم مادر؟ خاله؟ عمه و یا شوهر عمه را می‌داند که بحث دوستان را مطرح کنیم؟


به گفته خود دیجی‌کالا 400 هزار نفر در این کمپین شرکت کرده اند و شما اگر برای هر محصول تنها 30 دقیقه صرف بررسی هویت کاربر می‌کردید و کلمه شکار شد را اعلام نمی‌کردید این طور می‌توان محاسبه کرد که 200 هزار ساعت وقت کاربران خود را صرفا برای بررسی هویت تلف کرده اید. این یعنی کاربران به دنبال محصولی می‌گشتند که اصلا وجود خارجی نداشته .

همچنین تاخیر در آپلود عکس نیز، برای فریب دادن بات ها ( که آن هم شکست خورد ) باز کار درستی به نظر نمی‌رسد . این نشان می‌دهد دیجی‌کالا نیز آنچنان نگران سلامت مسابقه نبوده است و اهداف خودش را صرفا دنبال می‌کرده.

پس بهتر بود، درزمانی که مشغول بررسی هستید، تگ در دست بررسی را می‌زدید و درصورتی که مثلا تقلب فرد آشکار می‌شد، محصول دیگری را وارد سیستم تخفیف می‌کردید. هر چند این صحبت به طور کلی دچار مشکل است.

نتیجه گیری

من صرفا در متن خود، سعی کردم که شواهد و آنچه در این کمپین گذشته است را شرح دهم .

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


1- محصولات پس از 1 دقیقه بعد از قرار گرفتن روی صفحه، قابل خرید نبودند . آیا قبل از آن توسط فرد دیگری شکار شده اند؟

2- درصورتی که قبل از 1 دقیقه محصولات شکار شده اند، چرا در برخی موارد پس از چندین ساعت موضوع شکار شدن را به اطلاع کاربران رسانده اید؟

3- احتمال آن که یک فرد عادی، قبل از 1 دقیقه محصولات را شکار کند چه میزان است و آیا برنده ها، افراد عادی بوده اند یا آن ها نیز بات های بهتری داشته اند؟



منابع:

رمزگشایی مسابقه بلک فرایدی دیجی کالا | LinkedIn

https://www.linkedin.com/posts/jabbarkhani_aexaezaewaei-aexahyaeuahyagpaepaesaep-aexaezaewaeiahy-activity-6870021810608459776-P7P7

پاسخ دیجی‌کالا به انتقادات کمپین بلک‌فرایدی؛ آیا تخفیف‌ها واقعی بود؟ (digiato.com)








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