Скрипт для выбора победителя в инстаграме (из лайков)

Ivan @ 10 / 10 / 2021 @ Blog / Программирование / Скрипты
( / )

Время чтения: ~ 27 мин.

Напи­сал несколь­ко скрип­тов для выбо­ра побе­ди­те­лей в Instagram кон­кур­сах: по ком­мен­та­ри­ям и по лай­кам. В роли­ке рас­ска­зы­ваю, как поль­зо­вать­ся эти­ми скриптами.

Послед­няя вер­сия вни­зу пуб­ли­ка­ции, поль­зуй­тесь бесплатно.

Обра­ти­те вни­ма­ние, что у меня есть ещё один скрипт — для выбо­ра побе­ди­те­ля из ком­мен­та­ри­ев. Вот тут — про то, как он прин­ци­пи­аль­но рабо­та­ет, а вот тут — его послед­няя версия.

Если у вас есть жела­ние что-то попра­вить в этих скрип­тах, я буду толь­ко рад: они есть на гит­ха­бе.

Сна­ча­ла я сде­лал вот такой вари­ант, но ока­за­лось, что не всё так про­сто. Далее — в поряд­ке вне­се­ния изме­не­ний. Про­мо­тай­те в конец, там послед­няя версия.

// CHOOSE FROM LIKES, v1 
// MOSTLY WRITTEN BY I. Matveev of DMTRVK.RU 
// License: Creative Commons BYNCSA v3.
// THANKS TO GeorgeCrisan from https://forum.freecodecamp.org/t/how-to-make-math-random-not-repeat-same-numbers/417973/3 for the generateUniqueRandom function

// here you can set it up:

let myAccoutName = "dmtrvk.ru"; //your account name to exclude from selection
let howManyToSelect = 5; //number of winners
let numberOfCommentPagesToOpen = 100; // number times to click on the button
let timeToWaitBetweenClicks = 500; // in milliseconds, set this according to your connection speed, so the browser would have time to load the button to expand the comments list.

// end of setup, lets run it.
let haveIt = [];


mainProcess(howManyToSelect); 


function generateUniqueRandom(maxNr) {
    //Generate random number
    let random = (Math.random() * maxNr).toFixed();

    //Coerce to number by boxing
    random = Number(random);

    if(!haveIt.includes(random)) {
        haveIt.push(random);
        return random;
    } else {
        if(haveIt.length < maxNr) {
          //Recursively generate number
         return  generateUniqueRandom(maxNr);
        } else {
          console.log('No more numbers available.')
          return false;
        }
    }
}

function mainProcess(howManyToSelect){

    let userNameList = document.querySelectorAll(".FPmhX.notranslate.MBL3Z "); // here goes the selector we search for
    console.log(userNameList.length);
    nameSet = new Set();

    if (userNameList.length<=0){
    	console.log ("no names found! program aborted")
    	throw '';
    }
    
    for (let i=0; i<userNameList.length; i++) {
      nameSet.add(userNameList[i].firstChild.nodeValue);
      console.log(userNameList[i].firstChild.nodeValue);
    }

    console.log(nameSet.size);
    let keys = Array.from(nameSet.keys());

    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("Selected randomly:");

    for (i=0; i<howManyToSelect; i++){ //CHANGE THIS TO THE NUMBER OF WINNERS
        //console.log(keys[Math.floor(Math.random() * keys.length)]);
        randomNumber = generateUniqueRandom(keys.length);
        if (keys[randomNumber] == myAccoutName | keys[randomNumber] == undefined){ //CHANGE THIS TO EXCLUDE YOUR ACCOUNT
            i--;
        } else {
            console.log("№",i+1," —", "@", keys[randomNumber]);
        }
    }
}

Откры­ва­е­те пуб­ли­ка­цию, потом загру­жа­е­те спи­сок людей, поста­вив­ших лайк. Потом про­сто встав­ля­е­те в кон­соль бра­у­зе­ра и нажи­ма­е­те Ввод.

Обра­ти­те вни­ма­ние на ком­мен­та­рии в коде: в нача­ле про­грам­мы есть несколь­ко переменных.

myAccoutName = "dmtrvk​.ru"; //имя вашей учет­ной запи­си, кото­рое нуж­но исклю­чить из выбора
howManyToSelect = 5; //сколько побе­ди­те­лей вам нуж­но выбрать
numberOfCommentPagesToOpen = 100; // сколь­ко раз нажи­мать на кноп­ку +, что­бы под­гру­зить ком­мен­та­рии (в зави­си­мо­сти от того, сколь­ко у вас ком­мен­та­ри­ев под публикацией)
timeToWaitBetweenClicks = 500; // в мил­ли­се­кун­дах, уста­но­ви­те в соот­вет­ствии со ско­ро­стью ваше­го соеди­не­ния, что­бы бра­у­зер успел загру­зить кноп­ку +, кото­рая под­гру­жа­ет спи­сок комментариев.ъ

 

UPD: По какой-то невнят­ной при­чине скрипт не рабо­та­ет с остав­шей­ся частью спис­ка, пока не разо­брал­ся почему.

 

UPD2: Невнят­ная при­чи­на: не все попа­да­ло в спи­сок по при­чине того, что эти эле­мен­ты дина­ми­че­ски уда­ля­ют­ся и пока­зы­ва­ют­ся. Что делать с этим, пока не знаю.

UPD3: пока так, из трех частей, кото­рые надо запу­стить одну за дру­гой. После запус­ка пер­вой, надо про­скрол­лить коле­сом спи­сок туда-сюда, что­бы он запи­сал­ся в переменную.

// CHOOSE FROM LIKES, v3
// MOSTLY WRITTEN BY I. Matveev of DMTRVK.RU 
// License: Creative Commons BYNCSA v3.
// THANKS TO GeorgeCrisan from https://forum.freecodecamp.org/t/how-to-make-math-random-not-repeat-same-numbers/417973/3 for the generateUniqueRandom function
// THERE ARE 3 PARTS TO RUN one after another:


// #1
// FIRST PASTE AND RUN THIS ONE THEN SCROLL THE LIST, SO THE SCRIPT WOULD GATHER THE NAMES LIST

//run it on scroll
//
let nameSet = new Set();
document.addEventListener('wheel', () => {

     	let userNameList = document.body.querySelectorAll('.FPmhX'); // here goes the selector we search for
      console.log(userNameList.length);
      console.log(nameSet.size);
      

      if (userNameList.length<=0){
        console.log ("no names found! program aborted")
        throw '';
      }
      
      for (let i=0; i<userNameList.length; i++) {
        nameSet.add(userNameList[i].firstChild.nodeValue);
        console.log(userNameList[i].firstChild.nodeValue);
      }
});

// #2
// WHEN SCROLLED, CHECK THE LIST LENGTH
console.log(nameSet.size);


// #3
// THEN RUN THE MAIN SCRIPT:
// here you can set it up:

let myAccoutName = "dmtrvk.ru"; //your account name to exclude from selection
let howManyToSelect = 5; //number of winners
let numberOfCommentPagesToOpen = 100; // number times to click on the button
let timeToWaitBetweenClicks = 500; // in milliseconds, set this according to your connection speed, so the browser would have time to load the button to expand the comments list.

// end of setup, lets run it.
let haveIt = [];


mainProcess(howManyToSelect); 


function generateUniqueRandom(maxNr) {
    //Generate random number
    let random = (Math.random() * maxNr).toFixed();

    //Coerce to number by boxing
    random = Number(random);

    if(!haveIt.includes(random)) {
        haveIt.push(random);
        return random;
    } else {
        if(haveIt.length < maxNr) {
          //Recursively generate number
         return  generateUniqueRandom(maxNr);
        } else {
          console.log('No more numbers available.')
          return false;
        }
    }
}

function mainProcess(howManyToSelect){

    let keys = Array.from(nameSet.keys());

    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("Selected randomly from ", keys.length, " keys:");

    for (i=0; i<howManyToSelect; i++){ //CHANGE THIS TO THE NUMBER OF WINNERS
        //console.log(keys[Math.floor(Math.random() * keys.length)]);
        randomNumber = generateUniqueRandom(keys.length);
        if (keys[randomNumber] == myAccoutName | keys[randomNumber] == undefined){ //CHANGE THIS TO EXCLUDE YOUR ACCOUNT
            i--;
        } else {
            console.log("№",i+1," —", "@", keys[randomNumber]);
        }
    }
}

 UPD4: Пере­ра­бо­тал скрипт, теперь доста­точ­но про­скрол­лить туда-сюда (коле­сом мыши, пото­му что он сра­ба­ты­ва­ет на это собы­тие) и нажать Enter для выбо­ра победителя.

// CHOOSE FROM LIKES, v4
// MOSTLY WRITTEN BY I. Matveev of DMTRVK.RU
// License: Creative Commons BYNCSA v3.
// THANKS TO GeorgeCrisan from https://forum.freecodecamp.org/t/how-to-make-math-random-not-repeat-same-numbers/417973/3 for the generateUniqueRandom function
// thanks to Anna for the feedback.
// 
// INSTRUCTIONES:
// 
// #1
// PASTE AND RUN THIS SCRIPT IN CONSOLE, 
// THEN SCROLL THE LIST, 
// SO THE SCRIPT WOULD GATHER 
// THE NAMES LIST FROM 
// THE LIKES SECTION OF THE POST 
// UNTIL THE NUMBER OF ADDED USERNAMES STOPS TO INCREASE
// 
// #2
// PRESS ENTER WHEN FINISHED
// 
// 
// SET THESE PARAMETERS ACCORING TO YOUR NEEDS
// 

let myAccoutName = "dmtrvk.ru"; //your account name to exclude from selection, or leave it blank if you wish to have yourself a present just in case
let howManyToSelect = 3; //number of winners

// 
// END OF SETUP, LETS RUN IT.
// 

let nameSet = new Set();

window.alert('Scroll the list while the number in the console doesn\'t match the number of comments. Then click in the comment box free space (somwhere between element, so you don\'t click on a link, and press Enter.');

document.addEventListener('wheel', handler = function() { // set the fucking handler for this unnamed fucntion so I can delet the event listener later

    let userNameList = document.body.querySelectorAll('.FPmhX'); // here goes the selector we search for
    console.log(nameSet.size);

    if (userNameList.length <= 0) {
        console.log("No names found! Program aborted.")
        throw '';
    }

    for (let i = 0; i < userNameList.length; i++) {
        nameSet.add(userNameList[i].firstChild.nodeValue);
    }
});

window.addEventListener('keyup', handler2 = function (e) {
    let text = e.type +
        ' key=' + e.key +
        ' code=' + e.code +
        (e.shiftKey ? ' shiftKey' : '') +
        (e.ctrlKey ? ' ctrlKey' : '') +
        (e.altKey ? ' altKey' : '') +
        (e.metaKey ? ' metaKey' : '') +
        (e.repeat ? ' (repeat)' : '') +
        "\n";
    console.log('Pressed', text);
    if (e.key === 'Enter') {
        document.removeEventListener('wheel', handler);
        window.removeEventListener('keyup', handler2, true);
        main(howManyToSelect, myAccoutName);
    }
}, true);


function main(howManyToSelect, myAccoutName)  {
    console.log('> Number of unique names:', nameSet.size);
    let keys = Array.from(nameSet.keys());
    let haveIt = [];
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("Randomly selected ", howManyToSelect, " from ", keys.length, " keys:");
    for (let i = 0; i < howManyToSelect; i++) { //CHANGE THIS TO THE NUMBER OF WINNERS
        //console.log(keys[Math.floor(Math.random() * keys.length)]);
        let randomNumber = generateUniqueRandom(keys.length, haveIt);
        console.log('!nmasdasdas')
        if (keys[randomNumber] == myAccoutName | keys[randomNumber] == undefined) { //CHANGE THIS TO EXCLUDE YOUR ACCOUNT
            i--;
        } else {
            console.log("№", i + 1, " —", "@", keys[randomNumber]);
        }
    }
}

function generateUniqueRandom(maxNr, haveIt) {
    //Generate random number
    let random = (Math.random() * maxNr).toFixed();

    //Coerce to number by boxing
    random = Number(random);

    if (!haveIt.includes(random)) {
        haveIt.push(random);
        return random;
    } else {
        if (haveIt.length < maxNr) {
            //Recursively generate number
            return generateUniqueRandom(maxNr);
        } else {
            console.log('No more numbers available.')
            return false;
        }
    }
}

UPD5: Послед­няя вер­сия скрип­та: рабо­та­ет авто­ма­ти­че­ски, вам надо толь­ко скрол­лить коле­сом спи­сок лай­ков, и потом он сам сра­бо­та­ет как надо. Если не сра­бо­та­ет, все­гда мож­но нажать Ввод.

// CHOOSE FROM LIKES, v5
// MOSTLY WRITTEN BY I. Matveev of DMTRVK.RU
// License: Creative Commons BYNCSA v3.
// thanks to Anna for the feedback.
// 
// INSTRUCTIONES:
// 
// #1
// PASTE AND RUN THIS SCRIPT IN CONSOLE, 
// THEN SCROLL THE LIST, 
// SO THE SCRIPT WOULD GATHER 
// THE NAMES LIST FROM 
// THE LIKES SECTION OF THE POST 
// UNTIL THE NUMBER OF ADDED USERNAMES STOPS TO INCREASE
// 
// #2
// PRESS ENTER WHEN FINISHED
// 
// 
// SET THESE PARAMETERS ACCORING TO YOUR NEEDS
// 

let myAccoutName = "dmtrvk.ru"; //your account name to exclude from selection, or leave it blank if you wish to have yourself a present just in case
let howManyToSelect = 3; //number of winners

// 
// END OF SETUP, LETS RUN IT.
// 

let nameSet = new Set();
let one = document.body.querySelector('.Nm9Fw');
let two = one.querySelector('.zV_Nj');
let numberOfComments = Number.parseInt(two.querySelector('span').innerText) + 1;

window.alert('Scroll the list while the number in the console doesn\'t match the number of comments. Then click in the comment box free space (somwhere between element, so you don\'t click on a link, and press Enter.');
console.log ('Number of comments to parse:', numberOfComments);
document.addEventListener('wheel', handler = function() { // set the fucking handler for this unnamed fucntion so I can delet the event listener later

    let userNameList = document.body.querySelectorAll('.FPmhX'); // here goes the selector we search for
    

    if (userNameList.length <= 0) {
        console.log("No names found! Program aborted.")
        throw '';
    }

    for (let i = 0; i < userNameList.length; i++) {
        nameSet.add(userNameList[i].firstChild.nodeValue);
    }
    console.log('Number of uiqueueueue names found:', nameSet.size);

    if (nameSet.size >= numberOfComments) {
        document.removeEventListener('wheel', handler);
        window.removeEventListener('keyup', handler2, true);
        main(howManyToSelect, myAccoutName);
    }
});

window.addEventListener('keyup', handler2 = function (e) {
    let text = e.type +
        ' key=' + e.key +
        ' code=' + e.code +
        (e.shiftKey ? ' shiftKey' : '') +
        (e.ctrlKey ? ' ctrlKey' : '') +
        (e.altKey ? ' altKey' : '') +
        (e.metaKey ? ' metaKey' : '') +
        (e.repeat ? ' (repeat)' : '') +
        "\n";
    console.log('Pressed', text);
    if (e.key === 'Enter') {
        document.removeEventListener('wheel', handler);
        window.removeEventListener('keyup', handler2, true);
        main(howManyToSelect, myAccoutName);
    }
}, true);

function main(howManyToSelect, myAccoutName)  {
    console.log('> Number of unique names to choose from:', nameSet.size);
    let keys = Array.from(nameSet.keys());
    let haveIt = [];
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("!!!!!!!!!!!!!!!!!!!!!!!!");
    console.log("Randomly selected ", howManyToSelect, " from ", keys.length, " keys:");
    for (let i = 0; i < howManyToSelect; i++) { //CHANGE THIS TO THE NUMBER OF WINNERS
        //console.log(keys[Math.floor(Math.random() * keys.length)]);
        let randomNumber = generateUniqueRandom(keys.length, haveIt);
        if (keys[randomNumber] == myAccoutName | keys[randomNumber] == undefined) { //CHANGE THIS TO EXCLUDE YOUR ACCOUNT
            i--;
        } else {
            console.log("№", i + 1, " —", "@", keys[randomNumber]);
        }
    }
}

function generateUniqueRandom(maxNr, haveIt) {
    //Generate random number
    let random = (Math.random() * maxNr).toFixed();

    //Coerce to number by boxing
    random = Number(random);

    if (!haveIt.includes(random)) {
        haveIt.push(random);
        return random;
    } else {
        if (haveIt.length < maxNr) {
            //Recursively generate number
            return generateUniqueRandom(maxNr);
        } else {
            console.log('No more numbers available.')
            return false;
        }
    }
}

 


Может быть интересно:


Подпишитесь на нас в социальных сетях!

Instagram
VK
Facebook
YouTube!
Telegram!

Подпишитесь на обновления



* нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных