先日開催した「Sports Analyst Meetup #6」*1では、イベント参加者の方々全員に名札を配布する試みを実施しました。
今日はここから! #spoana 名札が用意されてる!ありがとうございます(もっとまともな写真のアイコンにしよう🤔) (@ 汐留ビルディング in 港区, 東京都) https://t.co/RWX30je7Ys pic.twitter.com/8r7jAuGUUY
— 🦌💗💉けんざぶ❄️🍭🍙 (@ken_zav) February 16, 2020
この名札はconnpassの情報を基に、Pythonで自動生成しました。本記事では、技術的な準備の裏側をご紹介します。
要件定義
運営で話し合った中で出てきた要件は次の通りでした。
- アイコンを表示できる
- 氏名(ハンドルネーム)を表示できる
- 会話のネタとなる要素を表示できる
1と2については、「twitterなどでアカウントは知ってるけど、現実世界でお会いするのは初めて」という方々の交流を促す狙いです。3については、イベントの休憩時間などでお互いにより話しかけやすくなるよう、申込時アンケートで聞いていた「好きなスポーツ」を掲載しようと考えました。
既存技術の調査
調べたところ、素晴らしいウェブサービスが公開されていました。
一方で、今回運営で話していた用途を考えると、次のような課題が挙げられました。
- connpassの表示名が長いときに、途中で切れてしまう*2
- アイコン・氏名(ハンドルネーム)に加える追加の要素を表示できない
GitHubにPRを出すことも検討しましたが、既存実装を理解する時間的制約などを考慮し、0から自作することに決めました。
データセットの準備
名札作成のためのデータセットは、connpassからダウンロードしました。自分が運営しているイベントの場合は「申込者の管理」ページから、参加者情報が掲載されたcsvファイルをダウンロードできます。
csvファイルからは、次の情報を取得しています。
- connpassのid
- connpassの表示名
- 好きなスポーツ(アンケートで取得)
- 申込者ステータス(キャンセル含む)
Pythonでの実装
Pythonでの処理は、次の流れとなりました。
- pandasでcsvファイルからデータ取得・加工
- BeautifulSoupでconnpassのアイコンを取得
- PILで名札を作成・保存
最初に、pandasでcsvファイルを読み込みます。この時点で、申込者ステータスが「キャンセル」の方を取り除くなどの処理を挟んでいます。次に、csvファイルには格納されていないアイコンの画像データを、connpassのidをキーにしてスクレイピングしました。最後にPythonで画像を扱えるライブラリを用いて、名札画像を作成・保存しています。「connpassの表示名が長いときに、途中で切れてしまう」問題は、動的にフォントサイズを変える、もしくは改行を加える実装で対処しました。
おわりに
本記事では、connpassの情報を基に、イベント参加者用の名札をPythonで自動生成する方法を紹介しました。
GitHub+Dockerでソースコード・実行環境を管理していますが、スクレイピングを含む実装なのでソースコードの公開は微妙かなと思い控えています。もしご興味ある方がいらっしゃれば、個別にご連絡ください。