niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R)connpassのAPIを使って、過去自分が履修したセミナーの一覧をチェックする

書きなぐりメモ…

最近は時間があるので色々と受講しているのですが、タイミングがあって気になったものを気ままに受けていたので、どれを受けて受けてないのかが分からなくなってしまったので、じゃあRで確認するか…というのがモチベーションです。

ということで、RでconnpassのAPIを叩いて結果を見てみるというだけです。APIを叩くと言っても適当なアドレスにアクセスすればよいので難しいことは何もない。CGIの時代を思い出すわね…。

connpassのAPIについてはこちらを見てください。robots.txtも守ろうね。

connpass.com

Rのコードはざっくりこんな感じ。自分の受けたものを全て抜き出すだけです。件数は上限が100なので100を指定、orderも開催日時順にしています。

library(tidyverse)
library(httr)
library(jsonlite)

nis <- GET("https://connpass.com/api/v1/event/?nickname=niszet&count=100&order=2")
jsonlite::fromJSON(content(nis, "text"))  %>% as_tibble()%>% jsonlite::flatten() -> nis_df

owner_nicknameを一緒に指定するとどうもORになるっぽいので、特定のイベント主のイベントのうち、自分が受けたものをみるには events.owner_nicknameで絞り込めば良いですね。

受けてないものを見るならそれぞれのデータを取ってきて、events.event_idを指定してanti_joinとか。

あとハマりどころとしては、contentで抜き出した文字列のままでは触りづらいのでfromJSONに与えるとか、as_tibbleしたあとは階層化されているのでflatten通すべきとかですかね。RStudio上でView()で見ると階層が潰されて表示されているので、そのままsetdiffとかしようとするとよくわからないエラーが出て困った、みたいなハマりポイントもありましたが、データ構造は必ず何かしらの形で見ましょう。strだと情報過多になるので、tibbleの場合はglimpse()が良いでしょうな。

flatten前のデータはこんな構造。eventsがdata.frameになってることがここで気づける。

jsonlite::fromJSON(content(nis, "text"))  %>% as_tibble() %>% glimpse()
Rows: 71
Columns: 4
$ results_start     <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
$ results_returned  <int> 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 7...
$ results_available <int> 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 7...
$ events            <df[,21]> <data.frame[36 x 21]>

ということで。Rで色々出来ると楽しいですね!

追記

flattenですが、purrrパッケージにも同名の関数が含まれているため、jsonlite::を明示的にしたほうがよいでしょう(上記のコードではそうなってます)

また、data.frameにした後の構造は下記のようになります。

> glimpse(nis_df)
Rows: 72
Columns: 26
$ results_start             <int> 1, 1, 1...
$ results_returned          <int> 72, 72,...
$ results_available         <int> 72, 72,...
$ events.event_id           <int> 181686,...
$ events.title              <chr> "9/19 O...
$ events.catch              <chr> "オンラインで...
$ events.description        <chr> "<h1>ご参...
$ events.event_url          <chr> "https:...
$ events.started_at         <chr> "2020-0...
$ events.ended_at           <chr> "2020-0...
$ events.limit              <int> NA, NA,...
$ events.hash_tag           <chr> "osc20h...
$ events.event_type         <chr> "partic...
$ events.accepted           <int> 43, 131...
$ events.waiting            <int> 0, 0, 0...
$ events.updated_at         <chr> "2020-0...
$ events.owner_id           <int> 313042,...
$ events.owner_nickname     <chr> "nagais...
$ events.owner_display_name <chr> "nagais...
$ events.place              <chr> "オンライン"...
$ events.address            <chr> "オンライン"...
$ events.lat                <chr> NA, NA,...
$ events.lon                <chr> NA, NA,...
$ events.series.id          <int> 2186, 1...
$ events.series.title       <chr> "OSPN(O...
$ events.series.url         <chr> "https:...

また、例えば最近参加したTokyoRのイベントは下記のようにすれば良いです。このowner_nicknameが分かりづらいので(tokyorとかではない)どうしようっかな…って感じですけど…。イベントのURLからイベントのidは取れるので、それを指定してそこからownerを引っ張ってくるというのが良いかな。

nis_df %>% filter(events.owner_nickname=="kilometer") %>% select(events.title)
                   events.title
187回R勉強会@東京(#TokyoR)
286回R勉強会@東京(#TokyoR)
384回R勉強会@東京(#TokyoR)
483回R勉強会@東京(#TokyoR)
579回R勉強会@東京(#TokyoR)
677回R勉強会@東京(#TokyoR)

あるいは、events.series.titleがTokyo.Rであること、あるいはevents.series.urlを見てイベントのページを見つける、などなど、でしょうか。

tokyor.connpass.com