はじめに
最近、技術イベントや勉強会に参加する機会が増えてきました。
でも、connpassのイベントを毎日チェックするのって地味に面倒…。
さらに、気になるイベントには満席になる前に参加したい!
"新着イベントを自動で集めて、毎日通知が飛んでくるようにしたい。"
そう思ったことありませんか?
今回はそんな「俺得」を叶えるために、connpass APIを使って自分専用のイベント一覧を取得する方法をご紹介します!
connpassとは
connpass(コンパス) は、エンジニアやクリエイター向けのIT勉強会・技術イベントの支援プラットフォームです。
イベントの開催・参加・検索が簡単にできるのが特徴で、個人から企業まで幅広く利用されています。
connpass API
connpassは 公式API を提供しており、イベント情報をプログラムから取得できます。
- API利用にはAPIキーをリクエストヘッダーに設定してアクセスする必要がある
- APIのパラメータでキーワード、開催日、地域などを指定可能
- APIのレスポンスはJSON形式
- 個人・コミュニティ向けには申請すれば無料でAPIキーが発行される
利用にあたっては、利用規約を確認しましょう。
connpass APIでイベント情報を取得する
構成イメージ
全体の流れ
- connpass APIの申請
- Amazon SNSトピックの作成
- AWS Lambdaの実装
- Amazon EventBridgeの設定
それでは見ていきましょう!
connpass APIの申請
フォームよりconnpass APIを申請します。
申請すると、数日でAPIが発行されます。
Amazon SNSトピックの作成
メール通知したいためSNSトピックを作成します。
タイプは「スタンダード」を選択します。
表示名はメール通知された時の表示したいラベルを指定します。
続いてサブスクリプションを作成します。
プロトコルは「Eメール」を選択します。
エンドポイントは通知したいメールアドレスを指定します。
サブスクリプション作成後、指定したメールアドレス宛にサブスクリプションを確認するメールが届きますので「Confirm subscription」をクリックします。
AWS Lambdaの実装
connpass APIを使ってAWS Lambdaを実装します。
実装のポイントを説明します。
- connpass APIキーをAWS Lambdaの環境変数に設定します。
キー:CONNPASS_API_KEY
値:[取得したconpass API]
- AWS Lambdaで設定したAPIキーを取得します。
# APIキーの取得
api_key = os.getenv("CONNPASS_API_KEY")
- APIリクエストを実装します。
エンドポイント:https://connpass.com/api/v2/events/
パラメータ:
order
:1
開催日昇順 /2
開催日降順 /3
新着順
count
:[取得したい件数]
(デフォルト20 最大100)
AWS LambdaからAPIを実行するため、User-Agent
をheadersに設定します。
User-Agent
をheadersに設定しないとAPIリクエストが失敗します。
# APIリクエスト
url = "https://connpass.com/api/v2/events/?order=3&count=100"
headers = {
"X-API-Key": api_key,
"User-Agent": "Mozilla/5.0 (compatible; LambdaBot/1.0; +https://aws.amazon.com/lambda/)"
}
response = requests.get(url, headers=headers)
- 取得結果をフィルタします。
ここでは前日の更新日付のイベントを取得するようにします。
# フィルタリング処理
filtered_events = []
for event in data.get("events", []):
if event["updated_at"].startswith(yesterday_jst): # 日本時間の前日で判定
(省略)
- SNSのトピックARNをAWS Lambdaの環境変数に設定します。
キー:SNS_TOPIC_ARN
値:[作成したSNSトピックARN]
- AWS Lambdaで設定したSNSトピックARNを取得します。
そしてSNSにconnpass取得結果を送信します。
# SNS に送信
sns_client = boto3.client("sns")
topic_arn = os.getenv("SNS_TOPIC_ARN") # SNSのTopic ARNを環境変数から取得
sns_client.publish(
TopicArn=topic_arn,
Message=email_body,
Subject="【connpass】新着イベント一覧",
)
全体のAWS Lambdaの実装は以下となります。
AWS Lambdaの実装
import json
import requests
import datetime
import os
import boto3
def lambda_handler(event, context):
# APIキーの取得
api_key = os.getenv("CONNPASS_API_KEY")
if not api_key:
return {
"statusCode": 500,
"body": json.dumps({"error": "API key is missing"})
}
# 日本時間(JST)の前日を取得
now_utc = datetime.datetime.utcnow() # 現在のUTC時間を取得
now_jst = now_utc + datetime.timedelta(hours=9) # UTCをJSTに変換
yesterday_jst = (now_jst - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
# APIリクエスト
url = "https://connpass.com/api/v2/events/?order=3&count=100"
headers = {
"X-API-Key": api_key,
"User-Agent": "Mozilla/5.0 (compatible; LambdaBot/1.0; +https://aws.amazon.com/lambda/)"
}
response = requests.get(url, headers=headers)
if response.status_code != 200:
return {
"statusCode": response.status_code,
"body": json.dumps({"error": f"Failed to fetch data (status code: {response.status_code})"})
}
data = response.json()
# フィルタリング処理
filtered_events = []
for event in data.get("events", []):
if event["updated_at"].startswith(yesterday_jst): # 日本時間の前日で判定
# started_at を "YYYY-MM-DD HH:MM" の形式に変換
started_at_iso = event.get("started_at", "")
started_at_formatted = ""
if started_at_iso:
try:
dt = datetime.datetime.fromisoformat(started_at_iso)
started_at_formatted = dt.strftime("%Y-%m-%d %H:%M")
except ValueError:
started_at_formatted = started_at_iso # 変換できない場合はそのまま
filtered_events.append({
"title": event.get("title", ""),
"url": event.get("url", ""),
"started_at": started_at_formatted,
"address": event.get("address", ""),
"place": event.get("place", ""),
"accepted": event.get("accepted", 0)
})
# メール用のプレーンテキストフォーマット
email_body = "新着イベント一覧:\n\n"
for event in filtered_events:
email_body += f"- {event['title']}\n"
email_body += f" 開始日時: {event['started_at']}\n"
email_body += f" 場所: {event['place']} ({event['address']})\n"
email_body += f" 参加者数: {event['accepted']}\n"
email_body += f" イベントページ: {event['url']}\n\n"
if not filtered_events:
email_body += "新着イベントはありませんでした。\n"
# SNS に送信
sns_client = boto3.client("sns")
topic_arn = os.getenv("SNS_TOPIC_ARN") # SNSのTopic ARNを環境変数から取得
sns_client.publish(
TopicArn=topic_arn,
Message=email_body,
Subject="【connpass】新着イベント一覧",
)
return {
"statusCode": 200,
"body": json.dumps(filtered_events, ensure_ascii=False)
}
Amazon EventBridgeの設定
定期的にAWS Lambdaを実行するようにAmazon EventBridgeのスケジュールを設定します。
頻度は「定期的なスケジュール」を選択します。
スケジュールの種類は「cronベースのスケジュール」を選択します。
ターゲットの詳細は「テンプレート化されたターゲット」を選択し、「AWS Lambda」を選択します。
あとは作成したAWS Lambdaを指定して、その他の設定をします。
できたもの
毎朝 7:00 に新着イベント一覧がメールに通知されます!
気になるイベントがあれば、イベントページのリンクから詳細を確認します。
おわりに
今回はconnpass APIとAWSを組み合わせて、自分だけの「俺得」なイベント通知システムを作ってみました。
毎朝の通知がきっかけで気になるイベントに出会えたり、思いがけない学びにつながることもあるかもしれません。
この記事が、どなたかのconnpassライフにちょっとでも役立てば嬉しいです。