Visualizzazione risultati 1 fino 12 di 12

Discussione: [P2P-DC]Info tramite bot in php

  1. #1
    Guest

    Post [P2P-DC]Info tramite bot in php

    Sapete come posso creare un piccolo bot in php che riesca ad entrare in un hub della rete dc?.
    In modo da poter avere la lista degli user presenti nell'hub su pagina.
    Grazie anticipatamente.
    Io ho un piccolo script per lo più una classe di funzioni che tramite socks si connette,solo che non sò come fare ad interpretare i risultati.
    Codice PHP:
    <?php

    error_reporting
    ("");
    class
    DC_Stats {
    var
    $hub = array();
    var
    $config = array();
    var
    $bot = array();
    var
    $socket;
    var
    $address;
    var
    $open_sock = FALSE;
    var
    $S_DATA;
    var
    $reading = 0;
    var
    $max_read = 30;

    function
    open($o_hub, $o_config, $o_bot) {
    $this->open_sock = TRUE;
    $this->hub = $o_hub;
    $this->config = $o_config;
    $this->bot = $o_bot;
    $this->debuglog("----- ".date("d/m/Y")." ".date("H:i:s")." -----\r\n");
    $this->printex("----- ".date("d/m/Y")." ".date("H:i:s")." -----<br>", 1);
    $this->debuglog("Aperta la connessione al socket");
    $this->printex("Aperta la connessione al socket", 1);
    }

    function
    connect() {
    if (!
    $this->open_sock) {
    $this->debuglog("Non è stata aperta la connessione al socket");
    $this->printex("Non è stata aperta la connessione al socket", 0);
    die();
    }
    if (
    array_search("sockets", get_loaded_extensions()) != "") { # Controlla se è attivi sockets
    $this->address = gethostbyname($this->hub['host']); # Ritorna IP del Indirizzo Hub
    $this->socket = socket_create(AF_INET, SOCK_STREAM, 0);
    if (!
    $this->socket) {
    $this->debuglog("Creazione di socket fallita");
    $this->printex("Creazione di socket fallita", 0);
    $this->debuglog("Descrizione errore: ".socket_strerror(socket_last_error()));
    $this->printex("Descrizione errore: ".socket_strerror(socket_last_error()), 0);
    $this->debuglog("Numero errore: ".socket_last_error());
    $this->printex("Numero errore: ".socket_last_error(), 0);
    die();
    } elseif (!
    socket_connect($this->socket, $this->address, $this->hub['port'])) {
    $this->debuglog("Connesione fallita all'indirizzo ".$this->hub['host'].":".$this->hub['port']."
    ("
    .$this->address.":".$this->hub['port'].")");
    $this->printex("Connesione fallita all'indirizzo ".$this->hub['host'].":".$this->hub['port']." (".$this->address.":".$this->hub['port'].")",
    0);
    $this->debuglog("Descrizione errore: ".socket_strerror(socket_last_error()));
    $this->printex("Descrizione errore: ".socket_strerror(socket_last_error()), 0);
    $this->debuglog("Numero errore: ".socket_last_error());
    $this->printex("Numero errore: ".socket_last_error(), 0);
    die();
    } else {
    $this->debuglog("Connessione avvenuta con successo");
    $this->printex("Connessione avvenuta con successo", 1);
    $this->printex("<font style='font-weight:bold'>HOST: </font>".$this->hub['host'], 1);
    $this->debuglog("HOST: ".$this->hub['host']);
    $this->printex("<font style='font-weight:bold'>IP: </font>".$this->address, 1);
    $this->debuglog("IP: ".$this->address);
    $this->printex("<font style='font-weight:bold'>PORTA: </font>".$this->hub['port'], 1);
    $this->debuglog("PORT: ".$this->hub['port']);
    }
    } else {
    $this->printex("Sockets non attivi", 0);
    $this->debuglog("Sockets non attivi");
    die();
    }
    }

    function
    close() {
    socket_close($this->socket);
    $this->debuglog("Connessione chiusa.");
    $this->printex("Connessione chiusa.", 1);
    }

    function
    listen() {
    $this->debuglog("Ricezzione dati in corso...");
    $this->printex("Ricezzione dati in corso...", 1);
    $this->read();
    }

    function
    read() {
    if (
    $this->reading > $this->max_read) {
    $this->debuglog("");
    $this->printex("", 1);
    $this->close();
    die();
    }
    if (
    substr($this->S_DATA, -1) != "|") {
    if (
    strlen($this->S_DATA) < 50000) {
    $this->S_DATA .= socket_read($this->socket, 5000);
    $this->reading++;
    if (
    $this->S_DATA != "") {
    $this->debuglog("Dati ricevuti.");
    $this->printex("Dati ricevuti.", 1);
    }
    $this->command();
    } else {
    $this->command();
    }
    } else {
    $this->command();
    }
    }

    function
    command() {
    $list_arr = explode(" ", $this->S_DATA);
    $cmd = strtoupper(substr($list_arr[0], 1));
    $this->debuglog("Ricevuto: ".$this->S_DATA);
    $this->printex("Ricevuto: ".$this->S_DATA, 1);
    array_shift($list_arr);
    $params = implode(" ", $list_arr);
    $params = explode("|", $params);
    $params = $params[0];
    switch (
    $cmd) {
    case
    "LOCK":
    $this->write("\$Key ".$this->lock2key($params)."|");
    $this->S_DATA = "";
    $this->read();
    break;
    case
    "HUBNAME":
    $this->write("\$ValidateNick ".$this->bot['nick']."|");
    $this->S_DATA = "";
    $this->read();
    break;
    case
    "GETPASS":
    $this->debuglog("Nick registrato.");
    $this->printex("Nick registrato.", 1);
    break;
    case
    "LOGEDIN":
    $this->debuglog("LOGIN SUCCESSFUL! (USER: ".$this->bot['nick']." - PASS: ".$this->config['password'].")");
    $this->printex("LOGIN SUCCESSFUL! (USER: ".$this->bot['nick']." - PASS: ".$this->config['password'].")", 1);
    $this->S_DATA = "";
    $this->read();
    break;
    case
    "HELLO":
    if (
    $params == $this->bot['nick']) {
    $this->write("\$Version 2.0|");
    $this->write("\$MyINFO \$ALL ".$this->bot['nick']." ".$this->bot['description']." <++ V:2.0,M:A,H:1/0/0,S:3>\$
    \$"
    .$this->bot['speed'].chr(1)."\$".$this->bot['email']."\$".$this->bot['share']."\$|");
    $this->write("\$GetNickList|");
    }
    $this->S_DATA = "";
    $this->read();
    break;
    case
    "NICKLIST":
    $nick_list = explode('$$', $params);
    $this->debuglog("Totale user nel hub: ".count($nick_list));
    $this->printex("Totale user nel hub: ".count($nick_list), 1);
    break;
    case
    "OPLIST":
    $op_list = explode('$$', $params);
    $this->debuglog("Totale operatori nel hub: ".count($op_list));
    $this->printex("Totale operatori nel hub: ".count($op_list), 1);
    $this->S_DATA = "";
    $this->read();
    break;
    case
    "MYINFO":
    $this->S_DATA = "";
    $this->read();
    break;
    case
    "QUIT":
    $this->S_DATA = "";
    $this->read();
    break;
    case
    "SEARCH":
    $this->S_DATA = "";
    $this->read();
    break;
    case
    "FORCEMOVE":
    $this->debuglog("Redirect non supportato");
    $this->printex("Redirect non supportato", 0);
    break;
    default:
    $this->S_DATA = "";
    $this->read();
    break;
    }
    }

    function
    write($data) {
    $result = socket_write($this->socket, $data, strlen($data));
    $this->debuglog("INVIO: ".$data);
    $this->printex("INVIO: ".$data, 1);
    }

    function
    printex($txt, $type) {
    if (
    $type == 1) { # Stampa informazioni
    echo "<font color='".$this->config['color_text']."'>".$txt."</font><br>";
    } elseif (
    $type == 0) { # Stampa errore
    echo "<font color='".$this->config['color_error']."'>".$txt."</font><br>";
    }
    }

    function
    debuglog($data) {
    if (
    $this->config['debug'] = 1) {
    if (
    $data != "") {
    $data .= "\r\n";
    $file = fopen("logs/".$this->config['log'], "a");
    fwrite($file, $data);
    fclose($file);
    }
    }
    }

    function
    lock2key($_LOCK) {
    $pk = stristr ($_LOCK, 'Pk=');
    $_LOCK = str_replace ($pk, '', $_LOCK);
    $_LOCK = substr ($_LOCK, 0, -1);
    $lockLength = strlen ($_LOCK);
    $h = ord($_LOCK{0}) ^ ord( $_LOCK{ $lockLength - 1} ) ^ ord( $_LOCK{ $lockLength - 2} ) ^ 5;
    while (
    $h > 255) {
    $h = $h - 256;
    }
    $h = (($h<<4) & 240) | (($h>>4) & 15);
    $a = $h;
    if (
    $a == '126' or $a == '124' or $a == '96' or $a == '36' or $a == '5' or $a == '0') {
    $LockToKey = "/%DCN";
    if (
    $a < 100)
    $LockToKey .="0";
    if (
    $a < 10)
    $LockToKey .="0";
    $LockToKey .= $a;
    $LockToKey .= "%/";
    } else {
    $LockToKey = chr ($a);
    }
    for (
    $j = 1; $j < strlen($_LOCK); $j++) {
    $h = ord($_LOCK{$j}) ^ ord($_LOCK{$j-1});
    while (
    $h > 255) {
    $h = $h - 256;
    }
    $h = (($h<<4) & 240) | (($h>>4) & 15);
    $a = $h;
    if (
    $a == '126' or $a == '124' or $a == '96' or $a == '36' or $a == '5' or $a == '0') {
    $LockToKey .= "/%DCN";
    if (
    $a < 100)
    $LockToKey .="0";
    if (
    $a < 10)
    $LockToKey .="0";
    $LockToKey .= $a;
    $LockToKey .= "%/";
    } else {
    $LockToKey .= chr ($a);
    }
    }
    return
    $LockToKey;
    }
    }
    ?>
    File di configurazione

    Codice PHP:
    <?php
    $config
    ['debug'] = 1; #0=disattivo, 1=attivo
    $config['password'] = "flooder"; # pass bot
    $config['log'] = "debug(".date("d-m-Y H-i-s").").log"; #Nome log
    $config['color_text'] = "#000000"; #Colore testo
    $config['color_error'] = "#FF0000"; #Colore errore
    $bot['nick'] = ""; #Nome bot
    $bot['description'] = "Bot"; #Descrizione bot
    $bot['email'] = "nessuna@nessuna.it"; #Email bot
    $bot['speed'] = "$nickname"; #Tipo connessione del bot. Es. DSL, LAN(T1), LAN(T3), Cable, 56k, ecc...
    $bot['share'] = 42212254720; #Share bot. 1kb=1024 - 1mb=1024*1024 1gb=1024*1024*1024 - 1tb=1024*1024*1024*1024
    $hub['host'] = ""; #Indirizzo del hub
    $hub['port'] = "411"; #Porta del hub
    #########################################
    ############ NON MODIFICARE #############
    /**/
    include("DC_Stats.Class.php"); /**/
    /**/
    $dc = new DC_Stats; /**/
    /**/
    $dc->open($hub, $config, $bot); /**/
    /**/
    $dc->connect(); /**/
    /**/
    $dc->listen(); /**/
    /**/ /**/
    #########################################
    #########################################
    ?>
    Se potete modificare questo non sò,in modo che mi dia un risultato a mò di client gui.

    edit: sposto in livello3!! Faber
    Ultima modifica di svacant : 26-06-2006 alle ore 19.09.53

  2. #2
    Guest

    Predefinito

    che io sappia i socket sui server altervista non funzionano

    cmq può esserti utile questo: http://www.dcpp.net/wiki/index.php/N...t-Hub_Protocol
    Ultima modifica di phpforum : 27-06-2006 alle ore 11.30.39

  3. #3
    Guest

    Predefinito

    Lo sò,ma io lo sto sviluppando in locale.
    Cmq è come pensavo io,difatti nel link che mi hai dato ci sono tutte le variabili che deve catturare,nello script postato da me,vengono catturate con uno switch,quindi andando per ordine,devo aprire un socket,inviare i dati (username,lock,key) poi ricevo i dati perchè ho avuto accesso all'hub e devo interpretarli.

    Con quello script la sintassi è questa.

    |$nicklist primonick$$secondonick$$|

    Se io vorrei interpretare questa stringa? e ricavarne solo i dati che mi servono,cioè primonick e secondonick,dovrei fare un piccolo script in php che appena vede il |$nicklist si ferma và una lettera più avanti,legge il primonick e appena incontra le $$ le ignora,legge l'altro nick e appena incontra $$| si ferma.
    In php come devo farlo?
    Ultima modifica di svacant : 27-06-2006 alle ore 11.48.44

  4. #4
    Guest

    Predefinito

    svacant -> Ma cosa vorresti fare tramite il bot?

  5. #5
    Guest

    Predefinito

    Voglio che entri dentro l'hub e mi ritorni la lista degli user e degli op.
    Tutto quì.
    Tipo come hublist.org che ti dà la lista in tempo reale degli user online.
    http://it.hublist.org/userlist.php?id=173794
    Questo è lo script che serve a me,posso sfruttarlo d'esterno con una lettura ....
    Se non riesco a farlo.
    Ultima modifica di svacant : 27-06-2006 alle ore 13.50.52

  6. #6
    Guest

    Predefinito

    io non ho la più pallida idea di come funzioni il protocollo di dc però per fare quello che dici tu potresti:
    1)trovare |$nicklist così:
    $nicklist=substr($data, strpos($data, "|$nicklist "));
    2)dare explode per ottenere tutti i nick
    $nicklist=explode("$$",$nicklist);
    (avendo cura di non stampare l'ultimo elemento che dovrebbe essere |)

  7. #7
    Guest

    Predefinito

    Si ma oltre il pipe ci stanno altri elementi,come faccio a bloccare lo script dicendogli di ignorare tutti i caratteri esterni?

  8. #8
    Guest

    Predefinito

    prova così:
    $x=strpos($data, "|$nicklist ");
    $data=substr($data, $x);
    $y=strpos($data, "|");
    $nicklist=substr($data, 0, $y);
    $nicklist=explode("$$",$nicklist);

  9. #9
    Guest

    Predefinito

    forse non ho capito quello che vuoi fare....
    cmq nel tuo script questa cosa è già gestita, nella variabile $nick_list già hai la lista dei nick, devi solo stamparla

  10. #10
    Guest

    Predefinito

    Aspettate un'attimo posto l'outpout da interpretare

    Edit: Spiego il tutto per filo e per segno.

    Chi conosce dc passi al punto 2.

    1.Dc è un protocollo di condivisione,funziona logicamente con un client ed un server,ci sono delle variabili di protocollo,basta aprire un socks per riceverle,sono stati fatti numerosi client in c e java,in modo da interpretare queste variabili e condividere files.

    2.Ho bisogno che un bot (un client) entri dentro all'hub e raccolga queste variabili,cioè la lista dei nick,lo script che ho postato prima fà tutto questo,solo che lascia un log "sporco" ora sono due le soluzioni,o prelevo quello che m'interessa dal log oppure faccio un'altro script più pulito (siccome sto strippando ho chiesto aiuto.

    Il log è composto così.
    Ci sono tante variabili a me interessa NickList e Oplist.

    |$variabile contenuto1$$contenuto2$$|
    Ultima modifica di svacant : 27-06-2006 alle ore 16.24.55

  11. #11
    Guest

    Predefinito

    Se guardi nel codice che hai postato, dentro i rami di codice dei case con NICKLIST e OPLIST, vengono valorizzati due array: $nick_list e $op_list già con i nick ricevuti dal server belli e pronti.

    tu in pratica dovresti fare semplicemente una cosa del genere:

    Codice PHP:
    echo "Nick presenti:<br />";
    foreach(
    $nick_list as $nick)
    {
    echo
    $nick."<br />";
    }
    nel ramo del case dove c'è NICKLIST, prima del break.

    stessa cosa per $op_list:

    Codice PHP:
    echo "Operatori presenti:<br />";
    foreach(
    $op_list as $op)
    {
    echo
    $op."<br />";
    }
    nel ramo del case dove c'è OPLIST, sempre prima del break.

  12. #12
    Guest

    Predefinito

    Niente,mi lascia perplesso questo script...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •