Ankündigung

Einklappen
Keine Ankündigung bisher.

RSS Feed in Echtzeitfeeds erstellen mit pubsubhubbub / Superfeedr

Einklappen

Neue Werbung 2019

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

  • RSS Feed in Echtzeitfeeds erstellen mit pubsubhubbub / Superfeedr

    Ich schreibe an einer Homepage, mit der ich RSS-Feeds und Podcasts laden darstellen kann. Natürlich möchte ich meine User auf jede neue Episode ihrer Podacsts aufmerksam machen sobald diese erscheinen.
    Ich wende das im Topic genannte Verfahren an, das einfach sein soll zu implementieren.

    Bisher folgte ich diesem Howto:
    https://blog.superfeedr.com/howto-pubsubhubbub/
    und einem Lehrvideo
    https://www.youtube.com/watch?v=KeZ3WzoUYi8

    Manche RSS Feeds sollen dies ja realtime unterstützen, was man an folgendem XML Code erkennen kann, den der Publisher zusätzlich einfügt:
    Code:
    <link rel="hub" href="https://pubsubhubbub.superfeedr.com">
    Meine Rolle, oder die meiner Homepage ist die eines subscribers. Den Service der umgehenden Benachrichtigung meinerseits (bzw. meiner Callback-URL) stellt dann der Hub bereit, in obiger Beispielzeile ist es Superfeedr.

    Meine Homepage habe ich hauptsächlich mit PHP programmiert und eine Testversion läuft davon (passwortgeschützt) auf meinem Rechner unter localhost.
    Damit der Hub mich erreichen kann, habe ich eine Callback-Adresse außerhalb angelegt die vom WWW, also vom Hub erreichbar ist.

    Subscribe:

    Das Abbonieren des Feeds als Subscriber funktioniert dann gut und ich erhalte die Mitteilung:

    Code:
    HTTP/1.1 204 No Content X-Powered-By: The force, Luke Vary: X-HTTP-Method-Override X-Superfeedr-Host: supernoder8.superfeedr.com Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Authorization PubSubHubbub-Version: 0.3 ETag: W/"0-0" Date: Sat, 17 Oct 2020 06:07:39 GMT Connection: close
    Was bedeutet dass die Subscribtion erfolgreich war, also okay.

    Sobald aber vom Publisher (beispielsweise ein Blog oder Podcast) ein neuer Beitrag veröffentlicht wird, sollte dann irgendwie dieser neue Beitrag in Form eines eigenen RSS-Feeds erscheinen, statt obiger Meldung.

    Dies klappt aber nicht. Stattdessen bekomme ich immer wieder die Meldung HTTP/1.1 204 No Content, auch wenn der Feed ein Update hatte.
    Und an dieser Stelle bräuchte ich bitte Unterstüttzung.

    Testblog:

    Ich benutze, um meine Bemühungen zu testen einen Testblog und einen dazugehörigen dynamschen Feed von dritter Seite:
    Blog: http://push-pub.appspot.com/
    RSS-Feed: http://push-pub.appspot.com/feed

    Meine Subsriber Seite:

    Code:
    <?php
    header('Content-Type: text/html; charset=utf-8');
    
    $hub_url ='https://pubsubhubbub.superfeedr.com';
    $feed='http://push-pub.appspot.com/feed';
    $callback_url="https://taifunorkan.de.cool/pubsubhubbub-callback.php";
    
    $post_fields= array(
        'hub.mode' =&gt; 'subscribe',
        'hub.topic' =&gt; $feed,
        'hub.callback' =&gt; $callback_url,
        'hub.verify' =&gt; 'sync'
    );
    
    
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL,$hub_url);
    curl_setopt($ch, CURLOPT_POST, 1);
    
    curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($post_fields));
    
    // Receive server response ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    
    $server_output = curl_exec($ch);
    $info = curl_getinfo($ch);
    
    curl_close ($ch);
    
    echo $server_output';
    Mein Callback Script:

    Code:
    <?php
    if (isset($_GET['hub_challenge'])) {
        // echo back the random string to the hub
        // to verify that it is the correct subscriber
        // HTTP 200 that everything is okay!
        http_response_code(200);
        echo $_GET['hub_challenge'];
        return;
    } else {
        http_response_code(404);
        return;
    }

  • #2
    In deinem Code sind HTML Entities anstatt deren Zeichen wie < oder >.
    Wenn du das noch korrigieren könntest, so das andere den Code einfach kopieren können, wäre das gut.

    Kommentar


    • #3
      Sobald aber vom Publisher (beispielsweise ein Blog oder Podcast) ein neuer Beitrag veröffentlicht wird, sollte dann irgendwie dieser neue Beitrag in Form eines eigenen RSS-Feeds erscheinen, statt obiger Meldung.
      Würde ein Update nicht an die Callback-URL geschickt werden?

      Ja, scheint so:

      Once the subscription is confirmed, the hub will inform you of any change in the feed by sending POST requests your webhook.
      Hänge mal alles, was beim Callback ankommt (und idealerweise auch, was es rausschickt) mit Timestamps an eine Log-Datei an.

      Was beim Callback reinkommt, ist so grob:

      Code:
      $getData  = print_r($_GET, true);
      $postData = print_r($_POST, true);
      $body     = file_get_contents('php://input');
      Das dann in irgendeine Datei, die du mit fopen($datei, 'ab') öffnest.

      Edit: Habe es gerade mal ausprobiert:

      Code:
      [2020-10-17 11:39:18.000000] [subscriber] Calling "https://pubsubhubbub.superfeedr.com" with POST data: Array
      (
          [hub.mode] => subscribe
          [hub.topic] => http://push-pub.appspot.com/feed
          [hub.callback] => https://tmp.example.org/pshb/callback.php
          [hub.verify] => sync
      )
      
      [2020-10-17 11:39:19.000000] [callback] 2797 - Received request
      [2020-10-17 11:39:19.000000] [callback] 2797 - GET data:
      Array
      (
          [hub_mode] => subscribe
          [hub_topic] => http://push-pub.appspot.com/feed
          [hub_challenge] => i9gj7f136h8m15ze61or
          [hub_lease_seconds] => 1296000
      )
      
      [2020-10-17 11:39:19.000000] [callback] 2797 - POST data:
      Array
      (
      )
      
      [2020-10-17 11:39:19.000000] [callback] 2797 - Body:
      
      [2020-10-17 11:39:19.000000] [callback] 2797 - Replying with 200 and "i9gj7f136h8m15ze61or"
      [2020-10-17 11:39:19.000000] [subscriber] Response:
      HTTP/1.1 204 No Content
      X-Powered-By: The force, Luke
      Vary: X-HTTP-Method-Override
      X-Superfeedr-Host: supernoder5.superfeedr.com
      Access-Control-Allow-Origin: *
      Access-Control-Allow-Credentials: true
      Access-Control-Allow-Methods: GET, POST, PUT, DELETE
      Access-Control-Allow-Headers: Authorization
      PubSubHubbub-Version: 0.3
      ETag: W/"0-0"
      Date: Sat, 17 Oct 2020 09:39:19 GMT
      Connection: close
      
      
      [2020-10-17 11:55:24.000000] [callback] a00a - Received request
      [2020-10-17 11:55:24.000000] [callback] a00a - GET data:
      Array
      (
      )
      
      [2020-10-17 11:55:24.000000] [callback] a00a - POST data:
      Array
      (
      )
      
      [2020-10-17 11:55:24.000000] [callback] a00a - Body:
      <?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><status feed="http://push-pub.appspot.com/feed" xmlns="http://superfeedr.com/xmpp-pubsub-ext"><http code="200">Fetched (ping) 200 86400 and parsed 1/20 entries</http><next_fetch>1970-01-19T13:17:31.770Z</next_fetch><entries_count_since_last_maintenance>1</entries_count_since_last_maintenance><velocity>2.4</velocity><popularity>1.591742203077015</popularity><title>Publisher example</title><period>86400</period><last_fetch>1970-01-19T13:15:28.523Z</last_fetch><last_parse>1970-01-19T13:15:28.523Z</last_parse><last_maintenance_at>1970-01-19T13:15:20.756Z</last_maintenance_at></status><link rel="hub" href="http://pubsubhubbub.superfeedr.com"/><link rel="self" href="http://push-pub.appspot.com/feed"/><link title="Publisher example" rel="self" href="http://push-pub.appspot.com/feed" type="application/atom+xml"/><link title="Publisher example" rel="alternate" href="http://push-pub.appspot.com/" type="text/html"/><link title="" rel="hub" href="https://pubsubhubbub.superfeedr.com" type="text/html"/><title>Publisher example</title><updated>2020-10-17T09:55:19.000Z</updated><id>http://push-pub.appspot.com/feed</id><entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext"><id>http://push-pub.appspot.com/feed/5663004578283520</id><published>2020-10-17T09:55:19.000Z</published><updated>2020-10-17T09:55:19.000Z</updated><title>test merms</title><content type="text">ich bin mal so frei</content><link title="test merms" rel="alternate" href="http://push-pub.appspot.com/entry/5663004578283520" type="text/html"/></entry></feed>
      [2020-10-17 11:55:24.000000] [callback] a00a - Replying with 404
      [2020-10-17 11:55:30.000000] [callback] 430f - Received request
      [2020-10-17 11:55:30.000000] [callback] 430f - GET data:
      Array
      (
      )
      
      [2020-10-17 11:55:30.000000] [callback] 430f - POST data:
      Array
      (
      )
      
      [2020-10-17 11:55:30.000000] [callback] 430f - Body:
      <?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><status feed="http://push-pub.appspot.com/feed" xmlns="http://superfeedr.com/xmpp-pubsub-ext"><http code="200">Fetched (ping) 200 86400 and parsed 1/20 entries</http><next_fetch>1970-01-19T13:17:31.770Z</next_fetch><entries_count_since_last_maintenance>1</entries_count_since_last_maintenance><velocity>2.4</velocity><popularity>1.591742203077015</popularity><title>Publisher example</title><period>86400</period><last_fetch>1970-01-19T13:15:28.523Z</last_fetch><last_parse>1970-01-19T13:15:28.523Z</last_parse><last_maintenance_at>1970-01-19T13:15:20.756Z</last_maintenance_at></status><link rel="hub" href="http://pubsubhubbub.superfeedr.com"/><link rel="self" href="http://push-pub.appspot.com/feed"/><link title="Publisher example" rel="self" href="http://push-pub.appspot.com/feed" type="application/atom+xml"/><link title="Publisher example" rel="alternate" href="http://push-pub.appspot.com/" type="text/html"/><link title="" rel="hub" href="https://pubsubhubbub.superfeedr.com" type="text/html"/><title>Publisher example</title><updated>2020-10-17T09:55:19.000Z</updated><id>http://push-pub.appspot.com/feed</id><entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext"><id>http://push-pub.appspot.com/feed/5663004578283520</id><published>2020-10-17T09:55:19.000Z</published><updated>2020-10-17T09:55:19.000Z</updated><title>test merms</title><content type="text">ich bin mal so frei</content><link title="test merms" rel="alternate" href="http://push-pub.appspot.com/entry/5663004578283520" type="text/html"/></entry></feed>
      [2020-10-17 11:55:30.000000] [callback] 430f - Replying with 404
      [2020-10-17 11:55:35.000000] [callback] 2a79 - Received request
      [2020-10-17 11:55:35.000000] [callback] 2a79 - GET data:
      Array
      (
      )
      
      [2020-10-17 11:55:35.000000] [callback] 2a79 - POST data:
      Array
      (
      )
      
      [2020-10-17 11:55:35.000000] [callback] 2a79 - Body:
      <?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><status feed="http://push-pub.appspot.com/feed" xmlns="http://superfeedr.com/xmpp-pubsub-ext"><http code="200">Fetched (ping) 200 86400 and parsed 1/20 entries</http><next_fetch>1970-01-19T13:17:31.770Z</next_fetch><entries_count_since_last_maintenance>1</entries_count_since_last_maintenance><velocity>2.4</velocity><popularity>1.591742203077015</popularity><title>Publisher example</title><period>86400</period><last_fetch>1970-01-19T13:15:28.523Z</last_fetch><last_parse>1970-01-19T13:15:28.523Z</last_parse><last_maintenance_at>1970-01-19T13:15:20.756Z</last_maintenance_at></status><link rel="hub" href="http://pubsubhubbub.superfeedr.com"/><link rel="self" href="http://push-pub.appspot.com/feed"/><link title="Publisher example" rel="self" href="http://push-pub.appspot.com/feed" type="application/atom+xml"/><link title="Publisher example" rel="alternate" href="http://push-pub.appspot.com/" type="text/html"/><link title="" rel="hub" href="https://pubsubhubbub.superfeedr.com" type="text/html"/><title>Publisher example</title><updated>2020-10-17T09:55:19.000Z</updated><id>http://push-pub.appspot.com/feed</id><entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext"><id>http://push-pub.appspot.com/feed/5663004578283520</id><published>2020-10-17T09:55:19.000Z</published><updated>2020-10-17T09:55:19.000Z</updated><title>test merms</title><content type="text">ich bin mal so frei</content><link title="test merms" rel="alternate" href="http://push-pub.appspot.com/entry/5663004578283520" type="text/html"/></entry></feed>
      [2020-10-17 11:55:35.000000] [callback] 2a79 - Replying with 404
      Da dann mit 404 zu antworten, ist natürlich falsch. Das habe ich jetzt nicht alles rausgebaut gehabt. Ich schätze, weil der Hub ein 404 kriegt, versucht er die Zustellung auch dreimal.

      (Das 430f, 2a79 usw. sind nur gekürzte random UUIDs, die ich einmal pro Callback-Auslösung baue und mit in die Logs schreibe, damit man besser sieht, was im gleichen Request/Response-Cycle passiert ist.)

      Kommentar


      • #4
        Hier ist noch der Code, wie ich ihn verwendet habe, dann muss ich den nicht aufheben.

        Code:
        .
        |-- src
        |   `-- pshb
        |       |-- functions.php
        |       `-- Logger.php
        |-- callback.php
        `-- subscriber.php
        src/pshb/functions.php

        Code:
        <?php
        
        namespace pshb;
        
        function create_default_logger(string $channel = 'default'): Logger
        {
            return new Logger($channel, fopen(__DIR__ . '/../../log.txt', 'ab'));
        }
        src/pshb/Logger.php

        Code:
        <?php
        
        namespace pshb;
        
        final class Logger
        {
            /** @var string $channel */
            private $channel;
        
            /** @var resource $outputStream */
            private $outputStream;
        
            /**
             * @param resource $outputStream
             */
            public function __construct(string $channel, $outputStream)
            {
                $this->channel = $channel;
        
                if (!is_resource($outputStream)) {
                    throw new \RuntimeException('Stream passed to Logger must be of type resource');
                }
        
                if (get_resource_type($outputStream) !== 'stream') {
                    throw new \RuntimeException(
                        'Stream passed to Logger must be of resource type "stream"',
                    );
                }
        
                $this->outputStream = $outputStream;
            }
        
            public function info(string $data): void
            {
                $timestamp = date('Y-m-d H:i:s.u');
        
                $dataPrepared = sprintf('[%s] [%s] %s', $timestamp, $this->channel, $data) . \PHP_EOL;
        
                $result = fwrite($this->outputStream, $dataPrepared);
        
                if (!is_int($result)) {
                    throw new \RuntimeException('Could not write to stream');
                }
            }
        }
        callback.php

        Code:
        <?php
        
        namespace pshb;
        
        require __DIR__ . '/src/pshb/functions.php';
        require __DIR__ . '/src/pshb/Logger.php';
        
        function callback_main(Logger $logger): void
        {
            $callbackRunId = substr(md5(uniqid('', true)), 0, 4);
        
            $getData  = print_r($_GET, true);
            $postData = print_r($_POST, true);
            $body     = file_get_contents('php://input');
        
            $logger->info(sprintf('%s - Received request', $callbackRunId));
            $logger->info(sprintf("%s - GET data:\n%s", $callbackRunId, $getData));
            $logger->info(sprintf("%s - POST data:\n%s", $callbackRunId, $postData));
            $logger->info(sprintf("%s - Body:\n%s", $callbackRunId, $body));
        
            if (isset($_GET['hub_challenge'])) {
                $logger->info(
                    sprintf('%s - Replying with 200 and "%s"', $callbackRunId, $_GET['hub_challenge']),
                );
        
                // echo back the random string to the hub
                // to verify that it is the correct subscriber
                // HTTP 200 that everything is okay!
                http_response_code(200);
                echo $_GET['hub_challenge'];
        
                return;
            }
        
            $logger->info(sprintf('%s - Replying with 404', $callbackRunId));
        
            http_response_code(404);
        }
        
        callback_main(create_default_logger('callback'));
        subscriber.php:

        Code:
        #!/usr/bin/env php
        <?php
        
        namespace pshb;
        
        require __DIR__ . '/src/pshb/functions.php';
        require __DIR__ . '/src/pshb/Logger.php';
        
        function subscriber_main(Logger $logger): void
        {
            $hub_url      = 'https://pubsubhubbub.superfeedr.com';
            $feed         = 'http://push-pub.appspot.com/feed';
            $callback_url = 'https://your-domain.example.org/callback.php';
        
            $post_fields = [
                'hub.mode'     => 'subscribe',
                'hub.topic'    => $feed,
                'hub.callback' => $callback_url,
                'hub.verify'   => 'sync',
            ];
        
            $ch = curl_init();
        
            curl_setopt($ch, CURLOPT_URL, $hub_url);
            curl_setopt($ch, CURLOPT_POST, 1);
        
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_fields));
        
            // Receive server response ...
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HEADER, 1);
        
            $logger->info(
                sprintf('Calling "%s" with POST data: %s', $hub_url, print_r($post_fields, true)),
            );
        
            $server_output = curl_exec($ch);
            $info          = curl_getinfo($ch);
        
            curl_close($ch);
        
            $logger->info(sprintf('Response:%s%s', \PHP_EOL, $server_output));
        }
        
        subscriber_main(create_default_logger('subscriber'));

        Kommentar


        • #5
          Hallo mermshaus,

          vielen Dank für die prompte Antwort und deine Lösung. Ich muss mich da hineindenken. Für mich als Beginner sieht das erstmal sehr umfangreich aus und mich wundert, dass überall zu lesen ist, dass die Implementierung (in meinen Worten) ein Klacks ist. Deshalb gibt es wahrscheinlich auch keinen Beispielcode für PHP?

          Ich muss mich da jetzt hineindenken ...

          Es gibt da ja auch Packages wie pubsubhubbub/subscriber, aber damit komm ich dann gar nicht klar:
          https://github.com/pubsubhubbub/php-subscriber

          An dem Zitat habe ich auch rumgekaut:
          Once the subscription is confirmed, the hub will inform you of any change in the feed by sending POST requests (to) your webhook.
          Dass ich das irgendwie abgreifen muss ist klar.

          Vielen Dank und später mehr dazu ...

          Bernd

          Kommentar


          • #6
            Ich habe folgenden Code für das Callback probiert, der klappt wohl. Allerdings frage ich mich, warum ich das Ergebnis mehr oder weniger doppelt erhalte?

            PHP-Code:
            <?php
            if (isset($_GET['hub_challenge'])) {
                
            // echo back the random string to the hub
                // to verify that it is the correct cubscriber
                // HTTP 200 that everything is okay!
                //header("HTTP/1.1 200 OK");
                
            http_response_code(200);
                echo 
            $_GET['hub_challenge'];
                return;
            }

            $getData  print_r($_GETtrue);
            $postData print_r($_POSTtrue);
            $body file_get_contents('php://input');

            //
            // Dump the content to a file...
            //

            $t microtime(true);
            $micro sprintf("%06d",($t floor($t)) * 1000000);
            $d = new DateTimedate('Y-m-d H:i:s.'.$micro$t) );
            $date$d->format("Y-m-d H:i:s.u");

            file_put_contents('websublog.txt'$date."\r\n",FILE_APPEND);
            file_put_contents('websublog.txt''GET: '."\r\n",FILE_APPEND);
            file_put_contents('websublog.txt'$getData."\r\n",FILE_APPEND);
            file_put_contents('websublog.txt''POST: '."\r\n",FILE_APPEND);
            file_put_contents('websublog.txt'$postData."\r\n",FILE_APPEND);
            file_put_contents('websublog.txt''Body: '."\r\n",FILE_APPEND);
            file_put_contents('websublog.txt'$body."\r\n",FILE_APPEND);
            Logfile Inhalt:

            2020-10-18 12:25:07.383999
            GET: Array ( )
            POST: Array ( )
            Body:
            <?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><status feed="http://push-pub.appspot.com/feed" xmlns="http://superfeedr.com/xmpp-pubsub-ext"><http code="200">Fetched (ping) 200 86400 and parsed 1/20 entries</http><next_fetch>1970-01-19T13:18:34.339Z</next_fetch><entries_count_since_last_maintenance>3 4</entries_count_since_last_maintenance><velocity>3</velocity><popularity>1.6089679827693135</popularity><title>Publisher example</title><period>86400</period><last_fetch>1970-01-19T13:16:56.705Z</last_fetch><last_parse>1970-01-19T13:16:56.705Z</last_parse><last_maintenance_at>1970-01-19T13:16:47.717Z</last_maintenance_at></status><link rel="hub" href="http://pubsubhubbub.superfeedr.com"/><link rel="self" href="http://push-pub.appspot.com/feed"/><link title="Publisher example" rel="self" href="http://push-pub.appspot.com/feed" type="application/atom+xml"/><link title="Publisher example" rel="alternate" href="http://push-pub.appspot.com/" type="text/html"/><link title="" rel="hub" href="https://pubsubhubbub.superfeedr.com" type="text/html"/><title>Publisher example</title><updated>2020-10-18T10:25:05.000Z</updated><id>http://push-pub.appspot.com/feed</id><entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext"><id>http://push-pub.appspot.com/feed/5764205672136704</id><published>2020-10-18T10:25:05.000Z</published><updated>2020-10-18T10:25:05.000Z</updated><title>Better date</title><content type="text">test</content><link title="Better date" rel="alternate" href="http://push-pub.appspot.com/entry/5764205672136704" type="text/html"/></entry></feed>

            2020-10-18 12:25:07.744272
            GET:
            Array ( )
            POST:
            Array ( )
            Body:
            <?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><status feed="https://push-pub.appspot.com/feed" xmlns="http://superfeedr.com/xmpp-pubsub-ext"><http code="200">Fetched (ping) 200 86400 and parsed 1/20 entries</http><next_fetch>1970-01-19T13:18:45.559Z</next_fetch><entries_count_since_last_maintenance>3 4</entries_count_since_last_maintenance><velocity>1.9 </velocity><title>Publisher example</title><period>86400</period><last_fetch>1970-01-19T13:16:56.705Z</last_fetch><last_parse>1970-01-19T13:16:56.705Z</last_parse><last_maintenance_at>1970-01-19T13:15:54.523Z</last_maintenance_at></status><link rel="hub" href="http://pubsubhubbub.superfeedr.com"/><link rel="self" href="http://push-pub.appspot.com/feed"/><link title="Publisher example" rel="self" href="http://push-pub.appspot.com/feed" type="application/atom+xml"/><link title="Publisher example" rel="alternate" href="http://push-pub.appspot.com/" type="text/html"/><link title="" rel="hub" href="https://pubsubhubbub.superfeedr.com" type="text/html"/><title>Publisher example</title><updated>2020-10-18T10:25:05.000Z</updated><id>https://push-pub.appspot.com/feed</id><entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext"><id>https://push-pub.appspot.com/feed/5764205672136704</id><published>2020-10-18T10:25:05.000Z</published><updated>2020-10-18T10:25:05.000Z</updated><title>Better date</title><content type="text">test</content><link title="Better date" rel="alternate" href="http://push-pub.appspot.com/entry/5764205672136704" type="text/html"/></entry></feed>

            Kommentar


            • #7
              Cool, dass du es rausbekommen hast, dir die Daten auf eine eigene Weise zu loggen.

              Die Rückgaben sind nicht identisch. Zum Beispiel ist das eine http und das andere https.

              Code:
              $ diff xml1.xml xml2.xml
              3c3
              <     <status feed="http://push-pub.appspot.com/feed"
              ---
              >     <status feed="https://push-pub.appspot.com/feed"
              6c6
              <         <next_fetch>1970-01-19T13:18:34.339Z</next_fetch>
              ---
              >         <next_fetch>1970-01-19T13:18:45.559Z</next_fetch>
              8,9c8
              <         <velocity>3</velocity>
              <         <popularity>1.6089679827693135</popularity>
              ---
              >         <velocity>1.9 </velocity>
              14c13
              <         <last_maintenance_at>1970-01-19T13:16:47.717Z</last_maintenance_at>
              ---
              >         <last_maintenance_at>1970-01-19T13:15:54.523Z</last_maintenance_at>
              23c22
              <     <id>http://push-pub.appspot.com/feed</id>
              ---
              >     <id>https://push-pub.appspot.com/feed</id>
              28c27
              <         <id>http://push-pub.appspot.com/feed/5764205672136704</id>
              ---
              >         <id>https://push-pub.appspot.com/feed/5764205672136704</id>
              Würde ich mir glaube ich nicht den Kopf drüber zerbrechen und erst mal weitermachen.

              Wenn ich raten sollte: Das Callback bekommt noch Dinge zugestellt von einem vorherigen Subscriber-Aufruf. Wenn du was Neues testest, meldest du den vorherigen Subscriber auf dem Hub ja nicht automatisch wieder ab.

              Die Daten gehen wahrscheinlich deshalb praktisch zeitgleich ein, weil der Hub-Server in bestimmten Intervallen anfängt, alle Subscriber zu bedienen. Vielleicht mit einem cronjob.

              Aber wie gesagt: Das kann dir als Subscriber in den Details egal sein. Du musst einfach zusehen, dass du die eingehenden Daten korrekt verarbeitest. Das ist ein verteiltes System, und du kannst so oder so nur deinen eigenen Teil beeinflussen. Der Hub-Server steht ja extern und ist Fremdsoftware.

              Kommentar


              • #8
                Ja, es gibt diese Unterschiede!

                Cool, dass du es rausbekommen hast, dir die Daten auf eine eigene Weise zu loggen.
                Danke, der Sprung zu deiner angebotenen Klasse ist für mich noch nicht ganze zu schaffen. Trotzdem hast du mich auf den entscheidenden Weg gebracht.

                Würde ich mir glaube ich nicht den Kopf drüber zerbrechen und erst mal weitermachen.
                Bin mir da nicht so sicher, aber vielleicht hast du recht.

                Ich denke es gibt Probleme mit einer dynamischen Callback URL? Wie z.B. callback.php?id=306

                Kommentar


                • #9
                  Zitat von taifunorkan Beitrag anzeigen
                  Bin mir da nicht so sicher, aber vielleicht hast du recht.
                  Was sagt der Anbieter dazu? Das ist ein Protokoll über eine "instabile" Verbindung. Es ist technisch nicht möglich sicher zu stellen, dass eine Nachricht den Empfänger genau einmal erreicht.
                  So wie es weiter oben klingt, haben die ein retry drin. Du musst das in deiner Anwendung also entsprechend berücksichtigen.

                  Wobei das Beispiel oben eher wie doppelt abonniert aussieht, oder doppelt veröffentlicht.

                  Kommentar


                  • #10
                    eher wie doppelt abonniert aussieh
                    Ja vielleicht doppelt abonniert. Ich versuche mal jeweils ein unsubscribe.

                    Code:
                    $post_fields= array(
                        'hub.mode' => 'unsubscribe',
                        'hub.topic' => $feed,
                        'hub.callback' => $callback_url,
                        'hub.verify' => 'sync'
                    );
                    Code:
                     
                     HTTP/1.1 204 No Content X-Powered-By: The force, Luke Vary: X-HTTP-Method-Override X-Superfeedr-Host: supernoder10.superfeedr.com Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Authorization PubSubHubbub-Version: 0.3 ETag: W/"30-f247c66e" Date: Mon, 19 Oct 2020 09:29:00 GMT Connection: close
                    Habe jeweils
                    https://push-pub.appspot.com/feed
                    http://push-pub.appspot.com/feed
                    abgemeldet (siehe oben) und dann
                    https://push-pub.appspot.com/feed
                    wieder abonniert.

                    habe aber wieder zweimal ein XML erhalten
                    new.xml für https:// (angemeldet)
                    und
                    new306.xml für http://

                    Irgendwie lustig!

                    Kommentar

                    Lädt...
                    X