blog/
Скрипт для выбора победителя в инстаграме (из лайков)
Написал несколько скриптов для выбора победителей в Instagram конкурсах: по комментариям и по лайкам. В ролике рассказываю, как пользоваться этими скриптами.
Последняя версия внизу публикации, пользуйтесь бесплатно.
Обратите внимание, что у меня есть ещё один скрипт — для выбора победителя из комментариев. Вот тут — про то, как он принципиально работает, а вот тут — его последняя версия.
Если у вас есть желание что-то поправить в этих скриптах, я буду только рад: они есть на гитхабе.
Сначала я сделал вот такой вариант, но оказалось, что не всё так просто. Далее — в порядке внесения изменений. Промотайте в конец, там последняя версия.
// CHOOSE FROM LIKES, v1 // MOSTLY WRITTEN BY I. Tolstikov 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. Tolstikov 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. Tolstikov 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. Tolstikov 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; } } }
Может быть интересно:
- Скрипт для выбора победителя в инстаграме (из комментариев)
- Как разыграть бесплатные места на курсе вёрстки для архитекторов (JS+Instagram)
- Урок — Буквы от больших к маленьким в InDesign
- Calculate inclination of a roof valley with Python
- Задаём свойства объектам в ArchiCAD 23 через Python