قرعهکشی دوست دارم متنباز و قابل تکرار است
قرعهکشی دوست دارم... چطور انجام میشود؟
هر آرزو در یک دوره مشخص، چهار مرحله را طی میکند. ورودیها، رمز عمومی و الگوریتم دوره منتشر میشوند تا هرکس بتواند نتیجه را روی کامپیوتر خودش بازسازی و راستیآزمایی کند.
در حال نمایش جزئیات دوره ۱ IRANE AZIZ مشاهده گزارش و تاریخچه همین دورهقرعهکشی دوست دارم... متنباز و قابل تکرار است
همه میتوانند فایل رسمی کوپنها، رمز عمومی دوره و فرمول انتخاب را دریافت کنند و دقیقاً همان ترتیب قرعهکشی را روی کامپیوتر خودشان بسازند. برای اعتماد به نتیجه لازم نیست به یک ویدئو، عدد از پیش اعلامشده یا نرمافزار ناشناخته تکیه کنی.
منظور از متنباز در این بخش، انتشار کامل ورودیها، الگوریتم و کد بازسازی قرعهکشی است؛ اطلاعات خصوصی حسابها و بخشهای امنیتی یا مالی پلتفرم منتشر نمیشوند.
این رمز هنگام تعریف دوره ثبت میشود و بعداً تغییر نمیکند. علامت +
در فرمول یعنی چسباندن مستقیم متنها با UTF-8 و بدون فاصله یا جداکننده.
SHA256(coupon_file_sha256 + coupon_code + slogan)
کل فرآیند قرعهکشی، قدمبهقدم
-
۱
قفل ورودیها
با شروع فاز قرعهکشی، صدور کوپن، مشاهده تبلیغ و ویرایش آرزوهای داخل صندوق متوقف میشود.
-
۲
ساخت فایل عمومی رسمی
فایل CSV با ستونهای شماره کوپن و موبایل ماسکشده ساخته میشود. هر کوپن به همان ترتیبی میآید که صادر شده است؛ در زمان برابر، شناسه داخلی ترتیب را قطعی میکند.
-
۳
ثبت اثر انگشت همان فایل
SHA256 از بایتهای دقیق همان فایلی گرفته میشود که مردم دانلود میکنند؛ نه از یک فایل پنهان یا متفاوت.
-
۴
محاسبه رتبه هر کوپن
هش فایل، شماره کوپن و رمز دوره به هم چسبانده و دوباره SHA256 میشوند؛ سپس هشها صعودی مرتب میشوند.
-
۵
بررسی صندوق و انتشار گزارش
کوپنها به ترتیب بررسی میشوند. آرزوی قابل پرداخت برنده است؛ کمبود موجودی و تکرار برنده نیز جداگانه و بدون برداشت از صندوق ثبت میشود.
فایل رسمی را باز کن و شماره کوپن خودت را جستوجو کن. کنار آن، شماره موبایل به شکل 091XXXX4567 دیده میشود؛ چهار رقم میانی پنهان است، اما خودت میتوانی شمارهات را تشخیص بدهی.
بزرگتر یا کوچکتر بودن شماره کوپن و زمان صدور آن هیچ امتیازی ایجاد نمیکند؛ ترتیب فقط از هش فایل عمومی، شماره کوپن و شعار ثابت همان دوره به دست میآید.
فایلها و مشخصات قابل راستیآزمایی
اکنون ۰ کوپن در دوره وجود دارد، اما این عدد هنوز قطعی نیست. به محض ورود دوره به فاز قرعهکشی، ورودیها قفل و لینک فایل رسمی همینجا فعال میشود.
دانلود فایل نمونه برای آزمایشهمینجا روی دستگاه خودت امتحان کن
تا زمان قفل دوره، آزمایشگاه با فایل نمونه واقعی کار میکند و روش نهایی دقیقاً همین است. پردازش کاملاً داخل مرورگر انجام میشود و فایل برای سرور ارسال نخواهد شد.
فایل نمونه را از بخش بالا دانلود و بدون تغییر انتخاب کن.
ابتدای ترتیب بازسازیشده
| رتبه | شماره کوپن | هش رتبه |
|---|
قرعهکشی را با زبان دلخواهت تکرار کن
این نمونهها فایل آموزشی را میگیرند، SHA256 آن را کنترل میکنند و رتبه کامل کوپنها را میسازند.
from urllib.request import urlopen
import hashlib
file_url = "https://doostdaram.com/draw-guide/example-coupons.csv?v=be65d979f575"
expected_hash = "be65d979f5756a23ce4e1a8195098d30ff3a5cc94c7a4a738b292350dcd6eaef"
slogan = "IRANE AZIZ"
file_format = "csv_v3"
data = urlopen(file_url).read()
file_hash = hashlib.sha256(data).hexdigest()
assert file_hash == expected_hash
text = data.decode("utf-8")
assert not text.startswith("\ufeff")
assert "\r" not in text and not text.endswith("\n")
lines = text.split("\n")
if file_format in ("csv_v2", "csv_v3"):
assert lines[0] == "coupon_code,masked_mobile"
records = [line.split(",", 1) for line in lines[1:]]
coupons = [coupon for coupon, masked_mobile in records]
else:
coupons = lines
if file_format != "csv_v3":
assert coupons == sorted(coupons)
rows = []
for coupon in coupons:
value = file_hash + coupon + slogan
rows.append((hashlib.sha256(value.encode("utf-8")).hexdigest(), coupon))
rows.sort()
for rank, (rank_hash, coupon) in enumerate(rows, 1):
print(rank, coupon, rank_hash)
<?php
$fileUrl = 'https://doostdaram.com/draw-guide/example-coupons.csv?v=be65d979f575';
$expectedHash = 'be65d979f5756a23ce4e1a8195098d30ff3a5cc94c7a4a738b292350dcd6eaef';
$slogan = 'IRANE AZIZ';
$fileFormat = 'csv_v3';
$bytes = file_get_contents($fileUrl);
$fileHash = hash('sha256', $bytes);
assert(hash_equals($expectedHash, $fileHash));
assert(! str_starts_with($bytes, "\xEF\xBB\xBF"));
assert(! str_contains($bytes, "\r") && ! str_ends_with($bytes, "\n"));
$lines = explode("\n", $bytes);
if (in_array($fileFormat, ['csv_v2', 'csv_v3'], true)) {
assert(array_shift($lines) === 'coupon_code,masked_mobile');
$coupons = array_map(fn ($line) => explode(',', $line, 2)[0], $lines);
} else {
$coupons = $lines;
}
if ($fileFormat !== 'csv_v3') {
$sorted = $coupons;
sort($sorted, SORT_STRING);
assert($coupons === $sorted);
}
$rows = [];
foreach ($coupons as $coupon) {
$rows[] = ['coupon' => $coupon, 'hash' => hash('sha256', $fileHash.$coupon.$slogan)];
}
usort($rows, fn ($a, $b) => strcmp($a['hash'], $b['hash']) ?: strcmp($a['coupon'], $b['coupon']));
foreach ($rows as $index => $row) {
echo ($index + 1)." {$row['coupon']} {$row['hash']}\n";
}
import { createHash } from 'node:crypto';
const fileUrl = 'https://doostdaram.com/draw-guide/example-coupons.csv?v=be65d979f575';
const expectedHash = 'be65d979f5756a23ce4e1a8195098d30ff3a5cc94c7a4a738b292350dcd6eaef';
const slogan = 'IRANE AZIZ';
const fileFormat = 'csv_v3';
const bytes = Buffer.from(await (await fetch(fileUrl)).arrayBuffer());
const sha256 = value => createHash('sha256').update(value).digest('hex');
const fileHash = sha256(bytes);
if (fileHash !== expectedHash) throw new Error('File hash mismatch');
const text = bytes.toString('utf8');
if (text.startsWith('\uFEFF') || text.includes('\r') || text.endsWith('\n')) {
throw new Error('Canonical format mismatch');
}
const lines = text.split('\n');
let coupons;
if (fileFormat === 'csv_v2' || fileFormat === 'csv_v3') {
if (lines.shift() !== 'coupon_code,masked_mobile') throw new Error('CSV header mismatch');
coupons = lines.map(line => line.split(',', 2)[0]);
} else {
coupons = lines;
}
if (fileFormat !== 'csv_v3' && coupons.some((coupon, index) => index > 0 && coupons[index - 1] > coupon)) {
throw new Error('Canonical order mismatch');
}
const rows = coupons.map(coupon => ({
coupon,
hash: sha256(fileHash + coupon + slogan),
}));
rows.sort((a, b) => a.hash === b.hash
? (a.coupon < b.coupon ? -1 : 1)
: (a.hash < b.hash ? -1 : 1));
rows.forEach((row, index) => console.log(index + 1, row.coupon, row.hash));
جمعآوری آرزوها
کاربر ثبتنام میکند و آرزوی خود را ثبت میکند. آرزو پس از بررسی انسانی، در صورت تأیید میتواند در سایت نمایش داده شود؛ اما هنوز وارد صندوق قرعهکشی نشده و کوپنی برای آن صادر نمیشود.
ورود به صندوق و دریافت کوپن
ثبتنام و ثبت آرزوی جدید در این فاز نیز ادامه دارد. آرزوهای تازه پس از بررسی و تأیید انسانی میتوانند وارد مسیر صندوق همین دوره شوند.
کاربر از میان آرزوهای خود، آرزوی موردنظرش را برای دوره انتخاب میکند. با طیکردن فرآیند اعلامشده، از جمله مشاهده معتبر اولین تبلیغ در صورت فعالبودن آن، آرزو وارد صندوق آرزوها میشود و کوپن شانس صادر میگردد.
کاربر میتواند طبق سقفها و شرایط همان دوره، با مشاهده تبلیغات معتبر بیشتر کوپنهای بیشتری دریافت کند. تعداد کوپن، زمان صدور و محدودیتها از طریق داشبورد نشان داده میشوند.
قفلشدن دوره و قرعهکشی
در این مرحله ورود آرزو به صندوق، مشاهده تبلیغ، دریافت کوپن و ویرایش آرزوهای شرکتدادهشده متوقف میشود. ثبتنام و ثبت آرزوی تازه برای آینده همچنان ممکن است، اما این آرزوها در قرعهکشی دوره قفلشده حضور ندارند.
در لحظه قفل، فایل عمومی رسمی کوپنها با UTF-8 و خط پایان LF، بدون BOM و بدون خط خالی انتهایی ساخته میشود. فایل شامل شماره کوپن و موبایل چهاررقمماسکشده است و رکوردها دقیقاً به ترتیب صدور کوپن قرار میگیرند؛ اگر زمان دو صدور برابر باشد، شناسه داخلی کوپن ترتیب را قطعی میکند. SHA256 دقیقاً از همان فایل قابل دانلود محاسبه میشود.
برای هر کوپن، مقدار SHA256(file_hash + coupon + slogan) محاسبه و خروجیهای ۶۴ کاراکتری صعودی مرتب میشوند. این ترتیب، ترتیب قطعی بررسی کوپنهاست و هرکس میتواند آن را با فایل منتشرشده بازسازی کند.
برای هر انتخاب، مبلغ آرزو با اعتبار قابل تخصیص صندوق سنجیده میشود. اگر اعتبار کافی باشد، نتیجه در فهرست تحقق قرار میگیرد؛ اگر کافی نباشد، آن انتخاب لزوماً تعهدی برای پرداخت ایجاد نمیکند و وضعیت آن در گزارش دوره ثبت میشود.
هر کاربر در هر دوره فقط یکبار میتواند برنده شود. اگر کوپن دیگری از همان کاربر در ادامه انتخاب شود، بدون برداشت از صندوق بهعنوان کوپن مجدد برنده قبلی ثبت خواهد شد.
اعلام نتیجه و آغاز مسیر بعدی
نتایج پس از بررسی و تأیید مدیریت منتشر میشوند. برندگان برای احراز شرایط و هماهنگی تحقق آرزو راهنمایی میشوند و سایر کاربران میتوانند آرزوهای خود را برای دوره بعد نگه دارند، ویرایش کنند یا آرزوی تازهای ثبت کنند.
شفافیت و نکات مهم
- شرکت کاربر در دورهها رایگان است و کوپن قابل خرید، فروش یا تبدیل به وجه نقد نیست.
- ثبت آرزو یا دریافت کوپن، تضمین تحقق آرزو یا انتخابشدن نیست.
- موجودی کل صندوق تا زمان اعلامشده برای قرعهکشی محرمانه است؛ نتیجه و گزارش دورههای پایانیافته در آرشیو دورهها منتشر میشود.
- سامانه میتواند برای حفظ صحت و عدالت، در صورت کشف خطای مؤثر، نتایج یا فرآیند مرتبط را مطابق قوانین اصلاح یا تکرار کند.
SHA256