ceturtdiena, 2013. gada 26. septembris

Draugiem.lv sēņošanas skripti

Mušmire grozā 8)


Uzreiz jābrīdina, ka šī būs virtuāla sēņošana ar virtuālām sēnēm, bez taustāmas jēgas. Samērā bezjēdzīga nodarbe un laika nosišana zinātniski pētnieciskos nolūkos.

Uzdevums Draugiem.lv spēlē, jeb kā to nosaukt, “Sēņu raža” savākt visas 38 dažādu veidu sēnes un “turpināt sēņošanu”, savācot maksimāli daudz sēņu, lai atrastos “Sēņu ražas” Topā (http://www.draugiem.lv/d/senuraza/?tab=tops).

Sēņu raža

Sēņu Tops


Pirmais — būtu jāizveido lietotāja galā (Firefox pārlūkprogrammā) Stylish skripts, lai atvieglotu sēņu atrašanu draugiem.lv lapās.
Izveidojam tā, lai sēne lapā parādās kā liels pamanāms, sarkans bloks, ko būtu grūti nepamanīt.

Stylish
Iedošu visu Stylish skriptu ar visiem sēņu URL, ja pateiksiet, kā ar CSS z-index vai ko tur uzcelt bildi visu kārtu, slāņu, divu pašā augšpusē, kā to vajadzētu izdarīt z-index, bet ne vienmēr izdara.

Atrasta sēne


“Sēņu ražas” Topā redzam, ka sēņu lielie onkuļi savākuši tādus sēņu daudzumus, kurus fiziski klikšķinot ar peli nav iespējams savākt (varbūt var).
Tādēļ mums arī jākļūst par onkuļiem un jāuzraksta neliels skripts, kas virtuālo sēņu meklēšanu un klikšķināšanu pa sēnēm izdarītu mūsu vietā. Un tēlos pārlūkprogrammu.

Es izmantošu PHP skriptu no komandrindas. Citās programmēšanas valodās skriptu būtība būs līdzīga.
Jāatrod elementi, kas tiek nosūtīti uz mūsu pārlūkprogrammu tad, kad sēne parādās lapā un “jānoklikšķina” uz sēnes.
Vienīgais, kas mums ir, tā ir reversā inženierija.

Apskatot pārlūkprogrammā atsūtīto draugiem.lv lapas kodu brīdī, kad lapā parādās sēne, mēs redzam, ka tajā brīdī lapas kodā parādās apmēram šādi jauni JavaScript koda elementi:

draugiem.lv lapas html kods


Papētot smalkāk, mēs nonākam pie secinājuma, ka svarīgākais šajā JavaScript kodā ir rindiņa:

InfoBox.open( '/d/senuraza/rq/pop_found.php?sub=1&r=0&i=20&found=fc667bcbb3949abd73a68326ea3ed5a2471fa37c', {

Jo! Jo, tā rindiņa satur URL daļu (priekšā nāk http://www.draugiem.lv) , uz kura būtu jānospiež tajā brīdī, kad sēne ir lapā, lai atrastā sēne tiktu pieskaitīta pie mūsu iepriekš jau atrastajām sēnēm.

Šī JavaScript daļa ir mainīga un nekad neatkārtojas (random) URL daļas kods. Cik nu var saprast un nojaust.
Šeit jāsāk pieminēt mūsu PHP kodi, lai ērtāk varētu nodemonstrēt, kā tas viss notiek darbībā.

JavaScript kodu mēs dekodējam un izjaucam pa daļām ar PHP preg_match un vienkāršām regulārajām izteiksmēm.

$meklis="InfoBox\.open\( \'\/d\/senuraza\/rq\/pop_found.php\?sub=(\d+)&r=(\d+)&i=(\d+)&found=([0-9a-z]+)\', \{";


Saliekam atpakaļ atrastās sēnes URL un pieprasām sēnes URL.

PHP koda gabals


Ja viss ir noritējis veiksmīgi, tad šajā brīdī pie mūsu atrastajām sēnēm būtu jāpieskaitās vēl vienai atrastai sēnei.

Mega groziņš


Pieprasījumus uz draugiem.lv serveri veicam saudzīgi izmantojot mūsu PHP skriptu ar kādu labu cURL klasi (Replacement for Google Code Search? - Stack Overflow, Search · curlclass · GitHub, ... vai izmantojam savu):

require_once($darba_direktorija.'curlclass.php');

cURL klasē nodefinējam visus nepieciešamos parametrus, cookie headeri utml., lai sekmīgi darbotos ar draugiem.lv ielogojušamajamies lietotāju.
Pieprasījumiem nav jābūt nepārtrauktiem, jo cik nu var izsecināt, tad jauna sēne neparādās ātrāk, kā pēc apmēram vidēji 10 - 15 sekundēm.
Padziļinātu izpēti par pieprasījumu skaitu laikā pret nogaidīšanas laiku neveicu.

Teorētiski pietiek ar vienu pieprasījumu 10 sekundēs, taču tad mums jāskatās uz labāko sēņotāju (skriptotāju) Topu un jāizvērtē tur esošo sēņotāju sēņošanas ātrums :)

Vēl šķiet, ka bombīšana tikai pa / samazina izredzes ātrāk atrast sēni. Randomā vai pēc kārtas jāmaina arī pieprasāmās draugiem.lv URL sadaļas, piemēram, jāpieprasa  /messages/ , /visitors/ un tādā garā.

Starp citu, līdzīgi bija arī ar to Bermontu ķeršanu.

Ja tajā draugiem.lv “Sēņu raža” spēlītē bija paredzēti kadi labumi, tad jau iepriekš atsakos no tiem.
Nevēlos piedalīties sēņošanā


Interesanti, ka caur to senuraza topu var ievākt ~ 300k aktīvu lietotāju ID datus (Piemēram: /d/senuraza/rq/top.php?tab=tops&top=all&pg=28509).

Pielikumā PHP koda gabals: Draugiem.lv “Sēņu raža” PHP CLI sēņotājs.
55096709492717636126646551950343700410

3 komentāri:

  1. Tev gan patīk lietas sarežģīt...

    AtbildētDzēst
  2. z-indexam vajag position nodefinēt

    AtbildētDzēst
    Atbildes
    1. Tieši tā, z-index darbojas tikai ar pozicionētiem elementiem.

      Dzēst

Jūsu komentārs tiks nosūtīts mājas lapas administratoram, līdz apstiprināšanai tas var nebūt pieejams šī bloga publiskajā daļā.