Udemy APIで講座情報を取得する【Ruby + Faraday】

Udemyの講座情報を自動で取得して、アフィリエイトサイトやデータ分析に活用したいと思ったことはありませんか?Udemy APIを使えば、講座のタイトル、価格、評価などの情報をプログラムから簡単に取得できます。

この記事では、RubyとFaradayを使ってUdemy APIから講座情報を取得する実装方法を解説します。APIクライアントの取得から実際のコード実装まで、すぐに動かせる実践的な内容をお届けします。

目次

Udemy APIとは?できること

Udemy APIは、Udemyが公式に提供するAffiliate API(アフィリエイトAPI)です。このAPIを使うことで、Udemyの講座情報をプログラムから取得できます。

主な用途

  • アフィリエイトサイト構築:講座情報を自動で取得して紹介
  • データ分析:人気講座のトレンド分析
  • 価格監視:セール情報の自動取得
  • 講座比較サービス:複数講座の情報を一覧表示

取得できる情報

  • 講座タイトル
  • 講座URL
  • 価格・割引情報
  • 評価・レビュー数
  • 講師情報
  • 講座の説明文

APIクライアント取得手順(4ステップ)

Udemy APIを利用するには、まずクライアントIDとクライアントパスワードを取得する必要があります。

Step 1: Udemyアカウントを作成

Udemyの公式サイトでアカウントを作成します。既にアカウントがある場合はそのまま使用できます。

Step 2: アカウント設定画面に移動

Udemyにログインし、右上のアカウントアイコンから「アカウント設定」を選択します。

Step 3: APIクライアントをリクエスト

アカウント設定画面で「APIクライアント」セクションを探し、「Affiliate APIクライアントをリクエストする」をクリックします。必要事項を入力して保存します。

Step 4: クライアントIDとパスワードを取得

リクエストが承認されると、クライアントIDとクライアントパスワードが発行されます。この2つの情報は、API認証に必要なので大切に保管してください。

実装手順(Ruby + Faraday)

RubyとFaradayを使って、Udemy APIから講座情報を取得する実装を進めていきます。

前提条件

  • Ruby 2.6以上がインストール済み
  • Udemy APIクライアントIDとパスワードを取得済み

Step 1: Faradayのインストール

FaradayはRubyのHTTPクライアントライブラリです。Udemy APIへのHTTPリクエストに使用します。

gem install faraday

Step 2: 基本設定

環境変数にクライアントIDとパスワードを設定します。.envファイルを作成して以下のように記述しましょう。

UDEMY_CLIENT_ID=your_client_id_here
UDEMY_CLIENT_PASSWORD=your_client_password_here

Step 3: APIリクエストの実装

Udemy APIにリクエストを送信するコードを実装します。

require 'json'
require 'faraday'
require 'uri'

class UdemyAPI
  # Udemy APIのベースURL
  BASE_URL = 'https://www.udemy.com/api-2.0/courses/'.freeze

  def initialize(client_id, client_password)
    @client_id = client_id
    @client_password = client_password
  end

  # キーワードで講座を検索
  def search_courses(keyword, language = 'ja')
    # 日本語対応のため、URIエンコードを実施
    search_url = URI.encode("#{BASE_URL}?language=#{language}&search=#{keyword}")
    response = get_request(search_url)
    
    return nil unless response.success?
    
    JSON.parse(response.body)
  end

  private

  # HTTPリクエストを送信
  def get_request(url)
    connection = Faraday.new(url: url) do |conn|
      # Basic認証(クライアントIDとパスワード)
      conn.basic_auth(@client_id, @client_password)
      # Net::HTTPアダプターを使用
      conn.adapter :net_http
    end
    
    connection.get
  end
end

Step 4: レスポンス処理とページネーション

Udemy APIは1リクエストあたり最大20件の講座情報を返します。21件目以降を取得するには、レスポンスのnextキーに含まれるURLに追加リクエストを送ります。

class UdemyAPI
  # 前述のコードに追加

  # すべての検索結果を取得(ページネーション対応)
  def search_all_courses(keyword, language = 'ja', max_pages = 100)
    courses = []
    search_url = URI.encode("#{BASE_URL}?language=#{language}&search=#{keyword}")
    
    page_count = 0
    
    loop do
      break if page_count >= max_pages
      
      response = get_request(search_url)
      break unless response.success?
      
      data = JSON.parse(response.body)
      courses.concat(data['results'])
      
      # 次のページがなければ終了
      break if data['next'].nil?
      
      search_url = data['next']
      page_count += 1
    end
    
    courses
  end
end

実際の使用例

実装したクラスを使って、実際に講座情報を取得してみましょう。

# 環境変数から認証情報を取得(dotenvなどを使用)
require 'dotenv/load'

client_id = ENV['UDEMY_CLIENT_ID']
client_password = ENV['UDEMY_CLIENT_PASSWORD']

# UdemyAPIインスタンスを作成
udemy = UdemyAPI.new(client_id, client_password)

# "Ruby"で検索
courses = udemy.search_all_courses('Ruby')

# 講座タイトルを出力
courses.each do |course|
  puts course['title']
  puts "価格: #{course['price']}"
  puts "URL: https://www.udemy.com#{course['url']}"
  puts "---"
end

より詳細な情報を取得する例

courses.each do |course|
  puts "タイトル: #{course['title']}"
  puts "講師: #{course['visible_instructors']&.first&.dig('display_name')}"
  puts "評価: #{course['avg_rating']}"
  puts "受講者数: #{course['num_subscribers']}"
  puts "価格: #{course['price']}"
  puts "言語: #{course['locale']['locale']}"
  puts "-" * 50
end

よくあるトラブルと解決法

トラブル1: 401 UNAUTHORIZEDエラー

原因:クライアントIDまたはパスワードが間違っている、もしくは認証情報が送信されていない。

解決法:

  • 環境変数の値を再確認
  • conn.basic_authが正しく呼ばれているか確認
  • クライアントIDとパスワードにスペースや改行が含まれていないか確認

トラブル2: 日本語キーワードが文字化けする

原因:URLに日本語が含まれる場合、エンコードが必要。

解決法:

# URI.encodeを使用してエンコード
search_url = URI.encode("#{BASE_URL}?language=ja&search=#{keyword}")

Ruby 2.7以降ではURI.encodeが非推奨になっているため、ERB::Util.url_encodeまたはCGI.escapeを使用することを推奨します。

require 'cgi'

keyword_encoded = CGI.escape(keyword)
search_url = "#{BASE_URL}?language=ja&search=#{keyword_encoded}"

トラブル3: 取得できる講座数が少ない

原因:ページネーション処理が実装されていない。

解決法:レスポンスのnextキーを確認し、追加リクエストを送信する処理を実装してください(上記のStep 4を参照)。

まとめ:Udemy APIで講座情報を活用しよう

Udemy APIを使えば、講座情報を自動で取得してさまざまな用途に活用できます。アフィリエイトサイトの構築やデータ分析など、可能性は無限大です。

実装のポイントまとめ:

  • Udemy APIクライアントIDとパスワードを取得
  • Faradayを使ってHTTPリクエスト
  • Basic認証で毎回認証情報を送信
  • 日本語キーワードはURIエンコード必須
  • ページネーション処理で全件取得

まずは簡単なキーワード検索から始めて、徐々に機能を拡張していきましょう。取得した講座情報をデータベースに保存したり、定期的に価格をチェックする仕組みを作ったりすれば、より実用的なアプリケーションが構築できます。

API開発をさらに効率化する関連記事

Udemy API実装を理解したら、他のAPI開発や効率化ツールも活用して、さらに開発スキルを向上させましょう:

API開発・連携

開発効率化・コーディング支援

Udemy API よくある質問

❓ Udemy APIは無料で使えますか?

はい、Udemy Affiliate APIは無料で利用できます。ただし、Udemyアカウントの作成とAPIクライアントの申請・承認が必要です。APIクライアントの申請は、Udemyのアカウント設定画面から行えます。承認されれば、クライアントIDとパスワードが発行され、APIを利用できるようになります。

❓ 1回のリクエストで何件の講座情報を取得できますか?

Udemy APIは1リクエストあたり最大20件の講座情報を返します。21件目以降の情報を取得するには、レスポンスに含まれるnextキーのURLに追加リクエストを送る必要があります。nextキーがnullになった時点で、すべての結果を取得したことになります。最大100ページまで取得可能です。

❓ Ruby以外の言語でも使えますか?

はい、Udemy APIはHTTPベースのRESTful APIなので、どのプログラミング言語でも利用できます。Python、JavaScript(Node.js)、PHP、Javaなど、HTTPリクエストを送信できる言語であれば問題ありません。Basic認証とJSON形式のレスポンス処理ができれば、同様の実装が可能です。

❓ APIのリクエスト制限はありますか?

Udemy APIには具体的なレート制限が公式ドキュメントに明記されていませんが、過度なリクエストは避けるべきです。推奨される実装としては、取得した講座情報をキャッシュして保存し、同じ情報への重複リクエストを減らすことです。また、ページネーション処理では適切な間隔を空けてリクエストを送信することで、サーバーへの負荷を軽減できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次