[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1778":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":17,"compositeScore":18,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":8,"pushedAt":8,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":14,"starSnapshotCount":14,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},1778,"janfadaa","SharifiZarchi\u002Fjanfadaa","SharifiZarchi",null,"HTML",179,12,9,8,0,1,6,3,3.34,false,"main",true,[],"2026-06-12 02:00:32","# مستندات رسوایی تاریخی «جان‌فدا»\n\nFor English version, see [README_en.md](README_en.md)\n\nجمهوری اسلامی با راه‌اندازی وب‌سایت جان‌فدا سعی کرد هواداران خود را بسیار گسترده نشان دهد.\nمقامات رسمی جمهوری اسلامی نظیر رئیس‌جمهور، روسای سایر قوا، صداوسیما و رسانه‌های حکومتی با استناد به آمار ثبت‌نام‌شدگان این وب‌سایت بارها ادعا کرده‌اند بیش از ۳۰ میلیون نفر در این وب‌سایت ثبت‌نام کرده، و آن را نشان از همراهی گسترده‌ی مردم با جمهوری اسلامی دانسته‌اند. اما چند خطای ناشیانه‌ی برنامه‌نویسی در این وب‌سایت، منجر به یک رسوایی بزرگ شد و آمار واقعی ثبت‌نام‌کنندگان را افشا کرد. در این مخزن، اسناد و شواهد این رسوایی ارائه می‌شود.\n\n## ۱. تحلیل فنی شناسه‌ها\nاین وب‌سایت جهت نمایش تعدادی از پیام کاربران (که در این متن به اختصار آن را کامنت می‌نامیم) روی وب‌سایت از یک سرویس Ajax استفاده می‌کند. فراخوانی این سرویس با اجرای دستور زیر در ترمینال به راحتی قابل انجام است:\n\n```\n curl -s 'https:\u002F\u002Fjanfadaa.ir\u002Fajax' --data-raw 'action=getComments' | jq\n```\nاین سرویس، نخستین اشتباه برنامه‌نویسان این وب‌سایت است: هر رکورد دریافتی این سرویس، شناسه‌ی رکوردهای ثبت‌شده در وب‌سایت را نشان می‌دهد. این شناسه‌ها، اعداد صعودی با حداکثر مقدار (در حال حاضر)  **۳,۹۱۳,۷۷۷** است. این  وب‌سایت در همین لحظه ادعا می‌کند تعداد ثبت‌نام‌شدگان بالای ۳۰ میلیون نفر است. در زیر قسمتی از پاسخ نمونه‌ی این سرویس مشاهده می‌شود (هر پاسخ شامل ۱۵ کامنت است که به عنوان مثال ۳ کامنت در پاسخ زیر ارائه‌ می‌شود).\n\n```\n{\n  \"data\": {\n    \"all\": [\n      {\n        \"id\": 3913777,\n        \"fullname\": \"\",\n        \"description\": \"هرکاری از دستم بر بیاد انجام میدهم برای کشورم\",\n        \"date\": \"۱۴۰۵\u002F۰۲\u002F۰۵,۱۹:۴۳\"\n      },\n      {\n        \"id\": 3913775,\n        \"fullname\": \"\",\n        \"description\": \"تا پای جان از این انقلاب دفاع خواهم کرد جانم فدای رهبر\",\n        \"date\": \"۱۴۰۵\u002F۰۲\u002F۰۵,۱۹:۴۳\"\n      },\n      {\n        \"id\": 3913770,\n        \"fullname\": \"\",\n        \"description\": \"من جان \\n فدای کشور عزیزم ایران میشوم\",\n        \"date\": \"۱۴۰۵\u002F۰۲\u002F۰۵,۱۹:۴۳\"\n      },\n      ...\n         ],\n    \"next\": 1777138019\n  },\n  \"success\": true\n}\n```\n## نادرست‌بودن پاسخ رسانه‌های حکومتی\n\nپس از آن‌که این موضوع در یک توییت اینجانب برملا شد، رسانه‌های حکومتی تلاش کردند وانمود کنند که شناسه‌ی مذکور، شناسه‌ی کامنت‌ها است و نه شناسه‌ی ثبت‌نام‌کنندگان. بدین ترتیب آن‌ها تلاش داشتند وانمود کنند تعداد رکوردهای ثبت‌نام در این وب‌سایت بالای ۳۰ میلیون و تعداد کامنت‌ها نزدیک ۴ میلیون بوده‌است. اما این رسانه‌ها اطلاع نداشتند برنامه‌نویسان ناشی این وب‌سایت در کد شواهد کافی برای رد این ادعا گذاشته‌اند:\n\nابتدا باید دقت کنیم که در این وب‌سایت فقط یک فرم ثبت‌نام وجود دارد که کاربر پس از درج نام کامل، شماره‌ی تلفن همراه، استان، شهر، تاریخ تولد، جنسیت و سطح تحصیلات (اکثر موارد به صورت اختیاری) می‌تواند به دل‌خواه خود یک کامنت (پیام کاربر) وارد کند. کامنت می‌تواند خالی یا حاوی یک متن کوتاه باشد.\n\nاما کافی است در سورس‌کد این وب‌سایت، فایل [`website_snapshot\u002Fassets\u002Fjs\u002Fpublic.js`](website_snapshot\u002Fassets\u002Fjs\u002Fpublic.js%3Fver%3D1.5.0) را ببینیم. هنگام ارسال درخواست ثبت‌نام، یک رکورد ثبت‌نام به صورت زیر به سرورهای این وب‌سایت ارسال می‌شود:\n\n```javascript\n        const data = {\n            action: 'verificationSms',\n            verificationCode: verificationCode,\n            mobile: mobile,\n            fullname: fullname,\n            state: state,\n            city: city,\n            birthday: birthday,\n            gender: gender,\n            education: education,\n            description: description,\n            formToken: formToken,\n        }\n```\nحالا اگر عناصر موجود در رکورد ثبت‌نام را با عناصر رکورد خروجی سرویس Ajax مقایسه کنیم می‌بینیم عناصر مشترکی شامل `fullname‍` و `description‍` دارند. یعنی در واقع هنگامی که یک رکورد ثبت‌نام به وب‌سایت ارسال می‌شود، این وب‌سایت با اختصاص یک شناسه `id` و زمان ثبت‌نام `date‍‍` آن را وارد داده‌پایگاه خود می‌کند. در واقع `id‍‍` شناسه‌ی رکورد ثبت‌نام است، که از آن‌جا که یک کاربر می‌تواند بارها ثبت‌نام کند تعداد آن بیشتر از تعداد واقعی کاربران ثبت‌نام کننده است. اما موضوع به همین‌جا تمام نمی‌شود.\n\n## تحلیل کل رکوردهای دریافتی\n\nبرای دریافت کل رکوردهای بازگشت‌داده‌شده از سرویس Ajax می‌توانید از اسکریپت ساده‌ی [`crawler.py`](crawler.py) که توسط این‌جانب با کمک Gemini\u002FAntigravity نوشته‌شده استفاده کنید. پیشنهاد می‌شود در صورت تمایل، بخش «جزئیات فنی دریافت رکوردها» را ملاحظه فرمائید.\n\nتحلیل این رکوردها، حقایق جدیدی در مورد این رسوایی تاریخی مشخص می‌کند.\n\nکل رکوردهای بازگشتی وب‌سایت مذکور تا لحظه‌ی تنظیم این سند تنها **۱۶۵۴ مورد** است که در فایل [`janfadaa_comments_chain.jsonl`](janfadaa_comments_chain.jsonl) موجود است. پنهان‌کاری سایت در نمایش ندادن فهرست کامل ثبت‌نامی‌ها نشان‌دهنده بی‌اعتباری کل ادعاهای این وب‌سایت است.\n\nقدیمی‌ترین کامنت با شناسه `117` (۸ فروردین ۱۴۰۵) و کامنت بعدی با شناسه `1803827` (۱۹ فروردین) ثبت شده است. در این فاصله ۱۱ روزه، هیچ کامنت قابل دسترسی دیگری توسط سرویس فوق وجود ندارد.\n\nاگر به فواصل نامنظم کامنت‌های بازگشتی از سرویس دقت کنیم (بعضی اوقات شناسه‌های کاملا متوالی و زمان‌های پیاپی و بعضی اوقات پرش‌های بسیار بزرگ در شناسه‌ها و زمان کامنت‌های بازگشتی حتی در یک بلوک ۱۵ پیامی) متوجه می‌شویم تعداد بسیار کمی از کامنت‌ها توسط گردانندگان این وب‌سایت برای نمایش دست‌چین‌ شده‌اند. اما این نکته چه اهمیتی دارد؟ پاسخ در بخش بعد است.\n\n## پیام‌های طولانی کاملا تکراری\n\nدر همین ۱۶۵۴ کامنت قابل دسترسی، پیام‌هایی وجود دارد که ۲ یا چندین مرتبه تکرار شده‌اند. تکراری بودن پیام‌هایی همچون «جانم فدای ایران» توسط کاربران مختلف قابل انتظار است و منجر به یافته‌ی خاصی نمی‌شود. ولی موضوع زمانی جالب می‌شود که ببینیم بعضی پیام‌ها نظیر مورد زیر شامل متن طولانی و غیر متداول قطعا توسط یک کاربر درج شده‌اند:\n\n```جانم فدای رهبرم سید مجتبی خامنه ای\\nلبنان نباید تنها بماند\\nایران بامعرفت همانطور که لبنان در کنارش ایستاد باید در کنارش بماند```\n\nاین کامنت در دو روز ۲۱ و ۲۲ فروردین ثبت شده‌است:\n* ۱۴۰۵\u002F۰۱\u002F۲۱,۲۰:۲۵, `id=2277832`\n* ۱۴۰۵\u002F۰۱\u002F۲۲,۱۴:۰۸, `id=2494010`\n\nبا توجه به متن طولانی و غیرمعمول این کامنت قطعا توسط یک نفر ثبت شده‌است. تا این‌جا ممکن است موضوع خیلی عجیب نباشد و بگوییم یک کاربر در دو روز مختلف یک متن را کپی و ثبت‌نام کرده. اما نکته‌ی کلیدی آن است که با وجود تعداد و درصد بسیار کم کامنت‌های بازگشتی وب‌سایت (تنها ۱۶۵۴ مورد) و فاصله‌ی بسیار بین دو شناسه‌ی ثبت شده‌ (بیش از ۲۰۰ هزار واحد) این‌که دو کامنت کاملا یکسان با فاصله‌ی بسیار زیاد توسط گردانندگان وب‌سایت دست‌چین شده‌اند فقط یک احتمال باقی می‌گذارد: حجم ثبت‌نام‌های تکراری بسیار بسیار زیاد و احتمالا سیستمی بوده‌است طوری که گردانندگان وب‌سایت با وجود دست‌چین‌کردن تعداد خیلی کمی از کامنت‌ها نتوانسته‌اند جلوی افشای این رسوایی عظیم دیگر را بگیرند.\n\nنمونه‌های دیگری از کامنت‌های کاملا تکراری با الگوی طولانی و غیر معمول در همین مجموعه‌ی کوچک دست‌چین‌شده عبارتند از:\n\n```میان دشمن و وطن ننگ بر آنکه شک کند \\nننگ بر آنکه خواسته شمر به ما کمک کند\\nجانم فدای ایران🇮🇷♥️```\n\n```من به عنوان یک شهروند ایرانی حاضرم جانم را فدای وطنم کنم.```\n\n## عدد نمی‌فهمند\n\nاسناد این رسوایی بزرگ و تاریخی به همین موارد خلاصه نمی‌شود. بزرگ‌ترین سند آن، عدم شفافیت وب‌سایت است. اگر قرار بود این آمارها حقیقت داشته باشد، مسوولان وب‌سایت از ابتدا رکوردهای بدون هویت (با حذف نام، تاریخ دقیق تولد و شماره تلفن‌ همراه) را منتشر می‌کردند. \n\nبه نظرم این رسوایی تاریخی ریشه در موارد متعددی دارد. مثلا مسوولان جمهوری اسلامی، مردم را مثل خود دارای هوش کم می‌دانند و گمان می‌کنند با تکرار هرروز ادعاهای نادرست و خلا اطلاعاتی ناشی از قطع اینترنت، می‌تواند به آن‌ها تلقین کنند ۳۰ میلیون هوادار دارند. حال آن‌که مردم ایران بسیار باهوش‌تر از مسوولان جمهوری اسلامی هستند و به لطف شبکه‌های اجتماعی، بسیار سریع از واقعیت‌ها مطلع می‌شوند.\n\nمثلا این وب‌سایت ادعا می‌کند فقط از افراد بالای ۱۲ سال ثبت‌نام می‌کند. جمعیت بالای ۱۲ سال ایران حدود ۷۰ تا ۷۳ میلیون نفر تخمین زده می‌شود که میلیون‌ها نفر از آن‌ها خارج از کشور هستند و عموما امکان ثبت‌نام در این وب‌سایت  نداشته‌اند. ادعای ۳۰ میلیون ثبت‌نام‌شده یعنی از هر دو نفر ایرانی بالای ۱۲ سال ساکن کشور، یک نفر در آن ثبت‌نام کرده‌اند. طراحان این حرکت حتی تصور نکرده‌اند هرکسی می‌تواند با یک پرس و جوی ساده از همشهریان خود متوجه شود واقعا چند درصد از مردم در این وب‌سایت ثبت‌نام کرده‌اند. \n\nکافی است نمودار رشد تقریبا خطی آمارهای اعلام شده توسط مسوولان (دست‌کم تا عدد ۲۶ میلیون نفر، و پس از آن قدری الگوی رشد را کاهش دادند) را ببینید. چه بسا اگر کسی ترمز آن‌ها را نکشیده بود، چه‌بسا به زودی اعلام می‌کردند ۱۰۰ میلیون ایرانی در این وب‌سایت ثبت‌نام کرده‌اند. همه‌ی این رسوایی ناشی از یک حقیقت تلخ است: مسوولان جمهوری اسلامی عدد نمی‌فهمند. \n\n## بازتولید نتایج (Reproduction)\nبرای بازتولید این نتایج، کافی است [`crawler.py`](crawler.py) را اجرا کنید. پیشنهاد می‌شود جزئیات فنی زیر را مطالعه فرمائید.\n\n* **امنیت:** اگر تمایل دارید IP شما در این وب‌سایت که متعلق به رژیم جمهوری اسلامی ایران است ثبت نشود، پیشنهاد می‌شود حتما از پراکسی یا VPN (مثلا tor) استفاده کنید. کافی است در ابتدای [`crawler.py`](crawler.py) مقدار متغیر `USE_PROXY` را به `True` تغییر داده و پورت پراکسی را در ابتدای اسکریپت مشخص کنید.\n\n## جزئیات فنی دریافت رکوردها\n\nمی‌توان از سرویس Ajax فوق استفاده کرد و با تغییر مقدار `pointer‍` کل رکوردهایی که این سرویس برمی‌گرداند را ذخیره کرد. برای این کار کافی است مقدار `next` قرارگرفته در یک رکورد بازگشتی را به عنوان پوینتر درخواست بعدی به سرویس بیاوریم. مثلا:\n‍‍\n```\ncurl -s 'https:\u002F\u002Fjanfadaa.ir\u002Fajax' --data-raw 'action=getComments&pointer=1777138019' | jq\n```\n\nکه در این درخواست، مقدار `1777138019` برابر مقدار `next` بازگشتی از پاسخ درخواست قبلی است. این‌جا البته یک اشکال فنی کوچک وجود دارد: برنامه‌نویسان ناشی وب‌سایت جان‌فدا سرویس Ajax را طوری نوشته‌اند که برای بعضی مقادیر واقعی `pointer‍` هیچ پاسخی برنمی‌گرداند. این چالش را با اندکی تفکر می‌توان حل کرد.\n\nمشاهده‌ی اصلی آن است که مقادیر `pointer‍` همواره نزولی هستند ولی در نگاه اول نمی‌توان بین آن‌ها الگوی دقیقی یافت. برای حل چالش فوق، می‌توان هرگاه به یک `pointer‍` بن‌بست رسیدیم، مقدار آن را به اندازه‌ی ثابتی (مثلا ۱۰۰ واحد، با توجه به سایر مقادیر) کسر کنیم و دوباره تلاش کنیم. در این حالت، حتی اگر مقدار `pointer‍` معتبر نباشد، سرویس آن را به نزدیک‌ترین مقدار معتبر نگاشت کرده و خروجی آن رکورد را برمی‌گرداند.  \n\nبا اجرای این برنامه ۱۴ مقدار `pointer‍` که در فایل [`broken_pointers.txt`](broken_pointers.txt) مشخص شده‌اند و معادل ۱۴ بلوک، هریک به اندازه‌ی ۱۵ کامنت (مجموعا ۲۱۰ کامنت کاربران) هستند به بن‌بست می‌خورند. هزار بار تلاش برای دریافت آن‌ها (در اسکریپت [`broken_pointers_retry.py`](broken_pointers_retry.py)) نتیجه‌ای ندارد. هرچند بهره‌مند بودن از این ۲۱۰ کامنت اضافه تغییری در نتایج ایجاد نمی‌کند.\n","该项目揭露了伊朗伊斯兰共和国官方网站“janfadaa”的注册用户数量造假问题。核心功能是通过分析该网站Ajax服务返回的数据，揭示了实际注册用户数远低于官方声称的3000万。技术特点包括使用curl命令和jq工具解析JSON响应，发现记录ID的最大值仅为约391万，从而质疑官方数据的真实性。此外，项目还展示了网站源代码中的关键证据，进一步证明了官方声明的不实之处。此项目适用于需要验证或研究在线平台用户数据真实性的场景，特别是对于关注政府透明度和公共信息准确性的研究人员和记者。",2,"2026-06-11 02:45:59","CREATED_QUERY"]