Salesforce apex から youtubeアップロード

■環境準備:

以下、

①googleアカウント作成する

https://console.cloud.google.com/home/dashboard?project=uploadfromsalesforcedemo&authuser=0&hl=ja&supportedpurview=project

② プロジェクト作成する

③ 管理画面の「APIとサービス」 」に移動する。

   ・「ライブラリ」に移動し、「YouTube Data API v3」を追加する

   ・「認証情報」に移動し、「OAuth 2.0 クライアント ID」を作成する。

④ refresh_token 取得する用の code を取得する。

  ① 以下をブラウザにて開く

  「https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=[client_id]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube&access_type=offline」

    ⇒「Google にログイン」⇒表示したコードメモする。

➁上記取得したコードを以下でrefresh_tokenとtokenを取得する

     curl –data “code=[code]” –data “client_id=[client_id]” –data “client_secret=[ client_secret ]” –data “redirect_uri=urn:ietf:wg:oauth:2.0:oob” –data “grant_type=authorization_code” –data “access_type=offline” https://www.googleapis.com/oauth2/v4/token

※Linux環境にて確認済み

いかのような値取得できます。

{
“access_token”: “xxxxxxxxxxxxxxx”,
“expires_in”: 3599,
“refresh_token”: “xxxxxxxxxxxxxxxxxxx”,
“scope”: “https://www.googleapis.com/auth/youtube”,
“token_type”: “Bearer”
}

➄ youtube チャンネル作成する。(デフォルト)

■apxコード

※ 上記取得した refresh_token 利用し、実行時に access_tokenを取得し、アップする。

    public static String getGoogleApiToken(){
        String access_token ='';
        HttpRequest req = new HttpRequest();
        String client_id = 'xxx';
        String client_secret = 'xx';
        String refresh_token ='xx';

        String endPoint = 'https://accounts.google.com/o/oauth2/token';
        req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
        req.setEndpoint(endPoint);
        req.setMethod('POST');
          String body = 'client_id='+EncodingUtil.urlEncode(client_id,'UTF-8') 
          +'&client_secret='+EncodingUtil.urlEncode(client_secret,'UTF-8')
          +'&refresh_token='+EncodingUtil.urlEncode(refresh_token,'UTF-8')
          +'&grant_type='+EncodingUtil.urlEncode('refresh_token','UTF-8');
        req.setBody(body);

        Http http = new Http();
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));

        if(res.getStatusCode() == 200){
            Map<String, Object> requestBody = (Map<String, Object>)JSON.deserializeUntyped(res.getBody());
            access_token = String.valueOf(requestBody.get('access_token'));
            system.debug('access_token=' + access_token);
        }
        return access_token;
     }
  public static String uploadFileToYoutube(String pId){
        String access_token = getGoogleApiToken();

        List<ContentVersion> cvList = getContentVersionList(pId);
        String endPoint = 'https://www.googleapis.com/upload/youtube/v3/videos';
        //以下設定方法また不明

    /**
            + '&part='+EncodingUtil.urlEncode('snippet','UTF-8') 
            + '&snippet.title='+EncodingUtil.urlEncode('test of a title','UTF-8')
            + '&snippet.title='+EncodingUtil.urlEncode('test of a title','UTF-8')
            + '&status.license='+EncodingUtil.urlEncode('creativeCommon','UTF-8')
            + '&snippet.description='+EncodingUtil.urlEncode('test of video description','UTF-8');

        ***/
        HttpRequest req = new HttpRequest();
        req.setHeader('Content-Type', 'application/octet-stream');
        // req.setHeader('Content-type', 'video/mp4');
        req.setHeader('Authorization', 'Bearer '+ access_token);
        req.setEndpoint(endPoint);
        req.setMethod('POST');
        req.setBodyAsBlob(cvList[0].VersionData);

          Http http = new Http();
          HTTPResponse res = http.send(req);
  
          System.debug('*Resp:' + String.ValueOF(res.getBody()));

          if(res.getStatusCode() == 200){
              return endPoint;
          }
          return '';
     }

現状、動画アップできましたが、「利用規約とポリシー」で自動的に非公開にしてしまいました。。。

参考:

https://pretagteam.com/question/upload-video-on-youtube-using-curl-and-api-v3

https://qiita.com/shin1ogawa/items/49a076f62e5f17f18fe5