PubSubHubbub и RSS/Atom

PubSubHubbub — это бесплатный, открытый и децентрализованный протокол. Он использует веб-перехватчики для передачи обновлений фида в режиме реального времени от издателей к подписчикам (читателям фида).

Для чего

  1. Чтобы каждый сайт отправлял в новостной Hub список своих новостей в виде RSS/Atom документа.
  2. Чтобы далее любой читатель мог зайти на Hub и подписаться на новости нужного сайта (с помощью почты или любой другой программы, которая может зарегистрировать себя как подписчика новостей нужного сайта).

История

  • 2009 год - google объявляет о сканировании RSS/Atom посредством PubSubHubbub
  • 2014 год - google объявляют, что используют WebSub сервисы (старое название PubSubHubbub)
  • 2014 год - seroundtable.com пишет объявление (ссылаясь на гугл) и рекомендует новостным сайтам использовать PubSubHubbub
  • 2014 год - мало известный zgoba.ru пишет что WebSub (PubSubHubbub) является технологией Google, косвенно это подтверждается на странице, которая говорит:

Open hubs are provided by:

Several other publishing platforms, like Wordpress, include their own hubs.

If you're looking for tutorials on how to get started with PubSubHubbub, check the links below:

После того, как PubSubHubbub переименовали в WebSub, был написано хороший документ описывающий эту технологию.

Какая польза для сайта

  1. Пользователи (подписчики) получают короткое описание новости, а за полным идут на сайт, где видят рекламу (такой вот способ привлечения читателей и зарабатывания денег.
  2. В интернете пишут, что благодаря WebSub страницы сайта влетают в индекс Google практически мгновенно.
  3. Помимо мгновенной индексации быстрое размещение является дополнительной технической защитой вашего авторского контента в Google. При этой технологии поисковая система вместе с уведомлением о появлении нового материала еще и целиком получает этот материал. Словом, при использовании данной технологии вы можете быть уверены, что ваш материал Google проиндексирует изначально именно у вас и вы будете его первоисточником.

Быстрое подключение Feed-а

Зарегистрировать свой Feed в сервисе Feedburner (тот самый гугловский сервис). Я просто добавил свой /rss/google-news.xml туда и получил feed в виде https://feeds.feedburner.com/mydomain. Говорят раньше было нужно: 

В настройках фида необходимо открыть вкладку «Публикуй» и активировать в ней функцию PingShot для уведомления интернет-служб о публикации нового контента.

Как теперь убедиться в том, что протокол PubSubHubbub будет использован? Переходим во вкладку «Оптимизируй», заходим в раздел XML Source и там мы сможем теперь увидеть атрибут: rel=”hub” href=”http://pubsubhubbub.appspot.com”.

В настоящем 2024 году меня берут сомнения в том, что этот способ поможет достичь выше указанной пользы моему сайту, потому что все что я вижу как владелец Feed-а, это импорт оттуда списка email-адресов подписчиков.

Серьезное подключение Feed-а

Для начала нам понадобится создать фид (забегая на перед, я использовал свой /rss/google-news.xml потому что оказалось он тоже совместим).

Создание Feed-а

1. Можно по примеру https://hubexample.blogspot.com/feeds/posts/default создаем например такой ХМЛ-документ:

<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="/api/redirect?key=046aeb1e4d0f605e1d317a34d239cc7f3eb558c1&to=http%3A%2F%2Fwww.blogger.com%2Fstyles%2Fatom.css" type="text/css"?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'
      xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss'
      xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'>
    <id>tag:blogger.com,1999:blog-5159749883668894085</id>
    <updated>2024-09-14T01:29:24.690-07:00</updated>
    <title type='text'>pubsubhubbub example</title>
    <subtitle type='html'></subtitle>
    <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml'
          href='/api/redirect?key=eb2d65cb30bcd804313f1b473d50bd9266a03899&to=https%3A%2F%2Fhubexample.blogspot.com%2Ffeeds%2Fposts%2Fdefault'/>
    <link rel='self' type='application/atom+xml'
          href='/api/redirect?key=68065a912176f08be7f551d77e8c69c5cb63e52d&to=https%3A%2F%2Fwww.blogger.com%2Ffeeds%2F5159749883668894085%2Fposts%2Fdefault'/>
    <link rel='alternate' type='text/html' href='/api/redirect?key=61cf7d70227f3f0bf3a29bb4e7c2686866e9a84c&to=https%3A%2F%2Fhubexample.blogspot.com%2F'/>
    <link rel='hub' href='/api/redirect?key=43792f6232889bedf4cfbeeac229cf2ad83ed6da&to=http%3A%2F%2Fpubsubhubbub.appspot.com%2F'/>
    <author>
        <name>Търсене в интернет</name>
        <uri>http://www.blogger.com/profile/07222249953165901040</uri>
        <email>noreply@blogger.com</email>
        <gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16'
                  src='https://img1.blogblog.com/img/b16-rounded.gif'/>
    </author>
    <generator version='7.00' uri='http://www.blogger.com'>Blogger</generator>
    <openSearch:totalResults>12</openSearch:totalResults>
    <openSearch:startIndex>1</openSearch:startIndex>
    <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
    <entry>
        <id>tag:blogger.com,1999:blog-5159749883668894085.post-5914975582624240066</id>
        <published>2010-10-22T10:06:00.001-07:00</published>
        <updated>2010-10-22T10:06:31.405-07:00</updated>
        <title type='text'>dasdddddddddd</title>
        <content type='html'>asdasdadasdsdddsadas</content>
        <link rel='replies' type='application/atom+xml'
              href='/api/redirect?key=81eeb6c9c073c4abbdc0829ff4a9989893d20b6c&to=https%3A%2F%2Fhubexample.blogspot.com%2Ffeeds%2F5914975582624240066%2Fcomments%2Fdefault'
              title='Коментари за публикацията'/>
        <link rel='replies' type='text/html'
              href='/api/redirect?key=960e0a30c63865f054adf397008c975fa5fe8add&to=https%3A%2F%2Fhubexample.blogspot.com%2F2010%2F10%2Fdasdddddddddd.html%23comment-form' title='0 коментара'/>
        <link rel='edit' type='application/atom+xml'
              href='/api/redirect?key=6d29d42c39ca53b80ee8ddd4dde70ac6fa841e05&to=https%3A%2F%2Fwww.blogger.com%2Ffeeds%2F5159749883668894085%2Fposts%2Fdefault%2F5914975582624240066'/>
        <link rel='self' type='application/atom+xml'
              href='/api/redirect?key=6d29d42c39ca53b80ee8ddd4dde70ac6fa841e05&to=https%3A%2F%2Fwww.blogger.com%2Ffeeds%2F5159749883668894085%2Fposts%2Fdefault%2F5914975582624240066'/>
        <link rel='alternate' type='text/html' href='/api/redirect?key=f00d2803a78cb8e205eb8f3b9c85b4245d4963ed&to=https%3A%2F%2Fhubexample.blogspot.com%2F2010%2F10%2Fdasdddddddddd.html'
              title='dasdddddddddd'/>
        <author>
            <name>Търсене в интернет</name>
            <uri>http://www.blogger.com/profile/07222249953165901040</uri>
            <email>noreply@blogger.com</email>
            <gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16'
                      src='https://img1.blogblog.com/img/b16-rounded.gif'/>
        </author>
        <thr:total>0</thr:total>
    </entry>
    <entry>
        <id>tag:blogger.com,1999:blog-5159749883668894085.post-8298611053768592125</id>
        <published>2010-10-22T10:02:00.000-07:00</published>
        <updated>2010-10-22T10:03:24.392-07:00</updated>
        <title type='text'>fdsfsd</title>
        <content type='html'>fsdfsdfsd</content>
        <link rel='replies' type='application/atom+xml'
              href='/api/redirect?key=b8e717cd2f380f656a28966d424b0f2125572153&to=https%3A%2F%2Fhubexample.blogspot.com%2Ffeeds%2F8298611053768592125%2Fcomments%2Fdefault'
              title='Коментари за публикацията'/>
        <link rel='replies' type='text/html' href='/api/redirect?key=d4d7429efd8ad21a6013de39186b1cedd5353f4f&to=https%3A%2F%2Fhubexample.blogspot.com%2F2010%2F10%2Ffdsfsd.html%23comment-form'
              title='0 коментара'/>
        <link rel='edit' type='application/atom+xml'
              href='/api/redirect?key=c6bd1cca38a3861367b34ba4b73aa9324acd677e&to=https%3A%2F%2Fwww.blogger.com%2Ffeeds%2F5159749883668894085%2Fposts%2Fdefault%2F8298611053768592125'/>
        <link rel='self' type='application/atom+xml'
              href='/api/redirect?key=c6bd1cca38a3861367b34ba4b73aa9324acd677e&to=https%3A%2F%2Fwww.blogger.com%2Ffeeds%2F5159749883668894085%2Fposts%2Fdefault%2F8298611053768592125'/>
        <link rel='alternate' type='text/html' href='/api/redirect?key=06e5e0b916b3de939a4e39a94dc96f8e6b443819&to=https%3A%2F%2Fhubexample.blogspot.com%2F2010%2F10%2Ffdsfsd.html'
              title='fdsfsd'/>
        <author>
            <name>Търсене в интернет</name>
            <uri>http://www.blogger.com/profile/07222249953165901040</uri>
            <email>noreply@blogger.com</email>
            <gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16'
                      src='https://img1.blogblog.com/img/b16-rounded.gif'/>
        </author>
        <thr:total>0</thr:total>
    </entry>
</feed>

2. Можно по примеру https://notiz.blog/feed/

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/api/redirect?key=e500daf861c8f8d888bfdffad5f427b4e2514d78&to=https%3A%2F%2Fnotiz.blog%2Fwp-content%2Fplugins%2Fpretty-feeds%2Fpretty-feed-v4.xsl" type="text/xsl" media="screen" ?>


<!--

	Feeds whisper secrets,
	In the RSS Club's embrace,
	Knowledge blooms in grace.

-->

<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
     xmlns:source="http://source.scripting.com/"
     xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

    <channel>
        <title>notizBlog</title>
        <atom:link href="/api/redirect?key=7b9c432627ff74863972de022ed310145891ac95&to=https%3A%2F%2Fnotiz.blog%2Ffeed%2F" rel="self" type="application/rss+xml"/>
        <link>https://notiz.blog</link>
        <description>a weblog mainly about the open, portable, interoperable, small, social, synaptic, semantic,
            structured, distributed, (re-)decentralized, independent, microformatted and federated social web
        </description>
        <lastBuildDate>Sun, 15 Sep 2024 12:43:24 +0000</lastBuildDate>
        <language>de-DE</language>
        <sy:updatePeriod>
            hourly
        </sy:updatePeriod>
        <sy:updateFrequency>
            1
        </sy:updateFrequency>
        <generator>https://wordpress.org/?v=6.6.2</generator>

        <image>
            <url>https://notiz.blog/wp-content/uploads/2019/10/cropped-notizblog-icon-1-32x32.png</url>
            <title>notizBlog</title>
            <link>https://notiz.blog</link>
            <width>32</width>
            <height>32</height>
        </image>
        <source:blogroll>https://reader.pfefferle.org/i/?a=opml&amp;get=c_2</source:blogroll>
        <creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
        <atom:link rel="hub" href="/api/redirect?key=d681fe04bd23422cdd16f361e22742540bd64873&to=https%3A%2F%2Fpubsubhubbub.appspot.com"/>
        <atom:link rel="hub" href="/api/redirect?key=5249b3694183a4bfc32a68c53ae400716628fd34&to=https%3A%2F%2Fpubsubhubbub.superfeedr.com"/>
        <atom:link rel="hub" href="/api/redirect?key=cd4923e62010c145b7df5ae66d80518fcaa430cd&to=https%3A%2F%2Fswitchboard.p3k.io%2F"/>
        <atom:link rel="search" type="application/opensearchdescription+xml" title="Search notizBlog"
                   href="/api/redirect?key=0f6d22e5cc9c2ff3cd9e283917eeb4d116db7a9d&to=https%3A%2F%2Fnotiz.blog%2Fwp-api%2Fopensearch%2F1.1%2Fdocument"/>
        <item>
            <title>Ab 18</title>
            <link>https://notiz.blog/2023/12/07/ab-18/</link>
            <comments>https://notiz.blog/2023/12/07/ab-18/#comments</comments>

            <dc:creator><![CDATA[Matthias Pfefferle]]></dc:creator>
            <pubDate>Thu, 07 Dec 2023 11:59:42 +0000</pubDate>
            <category><![CDATA[Journal]]></category>
            <category><![CDATA[Geburtstag]]></category>
            <category><![CDATA[notiz.blog]]></category>
            <category><![CDATA[notizblog]]></category>
            <guid isPermaLink="false">https://notiz.blog/?p=24732</guid>

            <description><![CDATA[Das notiz.blog ist volljährig 🎉]]></description>
            <content:encoded><![CDATA[
<p>Das notiz.blog ist <a href="/api/redirect?key=84528c8558e7f30e696e5256536c8aa5559deb4c&to=https%3A%2F%2Fnotiz.blog%2F2005%2F12%2F07%2Fmein-erster-eintrag%2F" data-type="link" data-id="https://notiz.blog/2005/12/07/mein-erster-eintrag/">volljährig</a> 🎉</p>
<p>RSS readers like you are the secret sauce of the internet. Keep rocking and staying informed!</p>]]></content:encoded>

            <wfw:commentRss>https://notiz.blog/2023/12/07/ab-18/feed/</wfw:commentRss>
            <slash:comments>6</slash:comments>


        </item>
        <item>
            <title>sidebar</title>
            <link>https://notiz.blog/2023/12/04/sidebar/</link>
            <comments>https://notiz.blog/2023/12/04/sidebar/#comments</comments>

            <dc:creator><![CDATA[Matthias Pfefferle]]></dc:creator>
            <pubDate>Mon, 04 Dec 2023 15:52:09 +0000</pubDate>
            <category><![CDATA[Open Web]]></category>
            <category><![CDATA[WordPress]]></category>
            <category><![CDATA[sidebars]]></category>
            <category><![CDATA[theme]]></category>
            <category><![CDATA[thinkingoutloud]]></category>
            <category><![CDATA[Web2.0]]></category>
            <guid isPermaLink="false">https://notiz.blog/?p=24386</guid>

            <description>
                <![CDATA[Vor einigen Wochen habe ich Ian Steward auf einem Automattic Meetup kennengelernt. Er kam auf mich zu, um mir zu erzählen, dass er kürzlich auf einen ziemlich alten Artikel von mir gestoßen ist. In diesem Artikel geht es darum, wie man die Reihenfolge der Sidebars im K2-WordPress-Theme ändert. Ich habe K2 sehr lange auf notiz.Blog [&#8230;]]]></description>
            <content:encoded><![CDATA[
<p>Thanks for reading this post via RSS. RSS is great, and you’re great for using it. ♥️</p>]]></content:encoded>

            <wfw:commentRss>https://notiz.blog/2023/12/04/sidebar/feed/</wfw:commentRss>
            <slash:comments>11</slash:comments>


        </item>
    </channel>
</rss>

3. Возможно будет достаточно самого простого варианта https://www.w3schools.in/php/php-rss-feed 

<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
<channel> 

<title>Title of Webpage</title>
<link>Webpage URL</link>
<description>About Webpage</description>
<language>en-us</language>

<item>
  <title>Article Title</title>
  <link>Article URL</link>
  <description>Article Content</description>
</item>

</channel>
</rss>

и так далее: 1 - 2

Выбираем хаб в который будем отправлять наш Feed

Хабов много (см. выше) и можно даже поднять свой собственный (даже написанный на php) + нам советуют прописать все хабы (в которые мы будем отправлять наш Feed следующее:

1. Например добавим 2 хаба в заголовки нашего Feed-а:
For HTTP resources, PubSubHubbub uses discovery in the HTTP Headers. Include the following HTTP Header as defined in RFC5988 with each resource.

Link: <https://your-hub-name.superfeedr.com/>; rel="hub"
Link: <http://your.resource.url>; rel="self"

2. Например добавим 2 хаба в тело Feed-а:
For RSS feeds, you need to add the links in the channel section of your feed.

<?xml version="1.0"?>
<rss>
 <channel>
  <title>...</title>
  <description>...</description>
  <link>...</link>

  <!-- PubSubHubbub Discovery -->
  <link rel="hub"  href="/api/redirect?key=ede063a2cfbf771bd2b4170b0f0a60484b4a3686&to=https%3A%2F%2Fyour-hub-name.superfeedr.com%2F" xmlns="http://www.w3.org/2005/Atom" />
  <link rel="self" href="/api/redirect?key=630c1444c3f2fa4292b73d4e778a2ee1c3b33323&to=http%3A%2F%2Fyour.feed.url" xmlns="http://www.w3.org/2005/Atom" />
  <!-- End Of PubSubHubbub Discovery -->
  ...
 </channel>
</rss>

For Atom RSS feeds, you need to add the links in the feed section of your feed.

<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom">
 <title>...</title>
 <link href="/api/redirect?key=630c1444c3f2fa4292b73d4e778a2ee1c3b33323&to=http%3A%2F%2Fyour.feed.url" rel="self" type="application/atom+xml"/>

 <!-- PubSubHubbub Discovery -->
 <link rel="hub" href="/api/redirect?key=bd649cbefe96d28d1c6bcec069ef86a2600b11b6&to=https%3A%2F%2F%3Cyour-hub-name%3E.superfeedr.com%2F" />
 <!-- End Of PubSubHubbub Discovery -->

 <updated>...</updated>
 <id>...</id>
 ...
</feed>

Публикуем наш Feed

И так, Feed мы создали, Hub выбрали, пора отправить наш Feed в Hub. Для примера я выбрал Google-хаб https://pubsubhubbub.appspot.com/ и согласно его инструкции делаю запрос:

curl -i \
    -d "hub.mode=publish&hub.url=https://mydomain.ru/rss/google-news.xml" \
    -X POST \
    https://pubsubhubbub.appspot.com
    
HTTP/2 204 
cache-control: no-cache
content-type: text/plain; charset=utf-8
x-cloud-trace-context: 8e67a9c22eb8a967f7d87b4100891ba2
date: Fri, 18 Oct 2024 15:57:59 GMT
server: Google Frontend
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

Отлично, мы опубликовали наш Feed в Hub-е, и через секунду по nginx-логам видим, что по адресу https://yapro.ru/rss/google-news.xml к нам зашел бот FeedFetcher-Google; (+http://www.google.com/feedfetcher.html) о котором можно почитать здесь.

Сейчас нам важно понять, а что теперь о наших страницах знает Hub. Для этого переходим на страницу https://pubsubhubbub.appspot.com/publish и в поле Publisher Diagnostics вводим адрес нашего Feed-а (я ввел адрес google-news.xml) и увидел, что Hub знает все новости вплоть до последней новости размещенной на моем сайте:

Пингуем Hub

Я провел эксперемент, разместил еще одну новость на сайте, но более ничего не отправлял в Hub, затем как и на предыдущем шаге воспользовался полем Publisher Diagnostics и Hub сказал, что на сайте нет новых новостей. Я подождал еще сутки, снова воспользовался полем Publisher Diagnostics и Hub снова сказал, что на сайте нет новых новостей. Это говорит нам о том, что чтобы бы Hub узнал об обновлениях на сайте, нужно отправить туда эти обновления - такая отправка называется публикация (в простонародье Ping).

Пинговать HUB (концентратор) нужно всякий раз, когда вы обновляете контент своего сайта. Это позволит HUB-у извлечь обновления, а затем отправить обновление подписчикам.

Для этого нужно отправить POST запрос со следующими ключами и значениями:

  • hub.mode="publish"
  • hub.url=<the URL of the resource that was updated>

Вы можете отправить несколько URL-адресов за один пинг, используя синтаксис массива, например hub.url[]=<url1>, and hub.url[]=<url2>, или отправив список URL-адресов в кодировке URL, разделенных запятыми, например, так hub.url=<url1>,<url2>.

В качестве меры фильтрации спама сервер всегда будет возвращаться, 204.

Таким образом ничего нового в этом абзаце нет, ведь запрос пинга ничем не отличается от запроса первой публикации.

На этом пожалуй все и как обычно возможно полезные ссылки:

  1. подписчик на php
  2. лучшее объяснение процесса подписки
  3. curl-запросы объясняющие подписку
  4. короткое объяснение на curl-запросах и даже немного про неофициальный способ публикации Топиков (новостных тем)
  5. самое достойное пояснение про процесс публикации
  6. и др: 1 - 2 - 3 - 4

Просто для понимания

Причина, по которой при заходе на appspot.com мы попадаем на console.cloud.google.com является то, что сайт appspot.com и сервис pubsubhubbub.appspot.com размещаются в облачном App Engine созданным Google. 


11.09.2021 07:08

Комментарии

Комментариев пока нет.


Copyrights © 2007 - 2026 YaPro.Ru