こんにちは、23日目の投稿になります。
皆さんはrecent change streamというWikipediaのAPIをご存知でしょうか。
具体的には下記の「最新の更新」ページの内容を取得するためのAPIです:
https://ja.wikipedia.org/wiki/特別:最近の更新?hidebots=1&hidecategorization=1&hideWikibase=1&limit=50&days=7&urlversion=2
今回はこれをPerl 6で取得してみましょう
IO::Socket::Async::SSL
を使うととりあえず(※)は実現できます:
use IO::Socket::Async::SSL;
use JSON::Tiny;
my $conn = await IO::Socket::Async::SSL.connect('stream.wikimedia.org', 443);
$conn.print: "GET /v2/stream/recentchange HTTP/1.0\r\nHost: stream.wikimedia.org\r\n\r\n";
react {
whenever $conn {
if $_ ~~ /^^data\:\s(\{.+\})\r*\n/ {
try {
CATCH {
when X::JSON::Tiny::Invalid { $*ERR.say($_) } # (#1)
}
my $json = from-json(~$0);
say $json if $json<wiki> eq 'jawiki'; # (#2)
}
}
}
}
$conn.close;
- ポイント
- IO::Socket::Async::SSLのサンプルをベースに書いていきましょう
- JSON::Tinyが吐く例外はCATCHで捕らえてあげると良いです。ちなみに
$*ERR.say($_.perl)
に書き換えると、どんな入力でうまくいかなかったのかSTDERRに出力できるようになります。 (#1) -
wiki
がキーになっている要素を見ることで日本語版のWikiepdiaに絞ることができます (#2)
以上、23日目の投稿でした。
(特定のWikipedia編集者の名前を載せるのは個人的に好ましいと思わないので実行結果は掲載しません)
※ APIから適切にエスケープのなされていない生のテキストが吐かれてしまうせいか、JSON::Tinyでのパースが結構な頻度で失敗してしまうようです