Python

【@ハンドル対処】YoutubeチャンネルIDを取得する方法

youtube_channel

この記事ではYouTube APIを使用する際の【@マークを含むチャンネル識別子】を使用した際に発生するエラーとその解決策に焦点を当てていきます。

問題の概要

YouTube APIでチャンネル情報を取得しようとする際、以下のような問題に直面します

  • @マークを含むチャンネル識別子を使用すると、APIがエラーを返す
  • チャンネルIDとして認識されず、正しいデータが取得できない

これは、@マークがYouTubeの「ハンドル」システムで使用されるものであり、APIで直接チャンネルIDとして利用できないことが原因です。

チャンネルIDとは?

YouTube APIで使用される正式なチャンネルIDは、通常UCで始まる一意の文字列です。例えば

UCaBcDeFgHiJkLmNoPqRsTuVw


このIDは、チャンネルごとに固有であり、APIリクエストで使用する際に正しく認識されます。

@マークの問題

@マークを含むチャンネル識別子(例:@example_channel)は、ユーザーフレンドリーな「ハンドル」として機能します。これはURLやメンション用に便利ですが、API呼び出しには適していないです。

解決策

この問題を解決するには、以下の手順を踏むことをお勧めします

  1. チャンネルIDの取得:
    • チャンネルのURLを開き、ページのソースコードを表示します。
    • "channelId":"UC..."というパターンを検索し、UCで始まるIDを見つけます。
  2. APIリクエストの修正:
    • @マークを含むハンドルの代わりに、取得したチャンネルIDを使用します。
  3. チャンネルID変換API:
    • YouTube Data APIには、ハンドルからチャンネルIDを取得するエンドポイントがあります。
    • channels.listメソッドを使用し、forHandleパラメータにハンドルを指定します。

例:

GET https://www.googleapis.com/youtube/v3/channels?part=id&forHandle=@example_channel&key=YOUR_API_KEY
  1. エラーハンドリング:
    • APIリクエストで@マークを含む識別子を使用した場合のエラーをキャッチし、ユーザーに正しいフォーマットを使用するよう促すメッセージを表示します。

実装例

以下に、@マークが含まれている場合にハンドルからチャンネルIDを取得し、含まれていない場合にはそのまま続行する処理の実装例を示します

#ハンドルを含むYoutubeのURLからYoutubeIDを取得して返す
def get_channel_id_from_handle(handle):
    try:
        search_response = youtube.search().list(
            part="snippet",
            q=handle,
            type="channel",
            maxResults=1
        ).execute()
        if "items" in search_response and search_response["items"]:
            channel_id = search_response["items"][0]["snippet"]["channelId"]
            return channel_id
        else:
            raise ValueError(f"指定されたハンドル '{handle}' に対応するチャンネルが見つかりませんでした。")
    except HttpError as e:
        print(f"HTTP エラーが発生しました(ステータス {e.resp.status}): {e.content}")
    except Exception as ex:
        print(f"予期しないエラーが発生しました: {ex}")
    return None
# メインの処理部分
while True:
    event, values = window.read()
    if event in (None, '終了'):
        break
    if event == 'コメント抽出':
        url = values['-URL-']
        start_date_str = values['-START_DATE-']
        end_date_str = values['-END_DATE-']

        if values['-CHANNEL-']:
            # ハンドルの場合の処理
            if "@" in url:
         #作成したチャンネルIDを返す関数を使用する。
                channel_id = get_channel_id_from_handle(url)
                if channel_id is None:
                    continue
            else:
                channel_id = url.split("/")[-1]
            
            # 日付の処理とコメント抽出
            # ... (省略)

        else:
            video_id = url.split('v=')
            comments = extract_comments_from_video(video_id)

        # コメントの保存処理
        # ... (省略)

この実装では、URLに@マークが含まれている場合、get_channel_id_from_handle関数を使用してチャンネルIDを取得します。含まれていない場合は、通常のチャンネルIDとして処理を続行します。

まとめ

YouTube APIを使用する際は、@マークを含むハンドルではなく、正式なチャンネルIDを使用することが重要です。この記事で紹介した方法と実装例を使えば、ほとんどの場合問題なくAPIを利用できるはずです。

特に、get_channel_id_from_handle関数を使用することで、ユーザーが入力したURLが@マークを含むハンドルであっても、適切にチャンネルIDを取得し処理を続行できます。

開発中に他の問題に遭遇した場合は、YouTube API公式ドキュメントを参照するか、開発者コミュニティでサポートを求めてください。

ABOUT ME
tona-code
24/7月末の退職を機に、pythonを使った副業にチャレンジ。 初月から5万以上の収入を得たノウハウを発信中。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です