Ankündigung

Einklappen
Keine Ankündigung bisher.

Forentricks

Einklappen

Neue Werbung 2019

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

  • Forentricks

    Hi.

    Na ja, kein wirklicher Trick, aber ich bin gerade per Zufall wieder darüber gestolpert, dass es diese Funktion in vBulletin-Foren gibt. Ich finde sie ganz witzig.

    - http://www.php.de/misc.php?do=whoposted&t=95511 (bezieht sich auf diesen Thread)

    (t ist die Thread-ID, die in den Thread-URLs zu finden ist.)

    Gibt etwa auch noch do=showsmilies und do=bbcode.

    PS: Es wäre schon sehr nett, eigene Queries und Scripts auf die Datenbank des Forums loslassen zu können.


  • #2
    Meinst du so eigene Queries, dass wir ein Backup vom vBulletin ziehen können und umziehen können ?

    Ansonsten danke, hatte ich nicht gekannt.
    GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

    Kommentar


    • #3
      Nett. Ich kannte nur den hier, vom "Antworten" Dialog, rechts unten bei "weitere Smiles" anzeigen, war so'n PopUp.

      http://www.php.de/misc.php?do=getsmilies

      LG
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Zitat von ChristianK Beitrag anzeigen
        Meinst du so eigene Queries, dass wir ein Backup vom vBulletin ziehen können und umziehen können ?
        Ich hätte auch gern mehr Einsicht in Statistiken, was ganz simpel etwa Postfrequenz und dergleichen angeht. Ich mag solche Zahlen.

        Aber: Ja. Ich hätte zumindest gern die Option, den BBCode und die Metadaten sämtlicher meiner eigenen Beiträge zu bekommen. Ich finde, das ist ein Anspruch, den man haben darf. Ich trage hier seit Jahr und Tag zur Wertschöpfung bei, ich sollte zumindest ein Backup meiner Daten erhalten können. Ich würde mir wünschen, dass wir generell als Web-Nutzer in der Richtung mehr Druck auf die Seiten ausüben, die wir nutzen. Es ist ja nicht so, dass das technisch ein großes Problem wäre.

        Noch besser wäre es natürlich, wenn man die Daten aller Threads, in denen man gepostet hat, erhalten könnte, um auch immer den Kontext der eigenen Beitrage nachvollziehen zu können. Ich wäre auch bereit, auf die Bereitstellung von so was eine Weile zu warten oder das nur alle paar Tage anfordern zu können, weil es ja doch vermutlich ein wenig Rechenzeit benötigt.

        Ich habe zumindest keine Lust, hier alle Beiträge zu verlieren, wenn das Forum doch mal den Geist aufgeben sollte. Hier ist zwar meines Wissens nie irgendwas passiert, aber dass hier so gar keine Administration oder Moderation passiert, ist auch nicht gerade vertrauenerweckend.

        Ich frage mich seit geraumer Zeit, ob es nicht ein wenig naiv ist, einfach so in Foren zu posten. :-\ Oder zumindest, ob man das alles nicht irgendwie sinnvoller hinbekommen könnte. Dass hier quasi keine Administration mehr stattfindet, ist ja zum Beispiel eine Tatsache.

        Kommentar


        • #5
          Ist der Admin telefonisch nicht erreichbar?
          .

          Kommentar


          • #6
            nach all den Versuchen bezweifle ich es (leider)
            https://github.com/Ma27
            Javascript Logic is funny:
            [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

            Kommentar


            • #7
              Weiß ich nicht. Dazu gibt es hier ja (semi-)aktuell auch diese Threads:

              - http://www.php.de/board-support/1114...toren-etc.html
              - http://www.php.de/board-support/1114...-proposal.html

              Ich meinte die Aussagen aber mehr exemplarisch für den Sachverhalt und nicht speziell auf dieses Forum bezogen. Sorry, ich merke auch gerade, dass sich das wohl anders liest.

              Bei so Seiten wie hier, die im Grunde bloß eine Domain mit ner Third-Party-Software-Installation (vBulletin) sind, würde ich jetzt nicht wirklich den Seitenbetreiber in die Pflicht nehmen, mir die von mir produzierten Inhalte sinnvoll zur Verfügung zu stellen. Wäre natürlich nett, wenn der die Sensibilisierung dafür und das technische Knowhow dazu hätte, aber wenn die Software selbst diese Funktionen zum Beispiel nicht sinnvoll implementiert anbietet, akzeptiere ich das und betrachte das als das eigentliche Hindernis.

              (Man könnte auch sagen: Ich akzeptiere, dass mein Anspruch in solchen Situationen leider einfach unrealistisch ist.)

              Das ist aber dennoch kein wünschenswerter Zustand.

              Anders ist es bei Seiten, die ihre Software selbst geschrieben haben. Da ist natürlich primär der Betreiber in der Pflicht. Die „Großen“ machen das teilweise auch ganz ordentlich:

              - http://en.wikipedia.org/wiki/Google_...beration_Front
              - http://meta.stackexchange.com/questi...-overflow-data

              Ich werde wohl die Tage mal wieder ein wenig basteln, ob sich für dieses Forum nicht auch irgendwie was drehen lässt.

              Kommentar


              • #8
                Zitat von mermshaus Beitrag anzeigen
                ...
                Ich werde wohl die Tage mal wieder ein wenig basteln, ob sich für dieses Forum nicht auch irgendwie was drehen lässt.
                Vielleicht hilfreich:
                VBulletin Miner

                ... wenn du das Ding zum Laufen bekommst. Es ist ähnlich antik wie die hier laufende VBulletin-Version 3.7.2. Aber möglicherweise ist gerade das von Vorteil.
                Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                Kommentar


                • #9
                  Danke für den Link.

                  Ich habe jetzt mal selbst fix was gebastelt.

                  Das ?do=whoposted (siehe Beitrag #1 hier im Thread) hilft enorm, um unkompliziert für einen Thread festzustellen, ob man in ihm gepostet hat. (Für den Hinterkopf.)

                  Ansonsten lese ich die Print-Ansicht eines Threads aus. Ich bin noch nicht sicher, ob das reichen wird. Das wäre leichtgewichtiger als die normalen Forenseiten (und ich glaube besser zu parsen, irgendwas war da problematisch iirc).

                  - http://www.php.de/board-support/1129...cks-print.html

                  Das Ziel hier war jetzt erst mal, den Inhalt eines Threads über die ID zu beziehen. Das klappt schon ganz ordentlich, auch wenn das natürlich alles noch sehr hacky ist.

                  Ach ja: Falls es wer ausprobiert und Probleme auffallen, was vor allem fehlende Inhalte aus dem Originalthread angeht, wäre es sehr nett, wenn das hier mitgeteilt werden könnte. Das ist ja als Archivierungstool gedacht und soll nachher stark automatisiert laufen. Da wäre es blöd, wenn am Ende die Hälfte fehlt.

                  PHP-Code:
                  <?php // forentricks.php, Version 2015-01-30

                  // Bekannte Probleme:
                  //
                  // - Über die Druckansicht kommt man wohl an keine Post-IDs. Das ist blöd.
                  //
                  // - Das -- ich glaube -- DOMinnerHTML() hat irgendwelche Whitespace-Issues
                  //   (z. B. bei "( t ist die Thread-ID" im Forentricks-Thread).

                  /**
                   * Siehe:
                   * http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument
                   */
                  function DOMinnerHTML($element)
                  {
                      
                  $innerHTML "";
                      
                  $children $element->childNodes;
                      foreach (
                  $children as $child)
                      {
                          
                  $tmp_dom = new DOMDocument();
                          
                  $tmp_dom->appendChild($tmp_dom->importNode($childtrue));
                          
                  $innerHTML .= $tmp_dom->saveHTML();
                      }
                      return 
                  $innerHTML;
                  }

                  class 
                  User
                  {
                      public 
                  $id;
                      public 
                  $name;

                      public function 
                  __construct($id$name)
                      {
                          
                  $this->id $id;
                          
                  $this->name $name;
                      }
                  }

                  class 
                  Thread
                  {
                      public 
                  $id;
                      public 
                  $title;
                      public 
                  $url;
                      public 
                  $creator;
                      public 
                  $posts;
                  }

                  class 
                  Post
                  {
                      public 
                  $id;
                      public 
                  $author;
                      public 
                  $content;
                      public 
                  $dateCreated;
                  }

                  function 
                  download($url)
                  {
                      
                  $ch curl_init();
                      
                  $timeout 5;
                      
                  curl_setopt($chCURLOPT_URL$url);
                      
                  curl_setopt($chCURLOPT_RETURNTRANSFER1);
                      
                  curl_setopt($chCURLOPT_CONNECTTIMEOUT$timeout);
                      
                  curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
                      
                  $data curl_exec($ch);
                      
                  curl_close($ch);
                      return 
                  $data;
                  }

                  /**
                   *
                   * @param int $id
                   * @return array
                   */
                  function whoposted($id)
                  {
                      
                  $data download('http://php.de/misc.php?do=whoposted&t=' $id);

                      
                  $doc = new DOMDocument('1.0''UTF-8');

                      
                  $doc->loadHTML($data);

                      
                  $xpath = new DOMXPath($doc);

                      
                  $list $xpath->query('//a');

                      
                  $users = array();

                      foreach (
                  $list as $element) {
                          
                  /* $element DOMElement */
                          
                  $matches = array();
                          if (
                  === preg_match(
                              
                  '/(?<=\Amember\.php\?u=)[0-9]+\z/',
                              
                  trim($element->getAttribute('href')),
                              
                  $matches
                          
                  )) {
                              
                  #$userId = $matches[0];
                              
                  $users[] = new User(
                                  
                  $matches[0],
                                  
                  trim($element->textContent)
                              );
                          }
                      }

                      return 
                  $users;
                  }

                  function 
                  getPosts(DOMDocument $doc, array $nameToUser)
                  {
                      
                  $posts = array();

                      
                  $xpath = new DOMXPath($doc);

                      
                  $list $xpath->query('//body/table[@class="tborder"]');

                      foreach (
                  $list as $element) {
                          
                  /* @var $element DOMElement */

                          
                  $post = new Post();

                          
                  $xpath2 = new DOMXPath($doc);

                          
                  $list2 $xpath2->query('.//td[@class="page"]/table/tr/td'$element);

                          
                  $name $list2->item(0)->textContent;

                          if (
                  array_key_exists($name$nameToUser)) {
                              
                  $post->author      $nameToUser[$name];
                          } else {
                              
                  $post->author = new User(-1$name ' (gelöscht)');
                          }
                          
                  $post->dateCreated DateTime::createFromFormat('d.m.Y H:i'$list2->item(1)->textContent);

                          
                  $list2 $xpath2->query('.//td[@class="page"]/div'$element);

                          foreach (
                  $list2 as $element2) {
                              
                  $post->content .= DOMinnerHTML($element2);
                          }

                          
                  $posts[] = $post;
                      }

                      return 
                  $posts;
                  }

                  function 
                  downloadThread($id)
                  {
                      
                  $thread = new Thread();
                      
                  $thread->id $id;

                      
                  $users whoposted($id);
                      
                  $nameToUser = array();

                      foreach (
                  $users as $user) {
                          if (
                  array_key_exists($user->name$nameToUser)) {
                              throw new 
                  Exception('welp');
                          }

                          
                  $nameToUser[$user->name] = $user;
                      }

                      
                  $data download('http://php.de/printthread.php?t=' $id '&pp=40');

                      
                  $doc = new DOMDocument('1.0''UTF-8');

                      
                  $old libxml_use_internal_errors(true);
                      
                  $doc->loadHTML($data);
                      
                  libxml_use_internal_errors($old);

                      
                  $xpath = new DOMXPath($doc);

                      
                  // Thread title

                      
                  $list $xpath->query('//a[@accesskey="3"]/strong');

                      if (
                  !== $list->length) {
                          throw new 
                  Exception('doh');
                      }

                      
                  $thread->title trim($list->item(0)->textContent);

                      
                  // Thread url

                      
                  $list $xpath->query('//a[@accesskey="3"]');

                      if (
                  !== $list->length) {
                          throw new 
                  Exception('doh');
                      }

                      
                  $thread->url trim($list->item(0)->getAttribute('href'));

                      
                  // Posts

                      
                  $thread->posts getPosts($doc$nameToUser);

                      
                  $list $xpath->query('//div[@class="pagenav"]');

                      if (
                  !== $list->length) {
                          
                  $tmp = array();
                          
                  preg_match('/Seite\s+1\s+von\s+([0-9]+)/'$list->item(0)->textContent$tmp);
                          
                  $pageCount = (int) $tmp[1];

                          for (
                  $i 2$i <= $pageCount$i++) {
                              
                  // Die Verzögerung ist Absicht
                              
                  sleep(1);

                              
                  $data2 download('http://php.de/printthread.php?t=' $id '&page=' $i '&pp=40');

                              
                  $doc2 = new DOMDocument('1.0''UTF-8');

                              
                  $old libxml_use_internal_errors(true);
                              
                  $doc2->loadHTML($data2);
                              
                  libxml_use_internal_errors($old);

                              
                  $thread->posts array_merge($thread->postsgetPosts($doc2$nameToUser));
                          }
                      }

                      return 
                  $thread;
                  }



                  // -----------------------------------------------------------------------------



                  $e = function ($s) {
                      return 
                  htmlspecialchars($sENT_QUOTES ENT_SUBSTITUTE ENT_HTML5 ENT_DISALLOWED'UTF-8');
                  };

                  $t 112905;

                  if (isset(
                  $_GET['t'])) {
                      
                  $t = (int) $_GET['t'];
                  }

                  //$thread = downloadThread(58053);
                  $thread downloadThread($t);

                  header('Content-Type: text/html; charset=UTF-8');

                  ?><!DOCTYPE html>
                  <html>
                      <head>
                          <meta charset="UTF-8" />
                          <title>Forentricks</title>
                          <style>
                              .small {
                                  font-size: small;
                              }

                              body {
                                  width: 800px;
                                  margin: 0 auto;
                              }

                              .post {
                                  font-size: small;
                                  padding: 10px;
                                  margin: 10px;
                                  border: 1px solid #ccc;
                                  border-radius: 10px;
                              }

                              .post-content {
                                  padding: 20px;
                              }

                          </style>
                      </head>
                      <body>
                          <p class="small">Testthreads:
                              <a href="?t=112905">Forentricks</a>,
                              <a href="?t=58053">Quizfrage</a> (lang!),
                              <a href="?t=48963">Lerne Grundlagen</a> (fancy),
                              <a href="?t=1">Thread 1</a>,
                              <a href="?t=100000">Thread 100000</a>
                          </p>

                          <h1><?=$e($thread->title)?></h1>

                          <p>Original URL: <a href="<?=$e($thread->url)?>"><?=$e($thread->url)?></a></p>

                          <?php $i 0?>
                          <?php foreach ($thread->posts as $post) : ?>
                              <?php $i++; ?>

                          <div class="post">

                              <p>#<?=$e($i)?> <?=$e($post->author->name)?> schrieb am <?=$e($post->dateCreated->format('Y-m-d H:i'))?>:</p>

                              <div class="post-content"><?=$post->content?></div>

                          </div>

                          <?php endforeach; ?>

                      </body>
                  </html>

                  Kommentar


                  • #10
                    Gute Idee! Wenn ich Zeit hab werd ich das auch mal etwas austesten in Bezug auf fehlende Inhalte, die ersten Versuche sehen gut aus.

                    Am Rande, was mir auf die Schnelle aufgefallen ist, hab jetzt fauler Weise nicht geschaut woran es liegt...

                    "Dein" HTML:

                    HTML-Code:
                     <meta charset="UTF-8" />
                      ...
                      per Zufall wieder dar&uuml;ber gestolpert,
                    Original HTML:

                    HTML-Code:
                     per Zufall wieder darüber gestolpert,
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Ich habe jetzt angefangen, erst mal die originale HTML-Version aller Threads von 1 bis ~113 K (also aller Threads, ja) zu ziehen. Ich glaube, das ist doch die beste Variante, weil man dann in jedem Fall ein solides Backup hat.

                      Vorerst nur die öffentlich (Edit: ich meine unangemeldet) zugänglichen Threads. Trash und Grüne Wiese sind das zum Beispiel nicht, aber das ist sicher nicht der größte Verlust.

                      Ich habe heute am frühen Nachmittag angefangen und bin so etwa bei Thread-ID 10 K und guten 100 MB an Daten (als *.html.gz abgelegt).

                      Das heißt, es werden am Ende gut 1 GB. Die Kompressionsrate von gzip liegt hier etwa bei Faktor 5. Für mich ist das vertretbar. (Also vor allem auch, was den Traffic angeht.)

                      Kommentar


                      • #12
                        Jetzt wäre es ein cooles Projekt die HTML-Dateien zu parsen und in einer Datenbank abzulegen. Dann hätte man praktisch eine Kopie des Forums .
                        GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                        Kommentar

                        Lädt...
                        X