Ankündigung

Einklappen
Keine Ankündigung bisher.

robots.txt anhand des User-agent: parsen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • robots.txt anhand des User-agent: parsen

    Guten morgen,

    ich möchte gerne die robots.txt anhand des User-agent: parsen und anschließend jeweils die Disallow's bzw. Allow's an ein array zum entsprechenden User-agent übergeben.

    Mein Problem:
    Zur Zeit komme ich selbst nach vielen googlen, Forensuche einfach nicht weiter. Ich möchte das ein Array erstellt wird NUR mit den Disallow's und Allow's welche auch unterhalb dem entrsprechenden User-agent: stehen. Meine Frage wie kann ich solch ein Array erstellen?

    Mein Versuch:
    Die robots.txt:
    Code:
    User-agent: *
    Disallow: /admin.php
    Disallow: /admin/
    Disallow: /cache/
    Disallow: /config/
    Disallow: /design/
    Disallow: /images/
    Disallow: /includes/
    Disallow: /language/
    Disallow: /db/ 
    Disallow: /templates/ 
    Disallow: /common.php 
    Disallow: /config.php 
    Disallow: /groupcp.php 
    Disallow: /memberlist.php 
    Disallow: /modcp.php 
    Disallow: /posting.php 
    Disallow: /privmsg.php 
    Disallow: /profile.php 
    Disallow: /search.php 
    Disallow: /viewtopic.php
    Disallow: /login.php
    
    User-agent: Mediapartners-Google* 
    Disallow:
    PHP-Code:
    $url 'http://example.com/'//beispiel URL
    $robotstxt = @file_get_contents($url '/robots.txt'); //datei einlesen
    var_dump($robotstxt);

    if (
    $robotstxt !== false//wenn robots.txt geöffnet werden konnte
    {
             
    $lines preg_split("/[\r\n]+/"$robotstxt, -1PREG_SPLIT_NO_EMPTY); //array mit einzelnen zeilen zurückgeben
             
    $data = array(); //array erstellen
             
    foreach ($lines as $line//alle zeilen auslesen
             
    {
                     if (
    substr($line01) != "#"//wenn zeile nicht mit # beginnt
                     
    {
                             
    preg_match('/([^:]+):([^#]+)/'$line$mat); //wert extrahieren
                             //print_r($mat);

                             
    if (!empty($mat))
                             {
                                     if (
    strtolower(trim($mat['1'])) == 'user-agent')
                                     {
                                             
    $arrayuseragent[] = trim($mat['2']);
                                     }
                                     elseif (
    strtolower(trim($mat['1'])) == 'disallow')
                                     {
                                             
    $arraydisallow[] = trim($mat['2']);
                                     }
                                     elseif (
    strtolower(trim($mat['1'])) == 'sitemap')
                                     {
                                             
    $arraysitemap[] = trim($mat['2']);
                                     }
                             }
                     }
             }

             
    //muss noch ne Bedingung mit isset machen
             
    var_dump($arrayuseragent);
             
    var_dump($arraydisallow);
             
    var_dump($arraysitemap);
    }
    else
    {
             echo 
    'Glück gehabt, keine robots.txt gefunden!';

    Die Ausgabe nach dem einlesen mit var_dump():
    Code:
    string(514) "User-agent: * Disallow: /admin.php Disallow: /admin/ Disallow: /cache/ Disallow: /config/ Disallow: /design/ Disallow: /images/ Disallow: /includes/ Disallow: /language/ Disallow: /db/ Disallow: /templates/ Disallow: /common.php Disallow: /config.php Disallow: /groupcp.php Disallow: /memberlist.php Disallow: /modcp.php Disallow: /posting.php Disallow: /privmsg.php Disallow: /profile.php Disallow: /search.php Disallow: /viewtopic.php Disallow: /login.php User-agent: Mediapartners-Google* Disallow:" 45
    Die fehlerhafte Ausgabe nach dem parsen mit var_dump():
    Code:
    array(2) { [0]=> string(1) "*" [1]=> string(21) "Mediapartners-Google*" } array(21) { [0]=> string(10) "/admin.php" [1]=> string(7) "/admin/" [2]=> string(7) "/cache/" [3]=> string(8) "/config/" [4]=> string(8) "/design/" [5]=> string(8) "/images/" [6]=> string(10) "/includes/" [7]=> string(10) "/language/" [8]=> string(4) "/db/" [9]=> string(11) "/templates/" [10]=> string(11) "/common.php" [11]=> string(11) "/config.php" [12]=> string(12) "/groupcp.php" [13]=> string(15) "/memberlist.php" [14]=> string(10) "/modcp.php" [15]=> string(12) "/posting.php" [16]=> string(12) "/privmsg.php" [17]=> string(12) "/profile.php" [18]=> string(11) "/search.php" [19]=> string(14) "/viewtopic.php" [20]=> string(10) "/login.php" }
    Bin wirklich über jede Hilfe und jeden Tipp dankbar, denn ich darfs kaum erwähnen aber sitze schon fast zwei Tage an diesem Vorhaben. Also vielen Dank schon im Vorraus.

    Beste Grüße!

  • #2
    PHP-Code:
    $url 'http://www.example.org';
    $robotfile file($url.'/robots.txt');

    // dispell new-lines and explode pairs

    $robotData = array();
    foreach ( 
    $robotfile as $line ) {
       
    $curline trim($line);
       
    $exploded explode(":"$curline);
       if ( 
    count($exploded) > ) {
          
    $action array_shift($exploded);
          
    $robotData[] = array('action' => $action'value' => join(":",$exploded) );
       }

    Als nächsten Schritt : Baue ein foreach() das $robotData abarbeitet 0 - ende und bei jedem 'action' - Subschlüssel im Ausgabe-Array den Hauptschlüssel auf den neuen User-agent ändert. Relativ simple logik und nun deine Aufgabe. Wert-Vergleiche im übrigen mach mit temporär "lowercased"-Strings, damit du eine gewisse Idiotensicherheit einbaust, du glaubst garnicht wie kunstvoll manche robots.txt's sind.

    Kommentar


    • #3
      Zitat von hjw-kunstwerk Beitrag anzeigen
      ...

      ich möchte gerne die robots.txt anhand des User-agent: parsen und anschließend jeweils die Disallow's bzw. Allow's an ein array zum entsprechenden User-agent übergen.

      Mein Problem:
      Zur Zeit komme ich selbst nach vielen googlen, Forensuche einfach nicht weiter. Ich möchte das ein Array erstellt wird NUR mit den Disallow's und Allow's welche auch unterhalb dem entrsprechenden User-agent: stehen. Meine Frage wie kann ich solch ein Array erstellen? ...
      Die größte Schwierigkeit dürfte die Verarbeitung mehrerer aufeinanderfolgender User-Agent-Zeilen sein, die sich einen Regelsatz teilen.
      Mal sehen:

      PHP-Code:
      function fw_scan_robots(
          
      $url
      ) {
          if (!
      is_resource($file fopen($url'r'))) {
              return 
      null;
          }
          
      $robots = array ();
          
      $ua_collect false;
          while (
      is_string($line fgets($file))) {
              if (!
      preg_match(
                  
      // knows:
                  //      allow:
                  //      disallow:
                  //      user-agent:
                  //      sitemap:
                  //      # single-line|end-of-line comments
                  
      '/\A\s*
                      (
                          (dis)?allow|
                          (sitemap)|
                          (user-agent)
                      )
                      \s*:\s*
                      (\S*)
                      \s*(?=\z|\#)
                  /ix'
      ,
                  
      $line,
                  
      $hits
              
      )) {
                  continue;
              }
              if (isset (
      $hits[4][0])) { // user-agent:
                  
      if (!$ua_collect) {
                      
      $ua_list = array (); // reset
                      
      $ua_collect true;
                  }
                  
      $ua_list[strtolower($hits[5])] = true;
              }
              else {
                  
      $ua_collect false;
                  
      // sitemaps:
                  
      if (isset ($hits[3][0])) {
                      
      // update every user agent in $ua_list
                      
      foreach ($ua_list as $ua => $dummy) {
                          
      $robots[$ua]['sitemap'][] = $hits[5];
                      }
                  }
                  else {
                      
      // allow:|disallow:
                      
      $allow = isset ($hits[2][0]) ? 'disallow' 'allow';
                      
      // update every user agent in $ua_list
                      
      foreach ($ua_list as $ua => $dummy) {
                          
      $robots[$ua][$allow][] = $hits[5];
                      }
                  }
              }
          } 
      /// endwhile
          
      return $robots;

      ... sitze schon fast zwei Tage an diesem Vorhaben. ...
      Ein wenig Zeit wirst du auch noch investieren müssen: Unabhängig von von den "offiziellen" Regeln, nach denen eine robots.txt aufgebaut ist, können bei Pfaden auch Dopplungen auftreten. Die werden derzeit einfach behalten. Eine Pfad-Normalisierung müsste also noch eingebaut werden.

      ...
      Zur Zeit komme ich selbst nach vielen googlen, Forensuche einfach nicht weiter.
      Die offizielle robots.txt-Seite erklärt nicht nur die Syntax-Regeln, sondern verweist auch auf einen robots.txt-Parser in Verbindung mit dem LWP. Der scheint mir ausgereifter als jede selbstgestrickte Variante und sollte sich auch nach PHP übersetzen lassen.

      Kommentar


      • #4
        zum entsprechenden User-agent übergen.
        Was soll das überhaupt bedeuten (meine nicht den Rechtschreibfehler)?

        Kommentar


        • #5
          Zitat von nikosch Beitrag anzeigen
          Was soll das überhaupt bedeuten (meine nicht den Rechtschreibfehler)?
          Ich möchte gerne für jeden vorhandenen User-agent in einer robots.txt ein Array erstellen, in welchem die dazugehörigen Allow's und Disallow's für den jeweiligen User-agent stehen.

          fiktive robot.txt
          Code:
          User-agent: *
          Request-rate: 1/5
          Disallow: /ajax.php
          Disallow: /archive/
          Disallow: /wiki/Especial:Search
          Disallow: /wiki/Especial%3ASearch
          
          User-agent: Morfeus Fucking Scanner
          Disallow: / 
          
          User-agent: msnbot/1.1
          Disallow: / 
          
          User-agent: msnbot
          Disallow: / 
          
          User-agent: Twiceler
          Disallow: / 
          
          User-agent: Yandex
          Disallow: / 
          
          User-agent: Purebot
          Disallow: / 
          
          User-agent: Speedy Spider
          Disallow: / 
          
          User-agent: Yeti
          Disallow: / 
          
          User-agent: Fasterfox
          Disallow: /
          Beispiel einer enorm großen robots.txt, die ich zum Beispiel parsen würden wollte. http://www.khd-research.net/robots.txt Oder eben auch das fiktive oben gelistete Beispiel von mir.

          So soll es in etwa aussehen:
          Code:
          array 0
          ['user-agent'] => Speedy Spider
          ['node'] => Disallow
          ['value'] => /
          
          array 1
          ['user-agent'] => Yeti
          ['node'] => Disallow
          ['value'] => /
          
          array 2
          ['user-agent'] => Fasterfox
          ['node'] => Disallow
          ['value'] => /
          
          //usw... wenn denn noch weitere User-agent's vorhanden sein sollten

          Hoffe ich konnte mein Anliegen einigermaßen verständlich aufzeigen, eben so das ich für jeweils jeden User-agent ein neues Array erhalte und dann kann ich es in einer foreach Schleife evtl weiterverarbeiten.

          Vielen Dank für's Antworten.

          PS: Rechtschreibfehler geändert, danke.

          Kommentar


          • #6
            Zitat von tr0y Beitrag anzeigen
            PHP-Code:
            $url 'http://www.example.org';
            $robotfile file($url.'/robots.txt');

            // dispell new-lines and explode pairs

            $robotData = array();
            foreach ( 
            $robotfile as $line ) {
               
            $curline trim($line);
               
            $exploded explode(":"$curline);
               if ( 
            count($exploded) > ) {
                  
            $action array_shift($exploded);
                  
            $robotData[] = array('action' => $action'value' => join(":",$exploded) );
               }

            Als nächsten Schritt : Baue ein foreach() das $robotData abarbeitet 0 - ende und bei jedem 'action' - Subschlüssel im Ausgabe-Array den Hauptschlüssel auf den neuen User-agent ändert. Relativ simple logik und nun deine Aufgabe. Wert-Vergleiche im übrigen mach mit temporär "lowercased"-Strings, damit du eine gewisse Idiotensicherheit einbaust, du glaubst garnicht wie kunstvoll manche robots.txt's sind.
            Danke für deine schnelle Antwort doch leider bin ich mit dem Array und diesem Subschlüssel nicht ganz durchgestiegen, wäre es möglich mir evtl. ein Beispiel zu geben.

            Nochmals danke für deinen Lösungsvorschlag.
            Beste Grüße.

            Kommentar


            • #7
              So soll es in etwa aussehen:
              Das lässt komplett mehrere Angaben für einen UA außen vor. Ebenfalls wie mit * oder widersprüchlichen Angaben verfahren soll.

              Kommentar


              • #8
                Zitat von nikosch Beitrag anzeigen
                Das lässt komplett mehrere Angaben für einen UA außen vor. Ebenfalls wie mit * oder widersprüchlichen Angaben verfahren soll.
                Richtig, der UA kann auch * sein. Dann sollte zum Beispiel im Array in ['user-agent'] statt Fasttrack ein '*' stehen. Um dies herauszubekommen/extrahieren habe ich weiter oben im ersten Post meinen Versuch mit preg_split und einer Regex aufgezeigt, doch leider ohne Erfolg und daher frage ich ich hier nach Tipps oder Erfahrungen wie andere evtl. mit dem parsen einer robots.txt umgehen?

                Das sollte am Ende raus kommen:
                Code:
                [0] => Array
                (
                    [action] => User-agent
                    [value] =>  *
                
                    [0] => Array
                        (
                            [action] => Disallow
                            [value] =>  /admin.php
                        )
                    [1] => Array
                        (
                            [action] => Disallow
                            [value] =>  /admin/
                        )
                
                    [2] => Array
                        (
                            [action] => Disallow
                            [value] =>  /cache/
                        )
                )
                
                [1] => Array
                (
                    [action] => User-agent
                    [value] =>  Fasttrack
                
                    [0] => Array
                        (
                            [action] => Disallow
                            [value] =>  /
                        )
                )
                
                usw... wenn weitere User-agent's vorhanden.
                Hoffe ich konnte mich mit diesem Beispiel nochmal etwas besser ausdrücken?!
                Danke für die rege Beteiligung. Gerne lass ich mich auch eines Besseren belehren, oder gibt es schon eine Best Practice in PHP?

                Kommentar


                • #9
                  Auf die Schnelle:
                  PHP-Code:
                  <?php



                  class UserAgents
                    
                  {
                    public function 
                  set ($sKey UserAgentInterface $oUserAgent)
                      {
                      
                  // strtolower ergänzen wenn gewünscht
                      
                      
                  $this->aItems[$sKey] = $oUserAgent;
                      }

                    public function 
                  get ($sKey)
                      {
                      
                  // strtolower ergänzen wenn gewünscht
                      
                      
                  if (false === isset ($this->aItems[$sKey]))
                        {
                        
                  $this->set ($sKey , new UserAgent ($sKey));
                        }
                      
                      return (
                  $this->aItems[$sKey]);
                      }

                    public function 
                  getAll ()
                      {
                      return (
                  $this->aItems);
                      }
                    }



                  interface 
                  UserAgentInterface
                    
                  {
                    public function 
                  addSetting (UserAgentSetting $oSetting);
                    }



                  class 
                  UserAgent
                        
                  implements UserAgentInterface
                    
                  {
                    public function 
                  __construct ($sName)
                      {
                      
                  $this->sName $sName;
                      }

                    public function 
                  addSetting (UserAgentSetting $oSetting)
                      {
                      
                  $this->aSettings[] = $oSetting;
                      }
                    }



                  class 
                  UserAgentAll extends UserAgent
                        
                  implements UserAgentInterface
                    
                  {
                    public function 
                  __construct ($oAll)
                      {
                      
                  $this->oAll $oAll;
                      }

                    public function 
                  addSetting (UserAgentSetting $oSetting)
                      {
                      foreach (
                  $this->oAll->getAll () as $oUserAgent)
                        {
                        if (
                  $oUserAgent != $this)
                          {
                          
                  $oUserAgent->addSetting ($oSetting);
                          }
                        }
                      }
                    }



                  class 
                  UserAgentSetting
                    
                  {
                    public function 
                  __construct ($sType $sValue)
                      {
                      
                  $this->sType  $sType;
                      
                  $this->sValue $sValue;
                      }
                    }



                  $oUserAgents       = new UserAgents;
                  $oCurrentUserAgent = new UserAgentAll ($oUserAgents);

                  $oUserAgents->set ('*' $oCurrentUserAgent);



                  foreach (
                  file ('http://www.khd-research.net/robots.txt') as $sLine)
                    {
                    list (
                  $sLine) = explode ('#' trim ($sLine) , 2);
                    
                    if (
                  '' == $sLine) continue;
                    
                    
                  preg_match ('#((User-agent)|(.+?)):\s*(.+)\s*#i' $sLine $aFound);

                    if (
                  '' != $aFound[2])
                      {
                      
                  $oCurrentUserAgent $oUserAgents->get ($aFound[4]); 
                      }
                    else
                      {
                      
                  $oCurrentUserAgent->addSetting (new UserAgentSetting ($aFound[3] , $aFound[4]));
                      }

                    }

                  print_r ($oUserAgents);
                  [edit]

                  So, jetzt sollte es stimmen.

                  Kommentar


                  • #10
                    @nikosch, wahnsinn ich bin völlig von den Socken! Danke danke danke danke, es ist ja voll der Hammer das in so kurzer Zeit!

                    Ich muss ganz ehrlich gestehen das ich mich mit Methoden und Constructions der OOP überhaupt noch nicht auskenne dies natürlich umbedingt lernen will, doch leider noch nicht dazu gekommen bin, auch da ich noch kein passendes Buch in deutsch gefunden habe welche OOP mit PHP leicht und verständlich erklärt. Nehme Tipps gerne an! Ich wünsch ich könnt dies schon. Naja Autodidakt eben

                    Nun habe ich noch ein Anliegen bzw. Frage und zwar habe ich versucht noch den User-agent mit dem * wildcard zu den gematchten UserAgents Object hinzuzufügen, doch leider ohne Erfolg. Gibt es für mein Vorhaben überhaupt eine Möglichkeit? Oder wäre dies zu kompliziert.

                    Dann ist mir aufgefallen, dass Aktuell beim wenn eine Sitemap als sType gefunden wird das http von dem sValue getrennt wird und das http hinter Sitemap steht.

                    Ansonsten bin ich einfach nur begeistert das sowas funktioniert! Danke

                    Kommentar


                    • #11
                      Die * Angaben habe ich auf alle Objekte (also User-Agenten) verteilt. Dachte, das ist vielleicht sinnvoller. Kommt letztlich drauf an, was Du mit den Daten anstellst. Falls Du das lieber so haben willst:

                      - komplette Klasse UserAgentAll rausnehmen.
                      - $oUserAgents->set ('*' , $oCurrentUserAgent); rausnehmen

                      (zum Testen reicht auch, letzteres auszukommentieren)

                      Dann ist mir aufgefallen, dass Aktuell beim wenn eine Sitemap als sType gefunden wird das http von dem sValue getrennt wird und das http hinter Sitemap steht.
                      Ich hatte noch zweimal was korrigiert (den reg. Ausdruck). Schau mal, obs noch so ist, kann das sonst nicht nachvollziehen.

                      Kommentar


                      • #12
                        @nikosch, super vielen herzlichen Dank. Das Problem mit dem http der in sType war nun nach deinem Edit behoben! Danke! Auch die Ausgabe ist jetzt noch um einiges Übersichtlicher geworden! Einfach toll -> möchte ich auch können!

                        Mir ist nun beim testen aufgefallen, dass wenn ich zum Beispiel diese robots.txt http://hjw-kunstwerk.de/robots.txt parsen möchte, kommischer weise nur der zweite User-agent eingelsen wird? Erwartet dein robots.txt parser eine Leerzeile oder sonst etwas am Dateianfang?

                        Code:
                        User-agent: *
                        Disallow: /*?
                        Disallow: /*PHPSESSID* #das ist ein test 
                        Disallow: /anzeigen.php
                        Disallow: /emphehlungen.php
                        Disallow: /js/
                        Disallow: /css/
                        Disallow: /include
                        Disallow: /media
                        
                        User-agent: Fasterfox
                        Disallow: /
                        
                        Sitemap: http://www.hjw-kunstwerk.de/sitemap.xml
                        Ausgabe nach Scriptdurchlauf:
                        Code:
                        UserAgents Object
                        (
                            [aItems] => Array
                                ([*] => UserAgentAll Object
                                        (
                                            [oAll] => UserAgents Object
                         *RECURSION*
                                        )
                        
                                    [Fasterfox] => UserAgent Object
                                        (
                                            [sName] => Fasterfox
                                            [aSettings] => Array
                                                (
                                                    [0] => UserAgentSetting Object
                                                        (
                                                            [sType] => Disallow
                                                            [sValue] => /
                                                        )
                        
                                                    [1] => UserAgentSetting Object
                                                        (
                                                            [sType] => Sitemap
                                                            [sValue] => http://www.hjw-kunstwerk.de/sitemap.xml
                                                        )
                        
                                                )
                        
                                        )
                        
                                )
                        
                        )
                        Ansonsten bin ich wirklich richtig begeistert von deinem PHP robots.txt Parser! Nochmals vielen herzlichen Dank für deine Bemühungen!

                        Beste Grüße!

                        Kommentar


                        • #13
                          @nikosch, bin noch am testen und einfach nur begeistert... ich frage mich ob ich da eventuell etwas anpassen muss um diese robots.txt http://www.last.fm/robots.txt zu parsen?

                          Code:
                          User-Agent: *
                          Disallow: /music?
                          Disallow: /widgets/radio?
                          
                          Disallow: /affiliate/
                          Disallow: /affiliate_redirect.php
                          Disallow: /affiliate_sendto.php
                          Disallow: /affiliatelink.php
                          Disallow: /campaignlink.php
                          Disallow: /delivery.php
                          
                          Disallow: /music/+noredirect/
                          
                          Disallow: /harming/humans
                          Disallow: /ignoring/human/orders
                          Disallow: /harm/to/self
                          
                          Allow: /
                          Ausgabe:
                          Code:
                          UserAgents Object
                          (
                              [aItems] => Array
                                  ([*] => UserAgentAll Object
                                          (
                                              [oAll] => UserAgents Object
                           *RECURSION*
                                          )
                          
                                  )
                          
                          )

                          Auch bei dieser robots.txt http://www.amazon.de/robots.txt bekomme ich 'keine' Ausgabe? Oder ist es evtl. nicht möglich den User-agent einzulesen wenn er nur ein * Wildcard besitzt?
                          Code:
                          # Disallow all crawlers access to certain pages.
                          
                          User-agent: *
                          Disallow: /exec/obidos/account-access-login
                          Disallow: /exec/obidos/change-style
                          Disallow: /exec/obidos/flex-sign-in
                          Disallow: /exec/obidos/handle-buy-box
                          Disallow: /exec/obidos/tg/cm/member/
                          Disallow: /exec/obidos/refer-a-friend-login
                          Disallow: /exec/obidos/subst/partners/friends/access.html
                          Disallow: /exec/obidos/subst/marketplace/sell-your-stuff.html
                          Disallow: /exec/obidos/subst/marketplace/sell-your-collection.html
                          Disallow: /exec/obidos/subst/associates/join
                          Disallow: /gp/cart
                          Disallow: /gp/customer-media/upload
                          Disallow: /gp/flex
                          Disallow: /gp/sign-in
                          Disallow: /gp/slides/make-money
                          Disallow: /gp/yourstore
                          Disallow: /gp/content-form
                          Disallow: /gp/customer-reviews/write-a-review.html
                          Disallow: /gp/vote
                          Disallow: /gp/voting/
                          Disallow: /gp/product/product-availability 
                          Disallow: /gp/reader
                          Disallow: /gp/gfix
                          Disallow: /gp/music/wma-pop-up
                          Disallow: /gp/customer-images
                          Disallow: /gp/music/clipserve
                          Disallow: /gp/offer-listing
                          Disallow: /gp/richpub/listmania/createpipeline
                          Disallow: /gp/history
                          Disallow: /gp/item-dispatch
                          Disallow: /gp/recsradio
                          Disallow: /dp/twister-update/
                          Disallow: /dp/e-mail-friend/
                          Disallow: /dp/product-availability/
                          Disallow: /gp/registry/wishlist/*/reserve
                          Disallow: /gp/structured-ratings/actions/get-experience.html
                          Disallow: /gp/twitter/
                          Disallow: /ap/signin
                          
                          # Sitemap files
                          Sitemap: http://www.amazon.de/sitemap_dp_index.xml
                          Sitemap: http://www.amazon.de/sitemap-manual-index.xml
                          Sitemap: http://www.amazon.de/sitemap_entity_index.xml.gz
                          Sitemap: http://www.amazon.de/sitemaps.DE_detail_page_sitemap_mobile_index.xml.gz
                          und die Ausgabe:
                          Code:
                          UserAgents Object
                          (
                              [aItems] => Array
                                  ([*] => UserAgentAll Object
                                          (
                                              [oAll] => UserAgents Object
                           *RECURSION*
                                          )
                          
                                  )
                          
                          )
                          Oder kann es sein das dort nur IP's zugreifen dürfen, welche evtl. auf einer Whitlist stehen? Ansonsten habe ich echt respekt vor deinem Wissen!

                          Kommentar


                          • #14
                            Hmm, an diesen Fall habe ich nicht gedacht. Der * verteilt die Angaben nur auf bereits vorhandene UA-Objekte. Das ist so natürlich Quark.
                            Ich poste nachher noch was passendes. Wenn Du Dein ursprüngliches Format nimmst (vgl. Hinweis in #11) dürfte es aber klappen.

                            Kommentar


                            • #15
                              So, dann hier mal ne neue Version. Das Verhalten ist jetzt ander: Jedes User-Agent-Objekt bindet ein globales UA-Objekt ein, das die ganzen * Angaben sammelt (dieses Objekt ist immer die selbe Instanz). Über getSettings () erhältst Du dann die verknüpfte Ausgabe des jeweiligen Objekts.

                              Damit das nicht so lang wird, habe ich die Ausgabe mal auf ein Objekt beschränkt:
                              PHP-Code:
                              <pre><?php



                              class UserAgents
                                
                              {
                                protected 
                              $aItems = array ();

                                public function 
                              __construct (GlobalUserAgent $oGlobalAgent)
                                  {
                                  
                              $this->set ('*' $oGlobalAgent);
                                  }

                                public function 
                              set ($sKey UserAgentInterface $oUserAgent)
                                  {
                                  
                              // strtolower ergänzen wenn gewünscht
                                  
                                  
                              $this->aItems[$sKey] = $oUserAgent;
                                  }

                                public function 
                              get ($sKey)
                                  {
                                  
                              // strtolower ergänzen wenn gewünscht
                                  
                                  
                              if (false === isset ($this->aItems[$sKey]))
                                    {
                                    
                              $this->set ($sKey , new UserAgent ($sKey $this->aItems['*']));
                                    }
                                  
                                  return (
                              $this->aItems[$sKey]);
                                  }

                                public function 
                              getAll ()
                                  {
                                  return (
                              $this->aItems);
                                  }
                                }



                              interface 
                              UserAgentInterface
                                
                              {
                                public function 
                              addSetting (UserAgentSetting $oSetting);
                                }



                              class 
                              UserAgent
                                    
                              implements UserAgentInterface
                                
                              {
                                protected 
                              $sName;
                                protected 
                              $oGlobalAgent;
                                protected 
                              $aSettings = array ();

                                public function 
                              __construct ($sName GlobalUserAgent $oGlobalAgent)
                                  {
                                  
                              $this->sName        $sName;
                                  
                              $this->oGlobalAgent $oGlobalAgent;
                                  }

                                public function 
                              addSetting (UserAgentSetting $oSetting)
                                  {
                                  
                              $this->aSettings[] = $oSetting;
                                  }

                                public function 
                              getSettings ()
                                  {
                                  return (
                              array_merge (
                                                      
                              $this->oGlobalAgent->getSettings () ,
                                                      
                              $this->aSettings
                                                      
                              )
                                         );
                                  }
                                }



                              class 
                              GlobalUserAgent extends UserAgent
                                    
                              implements UserAgentInterface
                                
                              {
                                public function 
                              __construct ()
                                  {
                                  }

                                public function 
                              addSetting (UserAgentSetting $oSetting)
                                  {
                                  
                              $oSetting->setGlobal (true);
                                  
                                  
                              parent::addSetting ($oSetting);
                                  }

                                public function 
                              getSettings ()
                                  {
                                  return (
                              $this->aSettings);
                                  }
                                }



                              class 
                              UserAgentSetting
                                
                              {
                                public 
                              $sType;
                                public 
                              $sValue;
                                public 
                              $bGlobal false;

                                public function 
                              __construct ($sType $sValue $bGlobal false)
                                  {
                                  
                              $this->sType   $sType;
                                  
                              $this->sValue  $sValue;
                                  
                              $this->bGlobal $bGlobal;
                                  }

                                public function 
                              setGlobal ($bGlobal true)
                                  {
                                  
                              $this->bGlobal $bGlobal;
                                  }
                                }



                              $oCurrentUserAgent = new GlobalUserAgent ();
                              $oUserAgents       = new UserAgents ($oCurrentUserAgent);

                              foreach (
                              file ('http://www.khd-research.net/robots.txt') as $sLine)
                                {
                                list (
                              $sLine) = explode ('#' trim ($sLine) , 2);
                                
                                if (
                              '' == $sLine) continue;
                                
                                
                              preg_match ('#((User-agent)|(.+?)):\s*(.+)\s*#i' $sLine $aFound);

                                if (
                              '' != $aFound[2])
                                  {
                                  
                              $oCurrentUserAgent $oUserAgents->get ($aFound[4]); 
                                  }
                                else
                                  {
                                  
                              $oCurrentUserAgent->addSetting (new UserAgentSetting ($aFound[3] , $aFound[4]));
                                  }
                                }

                              // Beispielausgabe für einen Agent

                              print_r ($oUserAgents->get ('Accoona-AI-Agent')->getSettings ());

                              // Beispielausgabe für alle Agents

                              // print_r ($oUserAgents);

                              Kommentar

                              Lädt...
                              X