芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

ようつべ動画のサムネのダウンロードの仕方

kusoimox.hatenablog.jp で更新してあるようにスクリプトからだとアクセスが嫌われてしまって情報がダウンロードできないのですが, ブラウザにそのURLを入力すればファイルとしてダウンロードできます.

ふと,ある動画のサムネが欲しいなぁっと思ったとき,以上の方法でサムネのURLならゲットできるだろうということで ブラウザを使用してURLをゲットしてみました~

サムネのURLを探して...

f`https://youtube.com/get_video_info?video_id={任意のYouTube動画のid}`

をブラウザのURL入力に入力してENTERを押すと,その動画のget_infoがダウンロードされるので, ダウンロードされたらメモ帳なんかのテキストエディタで開き, ”videoDetails”を検索すると,それ以降の文字列に動画の情報が書いてある. その下に"url"というのが複数あり,その隣にサムネのURLが書いてあったりする.

ただ,なんかに変換されている文字列なので,Pythonならば以下の

from urllib.parse import unquote
unquote("URLを含んだ部分の文字列")

で人に分かるような文字列にする. それでURLをブラウザに入力すればサムネがダウンロードできる. 動画本体はおそらく無理ですね. 見当たらない...

コレを使えばいいだけだった

※今後使えなく可能性はあるので注意

f'https://i.ytimg.com/vi_webp/{任意のYouTube動画のid}/maxresdefault.webp'

生放送とか特殊なものではない限りは以上のURLに動画IDを貼るだけでおkだと思います. "webp"というのがサムネの中で最も大きいっぽいです. JPEGならhttps://i.ytimg.com/vi/{任意のYouTube動画のid}/hqdefault.jpgでいくつかの動画はサムネをゲットできるはず.

スクリプト


# -*- coding: utf-8 -*-
import os
import mechanize
from mechanize import Browser,Request
from time import sleep
import logging
logging.basicConfig(level=logging.INFO,format='[%(process)d:%(asctime)s] %(message)s')

import sys
if sys.version_info.major < 3:
    from urllib2 import HTTPError, URLError
else:
    from urllib.error import HTTPError, URLError

def path():
    import wx
    app=wx.App()
    wx.MessageBox('保存先フォルダを選択してください','フォルダ選択',wx.STAY_ON_TOP)
    # フォルダ選択ダイアログを作成
    folda = wx.DirDialog(None,style=wx.DD_CHANGE_DIR | wx.OK | wx.STAY_ON_TOP,message="保存先フォルダ")
    # フォルダが選択されたとき
    if folda.ShowModal() == wx.ID_OK:
        folda_path = folda.GetPath()
        folda.Destroy()
        return folda_path

def download(vid:str):
    fpath = path()
    
    br = Browser()
    br.set_handle_equiv(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
    br.addheaders = [('User-Agent', 'ja-jp'),
                    ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
                    ('Connection','keep-alive')]
    br.set_handle_robots(False)

    while True:
        try:
            br.open(f'https://i.ytimg.com/vi_webp/{vid}/maxresdefault.webp')
            data = br.response().read()
            break
        except:
            sleep(30)
            continue

    with open(os.path.join(fpath,f"{vid}.webp"),mode="wb") as f:
        f.write(data)
    logging.info("webp download finish")

    from PIL import Image
    img = Image.open(os.path.join(fpath,f"{vid}.webp"))
    img.save(os.path.join(fpath,f"{vid}.png"),"png")
    logging.info("png convert finish")

if __name__ == "__main__":
    download(input("Youtube video id:"))
else:
    download(sys.args[1])

Pythonで画像をまとめてwebpに変換 | なるころぐ によると,webpはGoogleが開発したフォーマットのようで, JPEGよりも軽量なようです.

ただ,デスクトップの背景に使いたい場合,webpは選択できませんので, 容量を気にしないのであればpngに変換しなければなりません. そのため,PILpngに変換する処理を上記スクリプトの処理の最後に行っています.

実行してPIL.UnidentifiedImageError: cannot identify image fileが出たら, pip install --upgrade Pillowでバージョン7以上にしておきましょう.


・参考