将外部源条目转换为内容项
项目描述
Feedfeeder
Feedfeeder只需要做一些事情
读取一些ATOM源(不多)。
从 ATOM 订阅源中提取条目以创建 FeedFeederItems。任何包含封装文件的条目,封装文件将被下载并添加为文件项到订阅项中。
这意味着确定哪些是新的项目,这也意味着需要一个良好的 ID 生成机制。
等等,没有现有产品吗?
有大量针对 zope 和 plone 的 RSS/ATOM 阅读产品。它们似乎都不合适。只有一个产品实际上将条目存储在 zope 数据库中,但它是针对许多用户单独添加许多订阅的情况设计的,因此它需要一个独立的 ZEO 进程(旧版本)或独立的 mysql 数据库(新版本)。
所有其他产品都不在数据库中存储条目,都是旧的/未维护的等。
从某种意义上说,我们正在使用现有产品,就像我们使用 Mark Pilgrim 的优秀 feedparser(《http://feedparser.org》)一样,它将为我们实际读取 ATOM。
产品名称
该产品将 ATOM 订阅源的内容作为文档/文件内容类型馈送到 plone。因此,“feedfeeder”这个名字似乎是自嘲的。有趣是很重要的 :-)
产品结构
我使用 archgenxml 生成样板文件。有一个‘generate.sh’外壳脚本,它会为您调用 archgenxml。没有太多花哨的东西。
- feedfeeder 的内容类型有
folder.FeedfeederFolder
item.FeedFeederItem
它是如何工作的
feedfeeder 是一个文件夹,它包含所有之前添加的订阅条目作为文档或文件。它有一个“feeds”属性,包含要读取的订阅列表。
周期性地调用 feedparser(通过 cron 作业?)来解析订阅。订阅中项目的 UID 被转换为合适的文件名(条目原子 ID 的 md5十六进制散列),这样您就可以检测是否有新项目。
新项目被转换为订阅项。订阅数据填充到订阅项中(请参阅名为 objectInfo 的字段)。
订阅文件夹的预定更新
可以配置 Zope 定期触发 URL 调用。在 zope.conf 中,您可以使用 <clock-server> 指令定义计划和 URL,如下所示数据
<clock-server> method /path_to_feedfolder/update_feed_items period 3600 # seconds user admin password 123 host localhost:8080 </clock-server>
更新所有订阅一次
如果您的站点有多个订阅文件夹,并且您希望一次性更新它们,您可以这样做
<clock-server> method /yoursiteid/feed-mega-update period 3600 # seconds user admin password 123 host localhost:8080 </clock-server>
删除旧的订阅项
您可以周期性地删除特定天数之前的订阅项。例如,要每周删除 90 天前的订阅项,您可以这样做
<clock-server> method /yoursiteid/feed-mega-cleanup?days=90 period 604800 # seconds user admin password 123 host localhost:8080 </clock-server>
依赖关系
从版本 3 开始,我们需要 Plone 4.3 或 5.0。
Plone 5:在添加组件控制面板中,您还需要安装“Archetypes Content Types for Plone”。否则,如果您尝试添加 FeedfeederFolder,您将收到 404 未找到错误,因为找不到 createObject 脚本。
对于更早的 Plone 4 版本,请使用 2.x 版本。当前的最新版本是 2.8。
如果您使用 Plone 3,请使用来自 2.0 线的产品版本。当前的最新版本是 2.0.9。
升级说明
如果您在 Plone 4.0 或 4.1 中安装了 Products.feedfeeder 2.1.x,并且升级到 Plone 4.2 或更高版本,那么在新的样式集合中列出或排序 feedfeeder 项的功能将丢失。为了解决这个问题,您应该转到 Zope 管理接口中的 portal_setup,访问导入选项卡,选择“Feedfeeder 注册”配置文件并导入所有步骤。
测试
首先看这里的测试是位于‘doc/feedfeeder-integration.txt’的 doctest。
假设您有一个 buildout,测试最好使用一个合适的 bin/test 命令。
bin/test -s Products.feedfeeder
我们现在使用 Travis 进行测试。
feedfeeder 的历史
3.0.1 (2016-09-05)
错误修复:在检查条目是否已更新时,确实调用 getObjectInfo()。这样可以避免对 FeedFeederItems 进行不必要的更新。[tiberiuichim]
3.0.0 (2016-02-22)
兼容 Plone 4.3 和 5.0。[maurits]
删除了仅用于与Plone 4.1及以下版本兼容的独立注册配置文件。将< span class="docutils literal"> registry.xml 移至默认配置文件。[maurits]
禁用了更新/清理视图上的CSRF保护。否则您必须在cron作业中的url中添加 ?_authenticator=user_specific_authentication_string。修复了https://github.com/collective/Products.feedfeeder/issues/13 的问题。[maurits]
使用< span class="docutils literal"> main_template/macros/master,而不是奇怪的老式< span class="docutils literal"> @@standard-macros/view,后者在Plone 5上只会显示核心内容。[maurits]
2.8 (2015-05-16)
防止日志消息中的UnicodeEncodeError。[ulisdd]
2.7 (2014-12-26)
更新西班牙语翻译。[Manuel Gualda Caballero]
2.6 (2014-11-27)
添加选项,使用竖线< span class="docutils literal"> | 作为分隔符作为前缀来标记订阅链接标题(例如 我的地点: |http://myplace/feed)[jbofill]
2.5 (2014-01-18)
在设置描述时重新索引订阅项目。[jbofill]
解决某些DateTime对象中的 KeyError u’+0000’。与https://github.com/collective/Products.feedfeeder/issues/7相关。[jbofill]
更新到beautifulsoup4并使用Python内置的HTML解析器。[jbofill]
2.4 (2013-11-12)
依赖feedparser而不是FeedParser。问题#6。[maurits]
2.3 (2013-11-11)
将附件的最大大小设置为10 MB。这避免了下载数十亿个iso文件等。[jbofill]
2.2 (2013-10-01)
如果找不到guid和链接,则使用标题作为项目的uid的基础。它们在rss中是可选的。[maurits]
更新权限。使用“feedfeeder: Update feed”权限保护更新订阅。使用“feedfeeder: Update all feeds”权限保护更新所有订阅中的mega更新。我们在升级步骤中将这些权限授予Manager和Site Administrator角色。修复了https://github.com/collective/Products.feedfeeder/issues/4的问题。[maurits]
2.1 (2012-12-27)
使用区域设置而不是i18n目录。[maurits]
在新的样式集合中支持我们的标准。为此添加新配置文件。确保在Plone 4.0或4.1中不会失败,因为那里根本不需要这个。[maurits]
在创建后更新订阅文件夹的i18n未翻译的字符串。在订阅文件夹模板中添加了div#content。修复了测试。进行了大量清理(在content/folder.py和content/item.py中的旧内容类型定义)。移除了“更新订阅项目”操作的双倍。[cedricmessiant]
在新的页面中打开源。[thomasdesvenain]
使用png图标。使用icon_expr而不是content_icon。[thomasdesvenain]
仅支持Plone 4。[maurits]
2.0.9 (2012-11-12)
修复了更新订阅项目时可能出现的TypeError。修复了https://plone.org/products/feedfeeder/issues/42的问题。[maurits]
2.0.8 (2012-10-14)
迁移到https://github.com/collective/Products.feedfeeder。[maurits]
2.0.7 (2011-12-27)
避免当条目有两个具有相同href的附件时的BadRequest错误;我们忽略所有后续的。[maurits]
尝试避免一些订阅可能出现的ExpatError。修复了http://plone.org/products/feedfeeder/issues/40的问题。[maurits]
清理了我们的类型信息,从Plone 2.5中删除了一些无用信息。为此添加了升级步骤。[maurits]
在获取条目的UID时防止UnicodeDecode错误。[vangheem]
2.0.6 (2011-10-03)
防止链接(附件)没有类型。[maurits]
2.0.5 (2011-09-03)
在Plone 4上使用feed-item.pt,填充content-core槽,在Plone 3上使用feed-item3.pt,填充body槽,如前所述。修复了http://plone.org/products/feedfeeder/issues/36的问题。[maurits]
注册我们自己的文档作者视图小工具,用于显示feed项的作者作为创建者。参考 http://plone.org/products/feedfeeder/issues/36 [Maurits]
修复了更新feed项时可能出现的UnicodeDecodeError。参考 http://plone.org/products/feedfeeder/issues/37 [maurits]
修复了与Plone 4.1的兼容性 [iElectric]
2.0.4 (2011-03-24)
当可用的时,通过首选hashlib而不是md5来避免python2.6的DeprecationWarning。 [maurits]
当没有变化时,不要重新索引feed项。只有当有变化时才更新objectInfo字段。修复 http://plone.org/products/feedfeeder/issues/34 [maurits]
2.0.3 (2011-01-17)
尊重Plone的“关于”信息设置:只有当用户登录或允许匿名用户查看关于信息时,才显示文档作者。 [markvl]
2.0.2 (2010-12-17)
修改了导入RSS,并在feed项上添加了一个名为objectInfo的新字段。所有feed数据都将存储在此字段上,作为一个python字典。只需更改远程RSS模板,就可以在不修改feed项模式的情况下缓存额外的信息。[dmoro]
在feed文件夹中添加了一个选项,允许您选择自动重定向到远程资源。如果您有修改feed项的权限,则不会有任何重定向 [dmoro]
添加了新的测试 [sithmel]
2.0.1 (2010-11-26)
添加了@@feed-mega-update视图,您可以一次更新所有feed文件夹,例如在时钟服务器中。[miohtoma]
从标准python HTMLParser导入HTMLParseError,而不是BeautifulSoup。这使得feedfeeder再次与BeautifulSoup 3.0.x兼容。[maurits]
2.0 (2010-07-05)
解决了一些Plone 4兼容性问题。[sureshvv]
忽略没有id或链接的无法识别的条目,而不是抛出AttributeError。修复 http://plone.org/products/feedfeeder/issues/26 [maurits]
1.0.1 (2010-04-02)
修复了在Plone 4中查看文件夹或项时的错误,同时仍保持与Plone 2.5和Plone 3的兼容性。参考 http://plone.org/products/feedfeeder/issues/25 [maurits]
1.0 (2009-12-23)
一些摘要是从完整内容中摘取的片段,然后它们可以包含损坏的HTML;在这种情况下,我们现在只保存原始损坏的HTML,只有在可能的情况下才解析它。[lucmult]
1.0rc7 (2009-11-06)
改进了翻译功能。[lucmult]
现在使用BeautifulSoup来转换摘要中的xml/html实体,而不是旧的方法。旧的方法会与一些非ASCII字符冲突。[lucmult]
在更新feed项的文本时,如果它是一个支持的类型,则同时存储mimetype。参考 http://plone.org/products/feedfeeder/issues/24 [maurits]
1.0rc6 (2009-09-21)
错误修复:在构建描述时,花括号引号被损坏。修复 http://plone.org/products/feedfeeder/issues/7 (合并分支maurits-cleaner-entityrefs-in-description。)[maurits]
1.0rc5 (2009-07-02)
不要将我们的皮肤层添加到Plone默认和Plone Tableless,而只是添加到所有(*)。[maurits]
1.0rc4 (2009-06-18)
当项目的更新日期和发布日期均未知时,取今天作为首次添加时的日期。在更新时,不要更改原始项目。修复 http://plone.org/products/feedfeeder/issues/21 [maurits]
读取feed项的标签/分类/关键词,并将它们存储在创建的内容项上。没有Archetypes字段,只是一个简单的getter和setter,称为feed_tags。想法:Robin Harms Oredsson。[maurits]
在DateTime SyntaxError中抛出一些非常常见的美国夏令时区,例如EDT。我们现在包装DateTime解析feed,尝试在礼貌地放弃之前识别这些区域,使用maurits的修复。[russf]
在解析条目的更新和发布日期时捕获 DateTime.SyntaxError,然后继续处理下一个条目。修复了 http://plone.org/products/feedfeeder/issues/18 [maurits]
在应用我们的 GenericSetup 配置文件时避免吞咽过多的异常。修复了 http://plone.org/products/feedfeeder/issues/19 [maurits]
1.0rc3 (2008-10-04)
将配置文件定义从 python 移至 GenericSetup。配置文件现在不是“profile-feedfeeder:default”,而是“profile-Products.feedfeeder:default”。[maurits]
在 Extensions/ 目录中:移除了 Install.py 并将 AppInstall.py 重命名为 install.py。[maurits]
使收藏夹/智能文件夹可用 feed 条目的更新日期。[maurits]
Extensions/AppInstall.py:首先尝试以 Plone 3 方式安装我们的配置文件,如果失败则尝试 Plone 2.5 方式。[maurits]
移除了自带的 feedparser.py。而是在 setup.py 中添加了对 FeedParser 的 install_requires 依赖。[maurits]
将“feed:”开头的 feed 修复从 feedparser.py 移至 utilities.py,以便再次使用未更改的 feedparser.py。[maurits]
1.0 rc 2 (2008-07-23)
rc1 的重新发布:rc1 缺少了所有 .txt 文件,导致无法安装,因为 setup.py 读取 version.txt。[reinout]
1.0 rc 1 (2008-07-15)
接受没有标题的条目,这在 rss 中是允许的。请参阅 http://cyber.law.harvard.edu/rss/rss.html#hrelementsOfLtitemgt [maurits]
1.0 beta 4 (2008-05-20)
蛋化:现在您可以将其作为 Products.feedfeeder 蛋进行安装。[maurits]
1.0 beta 3 (2008-05-13)
在测试中使用 plone_workflow 显式,以便更容易在 Plone 2.5 和 3.0 上进行测试。[maurits]
使 update_feed_items 在 Plone 3 的 object_buttons 中可用,使用新的 small @@is_feedcontainer 作为条件。[maurits]
避免事件和接口的弃用警告。[maurits]
移除页面模板中的分号,这导致在 Plone 3 中中断。[maurits]
修复导入,以便它们在 Plone 3 中也能正常工作,而不产生弃用警告。[derstappenit]
1.0 beta 2 (2008-01-02)
历史开始。