गुस्सा पालतू जानवर ब्राउज़र के लिए बॉट

चेतावनी : बॉट अपमान के लिए सरल है। आपको कुछ नया सीखने की संभावना नहीं है। सिर्फ मनोरंजन के लिए लेख।

मैंने फैसला किया कि एक साल के बाद आप देख सकते हैं कि VKontakte के दोस्तों ने क्या मज़ा लिया है। पारंपरिक टन की राजनीति के अलावा, बिल्ली के बच्चे और अन्य अश्लील चित्रों के साथ, मुझे एंग्री पेट्स ब्राउज़र का लिंक मिला। मैंने कभी ब्राउज़र नहीं चलाया, इसलिए मैंने यह देखने का फैसला किया कि यह किस तरह का जानवर है। यह निम्नलिखित निकला: सबसे ज्यादा कावई चित्र (क्यूट कैट, पेंगुइन और गिलहरी एक दूसरे के चेहरे को पीटते हैं), गुदा दान करते हैं (धन 8 गुना गुणा आय), भूखंड, रणनीति, निराशाजनक, मैनुअल और अन्य सामान्य सुविधाएं गायब हैं।

खेल पूरी तरह से कम से कम पूरी तरह से सरल संचालन के होते हैं: एक इमारत का निर्माण, 10 मिनट प्रतीक्षा करें, इकाइयों का निर्माण करें, 10 मिनट प्रतीक्षा करें, एक शिकार ढूंढें, इकाइयों को हमला करने के लिए भेजें, 10 मिनट तक प्रतीक्षा करें, एक शिकार ढूंढें, इकाइयों को हमला करने के लिए भेजें, 10 मिनट प्रतीक्षा करें ... (उच्च स्तर पर 10 मिनट तेजी से बढ़ते हैं। त्वरण के लिए - एक शुल्क।)

ऐसे खेल से क्या लेना-देना? यह सही है, एक बॉट लिखें। ईमानदारी से यह मत खेलो।



हमने कार्य निर्धारित किया है:


ताकि बॉट एकदम से जल न जाए, सबसे पहले, हम उन बच्चों की पिटाई करने के लिए पीड़ितों का चयन करते हैं जो लंबे समय से ऑनलाइन नहीं थे, ताकि वे शिकायत न करें कि हमें कहां होना चाहिए; दूसरी बात, हम उपयोगकर्ता कार्यों का अनुकरण करते हैं, और नंगे AJAX अनुरोध नहीं भेजते हैं; तीसरा, क्रियाओं के बीच विलंब यादृच्छिक नहीं है, लेकिन शून्य है।

बॉट के लेखकों की खुशी के लिए, साइट पर लिपियों को बाधित नहीं किया जाता है। केवल पैक स्क्रिप्ट्स jQuery और अन्य हैं। और हाँ, वहाँ jQuery है, इसलिए हम सभ्यता के सभी लाभों का उपयोग करते हैं।

खेल के अधिकांश कार्यों में AJAX के अनुरोध होते हैं। आप एक आइटम पर क्लिक करते हैं, अनुरोध दूर हो जाता है, या तो लगभग पूर्ण स्क्रीन या एक अलग विंडो आती है। डीबगर में लिंक की जांच करते हुए, हम देखते हैं कि वे जैसे दिखते हैं
<a href="/10193192/city/view/10009466" data-link-handled="1" onclick="Main.goToUrl(this);return false;"></a> 
जहां Main.goToUrl विधि या तो तार या लिंक तत्वों को स्वीकार करती है। अधिकांश गेम लिंक में खिलाड़ी प्रोफ़ाइल पहचानकर्ता के साथ शुरुआत में एक उपसर्ग होता है। इसे बचाओ।

  profilePath: window.location.pathname.match(/^\/\d+\//)[0], 

AJAX अनुरोध कैसे करें? JQuery के पास एक अच्छा कार्य $ .ajaxSuccess है, जिसमें आप प्रत्येक सफल अनुरोध के बाद कॉलबैक पास कर सकते हैं। घटना, XMLHttpRequest ऑब्जेक्ट, और $ .ajax कॉल के लिए तर्क इसमें डंप हैं। तदनुसार, किसी दिए गए URL की प्राप्ति पर, हम अपना कॉलबैक कहते हैं।

  ajaxCallbacks: {}, run: function () { ... $('html').ajaxSuccess(Bot.ajaxSuccess); ... }, ajaxSuccess: function (e, xhr, settings) { var ajaxUrl = null, ajaxCallback = null; $.each(Bot.ajaxCallbacks, function (url, callback) { var fullUrl = Bot.profilePath + url; if (settings.url.substr(0, fullUrl.length) == fullUrl) { ajaxUrl = url; ajaxCallback = callback; } }); if (ajaxCallback) { Bot.ajaxCallbacks[ajaxUrl] = null; setTimeout(ajaxCallback, Bot.getClickDelay()); } }, waitForAjax: function (pageUrl, gotoPage, success) { Bot.ajaxCallbacks[pageUrl] = success; gotoPage(); }, 

अच्छी तरह से और विशुद्ध रूप से एकरूपता के लिए प्रतीक्षा करेंफॉरजैक्स में हम प्रतीक्षाफल जोड़ते हैं जब यह आवश्यक है कि AJAX के लिए इंतजार न करें, लेकिन सिर्फ देरी करने के लिए।

  waitForAction: function (action, success) { action(); setTimeout(success, Bot.getClickDelay()); }, 

एक साधारण मानव नश्वर अक्सर कैसे खेत करता है? वह मेल बटन दबाता है, लॉग पर जाता है, हाल ही में हुए हमले वाले शहर का चयन करता है, "हमला" पर क्लिक करता है, इकाइयों का चयन करता है, "चेहरे को भरें" पर क्लिक करता है।



इसलिए हम इस ऑपरेशन को एक सर्कल में दोहराएंगे। बेशक, लॉग में सही पृष्ठ पर सही शहर हमेशा नहीं होगा, लेकिन किसी विशेष प्रेरणा के बिना चालू करने के जटिल तर्क को लिखने के लिए स्पष्ट रूप से आलस्य है।

हम एक पीड़ित का चयन करते हैं और लिंक बनाते हैं ...
  attackNext: function () { if (Bot.targetCities.length == 0) return; if (!Bot.targetCities[Bot.currentTargetCity]) Bot.currentTargetCity = 0; var targetCity = Bot.targetCities[Bot.currentTargetCity++], targetCityUrl = 'city/view/' + targetCity, attackCityUrl = 'attack/' + targetCity; 

हम लिंक का अनुसरण करते हैं और बटन पर क्लिक करते हैं ...
  Bot.waitForAjax('pm/inbox', function () { Main.goToUrl(Bot.profilePath + 'pm/inbox'); }, function () { Bot.waitForAjax('pm/logs', function () { Main.goToUrl(Bot.profilePath + 'pm/logs'); }, function () { Bot.waitForAjax(targetCityUrl, function () { Main.goToUrl(Bot.profilePath + targetCityUrl); }, function () { Bot.waitForAjax(attackCityUrl, function () { $('button[onclick^="Attack.showAttackAlert"]').click(); }, function () { 

या तो हम विशिष्ट इकाइयों का चयन करते हैं (उपलब्ध मात्रा अधिकतम इनपुट विशेषता में है), या हम सब कुछ (एक अलग बटन) का चयन करते हैं, और फिर सबसे महत्वपूर्ण बात: "हमला" पर क्लिक करें।
  Bot.waitForAction(function () { var count = 0; $.each(Bot.attackUnits, function (unitType, unitNum) { var ctl = $('input[name="units[' + unitType + ']"]'); ctl.val(Math.min(ctl.attr('max'), unitNum)).change(); count++; }); if (count == 0) { $('span[onclick^="Attack.ChooseEveryone"]').click(); } }, function () { $('button[type=submit]').click(); setTimeout(Bot.attackNext, Bot.getAttackInterval()); }) 

जब आप AJAX पेजों पर क्लिक करते हैं तो पॉपअप परतें बंद हो जाती हैं, आप परेशान नहीं हो सकते।

दरअसल, बस इतना ही। केवल हमले वाले शहरों की एक सुंदर सूची को देखने के लिए उपवास किया जा सकता है कि हम किसको गीला कर रहे हैं।

पूर्ण कोड:
 window.Bot = { attackInterval: /*5.5*/8 * 60 * 1000, // 8 min attackIntervalRandom: 1.2 * 60 * 1000, // 1.2 min clickDelay: 3 * 1000, // 3 sec clickDelayRandom: 4 * 1000, // 4 sec targetCities: [ //12345678 ], attackUnits: { //101: 99 }, profilePath: window.location.pathname.match(/^\/\d+\//)[0], currentTargetCity: 0, ajaxCallbacks: {}, run: function () { var box = '<div style="position: absolute; background: #fff; padding: 10px; border-radius: 10px; left: 20px; top: 20px; z-index: 666666">'; $.each(Bot.targetCities, function (_, cityId) { box += '<a class="bot-target-city" data-link-handled="1" onclick="Main.goToUrl(this);return false;"' + ' id="bot-target-city-' + cityId + '"' + ' href="' + Bot.profilePath + 'city/view/' + cityId + '">' + cityId + '</a><br>'; }); box += '</div>'; $('body').append(box); $('html').ajaxSuccess(Bot.ajaxSuccess); Bot.attackNext(); }, ajaxSuccess: function (e, xhr, settings) { var ajaxUrl = null, ajaxCallback = null; $.each(Bot.ajaxCallbacks, function (url, callback) { var fullUrl = Bot.profilePath + url; if (settings.url.substr(0, fullUrl.length) == fullUrl) { ajaxUrl = url; ajaxCallback = callback; } }); if (ajaxCallback) { Bot.ajaxCallbacks[ajaxUrl] = null; setTimeout(ajaxCallback, Bot.getClickDelay()); } else { console.log('Not recognized ' + settings.url); } }, waitForAjax: function (pageUrl, gotoPage, success) { Bot.ajaxCallbacks[pageUrl] = success; gotoPage(); }, waitForAction: function (action, success) { action(); setTimeout(success, Bot.getClickDelay()); }, getAttackInterval: function () { return parseInt(Bot.attackInterval + Math.random() * Bot.attackIntervalRandom); }, getClickDelay: function () { return parseInt(Bot.clickDelay + Math.random() * Bot.clickDelayRandom); }, attackNext: function () { if (Bot.targetCities.length == 0) return; if (!Bot.targetCities[Bot.currentTargetCity]) Bot.currentTargetCity = 0; var targetCity = Bot.targetCities[Bot.currentTargetCity++], targetCityUrl = 'city/view/' + targetCity, attackCityUrl = 'attack/' + targetCity; $('a.bot-target-city').css({ fontWeight: 'normal' }); $('a#bot-target-city-' + targetCity).css({ fontWeight: 'bold' }); Bot.waitForAjax('pm/inbox', function () { Main.goToUrl(Bot.profilePath + 'pm/inbox'); }, function () { Bot.waitForAjax('pm/logs', function () { Main.goToUrl(Bot.profilePath + 'pm/logs'); }, function () { Bot.waitForAjax(targetCityUrl, function () { Main.goToUrl(Bot.profilePath + targetCityUrl); }, function () { Bot.waitForAjax(attackCityUrl, function () { $('button[onclick^="Attack.showAttackAlert"]').click(); }, function () { Bot.waitForAction(function () { var count = 0; $.each(Bot.attackUnits, function (unitType, unitNum) { var ctl = $('input[name="units[' + unitType + ']"]'); ctl.val(Math.min(ctl.attr('max'), unitNum)).change(); count++; }); if (count == 0) { $('span[onclick^="Attack.ChooseEveryone"]').click(); } }, function () { $('button[type=submit]').click(); setTimeout(Bot.attackNext, Bot.getAttackInterval()); }) }); }); }); }); } }; Bot.run(); 


उपयोग के लिए निर्देश:


सामान्य तौर पर, खेल के मालिकों का अहंकार मुझे उत्तेजित करता है। ओजेरिन के रूप में "सदस्यता शुल्क" (जिसके बिना और भी अधिक निराशाजनक रूप से खेलने के लिए) 180 रूबल / महीना (WoW, जिसमें वह सब कुछ है जो इस खेल में नहीं है, इसकी लागत केवल 2 गुना अधिक है)। संसाधनों को 120 रूबल / दिन (दिन!) तक खरीदा जा सकता है, संसाधनों के निष्कर्षण की गति को 8 गुना बढ़ाकर (वॉलेट्स की प्रतियोगिता, गैर-भुगतान आम तौर पर जंगल में जाते हैं)। त्वरक, रॉकेट के लिए भागों, हमले के लिए बोनस, quests पूरा करने के लिए खुला स्थान (हाँ, मैंने 300 रूबल का भुगतान किया - खोज पारित) और अन्य trifles आम तौर पर असीमित हैं। संसाधनों का आदान-प्रदान, एक कबीले में शामिल होना और अधिक - केवल पैसे के लिए। उन्हें "खिलाड़ियों की पसंद" का भुगतान करना होगा - ये 1500 रूबल के लिए सिक्के हैं। और यह सब एक लोहे के तर्क द्वारा कवर किया गया है: “आय का कुछ हिस्सा डब्ल्यूडब्ल्यूएफ में जाता है! आप प्यारा शराबी जानवरों को बचाने के लिए! आप निरंकुश होंगे - हम आप पर प्रतिबंध लगा देंगे! "

और आखिरकार, लोग भुगतान करते हैं। मैं नासमझ।

Source: https://habr.com/ru/post/In148323/


All Articles