0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perl 6Advent Calendar 2017

Day 23

Wikipediaの最新の更新情報を取得する

Last updated at Posted at 2017-12-23

こんにちは、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でのパースが結構な頻度で失敗してしまうようです

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?