- GitHub - dyama/berryjack: The simple twitter media downloader
- Twitterの画像を一括ダウンロードするシェルスクリプト「berryjack」を書いた。 – dyama's page
検索すると色々出てくるけど、シンプルにシェルスクリプトというのがよさげ。
基本的なアイデアは生きてるけど、今のtwitterの仕様では動画がダウンロードできないらしい。
GIF動画についてはこちらのページのやり方でいける。
mp4の動画はどうしようかと思って色々と悩んだ結果、youtube-dlに任せることにした。名前からしてYoutube専用なのかと思ったら色々なサイトから動画がダウンロードできて便利ね。
あとは不具合ではないんだけど、-oオプション(:orig)を付けた際にファイル名が "*.jpg%3Aorig" みたいになって見にくいのを直した。
全体的にはこんな感じか。時間があったら後で備忘録として実装の説明を書いておきたい。
youtube-dlにcookieを渡してないので、ログインしないとダメなヤツは保存できない。ま、必要になったら追加しよう・・・
$ diff -u berryjack berryjack.org --- berryjack 2017-10-18 02:12:01.985022700 +0900 +++ berryjack.org 2017-10-17 23:34:22.090356500 +0900 @@ -4,9 +4,6 @@ SCRIPT_DIR=$(cd $(dirname $0);pwd) source "$SCRIPT_DIR/common.sh" -YOUTUBE_DL=$SCRIPT_DIR/youtube-dl -FFMPEG=$SCRIPT_DIR/ffmpeg - function get_profile_image() { src="$1" @@ -130,31 +127,6 @@ # skip=1 # fi done - - # video(2) - GIF - # cf. http://www.unknownengineer.net/entry/2017/06/03/193913 - for video in $(grep -Eo 'https://pbs\.twimg\.com/tweet_video_thumb/[a-zA-Z0-9_\-]+\.(jpg|png)' $tmp |sort |uniq |sed -e "s/pbs.twimg.com\/tweet_video_thumb/video.twimg.com\/tweet_video/" | sed -e "s/jpg/mp4/") - do - exist "$dir" "$video" - done - - # video(3) - MP4(HLS) - # save sumbnails - for image in $(grep -Eo 'https://pbs\.twimg\.com/ext_tw_video_thumb/[0-9]+/[a-z]+/[a-z]+/[a-zA-Z0-9_\-]+\.(jpg|png)' $tmp) - do - exist "$dir" "$image" - done - # save videos - for video in $(grep -Eo 'data-conversation-id="[0-9]+"|ext_tw_video_thumb' $tmp | grep -B 1 ext_tw_video_thumb | grep data-conversation-id | grep -Eo '[0-9]+' | sed -e "s/^/https\:\/\/twitter.com\/$id\/status\//") - do - m3u8url=$($YOUTUBE_DL -g $video) - video2=$(echo $(basename $m3u8url) | sed -e 's/\.m3u8/.mp4/') - exist "$dir" "$video2" > /dev/null - if [ $? -eq 0 ]; then - echo $m3u8url - fi - done - # image for image in $( grep -Eo 'https://pbs\.twimg\.com/media/[a-zA-Z0-9_\-]+\.(jpg|png)' $tmp | sort | uniq | \ (if [ $orig -eq 0 ]; then @@ -164,18 +136,9 @@ fi ) ) do - if [ $orig -eq 0 ]; then - exist "$dir" "$image" - if [ $? -ne 0 ]; then - skip=1 - fi - else - exist "$dir" "$(echo $(basename $image) | sed -e 's/:orig$//')" > /dev/null - if [ $? -ne 0 ]; then - skip=1 - else - echo $image - fi + exist "$dir" "$image" + if [ $? -ne 0 ]; then + skip=1 fi done if [ $force -ne 1 -a $skip -eq 1 ]; then @@ -276,17 +239,7 @@ fi for media_url in $(get_media_url $id $get_orig "$cookie_file" $userdir $force) do - echo $media_url | grep -E '\.m3u8' > /dev/null 2>&1 - if [ $? -eq 0 ]; then - $YOUTUBE_DL -o "${userdir:+${userdir}/}%(id)s.%(ext)s" --ffmpeg-location $FFMPEG $media_url - else - echo $media_url | grep -E ':orig$' > /dev/null 2>&1 - if [ $? -eq 0 ]; then - wget $cookie_opt -nc -nv -P "$userdir" -O ${userdir:+${userdir}/}$(echo $(basename $media_url) | sed -e 's/:orig$//') "$media_url" - else - wget $cookie_opt -nc -nv -P "$userdir" "$media_url" - fi - fi + wget $cookie_opt -nc -nv -P "$userdir" "$media_url" done else get_media_url $id $get_orig "$cookie_file" "" $force