返回
Featured image of post XDU Planet 感想

XDU Planet 感想

搞完 XDU Planet 的一些想法

这个项目的由来

事情从我看同学博客说起。我感觉把我同学的博客都聚合到一起看,看起来更方便,而且还能满足我一直想当“干新闻的”想法。毕竟,我在校内开过一段时间电台,天天报新闻()

我的想法是,按照时间更新 RSS 数据,然后对其进行解码渲染。客户端先选择对象,然后选择文章,就可以看了。我的想法可以说是服务器版本的 RSS 阅读器,只不过 RSS 列表是我写好的同学博客。这个和看报纸十分相似:作者给报社供稿,报社展示。所以我说有点像“搞新闻的”。

第一次尝试

大约是去年,有个人写了个 go 语言实现的 xduplanet,他的想法是运行一个服务器程序,内部订好抓取 RSS 源的顺序,然后渲染显示。我当下来代码发现,虽然他能做到我上面的想法,但是开发阶段比较原始,他只有一个 json 文件写入所有人的 RSS 链接。而且页面是一个文章列表,而不是先选人再选文章。当时我时间较紧,能力也没那么强,我就作罢。

第二次尝试

在做 Web 工程大作业的时候,我们组不知为啥,搞的是从网上获取数据,然后用 RSS 输出数据的软件。他是一个管道过滤器结构,RSS 输出只是一个最终的端口。这也是我的一大意向程序,然而我并没帮忙开发多少,只是验收的时候我去演示了而已:-P

这个软件实际上十分接近我的需求了,我可以按照列表,推送当天同学博客有啥更新。但是那次演示完了,我感觉我是不想用了……

这次尝试

前几天有个玩老电脑的推荐我 68k.news 和小可怜网的代码。虽然一开始我只是抱着看看能不能用,在服务器上运行了一下,但是我看这网站,感觉我的 XDU Planet 想法终于可以实现了,而且这回基本算是做熟了,摆在了我的桌子上。但是你吃饭还得把菜放在嘴里…..

代码修改

修改了两个方面:Atom 源的支持和 API

Atom 源头

这个项目,由于本身是为了不支持 js 的老电脑显示当前新闻,他使用了 php-cgi 。不过没关心,我看代码十分简单,我就直接上了。我先简单地安排了我同学的博客,然后发现很多人的博客都显示不完全。

我去查看了这个项目使用的 php rss 库下面两个示例文件,和本项目进行比较。我发现本项目只支持 RSS 源头,而且 RSS 只支持查看 description 的东西。诚然对于显示新闻的 RSS 源来说,是够用了,但是我同学博客使用了不同的框架,这些框架输出源的格式对于这个程序,算超刚了:-P

  • 一类是输出了 Atom 类型的源,这个打开头就和 RSS 不一样,程序最后报错。
  • 一类是 RSS 源,但是内容都在 content:encoded 里面,这就是显示不完整。

我是一个基本没接触过 PHP 的人,但是代码比较好理解,我发动 CV 大法,把示例文件里面的解码文件抄了过来。然后就可以显示了……乱码。

没错,可能是为了兼容老电脑,这个东西使用国标码编码中文。我还得套一层中文编码器,这个我倒感觉能理解。毕竟这个网站本身是针对 Windows 98 级别的老爷机了。

以上修改都是针对 channel.php 文件,也就是输出 RSS 文章列表和文章内容的代码。这个项目有很多诸如 channel_ppc.php 等文件,我故意没动,让他们管理我新闻东西的输出,看着新闻这点阵字体,真的很怀旧。

API

上面的修改过程也是对本项目架构和功能的一个了解。在此之后,我魔改生成 Json 响应代码也就顺水成舟了。

这就又要扯到 Traintime PDA 了,这是我大半年以来一直在写的信息查看器。我一直想给这玩意扩充点好玩的功能。最一开始我把很久以前给别人录的饭堂和综合楼数据,在我的程序上进行渲染。但是我总想给这玩意扩充点类似“社交”的功能。正好 XDU Planet 可以在一定程度上满足这个需求,这个可以给大家展示我们同学公开的实用东西,而且这个东西也不需要获取啥机密讯息:他们的博客都是在互联网上公开的,而且终端只需要单方面获取就行了,这是一个单向的信息传递。我的代码也都是开放的,十分符合我开源的执念233

前面我提到了 channel.php 的用途,而这个代码的前半部分基本不需要修改,我只需要把下面的 PHP-HTML 混合代码修改成纯脚本输出就行了。PHP 本身支持设置返回头啥的,我只需要把返回头设置成 application/json,然后使用 exit 函数返回我的数据就行了。这就是初步的修改。

显然这么简单一改是无法完全我的需求的,API 面向的客户端可不是老年机。为了最后的 Eye candy,我对最核心的数据结构进行了修改。你们可以查看我的 xdurepo.php 文件,我把这个人的图标,名称,地址都传了过去。而最终为了输出 json 更好被客户端解码,我在每个返回值外面都套上了 stdClass。

基本上 API 就算这样了,我这里写出来。

GET /xduplanet.php

{
  "repos": {
    "benderblog": {         // key: 该对象名称,后面查询使用
      "name": "SuperBart/Benderblog ~ 开发者",     // 显示名称
      "website": "https://www.superbart.top",     // 博客网站
      "feed": "https://www.superbart.top/index.xml",    // RSS 或 ATOM 源头
      "favicon": "https://legacy.superbart.top/favicon.ico" // 图标
    },
  }
}
GET /xduplanet.php?feed=key
其中 key 是上述提到的后面查询使用的 key

{
  // 文章列表,下面分别对应标题,发布时间和来源链接
  "list": [
    {
      "title": "Flutter 介绍",
      "time": "2023-04-29T08:00:00+08:00",
      "url": "https://www.superbart.top/p/flutter-introduction.html"
    },
  ],
  // lastUpdateDate:本数据的获取时间,为将来备
  "lastUpdateTime": 1689432413
}
GET /xduplanet.php?feed=key&p=0
其中 key 是上述提到的后面查询使用的 key,p 指上面文章列表中第几个文章

// 文章标题,来源链接,发布时间,内容
// 注意内容是和前面所述老网站网页输出是一样的,也就是图片,视频等会被隐藏掉
{
  "title": "Flutter 介绍",
  "link": "https://www.superbart.top/p/flutter-introduction.html",
  "time": 1682726400,
  "content": "Omit here."
}

我在 Traintime PDA 里面的相关分页也写了相关页面,还明白了 PageView 如何保存状态,每天一个编程小常识这就是?

后面的胡说阶段

我把这个服务挂在了我的服务器上,还上新了一些外网著名媒体。没敢上那些明显危险的,我感觉这些媒体都算是比较中立的吧:-P

顺便想说几句 PHP 开发,我写了一个文件,然后调试方式只能传到服务器,然后看 nginx 的 log。魔改体验比较痛苦:-P

对于新闻,作为一个看了十年中央十三台的人来说,我有点无法理解拿新闻看乐子的人的想法。虽然这个方式确实是给了我这个老木头一点亮光。比如说,前几天是故日本首相安倍晋三被刺杀一周年纪念日,我作为严肃看新闻的,去看现任首相岸田文雄去纪念,然后继续不顾周边国家骂街去放核污水。但是有人说“日本JK被摔倒一周年纪念日”,我总觉得有点无语,倒也觉得正常。

但我发现,有些时候真的有点太过了。比如说俄乌战争,本来我去网上只是去看战争状况,然后就是无论从那个角度,都是“俄罗斯粉丝”和“乌克兰粉丝”互相隔空输出,顺便拿乌克兰找乐啥的。我总觉得拿人被欺负开玩笑很不合适,虽然这件事本身很复杂,没有任何人是无辜的。虽然我早就接触过楼下老大爷天天建政,也算“身经百战”,但是我感觉,这可是一个了解世界,了解想法很重要的渠道,就这么当作乐子,真的有点不太合适。

我希望看到的是对一个事件有调查,有分析,有结论的东西,这样无论如何至少都能骂两句(不是)。而不是“今天澳大利亚又刮起了沙尘暴,养羊的少了几只羊,估计是走失了”这样的短视频。