TreasureCheck Klasse

10/24/2015 22:07 ~ JWonderpig ~#1
Hallo,

hier ein kleiner Release:
Mit dieser Klasse könnt ihr prüfen, ob eine Treasure schon gekauft wurde oder nicht. ([Only registered and activated users can see links. Click Here To Register...])

Bei Username muss ein Epvp Accountname und bei Password ein Epvp Password eingetragen werden

PHP Code:
<?php

/**
 * This class performs the login to the site an determines the treasure state
 */
class TreasureCheck {

    
/**
     *  Forum URL
     * @var string
     */
    
private $url "http://www.elitepvpers.com/forum/";

    
/**
     *  Treasure Link
     * @var string
     */
    
private $treasure "http://www.elitepvpers.com/theblackmarket/treasure/";

    
/**
     *  Username
     * @var string 
     */
    
private $username "";

    
/**
     *  Password
     * @var string
     */
    
private $password "";
    
    
/**
     *  Content of treasure page
     * @var string
     */
    
private $treasureContent null;
    
    
/**
     *  Status of treasure
     * @var boolean
     */
    
private $treasureAvailable false;

    
/**
     *  Requires Treasure URL as parameter
     * @param string $url
     */
    
public function __construct($url) {
               
        
//add treasure id to the treasure link
        
$this->treasure $url;

        
//perform login + request
        
$this->treasureContent $this->performRequest();

        
//check if treasure is avaiable
        
$this->parseTreasureStatus();
    }
    
    
/**
     *  Returns Treasure status
     * @return boolean
     */
    
public function getTreasureStatus()
    {
        return 
$this->treasureAvailable;
    }
    
    
/**
     *  Parsed Treasure ID form URL
     * @param string $url
     * @return boolean
     */
    
private function parseTreasureID($url)
    {
       
        
$path parse_url($url);
        
$id explode('/'$path['path']);
        
        return 
$id[3];
    }
    
    
/**
     *  Returns status of Treasure
     * @return boolean
     */
    
private function parseTreasureStatus()
    {
        
        
libxml_use_internal_errors(true);
        
//create new DOM Object
        
$dom = new DOMDocument;
        
        
//Load HTml into the DOM object
        
$dom->loadHTML($this->treasureContent);
        
        
//remove white spaces
        
$dom->preserveWhiteSpace false;
        
        
//create new XPath Object
        
$finder = new DOMXPath($dom);
        
$rows $finder->query('//*[@class="cwalt"]/table/tr');
        
        
//go through each row and check status
        
foreach ($rows as $row)
        {
           
$cols $row->getElementsByTagName('td');
            
           if (
$cols->item(6)->nodeValue == 'n/a') {
               
$this->treasureAvailable true;
               return 
true;
           }
           
$this->treasureAvailable false;
           return 
false;
        }
    }

    
/**
     *  Performs Elitepvpers Login and returns content of the treasure page
     * @return string
     */
    
private function performRequest() {
        
$ch curl_init();
        
curl_setopt($chCURLOPT_HEADERfalse);
        
curl_setopt($chCURLOPT_COOKIEFILEdirname(__FILE__) . 'veri.txt');
        
curl_setopt($chCURLOPT_COOKIEJARdirname(__FILE__) . 'veri.txt');
        
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
curl_setopt($chCURLOPT_COOKIESESSIONtrue);
        
curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
        
curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
        
curl_setopt($chCURLOPT_FOLLOWLOCATIONfalse);
        
curl_setopt($chCURLOPT_USERAGENT$_SERVER['HTTP_USER_AGENT']);
        
curl_setopt($chCURLOPT_REFERER$this->url 'index.php');
        
curl_setopt($chCURLOPT_URL$this->url 'login.php?do=login');
        
curl_setopt($chCURLOPT_POST1);
        
curl_setopt($chCURLOPT_POSTFIELDS"vb_login_username=$this->username&vb_login_password&s=&securitytoken=guest&do=login&vb_login_md5password=" md5($this->password) . "&vb_login_md5password_utf=" md5($this->password));
        
$exec curl_exec($ch);

        
curl_setopt($chCURLOPT_POST0);
        
curl_setopt($chCURLOPT_REFERER$this->url 'login.php?do=login');
        
curl_setopt($chCURLOPT_URL$this->url 'clientscript/vbulletin_global.js?v=373');
        
$exec curl_exec($ch);

        
curl_setopt($chCURLOPT_REFERER$this->url 'login.php?do=login');
        
curl_setopt($chCURLOPT_URL$this->url 'index.php');
        
$exec curl_exec($ch);

        
curl_setopt($chCURLOPT_REFERER$this->url 'index.php');
        
curl_setopt($chCURLOPT_URL$this->treasure);
        
$exec curl_exec($ch);
        
        return 
$exec;
    }

}
Anschließen muss einfach dieser Code ausgeführt werden:

PHP Code:
$tc = new TreasureCheck('url zur treasure');
$tc->getTreasureStatus(); 
Diese Klasse könnt ihr in euren Projekten verwenden.

Grüße
~ JWonderpig ~
11/16/2015 22:05 Johnny Diggson#2
Guter Release :)
11/17/2015 22:02 False#3
Leider nicht kompatible mit Usern die Sonderzeichen im Namen haben, wie bei mir z.b :D Habe es mal mit dem Account meiner Freundin getestet(keine Sonderzeichen) und dort geht auch nichts ;)Schau dir mal [Only registered and activated users can see links. Click Here To Register...] an.

Kleiner Tipp, bemüh dich deine Methoden sowie Variablen namen DEUTLICH zu benennen.
Unter $treasureContent würde ich z.b verstehen das es der Inahlt vom Treasure ist (ob als Entity oder als Array oder als Json wäre ja relativ egal...) aber das es Html ist kommt man erst drauf wenn man nochmal schaut...
Genauso bei performRequest => Was für ein Request ?Ein Paar mehr constanten wären auch gut gewesen z.b fürs zusammen bauen der Url.
Immer dran denken, schön kurz halten, keinen doppelten Code wenn möglich und so schreiben das wenn man eine Sache ändern will das alles noch geht und man nicht 10 Sachen ändern muss.

Und so weiter...
11/19/2015 22:56 ~ JWonderpig ~#4
Quote:
Originally Posted by .ƒaℓsє. View Post
Leider nicht kompatible mit Usern die Sonderzeichen im Namen haben, wie bei mir z.b :D Habe es mal mit dem Account meiner Freundin getestet(keine Sonderzeichen) und dort geht auch nichts ;)Schau dir mal [Only registered and activated users can see links. Click Here To Register...] an.

Kleiner Tipp, bemüh dich deine Methoden sowie Variablen namen DEUTLICH zu benennen.
Unter $treasureContent würde ich z.b verstehen das es der Inahlt vom Treasure ist (ob als Entity oder als Array oder als Json wäre ja relativ egal...) aber das es Html ist kommt man erst drauf wenn man nochmal schaut...
Genauso bei performRequest => Was für ein Request ?Ein Paar mehr constanten wären auch gut gewesen z.b fürs zusammen bauen der Url.
Immer dran denken, schön kurz halten, keinen doppelten Code wenn möglich und so schreiben das wenn man eine Sache ändern will das alles noch geht und man nicht 10 Sachen ändern muss.

Und so weiter...
Danke für das Feedback.

Jooooa, man hätte es semantisch besser machen können, ist aber halt ein Free-Release und wurde in ca. 10-20 Minuten geschrieben :rolleyes:

Habe nicht so viel Wert auf Funkstions- & Variablennamen gelegt, da der User nur eine Funktion aufruft. Was genau meinst du mit Konstanten?
Ich sehe da irgendwie keinen Sinn drin? :o
11/20/2015 18:09 False#5
Quote:
Originally Posted by ~ JWonderpig ~ View Post
Danke für das Feedback.

Jooooa, man hätte es semantisch besser machen können, ist aber halt ein Free-Release und wurde in ca. 10-20 Minuten geschrieben :rolleyes:

Habe nicht so viel Wert auf Funkstions- & Variablennamen gelegt, da der User nur eine Funktion aufruft. Was genau meinst du mit Konstanten?
Ich sehe da irgendwie keinen Sinn drin? :o
Mit konstanten meine ich z.b "www.elitepvpers.com" etc. sprich was öffters vorkommt und evtl auch in anderen Classen vorkommt, wenn du das ändern willst musst du nur die konstante ändern und sonst nichts.
Sprich immer so programmieren das doppelter Coder vermieden wird und Anpassungen leicht durch zuführen sind.Egal ob kleines oder Großes Projekt, direkt angewöhnen, geht genauso schnell als wenn du es unsauber machst :p

Was wollen wir eigentlich mit der Klasse wenn diese (auch ohne Sonderzeichen) nicht funktioniert ?
11/20/2015 18:21 ~ JWonderpig ~#6
Quote:
Originally Posted by .ƒaℓsє. View Post
Was wollen wir eigentlich mit der Klasse wenn diese (auch ohne Sonderzeichen) nicht funktioniert ?
Im Beispiel klappt es, daher weiß ich nicht wirklich wieso es bei dir nicht klappt.
11/20/2015 22:00 False#7
Quote:
Originally Posted by ~ JWonderpig ~ View Post
Im Beispiel klappt es, daher weiß ich nicht wirklich wieso es bei dir nicht klappt.
Naja ich Habe das Beispiel kopiert, username, passwort und Treasure Link geändert und es klappt nicht...
Habe mir dann mal den output des ersten curl aufruf ausgeben lassen und dort ist der user nicht eingeloggt^^

€: Habe es mit anderen Treasures probiert, also bei denen die nicht gekauft wurden bekomme ich eine "1" und bei gekauft bekomme ich nichts zurück. €²: Habe mir den Code nun nochmal genauer angeschaut.... Bitte mach so keine prüfungen auf urls.... kein wunder das es nicht geht^^
ohne "http://" geht es nicht mehr nutz liker regex für das ganze -> [Only registered and activated users can see links. Click Here To Register...]
11/20/2015 22:33 ~ JWonderpig ~#8
Quote:
Originally Posted by .ƒaℓsє. View Post
Naja ich Habe das Beispiel kopiert, username, passwort und Treasure Link geändert und es klappt nicht...
Habe mir dann mal den output des ersten curl aufruf ausgeben lassen und dort ist der user nicht eingeloggt^^

€: Habe es mit anderen Treasures probiert, also bei denen die nicht gekauft wurden bekomme ich eine "1" und bei gekauft bekomme ich nichts zurück.
Du musst den Treasurelink auch nicht ändern. Der Link muss nur in den Parameter.
11/21/2015 00:49 False#9
Quote:
Originally Posted by ~ JWonderpig ~ View Post
Du musst den Treasurelink auch nicht ändern. Der Link muss nur in den Parameter.
Das meinte ich ja damit, aber schau dir mein zweiten edit an ;)