前提・実現したいこと
GAS(Google Apps Script)を用いて、ニコニコ動画の動画を自分のドライブの所定のフォルダにアップロードするコードを書いています。
発生している問題・エラーメッセージ
ニコ動のgetFlvを用いて、動画のURLを取得することには成功したのですが、ドライブに動画をアップロードしたところ、動画ファイルが途中までしかアップロードされておらず、最後まで見ることができませんでした。
エラーメッセージは出ていません。
該当のソースコード
code.gs
//雑なコードですいません。お目汚し失礼します。 function download(id){ //メールアドレスとパスワードをベタ書き var mail = "メールアドレス", pass = "パスワード"; //ユーザーセッションを取得 var userSession = getUserSession(mail, pass); //ユーザーセッションが取得できていたら if(userSession){ Logger.log("session=" + userSession); Utilities.sleep(5000); var nicohistory = getNicoHistory(id); if(nicohistory){ Utilities.sleep(5000); //getflvを実行 var data = getFlv(id, userSession, nicohistory); for(var i = 0; i < data.length; i++){ var temp = data[i].split("="); if(temp[0].match("url")){ //URLを取得 var url = unescape(temp[1]); Logger.log(url); Utilities.sleep(5000); //blobを取得 var blob = getBlob(url, userSession, nicohistory); if(blob){ //アップロードする var parentDir = "1hcyYh8HBVx8YRCN7LyMrL_sbMJXhMoXI"; var file = Drive.Files.insert({ title: "sm" + id, parents: [{id: parentDir}] }, blob); return file.alternateLink; } } } } } return null; } function doGet() { var htmlOutput = HtmlService.createTemplateFromFile("main").evaluate(); htmlOutput.setTitle("ニコ動DL"); return htmlOutput; } //ユーザーセッションとやらを取得する function getUserSession(mail_tel, password){ //ニコニコにログインするURL var url = "https://secure.nicovideo.jp/secure/login?site=niconico"; //postする情報 var payload = { "mail_tel" : mail_tel, "password" : password }; //リクエストに使うヘッダー var header = { "Cookie" : "" }; //リクエストに使用するパラメータ var params = { "method":"post", "headers":header, "payload":payload, "followRedirects":false } //URLにリクエストを送る var resp = UrlFetchApp.fetch(url, params); //レスポンスからSet-Cookieを取得しcookieオブジェクトを取得する var setcookie = resp.getAllHeaders()["Set-Cookie"]; //ユーザーセッションを取得する if(setcookie){ Logger.log("getUserSession:" + setcookie); //setCookieを一つづつ見ていく for(var i = 0; i < setcookie.length; i ++){ //先頭のCookieを取得? var temp = setcookie[i].split(";")[0]; //=で名前と値が分かれている temp = temp.split("="); //名前がuser_sessionである if(temp[0].match("user_session")){ //値にdeletedを含まない if(!temp[1].match("deleted")){ return temp[1]; } } } }else{ Logger.log("No Cookie"); } return null; } //nicoHistoryとやらを取得する function getNicoHistory(id){ //ニコニコにログインするURL var url = "https://www.nicovideo.jp/watch/sm" + id; //リクエストに使用するパラメータ var params = { "method":"get", "followRedirects":false } //URLにリクエストを送る var resp = UrlFetchApp.fetch(url, params); //レスポンスからSet-Cookieを取得しcookieオブジェクトを取得する var setcookie = resp.getAllHeaders()["Set-Cookie"]; //ユーザーセッションを取得する if(setcookie){ Logger.log("getNicoHistory:" + setcookie); //setCookieを一つづつ見ていく for(var i = 0; i < setcookie.length; i ++){ //先頭のCookieを取得? var temp = setcookie[i].split(";")[0]; //=で名前と値が分かれている temp = temp.split("="); //名前がuser_sessionである if(temp[0].match("nicohistory")){ return temp[1]; } } }else{ Logger.log("No Cookie"); } return null; } //getflvを実行(動画データを取得 function getFlv(id, session, nicohistory){ var url = "http://flapi.nicovideo.jp/api/getflv/sm" + id; //ユーザーセッションを設定 var headers = { "Cookie" : "user_session=" + session + "; nicohistory=" + nicohistory }; // リクエストオプションにheadersを設定 var options = { "headers" : headers } // リクエスト var resp = UrlFetchApp.fetch(url, options).getContentText(); //&で分割 var val = resp.split("&"); return val; } //getflvを実行(動画データを取得 function getBlob(url, session, nicohistory){ //ユーザーセッションを設定 var headers = { "Cookie" : "user_session=" + session + "; nicohistory=" + nicohistory }; // リクエストオプションにheadersを設定 var options = { "headers" : headers } // リクエスト var resp = UrlFetchApp.fetch(url, options); var blob = resp.getBlob(); return blob; }
main.html
<!DOCTYPE html> <html> <head> <base target="_top"> <style> body { background-color: #404040; } </style> </head> <body> <input type="text" id="url" placeholder="動画URLを入力"> <button id="dlButton">ダウンロード</button> <br> </body> <script> var dlButton; var inputUrl; window.onload = function(){ dlButton = document.getElementById("dlButton"); inputUrl = document.getElementById("url"); dlButton.addEventListener("click", function(e){ var id = inputUrl.value.replace(/^.+sm/, "").replace(/?.+$/, "") google.script.run.withSuccessHandler(function(val){ if(val){ alert("ダウンロード完了:" + val); }else{ alert("読み込み失敗"); } }).download(id); alert("ダウンロード中:" + id); }); }; </script> </html>
「gas drive insert blob 制限」、「niconico getflv 止まる」などで検索してみたのですが原因が分からず、困っています。
補足情報(FW/ツールのバージョンなど)
google apps script
ChromeV8搭載の新ランタイムだと3MB、
旧ランタイムだと4.4MBほどまでしかアップロードできていませんでした。
teratail初利用の為、質問の仕方に至らぬ点があったらすいません。
追記:11MBほどまでアップロードできるようになりました。50MBまでアップロードできないのはなぜなのでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/20 04:21 編集