はじめに
Twitterは情報発信者の多さやUX、即時性の点で優れている点も多く、メインの情報収集ツールとして利用してきた。しかし、アプリ経由ではタイムライン情報が2~7日間程度しか見ることができず、以前からどうにかできないかと考えていた。
今回、Twitter APIの有料化が公表1されたことで、やろうと思っていたTwitterデータの自動収集はいったん諦めて、一部ではあるがRSSに移行することにした。
背景
Twitterのタイムラインには自分が興味があるにせよ、情報の重要性や情報鮮度がバラバラな情報が時系列に流れてくる(もちろん広告も)。とりあえず全部目を通しておきたいのだが、あっという間にタイムラインからはアクセスできなくなってしまう。(経験則だと、iOSアプリだと最長6日間程度、Androidアプリだと最短2日間~最長4日間程度)
特にメディア系は似たような情報(と、いうかほぼ同じ内容)が繰り返し流れてくるためにタイムラインからは外していたのだが、そうするとそれはそれで不便だった(例えば、リツイートが強制的に表示されてしまう、等)
具体的にはインプレス社の記事がそうで、かといってホームページをいちいち目でチェックするのも大変だし、まだRSSフィードが提供されていたのでそれを使用することにした。
RSSへの移行
第1段階:Twitterからブラウザ+アドオンへ
GoogleがRSSリーダーを終了した頃(2013年、もう10年前!)にRSSなんてとっくに終わってると思っていたのだが、調べてみるとまだ使えるソフトがあった。ざっくり書くと、サーバー系とクライアント系。
サーバー系はもちろんサーバーを立てるわけだが、サーバー用のソフトがいつまでサポートされるか分からないし、だいていデータベースを使用している。データーベースを使ってまでゴリゴリやるつもりはない2ので、サーバー系は選択肢から外した。
クライアント系もあまり選択肢はなかったが、Firefoxを普段使用しているので拡張機能のFeedbro
アドオンを選択した。これはこれで非常にいいツールなのだが、クライアント系なので常時パソコンを起動しておかなければいけない(RSSフィードは基本的に新着のみなので一定時間経つとRSSフィード経由では情報がとれなくなる)。また、未読が増えてくるとPCのメモリを食うし、UI(UXではない)もメールのような感じでTwitterのようにざーっと見て情報の取捨選択が難しい。
第2段階:自宅サーバーで自動収集 + HTMLファイル出力(今回)
現在自宅サーバーとしてNanoPi NEO2
(SBC=Single Board Computer、ラズパイのようなもの)が稼働しているので、RSSを定期的に読み込んでWebページにリダイレクトするHTMLファイルを作成するプログラムを作成した。
import feedparser
import datetime
from jinja2 import Template
import re
import os
rsss = [
[ 'Internet Watch', 'https://internet.watch.impress.co.jp/data/rss/1.0/iw/feed.rdf' ],
[ 'Impress Watch', 'https://www.watch.impress.co.jp/data/rss/1.0/ipw/feed.rdf' ] # 最終行カンマ不要
]
# 記事のURLにリダイレクトするHTMLファイルのテンプレート
html_template = '''
<!DOCTYPE html>
<html>
<head>
<title>{{ p_title }}</title>
<meta http-equiv="refresh" content="1;URL={{ p_url }}">
</head>
<body><br></body>
</html>
'''
template = Template(html_template)
for rss in rsss:
site = rss[0]
url = rss[1]
print(f'\r\n{site}[{url}]から取得\r\n')
feed = feedparser.parse(url)
for entry in reversed(feed.entries): # entryは新しい方が先なので逆順にする
udate = entry.updated # 記事の更新時間('%Y-%m-%dT%H:%M:%S%z'形式)
title = entry.title # 記事タイトル
link = entry.link # 記事URL
dt = datetime.datetime.strptime(udate, '%Y-%m-%dT%H:%M:%S%z')
m = re.match(r'.+/([0-9]+)\.html', link) # URLの最後は9999999.html
if m != None:
id = m.group(1) # URLの最後の9999999の部分をidとする
else:
id = '0000000'
print(f'{udate}, {title}')
# HTMLデータを作成
html_rendered = template.render({'p_title': title, 'p_url': link})
# ファイル名を'<id>.html'とする
fname = f'{id}.html'
with open(fname, 'w', encoding='utf_8', newline='') as file:
file.write(html_rendered)
os.utime(path=fname, times=(dt.timestamp(), dt.timestamp())) # ファイルの更新時間を記事にあわせる
※実際に動かしているプログラムはもう少し複雑だが、見やすいようにコアの部分だけ残した。
プログラムはcron
で定期的に実行し、作成されたhtmlファイル(ファイル名に記事タイトルが含まれている)をPCから開けばリダイレクトされて該当記事が見られるようにした。Firefox
を使用しているので記事はPocket
ですぐに保存もできる。
なお、自宅サーバーにHTMLファイルを蓄積していて、インターネットに対してポート開放は行っていないため自宅外から見ることはできない。(第1段階と変わらない)
終わりに
RSSは良く言えば枯れた技術で今後大きな発展は見込めないかもしれない。
今回はとにかく手間をかけたくなかったし、あくまで情報収集の効率化のためだったので簡易なプログラムではあるがこれで良しとした。
Twitterで情報発信をしている人がいる間は自分はTwitterも使い続けるだろうし、Twitterをなくして別の何かに完全移行できるとは自分は思っていない。必要に応じて必要なツールを使えばいいと思っている。
今回、RSS経由で取得できる情報は自動収集してサーバーに蓄積できるようにしたので、今後の展望としては自宅外で隙間時間に見れるようにするのが目標。
-
データベースを使う利点は理解できるのだが、データベースを使用しているとバックアップがそれなりに単純じゃなかったり、トラブルシューティングがひと手間増えるなど、とにかく管理コスト(手間)がかかる。一番の難点はソフトウェア側のアップデートに伴ってデータベースもバージョンアップする必要がある点。マルチユーザー環境やトランザクション(特にロールバック)が不要の場合はデータベースは不要だと思っている ↩