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

نقشه گنج دیجیکالا، از یک مسابقه تا توهم یک توطعه؟!

این مقاله برای تاریخ 1400/09/04 بوده و با عرض پوزش به دلیل نیاز به ویراستاری و مشغله بنده، با تأخیر ارسال می‌شود.

شروع یک مسابقه جذاب

پنجشنبه 1400/09/04 شروع بلک فرایدی دیجیکالا بود.

آخر شب شروع شد، حالا کاری نداریم به محض شروع، تا چند ساعت سایتشون دون بود.

یه مسابقه شکار گنج برگزار کرد که در ساعات خاصی یک کد تخفیف 99% توی یکی از عکسهای محصولات مشخص قرار میگرفت و خوش شانس کسی بود زودتر پیداش کنه.

https://www.digikala.com/landings/treasure-hunt/
https://www.digikala.com/landings/treasure-hunt/


ارزیابی فنی اولیه

خیلی بدیهی بود که به شکلی دستی و چشمی تقریباً شانسی وجود نداره و این رقابت بین ماشین هاست.

پس از همون شب کارو شروع کردم. زبان محبوب PHP رو آتیش کردم و از همون شب تا شب فرداش پای کار بودم و یه روز کامل نخوابیدم.

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

البته این رو با تاکید پاسخ داد که کوپن رأس ساعت 10:00 روی سایت قرار میگیره. (که بعداً دیدیم اینطور نبود)

یه مقدار جلوی روی، مبهم بود ولی باید با یه پیش فرض هایی جلو میرفتم. ساده ترین حالت رو در نظر گرفتم که یک عکس به تصاویر اصلی یک محصول اضافه یا ویرایش میشه.

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


کد من کار کرد

برنامه ای که نوشتم هر بار کد تخفیف رو زیر 5 دقیقه پیدا میکرد که در مرحله بعد بهبود دادم و سرعتش به زیر 1 دقیقه رسید.

اول به شکل سری نوشتم که خب خیلی سرعت پایینی داشت ولی فقط میخواستم کار کنه:

[ مشاهده‌ی ویدیو ]

بعد با استفاده از Thread به شکل پردازش موازی جوری که هر 47 صفحه محصول رو همزمان از ۴ سرور مختلف بررسی کنه، درآوردم که سرعتش بسیار بالا رفت:

[ مشاهده‌ی ویدیو ]

جستجو روی 1653 محصول و 10686 عکس انجام شده!

روبات من سریع کوپن تخفیف رو پیدا کرد و میبینید که ساعت 10 نبوده و با ۲ ساعت تاخیر در ساعت 12:07 دقیقه کوپن روی سایت قرار گرفته.

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

با این ترفند فقط افراد بیشتری رو درگیر میکردن که حتماً روی رنک و SEO سایت میتونه تاثیر مثبت بگذاره.

https://www.digikala.com/product/dkp-1774519
https://www.digikala.com/product/dkp-1774519


اما وقتی کد وارد میشه پیام میده که "کد تخفیف وارد شده درست نیست".

(عکسها در مراحل مختلف تهیه شدند)
(عکسها در مراحل مختلف تهیه شدند)


کش و قوس با پشتیبانی

بارها با پشتیبانی تماس گرفتم هر سری هم با یک اوپراتور صحبت کردم و جالبه که هر بار تفسیرهای گوناگونی از این پیام مسخره گرفتم؛ مثلاً:

- «کالایی با قیمت کمتر از قیمت کالای منتخب باید انتخاب کنید.» (عجب! این رو گفتن برا وقتیه که کالای منتخب موجود نیست و جایگزین بردارید، روی همین مسئله ای که رخ میداد اینه که محصولی که دیگه موجود نیست از کجا بدونیم قیمتش چقدر بوده که بگردیم کالایی معادل قیمت یا کمتر از اون بیابیم!)

- «کالای بالاتر از قیمت کالای منتخب هم میتونید انتخاب کنید و تفاوتشو پرداخت میکنید.» (کاملاً خلاف حرف اوپراتور قبلی)

- «ممکنه محصول ناموجود شده، دوباره تست کنید.» (برای همین، وسط مسابقات تبصره زدن که کالایی غیر از کالای منتخب هم ارزشِ اون، میتونید انتخاب کنید)

- «ممکنه کسی کوپن رو زده ولی هنوز فرصت برای شما هست سعی کنید.» (مغایر قوانین، نگه داشتن بیشتر شما توی سایت)

- «اونی که اسمشو زدیم تو سایت نمونس، ممکنه چند برنده داشته باشیم.» (مغایر قوانین، یه حرف مسخره!)

- «در هر سری از مسابقه چندین کد صادر میشه.» (مغایر قوانین، یک کد بیشتر صادر نمیشه)

- «راس ساعت کد صادر میشه.» (حسب تجربه در عمل تا دو ساعت بعدم صادر شده.)

- «با حروف کوچیک بزرگ دوباره تست کنید.» (خیلی ممنون!)

- «از طریق تیکت اسکرین شات بفرستید پیگیری میکنیم.» (نخود سیاه!)

- «جاتون محفوظه براتون کد تخفیف جدید صادر میشه.» (وعده سر خرمن!)

- «یک نفر دیگه زودتر از شما وارد کرده که در قوانینم نوشتیم.» (چه عجب یکی قوانینو خونده!)

و این گزاره ها عیناً نقل قول از صحبتهای شاید هفت هشت نفر از پشتیبانان بودند!!!

میبینید که یک موضوع ساده چقدر تناقض در گفتار وجود داره و جالبه که هر اوپراتور به صراحت حرف اوپراتور قبلی رو نقض میکرد و وقتی هم میگفتم قبلی اینطور گفت، میگفتن «نه! اینی که من میگم درسته!!!»

خب قبل از مسابقه هماهنگ بشید، اوپراتورها رو راجع قوانین توجیح کنید، این سخته؟!


پیامی که به پشتیبانی ارسال کردم:

در ادامه موضوع قبلی و تماس های پیاپی با پشتیبان.
کد تخفیف 99 درصد را اولین نفر پیدا کردم ساعت 14:32 اولین تماس را گرفتم و تیکت هم ارسال کردم. که موقع ثبت کد پیام میداد کد اشتباه است. همکارتان فرمودند چون زودتر تیکت زدید پس جایگاه شما محفوظ است!
دوباره تلاش کردم برای محصول های مختلف. که یکباره اسم یک نفر دیگه رفت روی سایت!
باز تماس گرفتم گفتند همچنان تلاش کنید!!! ما هم هی تلاش کردیم و هیچی نشد که نشد!
گفتن محصول قیمت کمتر باشد، یکبار گفتن بیشتر هم مشکلی نیست.
من همان محصول ایکس باکس که یک لحظه موجود شد رو تست کردم:
https://www.digikala.com/product/dkp-3738743/
محصول با قیمت دیگر تست کردم ps5:
https://www.digikala.com/product/dkp-5696772/
حتی یک محصول 300 هزار تومانی را تست کردم:
https://www.digikala.com/product/dkp-1110918/
همه خطای اشتباه بودن کد را میدهند!
امیدوارم حق بنده محفوظ باشد.
تصاویر مستندات ضمیمه شد.


قوانین مسابقه:

چرا وقتی خیلی ساده میشه یک پیام شفاف ظاهر بشه که "این کد قبلاً استفاده شده" (یا هر علت دیگری) یک چنین پیام مبهم و کلی و بی ربطی باید ظاهر بشه؟

احتمالاً جواب سادست. چون هر وقت به فراخور موقعیت، هر تفسیری که به نفعشونه از این پیام مزخرف بکنند.

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

(متاسفانه به دلیل فنی نامشخص صدای ضبط شده‌ی مکالمات با پشتیبانی ضبط نشد.)


یک اتفاق عجیب!

بعداً روبات رو بازم ارتقا دادم و امکان تغییر آی پی با پروکسی لیست و تفکیک وظیفه هر روبات برای پیدا کردن یک سری صفحات بخصوص رو اضافه کردم. تا وظایف بین چند روبات مستقل تقسیم بشه و بشه اونها رو روی چندین سرور توزیع کرد و سرعت هر یک بیشتر بشه.

حتی داشتم به این سمت حرکت میکردم که کد رو به یه شکلی از توی تصویر تشخیص و توسط OCR اون رو تکست برگرونه و خودکار کد رو توی سایت درج و سفارش رو ثبت کنه که کل فرایند 100 درصد خودکار بشه.

که توی تست همین مسائل بودم که متاسفانه در یک اقدام بسیار عجیب مسابقه رو زودتر از موعد متوقف کردن!

قرار بود مسابقه 9 آذر تموم بشه ولی دو روز زودتر یعنی در 7 آذر بدون توضیح هیچ دلیلی متوقفش کردند و معلومم نشد تکلیف جوایز باقی ماندش چی میشه!

بعدم که کلاً کرکره رو کشیدن پایین و صفحه مسابقه رو حذف کردند که هیچ سندی باقی نمونه!!!

این شد که عملاً زحمات نوشتن کد جدید به باد رفت و البته فقط تجربش برامون موند.

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

مکاتبات در ایمیل ها در این خصوص:


نظریه رانت

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

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

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

حالا این فرض بوجود میاد که خب شاید اصلاً همینکارو هم کرده باشند. اما با مقایسه تصاویری که کوپن روشون درج شده، اکثر اونها روی عکسهایی هستن که خودشون هم دارای متن هستند(تصاویر زیر) که این فرضیه قوت میگیره که این کار تعمدی و البته هوشمندانه بوده برای به اشتباه انداختن روباتهای OCR احتمالی که متن رو از تصویر تشخیص میدن.

بنابراین اگر فرضیه اولیه صحیح باشه و محصولات انتخابی باشند، به نظریه رانت نزدیک میشیم.


چندتا عکس همینجوری!

عکس من در این لحظه در حال کار:

این عکس هم ببینید:

تریپ مثلاً ما حواسمون به همه چیز هست و اینا!😂


رفع اتهام

یه چیز دیگه اینکه، وقتی گفتم: «چند بار کوپنو پیدا کردم و خطا داده» بلافاصله گفت: «میتونم بپرسم چطور تونستید؟» منتظر بود اسم کوچکترین تکنولوژی رو بیارم تا بگه «آها تخلف؟! همین بوده دیگه دلیلش!» منم گفتم «قبل از من چطور تونستن، پس منم تونستم، اصلاً فرض کنیم 100 تا کامپیوتر گذاشتم 100 نفرم استخدام کردم افتادن روش... 😂» (حالا فک کن اون اوپراتور الان داره اینو میخونه، یه ریپلای بزن!😅)

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

همچنین نمیتونم قضاوتی کنم و بگم سرکاریه چون واقعاً شاید افرادی کدی بنویسن یا منابعی داشته باشن که خیلی سریعتر عمل کنند.


سورس کد مستندات فنی

سورس کد و مستندات فنی روبات رو صرفاً جهت مقاصد آموزشی از اینجا میتونید رایگان ببینید یا دانلود کنید:

https://github.com/NabiKAZ/bot-digikala-treasure-hunt-1400

#شکار_گنج #دیجیکالا


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