‘半自動’ タグのついている投稿

twitpic閉鎖らしいので画像を保存するスクリプト書いたよ

2014年9月7日 Linux, スクリプト関連

2014/10/18 追記 :
リストの取得ができなくなったため、このスクリプトは正常に動かなくなりました。
画像のエクスポートが必要な方はtwitpicにログイン後、http://twitpic.com/account/settings からエクスポート機能を利用してください。

他所でrubyのとか見かけたけどせっかくだからと思ってShellscriptで書いた。
使用前に3行目と4行目ともしかしたら47行目をそれぞれの環境に合わせて書き換えて使うといいよ。
自分のアカウントじゃなくても使えるのであの人の絵残しときたいな、あの人の写真残しときたいなとか色々使えると思う。

ダウンロードはここ(https://github.com/fyopue/DLtwitpic)
ソースがスーパー汚いけどもとりあえず使える。

動作確認はLinux Mint 17でやったから多分Ubuntuでも平気。

#!/bin/bash
workdir=/tmp/
dld=/home/usr/twitpic/
usrid=twitpicusrname
seed=1

if [ ! -d ${dld} ]
then
  mkdir ${dld}
fi

cd ${workdir}
wget -P ${workdir} http://twitpic.com/photos/${usrid}

#末尾ページ認識
lend=`cat "${workdir}${usrid}" | sed "s/\t\|  //g" | tr -d "\n" | sed -e "s/<div id\=\"user\-pagination\">/\n<div id\=\"user\-pagination\">/g" | grep pagination | sed -e "s/></\n/g" | grep Last | grep -o [0-9] | tr -d "\n"`

#
rm ${workdir}${usrid}


#リスト生成
for (( i = 0; i < ${lend}; i++ ))
{

  sleep "1" && wget -P ${workdir} http://twitpic.com/photos/${usrid}?page=${seed}

#抜き取り
  cat "${workdir}${usrid}?page=${seed}" | sed "s/\t\|  //g" | tr -d "\n" | sed -e "s/<div class\=\"user\-photo\-wrap\">/\n<div class\=\"user\-photo\-wrap\">/g" -e "s/<div id\=\"user\-pagination\">/\n<div id\=\"user\-pagination\">/g" | grep -v javascript | grep -o \"\/.*\"\>\<img | sed -e "s/\"\|><img//g" -e "s/^/http\:\/\/twitpic\.com/g" -e "s/$/\/full/g" >> list

#
  rm /tmp/${usrid}?page=${seed}

  (( seed++ ))

}


#画像取得
wrk=`cat ${workdir}list | wc -l`
seed=1

for (( i = 0; i < ${wrk}; i++ ))
{

  sleep "1" && wget -P ${workdir} `cat ${workdir}list | head -${seed} | tail -1`
  sleep "1" && wget -P "${dld}" `cat ${workdir}full | grep d3j5vwomefv46c | grep -o \"[@-~].*\? | sed "s/\"\|\?//g"`

#
  rm ${workdir}full

  (( seed++ ))

}

#
rm ${workdir}list

そういえば、最近はコマンド内でコマンド実行させるのに$()←こんなのつけるのが推奨されてるらしいですねっ!!

日付に頼らずにバックアップの世代管理

2013年11月4日 Linux, スクリプト関連

先月の頭あたりにツイートしたきり放置してたやつ。
世代管理というとdateコマンドで日付を特定して古い日付のを削除して・・・とか思いがちだけど、たまたまサーバが落ちてましたとか電源切ってましたとかで削除されなかった時にゴミが残り続けてしまうのでファイル数上限を設定する方が上等かなと。

#!/bin/bash

cd "/filedir/daily/"
dt=`date +%Y%m%d%H`
/usr/bin/crontab -l > "tablog${dt}.txt"
fl=`ls | wc -l`
fn="${1}"
if [ -z "${fn}" ]
then
  fn="10"
fi
if [ ${fl} -gt ${fn} ]
then
  rmf=$(( ${fl} - ${fn} ))
  rm `ls | head -${rmf}`
fi

Qiitaに初投稿しちゃおうかと思ったんだけど、その前にこっちで出しとく。
なぜならQiitaは自分のホームではないから。
既にgithubでは公開済みだし。

半端ないアウェー感。

Visitorsでログ取りするスクリプトに恥ずかしいバグが・・・

2010年7月4日 スクリプト関連, 雑記

何だか2日に実行し忘れて後日処理を行ったときの月次処理が行われないとか、圧縮ファイルを作るときに含まれているべきファイルが抜けているとか色々恥ずかしい感じのところを修正した。
使い方はこのページにある通り

#!/bin/bash
### kotokoilogs_v3.1
drv () {
    cat access_log${2} >>acl${1}.txt
    visitors -A -m 250 acl${1}.txt >acl${1}.html
}
ext () {
    local rnmMt=`date -d "$(( 2 + ${dag} )) days ago" '+%Y%m'`
    echo ${rnmMt}
    mv acl1.txt acl${rnmMt}.txt
    mv acl1.html ./monthly/acl${rnmMt}.html
    zip -5 acl${rnmMt}.zip acl${rnmMt}.txt ./monthly/acl${rnmMt}.html ./daily/*.*
    rm acl${rnmMt}.txt ./daily/*.*
    cp access_log${2} acl1.txt
}
logs () {
    wget -P "/home/user/dir/logs" "ftp://ID:PASS@domain/../logs/access_log${2}"
    drv 2 ${2}
    local Dt=`date -d "${dag} days ago" '+%d'`
    case "${Dt}" in
        #今日は2日です
        02 ) ext 0 ${2} ;;
        #今日は2日ではありません
        * ) echo "通常処理" ;;
    esac
    drv 1 ${2}
    visitors -A -m 250 access_log${2} >./daily/${ymd}.html
    rm "access_log${2}"
    case "${1}" in
        0 ) echo "完了" ;;
        * ) epiphany ./daily/${ymd}.html acl1.html acl2.html ;;
    esac
}
cd '/home/user/dir/logs'
case "${2}" in
    [1-6] ) dag=${2}
    bkdate=_${2}
    ;;
    * ) dag=0 ;;
esac
ymd=`date -d "${dag} days ago" '+%Y%m%d'`
case "${1}" in
    0 ) logs 1 ${bkdate} ;;
    1 ) epiphany ./daily/${ymd}.html acl1.html acl2.html ;;
    * ) logs 0 ;;
esac
### ${ymd}.html -- 日次
### acl1.html -- 月次
### acl2.html -- 累積

シェルスクリプトから自動で短縮URL付きのつぶやきをTwitterに投稿。(修正)

2010年5月2日 Linux, スクリプト関連, 雑記

長~いURLを短縮させようとすると短縮自体は成功するのに本文への反映がされないという現象を確認してしまったので急遽修正版。
修正と言っても1行消しただけなので、その他の仕様は前回と変わってない。

使い方とかはこの辺参照。

#!/bin/bash
str=”$1″
#第一引数からURLを雑に抽出し配列へ
array=( `echo “$1” | sed -e ‘s/http/nhttp/g’ -e ‘s/ftp/nftp/g’ -e ‘s/ /n/g’ | grep tp://` )
#配列に含まれる要素の数分処理
for (( i = 0; i < ${#array[*]}; i++ ))
{
  #配列2は諸事情により削除されました。
  #goo.glで配列のURLを短縮URLに/配列3へ流し込み
  array3[i]=`curl -G “http://ggl-shortener.appspot.com/?url=${array[i]}” | sed ‘s/”/n/g’ | grep tp://`
  #変数strのURL部分を差し替え
  str=`echo $str | sed “s%${array[i]}%${array3[i]}%”`
}
#文字数を軽く確認してからつぶやく
if [ ${#str} -lt 141 ]
  then
    #id、passリストから1行目を読み込み。※書式 id:pass
    IPS=`sed -n 1p ~/working/shellscript/ips.list`
    curl -u “$IPS” -d status=”$str” http://twitter.com/statuses/update.xml
  exit 0
else
  echo ‘文字数多いみたい。’
  exit 1
fi

ガチな暫定コード。これからxAuthに対応させようと思っているので、出来たらまたコード更新の予定。しぇるすくりぷったーとか参考にしようかと思ったけども、Pythonで生で実装してるコードを公開している方がいたので、勉強がてらそっちを移植してみようと思うよ。

そこまで出来れば投稿部分に関してはTwitterクライアントのシェルスクリプト実装の中では最強だもんね。あくまで投稿部分のみだけど。

シェルスクリプトから自動で短縮URL付きのつぶやきをTwitterに投稿。

2010年4月21日 Linux, スクリプト関連, 雑記

行けた行けた。半角スペースの入った引数つけるときは二重引用符じゃダメなのねw
何はともあれ上手く行ったので公開。制限事項は多分前回のものとほとんど変わらずURLの中に「スペース」が混じるとそこで区切られちゃう点。

使い方は簡単でスクリプトの実行時に引数として投稿内容を単引用符(Shift+7 のヤツ)で括ったものを付けて実行するだけ。一応複数のURLでも大丈夫。
URLと本文の切り分けに半角スペースを使っているので、半角スペースを含むURLには前述の通り使えない。

その辺のことは前回の記事を自分で読んだり実際に動かしてみたりして確認してくだしあ。
いま何か頭が働かないんだ。そんなわけで最終成果物。

#!/bin/bash
str=”$1″
#第一引数からURLを雑に抽出し配列へ
array=( `echo “$1” | sed -e ‘s/http/nhttp/g’ -e ‘s/ftp/nftp/g’ -e ‘s/ /n/g’ | grep tp://` )
#配列に含まれる要素の数分処理
for (( i = 0; i < ${#array[*]}; i++ ))
{
  #URLエンコード/配列2へ流し込み
  array2[i]=`echo “${array[i]}” | nkf -eMQ | tr = %`
  #goo.glで配列2のURLを短縮URLに/配列3へ流し込み
  array3[i]=`curl -G “http://ggl-shortener.appspot.com/?url=${array2[i]}” | sed ‘s/”/n/g’ | grep tp://`
  #変数strのURL部分を差し替え
  str=`echo $str | sed “s%${array[i]}%${array3[i]}%”`
}
#文字数を軽く確認してからつぶやく
if [ ${#str} -lt 141 ]
  then
    IPS=`sed -n 1p ~/working/shellscript/ips.list`
    curl -u “$IPS” -d status=”$str” http://twitter.com/statuses/update.xml
  exit 0
else
  echo ‘文字数多いみたい。’
  exit 1
fi

大まかな処理の流れはコメント行の通り。
コメント行読んでどうにかしろっていうのもアレな感じのコードなので、流れだけもうちょっと詳しく書いておく。

まずは1~4行目 変数strに第一引数の中身を代入。次に配列変数arrayにURLを抽出し抽出結果を代入。
5~13行目 for文で配列に含まれる要素の数の分だけ処理。配列変数array2にURLエンコードされたarrayの中身を代入。array2の中身をgoo.glに投げて配列変数array3に結果を代入。変数strのURL部分を差し替えて上書き。
14~23行目 文字数を軽く確認して141文字未満ならつぶやく。そうでないならエラーで終了。

こんな感じ。あ、言うほど面倒くさくなかったね。どうでも良いけどいつも通りインデントが全角なのでそこだけ注意してください。

さ、あとは仕掛かりのリスト生成をこなせば、いつも通りまったり絵を描いて過ごせるよ。

ふぉふぉふぉ、役に立ったならご褒美くらいくださってもよろしくってよ。
ホラこんな所にアマゾンのウィッシュリストが。

Kindle用の画像zipを作ってくれるスクリプトが地味にヤバそうだったので直した。

2010年3月10日 Linux, スクリプト関連, 雑記

間違えてディレクトリの指定無とかで実行しちゃったときユーザルートのファイルが光の速さでお亡くなりになるのは正直アレ過ぎるのでディレクトリの指定が空だったり、解像度指定が空だったりしたときにエラーで終了するようにした。

追加したのは太字部分。
想定しているエラーの条件は以下の通り。

・ディレクトリの指定を忘れて解像度の指定のみ入れた場合 — この場合は当然exit。
・ディレクトリの指定、解像度の指定の両方を忘れた場合 — この場合は解像度指定の段階でexit。
・解像度の指定を忘れた場合 — この場合は解像度指定の段階でexit。
・存在しないディレクトリを指定した場合 — この場合はcdの実行失敗で$?に1が入っているはずなのでexit。

ホントは削除する前にお伺いを立てるようなのの方がやり方としてお行儀いい気もするけども、いちいち消すか消さないかっていうメッセージのところで処理が止められてるのも邪魔くさいのでそれはしない方向で。

使い方はそのまま。ディレクトリと対象機器(k2、kdx)を引数として付けて実行。

#!/bin/bash
case “$1” in
  k2 | kdx ) echo “err:ディレクトリが指定されていません。”
  exit 1
  ;;
  * ) cd $1 ;;
esac
case “$?” in
  1 ) echo “err:ディレクトリの指定が間違っています。”
  exit 1
  ;;
esac

#対象機器の解像度指定
##k2 — Kindle2
##kdx — Kindle DX
case “$2” in
  k2 ) rez=800 ;;
  kdx ) rez=1200 ;;
  * ) echo “err:対象機器が指定されていません。”
  exit 1
  ;;

esac
#拡張子を配列に
ext=( jpg JPG jpeg JPEG gif GIF png PNG )
for (( i = 0; i < 8; i++ ))
{
  #画像ファイルのみのリスト生成
  ls | grep .${ext[i]} >>zlist.lst
}
#リスト行数取得
p=`wc -l <zlist.lst`
for (( i = 0; i < $((p + 1)); i++ ))
{
  case “$i” in
    0 ) ;;
    * )
      #ファイルサイズ変更後、元ファイル削除
      val=`printf “%03d” $i`
      flname[i]=`sed -n “$i”p zlist.lst`
      convert -resize “$rez”x”$rez” “${flname[i]}” p”$val”.jpg
      rm “${flname[i]}”
    ;;
  esac
}
bn=`basename $1`
zip ../”$bn”.zip *.*
rm *.*
cd ..
rmdir “$bn”

例によって例のごとくインデントが全角です。

役に立ったならご褒美くらいくださってもよろしくってよ。
ホラこんな所にアマゾンのウィッシュリストが。

Kindle用の画像zipを作ってくれるスクリプト。

2010年3月5日 スクリプト関連, 雑記

とりあえずで【1】のスクリプトを書いたんだけど、
いちいちファイル名を整えて・・・とかやるのが面倒くさくなってきちゃったので、新しく【2】に書き直した。
使い方は実行の時にディレクトリと対象機器(k2、kdx)を引数として付けて実行するだけ。
実行すると実際にファイルが処理されようがされまいが最終的に指定ディレクトリ内のファイルが全て削除されるので、万一使うような場合はその辺気をつけて使ってください。

【1】

#!/bin/bash
cd $1
p=`ls | wc -l`
c=1
for (( i = 0; i < $((p + 1)); i++ ))
{
  val=`printf “%03d” $c`
  val2=”p””$val”
  convert -resize 800×800 “$val””.jpg” “$val2″”.jpg”
  rm “$val””.jpg”
  c=$((c + 1))
}

【2】

#!/bin/bash
cd $1
#対象機器の解像度指定
##k2 — Kindle2
##kdx — Kindle DX
case “$2” in
  k2 ) rez=800 ;;
  kdx ) rez=1200 ;;
esac
#拡張子を配列に
ext=( jpg JPG jpeg JPEG gif GIF png PNG )
for (( i = 0; i < 8; i++ ))
{
  #画像ファイルのみのリスト生成
  ls | grep .${ext[i]} >>zlist.lst
}
#リスト行数取得
p=`wc -l <zlist.lst`
for (( i = 0; i < $((p + 1)); i++ ))
{
  case “$i” in
    0 ) ;;
    * )
      #ファイルサイズ変更後、元ファイル削除
      val=`printf “%03d” $i`
      flname[i]=`sed -n “$i”p zlist.lst`
      convert -resize “$rez”x”$rez” “${flname[i]}” p”$val”.jpg
      rm “${flname[i]}”
    ;;
  esac
}
bn=`basename $1`
zip ../”$bn”.zip *.*
rm *.*
cd ..
rmdir “$bn”

地味に説明が面倒くさいのでとりあえず流れだけ説明。
・実行すると変数rezに解像度の値を代入、配列変数extに画像の拡張子を代入。
・画像ファイルのみのリスト生成、リスト行数取得。
・ファイルサイズ変更、ファイル名を連番にしつつ元ファイルを削除。
・変数bnに現在のディレクトリ名を代入、一つ上のディレクトリに書庫を作成。
・ファイル、ディレクトリ削除。

と言う流れ。気が向いたらそのうち詳しく説明するかもしれないけども期待はしない方が良い。
例によって例のごとくインデントが全角です。

役に立ったならご褒美くらいくださってもよろしくってよ。
ホラこんな所にアマゾンのウィッシュリストが。

これで、おかたづけまで完璧だ。

2010年2月25日 Linux, スクリプト関連, 雑記

こうで、

ext () {
  rnmMt=`date -d ‘2 days ago’ ‘+%Y%m’`
  mv acl1.txt acl$rnmMt.txt
  mv acl1.html acl$rnmMt.html
  zip -5 acl$rnmMt.zip acl$rnmMt.txt acl$rnmMt.html
  rm acl1.txt acl$rnmMt.txt
  cp access_log acl1.txt
}

↓↓↓↓↓

ext () {
  rnmMt=`date -d ‘2 days ago’ ‘+%Y%m’`
  mv acl1.txt acl$rnmMt.txt
  mv acl1.html acl$rnmMt.html
  zip -5 acl$rnmMt.zip acl$rnmMt.txt acl$rnmMt.html ./daily/*.*
  rm acl1.txt acl$rnmMt.txt ./daily/*.*
  cp access_log acl1.txt
}

こう。

visitors -A -m 250 access_log >$ymd.html

↓↓↓↓↓

visitors -A -m 250 access_log >./daily/$ymd.html

※太字が追加部分。
これならファイルが増えすぎて泣くこともない。
【「Visitorsでアクセスログを読み(ry」を書き直し。】の差分。これでばっちり。

「Visitorsでアクセスログを読み(ry」を書き直し。

2010年2月25日 Linux, スクリプト関連, 雑記

【Visitorsでアクセスログを読みやすくしたりその他いろいろ。】のスクリプトをもっとスマートにできないものかと思って書き直してみた。
書き直しついでに日次ログも残すようにしてみた。使い方はそのまま。

なんかまたやらなきゃいけない処理が増えた気がするので日次処理しない方がいい気もしないでない。
これだと日次ログが雪だるま式に増えて行くことになるし・・・

#!/bin/sh
drv () {
  cat access_log >>acl$1.txt
  visitors -A -m 250 acl$1.txt >acl$1.html
}
ext () {
  rnmMt=`date -d ‘2 days ago’ ‘+%Y%m’`
  mv acl1.txt acl$rnmMt.txt
  mv acl1.html acl$rnmMt.html
  zip -5 acl$rnmMt.zip acl$rnmMt.txt acl$rnmMt.html
  rm acl1.txt acl$rnmMt.txt
  cp access_log acl1.txt
}
logs () {
  wget -P ‘/home/user/dir/logs’ ‘ftp://user:pass@server/dir/logname’
  visitors -A -m 250 access_log >$ymd.html
  drv 2
  Dt=`date ‘+%d’`
  case “$Dt” in
    #今日は2日です
    02 ) ext ;;
    #今日は2日ではありません
    * ) echo “通常処理” ;;
  esac
  drv 1
  case “$1” in
    0 ) echo “完了” ;;
    * ) epiphany $ymd.html acl1.html acl2.html ;;
  esac
  rm ‘access_log’
}
cd ‘/home/user/dir/logs’
ymd=`date ‘+%Y%m%d’`
case “$1” in
  0 ) logs ;;
  1 ) epiphany $ymd.html acl1.html acl2.html ;;
  * ) logs 0 ;;
esac

Visitorsでアクセスログを読みやすくしたりその他いろいろ。

2010年2月4日 Linux, スクリプト関連, 雑記

今日はちょっと気分を変えてシェルスクリプトを一つ。
アクセスログを読みやすくしてローカルに溜め込むスクリプトです。
溜め込みついでに月ごとのログとログ取り開始からの累積ログの2種類を溜め込むようになってます。

使い方は簡単で一日一回、引数0か1か引数なしでスクリプトを呼び出すだけ。
あとは勝手にログを溜め込んで期日(毎月2日)がきたら一ヶ月分の生ログテキストと加工済みログを圧縮して片付けます。自分で使用することのみを想定しているのでそれしかできません。

引数に対応する機能は次の通りです。
・引数0はログの取得/加工後ブラウザで確認
・引数1はログをブラウザで確認のみ
・引数なしはログの取得/加工のみ
という機能・・・のはず。”はず”と言うのはうちでは0しか使ってないからなんですが確認するのも面倒なので自己責任でお願いします。

ちなみにcronで回すのがいいと思います。うちではすぐに確認するので手でやってますが。

アクセスログをローカルで読みやすく加工するためにはアクセス解析ソフトなんかを使うわけなんだけども、今回はVisitorsを使います。
なぜVisitorsかというと、うちで使ってるから。

ではでは早速スクリプトぺたり。

#!/bin/sh
mtth () {
  cat ‘acl4.txt’ ‘accesslog’ >’acl3.txt’
  cp ‘acl3.txt’ ‘acl4.txt’
  visitors -A -m 250 ‘acl4.txt’ >’acl2.html’
}
nml () {
  cp ‘acl.txt’ ‘acl2.txt’
  visitors -A -m 250 ‘acl2.txt’ >’acl.html’
}
logs () {
  wget -P ‘/home/user/dir/logs’ ‘ftp://user:pass@server/dir/logname’
  cd ‘/home/user/dir/logs’
  Dt=`date ‘+%d’`
  if [ $Dt -eq 2 ]
  then
    #今日は2日です
    mtth
    rnmMt=`date -d ‘2 days ago’ ‘+%Y%m’`
    mv acl2.txt acl$rnmMt.txt
    mv acl.html acl$rnmMt.html
    zip -5 acl$rnmMt.zip acl$rnmMt.txt acl$rnmMt.html
    rm acl.txt acl$rnmMt.txt
    cp ‘access_log’ ‘acl.txt’
    nml
  else
    #今日は2日ではありません
    mtth
    cat ‘acl2.txt’ ‘access_log’ >’acl.txt’
    nml
  fi
rm ‘access_log’
}
if [ ${1} -eq 0 ]
then
  logs
  epiphany ‘/home/user/dir/logs/acl.html’ ‘/home/user/dir/logs/acl2.html’
elif [ ${1} -eq 1 ]
then
  epiphany ‘/home/user/dir/logs/acl.html’ ‘/home/user/dir/logs/acl2.html’
else
  logs
fi

前に上げた株価データ取得スクリプトよりも簡単で説明もクソもないので今回は説明なしです。なんていうか動けばいいやレベルのゴミスクリプトなので。

そうそう、途中に2日か否かを確認する部分があるんですが、これは月ごとに切り分ける必要がなければ不要な部分です。

注意 – このスクリプトを使ったことで何かが起こったとしても責任は負えませんのでそのつもりで使ってください。もし万一使うようなことがあれば・・・ですが。

2月5日追記
ああ、そうだ。書き忘れてたけどもインデントを全角スペースに変換してあるからコピーしただけじゃ動かないかも。