Twitterのタイムラインをぼーっと眺めていたらみんな熱心に勉強会などのイベントに行っているので自分でもキャッチアップしたかったのだけど、なんか楽にやる方法はないだろうか。というのを最初に思った。
フォローしてる人が行った勉強会の発表資料を自動でニュースにするサイトを作りたい
— laiso@3/31深セン〜4/2東京 (@laiso) March 11, 2018
と思いたってconnpassのサイトをみていたところ、通知設定で「グループイベントに新しい資料が追加された時」という項目があったので、グループに参加さえしていればメールで資料のアップデートを知ることができるとわかった。
しかしグループに参加するためにイベントの開催やアクティビティをチェックしないといけないのがめんどうくさい。そこで、アクティブなイベントを開催しているグループで自分が興味ありそうなものならどんどん資料の更新を通知してもらうように、フォローワーの参加イベントのグループに自動で参加して、資料追加をwatchしようと決めた。
だがconnpassにはAPIがあるがイベント検索用で、OAuth認証してユーザーのデータを操作するような口はなかった。
APIリファレンス - connpass
なので、スクレイピングをすることにして方法を検討していたところ、JSを実行させないとうまくいきそうにないことがなんとなくわかった。
Seleniumでやろうかなと思っていたが、検索したところブラウザオートメーション系のPuppeteerという故PhantomJSのような便利なものがあってそれを利用した。
Puppeteerを使用したHeadless Chromeの操作 - VASILY DEVELOPERS BLOG | VASILYテックブログ
中身はこんな感じ
puppeteer.launch({headless: !isDebug})
.then(async browser => {
const page = await browser.newPage()
if (isDebug) await page.setViewport({width: 1980, height: 800})
const n = await page.goto('https://connpass.com/login/')
await page.type('input[name=username]', username)
await page.type('input[name=password]', password)
await page.click('#login_form button[type=submit]')
await page.waitForSelector('#personalMenu')
await page.goto(eventUrl)
await page.click('.GroupMembershipButton')
if (isDebug) await page.waitFor(3000)
browser.close();
})
CLIにしておいた: https://github.com/laiso/connpass-group-join
イベントやグループ情報を収集する部分も別途書けば望むものができそうだ。ということで安心した。