টাইপিং টেস্ট চিটিং ধরে প্রতিটি স্কোরের পেছনের কিস্ট্রোক লগ যাচাই করে। আমাদের টেস্ট প্রতিটি ফলাফল তার কিস্ট্রোক লগ থেকে আবার হিসাব করে, একটি হ্যাশ যাচাই করে, লগের গঠন ও টাইমিং পরীক্ষা করে, আর 130 WPM-এর বেশি যে সময়বাঁধা ফলাফলের টাইমিংও অস্বাভাবিক দেখায়, তাকে আপনি পুনঃটেস্ট পাস না করা পর্যন্ত পাবলিক বোর্ডের বাইরে রাখে। টাইমিংয়ের পরীক্ষা অসাবধান বটদের ধরে; পুনঃটেস্ট সাবধানী বটকেও পুরো কাজটা আবার করতে বাধ্য করে।
যে প্রথম বট আমাদের টাইমিংয়ের পরীক্ষা পেরিয়ে গিয়েছিল, সেটা ছিল আমাদেরই।
আমাদের এন্ড-টু-এন্ড টেস্টের হেল্পার নির্দিষ্ট 40 ms ব্যবধানে কি চাপত, কারণ একটি টেস্ট স্ক্রিপ্ট সেটাই করে। সার্ভার ফলাফল আবার হিসাব করল, হ্যাশ নিশ্চিত করল, আর রানটিকে সন্দেহজনক হিসেবে চিহ্নিত করল: কিস্ট্রোকগুলোর মধ্যে শূন্য ভ্যারিয়েন্স, শূন্য রোলওভার, হুবহু একই হোল্ড টাইম। আমাদের নিজেদের টেস্ট স্যুট মানুষের মতো দেখতে একটি ফলাফল জমা দেওয়ার আগে আমাদের প্রতি শব্দে এলোমেলো জিটার আর মাঝে মাঝে 80 থেকে 300 ms-এর "ভাবনার" বিরতি যোগ করতে হয়েছিল। অপশনটা এখনও কোডে আছে, humanLike নামে।
যা চেষ্টা করে না তার বিরুদ্ধে পরীক্ষাগুলো কাজ করে, আর যা চেষ্টা করে তা এগুলো পেরিয়ে যেতে পারে, তাই ডিজাইনে আসল ভার রাখা হয়েছে পুনঃটেস্টের ওপর।
প্রথম ধাপ: সবকিছু আবার হিসাব করা
আপনার ব্রাউজার আমাদের কোনো WPM পাঠায় না। পাঠায় কিস্ট্রোক লগ (প্রতিটি keydown, keyup, input ও composition ইভেন্ট, মনোটোনিক performance.now() ঘড়ির টাইমস্ট্যাম্পসহ), তার হিসাব করা মেট্রিকগুলো, আর ক্যানোনিকাল ফলাফলের একটি SHA-256 হ্যাশ।
সার্ভার লগের ওপর একই মেট্রিক কোড চালায় এবং তুলনা করে। কোনো সংখ্যা 0.01-এর বেশি আলাদা হলে ফলাফলটি metrics_mismatch হিসেবে বাতিল হয়। হ্যাশ না মিললে বাতিল হয় hash_mismatch হিসেবে। যে ব্রাউজার এক্সটেনশন WPM ফিল্ড বদলে দেয়, যা ক্লায়েন্টকে বিশ্বাস করা সাইটগুলোতে সবচেয়ে প্রচলিত চিটিং, সেটা এখানেই ধরা পড়ে। আপনার স্ক্রিনের সংখ্যা আর ডেটাবেসের সংখ্যা একই ফাংশন থেকে আসে, এজন্যই আমাদের মেট্রিক পেজ কথা দিতে পারে যে তার করে দেখানো উদাহরণ দুই দশমিক ঘর পর্যন্ত হুবহু মিলবে।
টেস্টের সময় সার্ভারে মাপা হয় না কেন? তাহলে আপনার স্কোরে নেটওয়ার্কও ঢুকে পড়ত। প্রতিটি কিস্ট্রোক আমাদের কাছে একটু দেরিতে পৌঁছাত, আপনার সংযোগ অনুযায়ী ভিন্ন পরিমাণে, আর ধীর লাইনে থাকা একজন দ্রুত টাইপিস্ট এমন স্পিড হারাতেন যা তাঁর সত্যিই ছিল। লগ আমাদের দেয় নির্ভুলতার জন্য ক্লায়েন্টের ঘড়ি আর সততার জন্য সার্ভারের পুনর্হিসাব।
দ্বিতীয় ধাপ: লগটা কি অর্থবহ?
টাইমিং বিশ্লেষণের আগে জমা দেওয়া ডেটার গঠন নিয়ে কিছু সাধারণ পরীক্ষা:
- টেস্টটি অন্তত 15 সেকেন্ড বা 10টি শব্দ দীর্ঘ হতে হবে। এর চেয়ে ছোট রান র্যাংক করার জন্য খুব বেশি অস্থির, আর ফুলিয়ে দেখানোও সবচেয়ে সহজ।
- টেস্ট শেষ হতে পারার আগেই, অর্থাৎ শুরুর সময় আর তার নিজের দৈর্ঘ্য মিলিয়ে যে মুহূর্ত, তার আগে কোনো ফলাফল আসতে পারে না। শুরু হওয়ার বিশ সেকেন্ড পরে পৌঁছানো 60 সেকেন্ডের ফলাফল আসলে ঘটেনি।
- ইভেন্টের সংখ্যা টাইপ করা অক্ষরের সঙ্গে মিলতে হবে।
- ডেস্কটপে প্রতিটি input ইভেন্টের 50 ms-এর মধ্যে আগে একটি keydown থাকতে হবে। এতে ধরা পড়ে পেস্ট করা লেখা, স্ক্রিপ্টে তৈরি input ইভেন্ট আর বেশিরভাগ কিস্ট্রোক-ইনজেকশন টুল, যেগুলো কোনো ফিজিক্যাল কি ছাড়াই লেখা পাঠায়। ইনপুট মেথড এডিটর (IME composition) দিয়ে টাইপ করা এর থেকে ছাড় পায়, আর ফোনের ফলাফল পাবলিক বোর্ডের বাইরে থাকে।
- শুরু নেই, শেষ নেই বা টাইমস্ট্যাম্প মনোটোনিক নয় এমন লগ ত্রুটিপূর্ণ, আর সরাসরি বাতিল হয়।
এর কোনোটিই চতুর কিছু নয়, কিন্তু এতেই বেশিরভাগ ভিড় সরে যায়।
তৃতীয় ধাপ: কিস্ট্রোকের টাইমিং কী প্রকাশ করতে পারে?
এই অংশটি আমরা ইচ্ছে করেই পুরোপুরি নথিভুক্ত করি না: বৈশিষ্ট্যের তালিকা প্রকাশ্য, সীমা আর ওজন নয়। প্রকাশিত সীমা মানে একটা লক্ষ্যবস্তু। আমরা যদি বলতাম "N মিলিসেকেন্ডের কম স্ট্যান্ডার্ড ডেভিয়েশন চিহ্নিত হয়", তাহলে প্রতিটি স্ক্রিপ্টের পরের সংস্করণ N যোগ এক যোগ করত। যে বৈশিষ্ট্যগুলো আমরা স্কোর করি:
কি-গুলোর মধ্যে গড় ব্যবধান আর তা কতটা ওঠানামা করে। মানুষের টাইপিং অনিয়মিত। 168,960 জন টাইপিস্টকে নিয়ে Dhakal ও সহকর্মীদের 2018 সালের গবেষণায় দুটি কি-র মধ্যে গড় ব্যবধান ছিল প্রায় 239 ms, স্ট্যান্ডার্ড ডেভিয়েশন প্রায় 112 ms। নির্দিষ্ট ব্যবধানে টাইপ করা স্ক্রিপ্টে প্রায় কোনো ওঠানামাই থাকে না; কিস্ট্রোকভিত্তিক একটি CAPTCHA নিয়ে 2025 সালের একটি arXiv গবেষণা তাদের টেস্ট বটে ঠিক এটাই দেখেছিল, যা নির্দিষ্ট 50 ms দেরিতে টাইপ করত। এটাই আমাদের সবচেয়ে শক্তিশালী সংকেত, আর আমাদের হেল্পার এতেই আটকে গিয়েছিল।
40 ms-এর কম ব্যবধানের অনুপাত। 40 ms-এর ব্যবধান টানা বজায় রাখলে হয় মিনিটে 1,500 অক্ষর, বা প্রতি শব্দে পাঁচ অক্ষর ধরে 300 WPM। রোলওভারের সময় কি একসঙ্গে চাপলে আঙুল সত্যিই এত ছোট একক ব্যবধান তৈরি করে, তাই একটি ছোট ব্যবধানের কোনো অর্থ নেই। কিন্তু যে লগে ব্যবধানের বড় অংশই এত ছোট, সেটা টাইপিং নয়।
কি চেপে রাখার সময়। আসল আঙুলে তা কয়েক দশ মিলিসেকেন্ড ওঠানামা করে; কৃত্রিম ইভেন্টে প্রায়ই হোল্ড টাইম হুবহু এক বা প্রায় শূন্য থাকে, কারণ টুলটি keydown আর keyup পরপর পাঠায়।
রোলওভার অনুপাত। আগের কি ওঠার আগেই কত ঘন ঘন পরের কি নামে। Dhakal গড় রোলওভার অনুপাত মেপেছিলেন 25%, বেশিরভাগ দ্রুত টাইপিস্ট 40 থেকে 70% কিপ্রেসে রোলওভার করেন, আর কি-গুলো গড়ে 30 ms একসঙ্গে থাকে। ধীর টাইপিস্টরা প্রায় একেবারেই রোলওভার করেন না, তাই রোলওভার ছাড়া একটি দ্রুত ফলাফল চোখে পড়ে। বটেরা কদাচিৎ কি একসঙ্গে চাপে।
দীর্ঘতম বিরতি, সেকেন্ডে সেকেন্ডে স্পিডের ওঠানামা, আর এক সেকেন্ডের বেশি ব্যবধানের অনুপাত। মানুষ এমনভাবে দ্বিধা করে, যা একটি স্ক্রিপ্টকে নকল করতে আলাদা করে বলে দিতে হয়।
একটি স্কোরিং মডেল এগুলো মিলিয়ে কোনো ফলাফলকে সন্দেহজনক হিসেবে চিহ্নিত করতে পারে। 130 WPM-এর নিচে একটি চিহ্ন নিজে থেকে কিছুই বাতিল করে না। আপনার ফলাফল কখনো আপনার কাছ থেকে লুকানো হয় না; এই পরীক্ষাগুলো শুধু ঠিক করে সেটা র্যাংক হবে কি না।
টাইপিং টেস্টের চিটিং কি টাইমিংয়ের পরীক্ষা পেরিয়ে যেতে পারে?
হ্যাঁ, যদি চিটিংটা যত্ন নিয়ে বানানো হয়। 2026 সালের জানুয়ারিতে David Condrey-র একটি arXiv গবেষণাপত্র এমন কিস্ট্রোক-টাইমিং ডিটেক্টর পরীক্ষা করেছিল, যেগুলোর কাজ মানুষের টাইপ করা লেখা থেকে AI-তে তৈরি লেখাকে আলাদা করা। পুরোপুরি স্বয়ংক্রিয় ইনজেকশন সেগুলো নিখুঁতভাবে আলাদা করেছিল, কিন্তু মানুষের টাইমিংসহ আক্রমণ (একজন মানুষ AI-র লেখা আবার টাইপ করছেন, বা একটি প্রোগ্রাম মানুষের টাইপিং ডেটা থেকে দেরির নমুনা নিচ্ছে) পাঁচটি ক্লাসিফায়ারকেই অন্তত 99.8% হারে ফাঁকি দিয়েছিল। গবেষণাপত্রটি লেখকত্ব শনাক্তকরণ নিয়ে, টাইপিং টেস্ট নিয়ে নয়, কিন্তু শিক্ষাটা এখানেও খাটে: তৃতীয় ধাপ অসাবধানদের ধরে, এর বেশি তেমন কিছু নয়।
আমাদের নিজেদের টেস্ট হেল্পার ছোট পরিসরে একই কথা বলে: এলোমেলো জিটার আর কয়েকটি বিরতি সেটিকে স্পষ্টতই কৃত্রিম থেকে বিশ্বাসযোগ্যে নিয়ে গিয়েছিল।
তাই তৃতীয় ধাপ একটি ছাঁকনি। রায় আসে চতুর্থ ধাপ থেকে।
চতুর্থ ধাপ: যাচাইয়ের পুনঃটেস্ট
কোনো সময়বাঁধা ফলাফল 130 WPM-এর বেশি হলে এবং তার টাইমিংও অস্বাভাবিক দেখালে, আপনি সেটা দেখতে পান এবং সেটা সেভ হয়, কিন্তু আপনি একটি যাচাইয়ের পুনঃটেস্ট পাস না করা পর্যন্ত সেটা পাবলিক বোর্ডের বাইরে থাকে। সেটা একটি নতুন 30 সেকেন্ডের টেস্ট, আর আপনাকে দাবি করা স্পিডের অন্তত 75%-এ পৌঁছাতে হবে। একবারের আকস্মিক ফল বা ধার করা লগ দ্বিতীয় রানে টেকে না।
130 WPM কেন? এটা Dhakal-এর ডেটার 51.56 WPM গড়ের প্রায় আড়াই গুণ, বেশিরভাগ টাইপিস্টের অনেক ওপরে, আর যিনি সত্যিই এত দ্রুত টাইপ করেন তিনি সেটা দুবার করতে পারেন। অদ্ভুত টাইমিংসহ হঠাৎ একটি দ্রুত ফলাফল ঠিক সেই আকারের, যা একটি ধার করা লগ বা স্ক্রিপ্ট তৈরি করে, আর ফলাফলটা সৎ হলে একটি বাড়তি টেস্ট সামান্য মূল্য।
পুনঃটেস্ট একটি সাধারণ টাইপিং টেস্ট, সাধারণ লেখায়, কোনো বিকৃত ছবি বা অদ্ভুত চিহ্নে ভরা পাতা নয়। পড়তে কষ্ট হয় এমন লেখা সবাইকে ধীর করে, আর সবচেয়ে বেশি ধীর করে সেই সৎ দ্রুত টাইপিস্টদের, যাঁদের ছাড়পত্র দেওয়ার জন্যই পুনঃটেস্ট। যে যাচাইয়ে সৎ দ্রুত টাইপিস্টরা ফেল করেন, তা না থাকার চেয়েও খারাপ। সাধারণ লেখা পরীক্ষাটাকে ন্যায্যও রাখে: পুনঃটেস্টের নিজের লগও অন্য যেকোনো ফলাফলের মতো একই টাইমিং পরীক্ষার মধ্য দিয়ে যায়।
রেট লিমিট আর ব্যান
জমা দেওয়ার হার সীমিত: সাইন ইন করা প্রতি ব্যবহারকারীর জন্য মিনিটে ত্রিশটি, প্রতি IP ঠিকানার জন্য ষাটটি। যে অ্যাকাউন্ট বারবার পরীক্ষায় আটকায়, তাকে শ্যাডো-ব্যান করা হয়, অর্থাৎ চুপচাপ বোর্ড থেকে লুকিয়ে রাখা হয়, আর 24 ঘণ্টায় তিনটি গুরুতর অ্যান্টি-চিট ঘটনা ঘটলে তা স্বয়ংক্রিয়ভাবে হয়। একটি সময়সীমার ভেতরে ঘটনা গোনার মানে, একটি অদ্ভুত ফলাফলের জন্য কখনো আপনার অ্যাকাউন্ট যায় না, অথচ বারবার ফেল করা একটি স্ক্রিপ্ট দ্রুত থেমে যায়।
সর্বকালের লিডারবোর্ডে আসতে অ্যাকাউন্টে 30 মিনিট টাইপিংও লাগে, তাই একটিমাত্র নিখুঁত রানসহ একটি নতুন অ্যাকাউন্ট সেগুলোর শীর্ষে উঠতে পারে না।
অনিচ্ছাকৃতভাবে কীসে চিহ্নিত হতে পারেন
বেশিরভাগ চিহ্নিত ফলাফল চিটিং নয়। সৎভাবে পরীক্ষায় আটকে যাওয়ার উপায়গুলো:
ফোনে অটোকারেক্ট। একটি প্রতিস্থাপন আসে একটি input ইভেন্ট হিসেবে, যা কয়েকটি অক্ষর বদলে দেয়। আমরা এটাকে একটি কিপ্রেস হিসেবে গুনি, চিহ্নিত করি, আর একটি নোটসহ ফলাফলটি পাবলিক বোর্ডের বাইরে রাখি, বাতিল করি না।
পেস্ট করা লেখা। পেস্ট করা বন্ধ, আর যে ফলাফলে চেষ্টা করা হয়েছিল তা বোর্ড থেকে বাদ পড়ে।
ট্যাব বদলানো। টেস্ট চলাকালীন দুই সেকেন্ডের বেশি পেজ থেকে ফোকাস সরে গেলে টেস্টটি বাধাপ্রাপ্ত হিসেবে চিহ্নিত হয়; সেটা সেভ হয় এবং দেখানো হয়, কিন্তু র্যাংক হয় না।
বিরতি। শব্দ বা উদ্ধৃতির টেস্টে পাঁচ সেকেন্ডের বেশি ব্যবধান হলে ফলাফলটি বিরতিযুক্ত হিসেবে চিহ্নিত হয়। একই ব্যবস্থা।
IME composition। জাপানি, কোরিয়ান ও চীনা ইনপুট আসে composition ইভেন্টের মাধ্যমে, তাই সেগুলোর জন্য আমরা keydown-এর নিয়ম বাদ দিই। তারপরও কিছু ভুল মনে হলে সেটা একটা বাগ, আর আমরা লগটা চাইব।
অফলাইন ফলাফল। শেষ হওয়ার দশ মিনিটের বেশি পরে সিঙ্ক হওয়া ফলাফল আপনার হিস্ট্রিতে র্যাংক ছাড়াই থাকে, কারণ আমরা তার ঘড়ি যাচাই করতে পারি না।
সত্যিই দ্রুত হওয়া। 130 WPM-এর ওপরে আপনি পুনঃটেস্টের মুখোমুখি হবেন, সম্ভবত আপনার প্রথম ভালো দিনেই।
কীভাবে আপিল করবেন
প্রতিটি বাদ পড়ার কারণ আপনার হিস্ট্রিতে দেখানো থাকে। কোনো ফলাফল বা নিষেধাজ্ঞা নিয়ে আমরা ভুল করেছি মনে হলে, আপনার অ্যাকাউন্টের ঠিকানা থেকে আমাদের অ্যান্টি-চিট পেজের আপিলের ঠিকানায় ইমেল করুন, ফলাফলের লিংক বা টেস্টের তারিখ ও সময়সহ। একজন মানুষ কিস্ট্রোক রিপ্লে দেখেন এবং কয়েক দিনের মধ্যে উত্তর দেন। আপিলের সিদ্ধান্ত কখনো শুধু স্বয়ংক্রিয় মডেল নেয় না।
আমরা কি এইমাত্র পরীক্ষাগুলো পেরোনোর একটা নির্দেশিকা প্রকাশ করে ফেললাম? আংশিকভাবে। বৈশিষ্ট্যের তালিকা আচরণ থেকে সবসময়ই বের করা যেত, আর সীমাগুলো গোপনই থাকে। আসল অংশ হলো পুনঃটেস্ট, আর তা পেরোনোর উপায় হলো টাইপ করা।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
টাইপিং টেস্ট কীভাবে বট ধরে?
ভালো টেস্টগুলো কিস্ট্রোক লগ পড়ে: প্রতিটি অক্ষরের পেছনে একটি কি চাপা আছে কি না, কি-গুলোর মধ্যে ব্যবধান কতটা ওঠানামা করে, আর কি কীভাবে চেপে রাখা ও একসঙ্গে চাপা হয়। স্ক্রিপ্টগুলো সাধারণত বেশি নিয়মিত হয়; সাবধানী বটেরা মানুষের নকল করতে পারে, এজন্যই আমরা একটি পুনঃটেস্ট যোগ করি।
একটি বট কি টাইপিং টেস্টের অ্যান্টি-চিট পেরিয়ে যেতে পারে?
সাবধানী একটি বট টাইমিংয়ের পরীক্ষা পেরিয়ে যেতে পারে: কিস্ট্রোক-টাইমিং ডিটেক্টর নিয়ে গবেষণায় দেখা গেছে, মানুষের মতো নকল টাইমিং প্রায় প্রতিবারই সেগুলোকে ফাঁকি দিয়েছে। এজন্যই আমরা দ্রুত ফলাফল পুনঃটেস্টের জন্য আটকে রাখি, যা একটি বটকে আবার পাস করতে হয় দ্বিতীয় একটি লগ দিয়ে, যাকে একই পরীক্ষাগুলো পেরোতে হয়।
আমার টাইপিং টেস্টের ফলাফল র্যাংক হলো না কেন?
সাধারণত কারণ হলো 15 সেকেন্ড বা 10 শব্দের চেয়ে ছোট টেস্ট, পাঁচ সেকেন্ডের বেশি বিরতি, ট্যাব বদলানো, বা পুনঃটেস্টের অপেক্ষায় থাকা 130 WPM-এর বেশি একটি ফলাফল। আপনার হিস্ট্রিতে কারণটি দেখানো থাকে।