2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

最近、技術イベントや勉強会に参加する機会が増えてきました。
でも、connpassのイベントを毎日チェックするのって地味に面倒…。
さらに、気になるイベントには満席になる前に参加したい!

"新着イベントを自動で集めて、毎日通知が飛んでくるようにしたい。"
そう思ったことありませんか?

今回はそんな「俺得」を叶えるために、connpass APIを使って自分専用のイベント一覧を取得する方法をご紹介します!

connpassとは

connpass(コンパス) は、エンジニアやクリエイター向けのIT勉強会・技術イベントの支援プラットフォームです。
イベントの開催・参加・検索が簡単にできるのが特徴で、個人から企業まで幅広く利用されています。

connpass API

connpassは 公式API を提供しており、イベント情報をプログラムから取得できます。

  • API利用にはAPIキーをリクエストヘッダーに設定してアクセスする必要がある
  • APIのパラメータでキーワード、開催日、地域などを指定可能
  • APIのレスポンスはJSON形式
  • 個人・コミュニティ向けには申請すれば無料でAPIキーが発行される

利用にあたっては、利用規約を確認しましょう。

connpass APIでイベント情報を取得する

構成イメージ

スクリーンショット 2025-07-05 7.17.56.png

全体の流れ

  1. connpass APIの申請
  2. Amazon SNSトピックの作成
  3. AWS Lambdaの実装
  4. Amazon EventBridgeの設定

それでは見ていきましょう!

connpass APIの申請

フォームよりconnpass APIを申請します。
申請すると、数日でAPIが発行されます。

Amazon SNSトピックの作成

メール通知したいためSNSトピックを作成します。
タイプは「スタンダード」を選択します。
表示名はメール通知された時の表示したいラベルを指定します。

image.png

続いてサブスクリプションを作成します。
プロトコルは「Eメール」を選択します。
エンドポイントは通知したいメールアドレスを指定します。

image.png

サブスクリプション作成後、指定したメールアドレス宛にサブスクリプションを確認するメールが届きますので「Confirm subscription」をクリックします。

image.png

AWS Lambdaの実装

connpass APIを使ってAWS Lambdaを実装します。
実装のポイントを説明します。

  • connpass APIキーをAWS Lambdaの環境変数に設定します。
    キー:CONNPASS_API_KEY
    値:[取得したconpass API]

image.png

  • AWS Lambdaで設定したAPIキーを取得します。
    # APIキーの取得
    api_key = os.getenv("CONNPASS_API_KEY")
  • APIリクエストを実装します。
    エンドポイント:https://connpass.com/api/v2/events/
    パラメータ:
     order1 開催日昇順 / 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]

image.png

  • 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の実装
lambda_function.py
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ベースのスケジュール」を選択します。

image.png

ターゲットの詳細は「テンプレート化されたターゲット」を選択し、「AWS Lambda」を選択します。

image.png

あとは作成したAWS Lambdaを指定して、その他の設定をします。

できたもの

毎朝 7:00 に新着イベント一覧がメールに通知されます!

image.png

気になるイベントがあれば、イベントページのリンクから詳細を確認します。

おわりに

今回はconnpass APIとAWSを組み合わせて、自分だけの「俺得」なイベント通知システムを作ってみました。

毎朝の通知がきっかけで気になるイベントに出会えたり、思いがけない学びにつながることもあるかもしれません。

この記事が、どなたかのconnpassライフにちょっとでも役立てば嬉しいです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?