Node.js
connpass
headless-chrome

connpassにログインして指定したグループに参加するスクリプト

Twitterのタイムラインをぼーっと眺めていたらみんな熱心に勉強会などのイベントに行っているので自分でもキャッチアップしたかったのだけど、なんか楽にやる方法はないだろうか。というのを最初に思った。

と思いたって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

イベントやグループ情報を収集する部分も別途書けば望むものができそうだ。ということで安心した。