Dalius Daro

2019 m. gruodžio 8 d., sekmadienis

Instagram'o automatizacija

Kadangi pastaruoju metu mane dominanti tema yra marketing’as, tai pasidarė įdomu ar įmanoma automatizuoti Instagram’o like’us. Kažkiek paieškojau informacijos - argumentų kodėl tai verta daryti yra, kaip tai daryti „teisingai“ informacijos irgi yra. Tai pagalvojau - reikia pabandyti. Tam tikra prasme tai turbūt patenka prie juodųjų marketingo technologijų, bet dėl to galbūt tai dar įdomiau.

Natūralu, kad ne pirmas tai sugalvojau, tai kažkas tikrai bandė padaryti. Radau projektą github’e https://github.com/instagrambot/instabot - pagal instrukcijas paleidau ir po 30 like’ų buvau užblokuotas. Tik tada ėmiau žiūrėti į projekto “Issues” skiltį ir pamačiau, kad yra krūva problemų apie blokavimą. Pasirodo Instagram’as birželio penktą paleido Machine Learning paremtą sistemą, kuri automatiškai gaudo automatizuotas sistemas (botus). Idėja, kad Instagram’as turi būti kuo labiau autentiškas. Tiesa sakant, dalis automatizacijos paslaugas teikiančių kompanijų tiesiog užsidarė Instagram’ui padarius šiuos pakeitimus. Atviro kodo projektuose pasipylė problemos (issues), kuriuose padiskutavo, kad su Instagram’o machine learning sistema reikia kovoti parašant savo machine learning sistemą, bet iš esmės čia viskas ir baigėsi. Realiai sprendimo atrodo niekas nerado.

Šią situaciją priėmiau kaip iššūkį, nes buvo išties įdomu kiek gera ta sistema. Taigi, jei python’u paremta sistema pagaunama lengvai, galbūt galima sugalvoti kažką gudresnio? Dalis ale „veikiančių“ sistemų yra paremtos naršyklių plėtiniais. Kadangi greituoju būdu GramUp neradau, mokamos sistemos imti nesinorėjo (nes neįdomu), tai nusprendžiau pabandyti parašyti savo.

Tai beje nėra labai sudėtinga (kam neįdomu techninė dalis, praleidžiame visą kodą ir skaitome paskutinę pastraipą).

Pirmiausia, paimame Your first WebExtension tutorial’ą ir pasidarome paprastą naršyklės plėtinį.

Tada pasirašome pagalbinę funkciją:

function sleep(s) {
    return new Promise(resolve => setTimeout(resolve, s * 1000));
}

O čia galėtų būti boto kodas, kuris like’ina visus įrašus, kuriuos rado instagramo puslapyje. Turėtų veikti. Netikrinau, nes ne tokia mano idėja, o kas norės nesunkiai praplės iki reikiamo kodo.

(async function() {
    let links = document.querySelectorAll('a');
    for (const link of links) {
        let href = link.getAttribute('href');
        if (href.startsWith('/p/')) {
            link.click();
            await sleep(2)

            let likeButtons = document.querySelectorAll('span[aria-label="Like"]');
            if (likeButtons.length > 0) {
                likeButtons[0].parentNode.click();
                await sleep(2);
            }

            window.history.back();
            await sleep(2);
        }
    }
})

Taigi maždaug toks kodas suveikė maždaug 30čiai like’ų ir šįkart jau gavau bloką savaitei (visa tai įvyko per maždaug 10-20 min). Su ta paskyra eksperimentų daugiau nedarysiu, nes gal man dar jos reikės.

Bet pasiduoti čia dar nesinorėjo, nes visgi įdomu ar tikrai efektyvus instagram’as šioje vietoje. Todėl ėmiau galvoti apie problemą iš Instagram’o pozicijų. Jeigu man reikėtų atpažinti botus - kaip aš tai daryčiau. Tarkime greitai sugalvojau šiuos variantus:

  • Ieškočiau neįprasto žmogui elgesio pagal tai kaip dažnai ir kokiais intervalais atliekamai veiksmai. Pvz.: joks normalus žmogus nelike’ins idealiai kas 5 sekundes. Šitas dalykas garantuotai padarytas, nes jis pigus.

  • Ieškočiau monotoniško ar labai nuspėjamo elgesio. Pvz.: žmogus gali panaršyti, palike’inti, paskaityti, pakomentuoti ir visus tuos veiksmus daryti be jokios griežtos tvarkos ar bent jau ta tvarka atitinka kažkokius šablonus, kuriuos ML turėtų pagauti. Šį dalyką padaryti šiek tiek brangiau todėl jei jis padarytas tikriausiai taikomas išimtinais atvejais. Taip pat šis dalykas turi vieną didelį minusą, autizmo spektro žmonės gali būti palaikyti botais (ir tas panašu kartais įvyksta, jeigu tikėti žmonėmis).

  • Dar galbūt ieškočiau pačiam žmogui neįprasto elgesio. Tikėtina, kad žmogus paleidęs botą ir veikdamas pats elgsis skirtingai. Čia galima paprasčiausiai skirstyti žmones į skirtingas grupes ir jei ta pati paskyra patenka į skirtingas grupes, galima manyti, kad rastas botas. Na nebent dalinatės paskyra su kažkuo.

  • Ieškočiau elementarių automatizacijos požymių (pvz.: click() kvietimas simuliuoja paspaudimą gana nevykusiai). Šito Instagram’as, mano nuostabai, nepadaręs apskritai, nes turėčiau gauti bloką po pirmo automatizuoto like’o.

Taigi sekantį botą parašiau šiek tiek rafinuočiau. Pažiūrėjau kaip maždaug elgiuosi aš palike’inęs 50 įrašų (save iš šono stebėti sunku, bet įmanoma). Tada parašiau bot’ą pagal maždaug tą patį savo elgesio šabloną. Čia po 150 like’ų per 4 valandas bloko negavau. Įdomioji dalis, kad po kelių valandų pabandęs like’inti gyvai gavau bloką po 30 like’ų, o tada sistema po valandos dar ir savaitei užblokavo. Taigi rezultate turiu dvi blokuotas paskyras. Spėju, kad trigerinau sistemą surinkęs daugiau negu 200 like’ų per 24h ir buvo paleistas koks nors brangesnis patikrinimas per mano veiksmus.

Taigi iš esmės Instagram’o apsauga nuo botų tikrai gerai padaryta. Kažkiek apeinama, bet apeidinėti jos neverta, nes bloką galima gauti, jei ne dabar, tai vėliau patobulėjus Instagram’o botų nustatymo sistemai. Kas iš esmės džiugina iš tos pusės, kad konkuruoti su kitais reikės lygioje kovoje bent jau iš technologinės pusės.