質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

1回答

1109閲覧

[GAS]Googleドライブへのニコ動の動画ファイルのアップロードが途中までしかできない

KojimaYuuki

総合スコア24

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2020/02/19 16:29

編集2020/02/20 10:18

前提・実現したいこと

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までアップロードできないのはなぜなのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

検証してみました。

まず、UrlfetchAppは**制限があります**。1回辺りの制限が50MBまでです。そして、実際そのコードでやってみた所、たしかに動画は取得され、ドライブに格納されますが、きっちり50MBで切れます。

なので、そのファイルサイズ以上に取れてますが、動画のサイズ自体が50MBを超えているので、それが原因かもしれません。また、一部の動画は403エラーが出ます(これは、UrlfetchAppを連続で回しすぎてる事が原因だったかもしれません)

例えばコレとかは取得ができません。古い動画はniconico内部で継ぎ接ぎになっていて、古いものは新しいものとURLこそ同じですが、取れないものは昔からあります。
https://www.nicovideo.jp/watch/sm2927385

イメージ説明

投稿2020/02/20 00:40

編集2020/02/20 00:43
officeforest

総合スコア412

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojimaYuuki

2020/02/20 04:21 編集

回答していただきありがとうございます。 「まず、UrlfetchAppは制限があります。1回辺りの制限が50MBまでです。そして、実際そのコードでやってみた所、たしかに動画は取得され、ドライブに格納されますが、きっちり50MBで切れます。 なので、そのファイルサイズ以上に取れてますが、動画のサイズ自体が50MBを超えているので、それが原因かもしれません。」 制限があるんですね。知りませんでした。しかし、当方では50MBまですら取得できていない現状があります。これについては改善する方法などございますでしょうか?公開方法などで変わるのですか?因みに、取得しようとした動画のフルサイズは、15MB程度だったと思います。 「また、一部の動画は403エラーが出ます(これは、UrlfetchAppを連続で回しすぎてる事が原因だったかもしれません)」 これに関しては、sleepで時間を空けて処理するように変更しようと思います。 「例えばコレとかは取得ができません。古い動画はniconico内部で継ぎ接ぎになっていて、古いものは新しいものとURLこそ同じですが、取れないものは昔からあります。 https://www.nicovideo.jp/watch/sm2927385」 これは知らなかったです。別の方法が何か無いか、自分で考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問