PubSubHubbub — это бесплатный, открытый и децентрализованный протокол. Он использует веб-перехватчики для передачи обновлений фида в режиме реального времени от издателей к подписчикам (читателям фида).
Open hubs are provided by:
- Superfeedr (pubsubhubbub.superfeedr.com)
- Google (pubsubhubbub.appspot.com)
- Aaron Parecki: p3k
- Christian Weiske: phubb
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:
- How to PubSubHubbub by Superfeedr
- How to publish and consume PubSubHubbub on indiewebcamp.com
После того, как PubSubHubbub переименовали в WebSub, был написано хороший документ описывающий эту технологию.
Зарегистрировать свой 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-адресов подписчиков.
Для начала нам понадобится создать фид (забегая на перед, я использовал свой /rss/google-news.xml потому что оказалось он тоже совместим).
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&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 […]]]></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>Хабов много (см. выше) и можно даже поднять свой собственный (даже написанный на 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 мы создали, 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, затем как и на предыдущем шаге воспользовался полем 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.
Таким образом ничего нового в этом абзаце нет, ведь запрос пинга ничем не отличается от запроса первой публикации.
На этом пожалуй все и как обычно возможно полезные ссылки:
Причина, по которой при заходе на appspot.com мы попадаем на console.cloud.google.com является то, что сайт appspot.com и сервис pubsubhubbub.appspot.com размещаются в облачном App Engine созданным Google.
Комментарии
Комментариев пока нет.