u++の備忘録

イベント参加者用の名札をPythonで自動生成

先日開催した「Sports Analyst Meetup #6」*1では、イベント参加者の方々全員に名札を配布する試みを実施しました。

f:id:upura:20200209162722p:plain

この名札はconnpassの情報を基に、Pythonで自動生成しました。本記事では、技術的な準備の裏側をご紹介します。

要件定義

運営で話し合った中で出てきた要件は次の通りでした。

  1. アイコンを表示できる
  2. 氏名(ハンドルネーム)を表示できる
  3. 会話のネタとなる要素を表示できる

1と2については、「twitterなどでアカウントは知ってるけど、現実世界でお会いするのは初めて」という方々の交流を促す狙いです。3については、イベントの休憩時間などでお互いにより話しかけやすくなるよう、申込時アンケートで聞いていた「好きなスポーツ」を掲載しようと考えました。

既存技術の調査

調べたところ、素晴らしいウェブサービスが公開されていました。

yoshiko.hatenablog.jp

一方で、今回運営で話していた用途を考えると、次のような課題が挙げられました。

  • connpassの表示名が長いときに、途中で切れてしまう*2
  • アイコン・氏名(ハンドルネーム)に加える追加の要素を表示できない

GitHubにPRを出すことも検討しましたが、既存実装を理解する時間的制約などを考慮し、0から自作することに決めました。

データセットの準備

名札作成のためのデータセットは、connpassからダウンロードしました。自分が運営しているイベントの場合は「申込者の管理」ページから、参加者情報が掲載されたcsvファイルをダウンロードできます。

f:id:upura:20200209163118p:plain

csvファイルからは、次の情報を取得しています。

  • connpassのid
  • connpassの表示名
  • 好きなスポーツ(アンケートで取得)
  • 申込者ステータス(キャンセル含む)

Pythonでの実装

Pythonでの処理は、次の流れとなりました。

  1. pandasでcsvファイルからデータ取得・加工
  2. BeautifulSoupでconnpassのアイコンを取得
  3. PILで名札を作成・保存

最初に、pandasでcsvファイルを読み込みます。この時点で、申込者ステータスが「キャンセル」の方を取り除くなどの処理を挟んでいます。次に、csvファイルには格納されていないアイコンの画像データを、connpassのidをキーにしてスクレイピングしました。最後にPythonで画像を扱えるライブラリを用いて、名札画像を作成・保存しています。「connpassの表示名が長いときに、途中で切れてしまう」問題は、動的にフォントサイズを変える、もしくは改行を加える実装で対処しました。

おわりに

本記事では、connpassの情報を基に、イベント参加者用の名札をPythonで自動生成する方法を紹介しました。

GitHub+Dockerでソースコード・実行環境を管理していますが、スクレイピングを含む実装なのでソースコードの公開は微妙かなと思い控えています。もしご興味ある方がいらっしゃれば、個別にご連絡ください。