배치 처리이지만 Youtube Auth 인증이 필요했기 때문에 편하게 어떻게 든

13218 단어 YouTube

소개



취미로 이런 것을 만들었습니다.
htps //w w. 요츠베. 코 m / 찬 l / 우카 r-Q-rsW3TCgW3-hw2A / p-y-sts

Youtube의 플레이리스트를 자동 생성하는 스크립트를 cron적인 느낌으로 달리고 있습니다만, 플레이리스트 작성을 위해서는 Auth 인증하고 API를 두드려야 했습니다.

자신의 Youtube 계정으로 인증하고 싶은 것만으로 불특정 다수의 유저가 인증하는 것은 아니기 때문에, 진지하게 Auth 인증을 만드는 것은 귀찮다고 생각해, 좋은 방법 없을까라고 생각하고 있으면 좋은 방법이 있었으므로 그 메모입니다.

전지식


  • Youtube Data API
  • 읽기 시스템 조작은 사용자 인증이 필요하지 않습니다
  • write 계열의 조작에는 사용자 인증이 필요합니다
  • ぇぺぺrs. 오, ぇ. 코 m / 요츠 베 / v3 / 껄껄 g-s r d? hl = 그럼 # r r d

  • 한번 refresh_token마저 취득해 버리면 이후 배치 처리는 움직일 수 있으므로, 그만큼 수동으로 가져온다

  • 했던 일



    샘플 코드는 js이지만 별도로 무엇이든 좋습니다.

    1: client_id, client_secret 생성





    ↑이미지와 같은 タイプ: ウェブアプリケーション, OAuth2.0クライアント 의 ID를 발행해 둡니다.

    2부: 인증 URL을 두드리는


    //
    // script1.js
    //
    
    // その1で取得したclient_id
    const clientId = "xxx.apps.googleusercontent.com";
    
    // redirectUrlは実際にサーバを立てる必要はない。localhostならまあなんでも良い
    const redirectUrl = "http://localhost:8000";
    
    const scope = "https://www.googleapis.com/auth/youtube";
    
    const url = [
      "https://accounts.google.com/o/oauth2/auth?",
      `client_id=${clientId}&`,
      `redirect_uri=${encodeURIComponent(redirectUrl)}&`,
      `scope=${scope}&`,
      "response_type=code&",
      "access_type=offline"
    ].join("");
    
    console.log(url);
    
    $ node script1.js
    https://accounts.google.com/o/oauth2/auth?client_id=xxx.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8000&scope=https://www.googleapis.com/auth/youtube&response_type=code&access_type=offline
    

    ↑이 URL을 브라우저에서 엽니다.

    그 3: refresh_token 얻기



    그 2에서 생성한 URL을 두드려 Youtube 인증하면 아래와 같은 localhost로 리디렉션됩니다.
    http://localhost:8000/?code=aaa&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube#
    서버는 세우지 않기 때문에 브라우저의 에러 화면이 됩니다만 특별히 문제 없습니다.
    URL 바에 포함된 code를 복사하여 아래 스크립트를 실행합니다.
    //
    // script2.js
    //
    
    const body = {
      code: "aaa", // 先程取得したcode
      client_id: "xxx.apps.googleusercontent.com", // その1で取得したclient_id
      client_secret: "yyy",  // その1で取得したclient_secret
      redirect_uri: "http://localhost:8000", // その2と同じくサーバを立てる必要はない
      grant_type: "authorization_code"
    };
    
    const command = [
      "curl -X POST",
      '-H "Content-Type: application/json"',
      "-d",
      `'${JSON.stringify(body)}'`,
      "https://accounts.google.com/o/oauth2/token"
    ].join(" ");
    
    console.log(command);
    
    $ node script2.js
    curl -X POST -H "Content-Type: application/json" -d '{"code":"aaa","client_id":"xxx.apps.googleusercontent.com","client_secret":"yyy","redirect_uri":"http://localhost:8000","grant_type":"authorization_code"}' https://accounts.google.com/o/oauth2/token
    
    # ↑このコマンドをコピペして実行すると下記のレスポンスが返ってくる
    
    {
      "access_token": "xxx",
      "expires_in": 3600,
      "refresh_token": "zzz", // これが欲しかった!!
      "scope": "https://www.googleapis.com/auth/youtube",
      "token_type": "Bearer"
    }%
    
    

    4: refresh_token을 사용하여 인증이 필요한 API를 두드리기


    //
    // script3.js
    //
    
    import { google } from "googleapis";
    
    const getAuthorizedYoutubeClient = () => {
      const OAuth2 = google.auth.OAuth2;
      const clientId = "xxx.apps.googleusercontent.com";
      const clientSecret = "yyy";
      const refreshToken = "zzz";
      const authClient = new OAuth2(
        clientId,
        clientSecret,
        "http://localhost:8000"
      );
    
      authClient.setCredentials({ refresh_token: refreshToken });
      return google.youtube({
        version: "v3",
        auth: authClient
      });
    };
    
    const client = getAuthorizedYoutubeClient();
    client.playlists.insert({
      part: "snippet,status",
      requestBody: {
        snippet: {
          title: "playlist title",
          description: "playlist description"
        },
        status: {
          privacyStatus: "public"
        }
      }
    }).then(result => {
      console.log(result);
    });
    

    이제 마음대로 refresh_token을 사용하여 인증하고 API를 두드려줍니다.
    이 라이브러리는 매우 편리합니다.

    기타 감상


  • 일괄 처리를 위해 server_key token을 발행하면 쉽습니다.
  • Youtube Data API의 할당량 사용량 제한이 너무 엄청나다.
  • ぇぺぺrs. 오, ぇ. 코 m / 요츠 베 / v3 / 껄껄 g-s r d? hl = 그럼 # 쿠오타
  • 처리가 버그되어 플레이리스트 잘못해서 만들어 버렸다 → 지우기 → 재처리하여 다시 플레이리스트 생성하기 → 사용량 오버 오류
  • 이런 식으로, 동작 확인하려고하면 다음날까지 기다리는 날개가 되었다


  • 근본적인 문제이지만 refresh_token의 expire가 어느 정도인지 불명
  • h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 8953983 / 드 - 오 ぇ - 라 f sh-와 켄 s - 에 x 필
  • ↑이 교환에서는 「expire하지 않는다」 「대량으로 refresh_token을 발행하면 낡은 것으로부터 invalid가 된다」라고 하는 기술이 있다

  • 기사 쓰고 나서 깨달았지만, 본가와 비슷한 문서가 있었다
  • htps : //에서 ゔぇぺぺrs. 오, ぇ. 코 m/요츠베/v3/구이로 s/모ゔㅃ g_와 _오아 th? hl = 그럼

  • 좋은 웹페이지 즐겨찾기