‘スクリプト関連’ カテゴリーのアーカイブ

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では公開済みだし。

半端ないアウェー感。

WEBラジオ落として聞くー

2013年10月28日 Linux, スクリプト関連

こんなの書いてみた。
引数でasxファイルを渡してやるとmimmsで/tmpにダウンロードしてくれるの。
リンクのURLって引用符で括ってあれば割と簡単に抽出できるんだね。

grepの-oオプション便利!

#!/bin/bash
cd /tmp/
fln=( ${@} )
for (( i = 0; i < ${#}; i++ ))
{
  mimms `cat ${fln[i]} | grep HREF | grep -o "[@-~].*" | sed "s/"//g"`
}

Linuxで録画予約を自動化するスクリプト書いた

2013年10月21日 Linux, スクリプト関連

2013/11/13 追記 :
recdgen.shを更新しました。iepg.listに特番の番号を放置した時、受信できない放送局の番組に番号がそのまま引き継がれて正常に録画ができなくなる可能性があったので、ch.listに登録の無い局に出会った時に該当番号を削除する処理を追加。
blog記事中のスクリプトは更新済みです。

2013/10/25 追記 :
recdgen.shに録画情報のチェック機能を追加しました。
翌週の放送がないときは録画しない、すでに放送された番組のデータが残っていたら最新のものに差し替える、録画情報がおかしい時は録画予約に反映しないなど。
その他、細かく修正を行なっています。詳細な変更点はgithubで確認してください。
blog記事中のスクリプトは更新済みです。

2013/10/24 追記 :
recdgen.sh、rectv.shを更新しました。
recdgen.shの変更点は、設定方法の変更とreadmeに記載されていた挙動とずれていた部分の修正。
rectv.shの変更点は、設定方法の変更です。recdgen.sh、rectv.shともにディレクトリの設定を変更しなくても実行権限をつけるだけでそれなりに動くようになりました。rectv.shのhddの設定は必要です。
blog記事中のスクリプトは更新済みです。

2013/10/23 追記 :
recdgen.shを更新しました。
変更点は、エラー処理の追加、無駄な処理の削除、iepg.listの末尾のアイテムを取りこぼす可能性があった処理の修正、問題箇所がふわっとわかるかもしれないエラーログ出力の追加です。
記事中のスクリプトは更新済みです。

PT3で録画サーバを構築して1年とちょっと。
これまでなんとなく手入力でcrontabに録画予約を登録していたんだけども、いい加減面倒になってきたので、この際だからと思って録画予約を自動化するスクリプトを書いてみたよ。
LinuxMint13で動くよ!!Shellscriptだよ!!!
これに関しては既存のソフトウェアなんかもたくさん書かれていて車輪の再発明もいいところなんだけど、既存のものはSQLを使ってたりして事前の準備が面倒すぎるので、お勉強のついで。

スクリプト2つと設定ファイル3つで動くよ!LAMPなしでいけちゃうよ!!やったね!!

スクリプトのダウンロードはgithub(右側 Download ZIP)ここ(rectv.zip)から

使い方はZIPファイルの中のReadme読んでください・・・
一応必要十分な情報は盛りこんであるはずだから。
なんというかReadme書ききったらもう気力が残ってない。マニュアルとか苦行すぎるw

あとこれはかなりどうでも良い事なんだけども、
recdgen.shのcrontabのjob登録のしかたがかなり乱暴なので、気になるならは自分で直してね。
そのままでも不都合なければそのままでも動くけども。

それからrecdgen.shの実行前には必ず crontab -l > filename してね。

やらないでcrontab飛んだー!!とか言われても知らんがなwwwwwwwwwwwとしか言えないから。
ちゃんと注意書きしたからね。

それからこれかなり大事な部分、
録画に失敗しても責任取らないし取れないから事前に十分な動作テストを行なってから使ってください。

一応スクリプトすぐ読めるように置いときます。

この投稿の続きを読む »

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 -- 累積

変数で遊んでみるとか。

2010年6月18日 スクリプト関連, 雑記

多分この二箇所が一番楽しめるところ。
ここと

test03 () {
    $1 doukashira
}

ここ

${test[2]} echo

へぇっていう感じに。

#!/bin/bash
test03 () {
    $1 doukashira
}
test=( test01 test02 test03)
for (( i = 0; i < 6; i++ ))
{
    test1=( `echo test0${i}1 test0${i}2 test0${i}3` )
    ttat[$i]=${test1[*]}
}
echo ${test[*]}
echo ${test1[*]}
${test[2]} echo
echo ${test[1]}
echo ${ttat[*]}
echo ${ttat[4]}
bbb=( ${ttat[2]} )
echo ${bbb[*]}
echo ${bbb[1]}

変数名に意味はありません。

引数を片っ端から配列に流し込んでみる。

2010年6月18日 スクリプト関連, 雑記

作業中のを部分的に切り出してみた。
こんな感じでどうかな。

#!/bin/bash
keyval () {
    i=${#kv[*]}
    kv[${i}]=”${1}=${2}”
}
keyval “oauth_consumer_key” “${consumer_key}”
keyval “oauth_nonce” “${oauth_nonce}”
keyval “oauth_signature_method” “HMAC-SHA1”
keyval “oauth_timestamp” “${oauth_timestamp}”
keyval “oauth_version” “1.0”
keyval “x_auth_mode” “client_auth”
keyval “x_auth_password” “${pss}”
keyval “x_auth_username” “${usr}”
data=`echo ${kv[*]} | sed ‘s/ /&/g’`

それなりに可変長でランダムな文字列とかsplitっぽいものとか。

2010年6月14日 スクリプト関連, 雑記

もっとマシなやり方もあるかもしれないけども、こんな感じのとか。

#!/bin/bash
echo $RANDOM | openssl sha1 | cut -c $((($RANDOM % 10) + 1))-$((($RANDOM % 10) + 20))

誰得なsplitっぽいものとか。

#!/bin/bash
split () {
    rtstr=( `echo ${2} | sed “s/${1}/ /g”` )
}
split $@
echo ${rtstr[*]}

6月末なんてすぐ来ちゃうからちょっとずつでも進めていかないと。
・・・地味にあせる。

Perlお触り途中経過。まだbashほどエロスは感じない。

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

とりあえずPerlはここまでやった。
空の配列を作るところでかなり長いことハマってたけども、今日やっと事前に準備するものなんだって事に気が付いて何となく動くぞって程度にはなった感じ。クソ過ぎて涙が出るw
”インデックスを指定して代入!”ってやっただけじゃ配列用意してくれないのね。

一応このコードでgoo.glの短縮URLの取得まではできたので、作業記録も兼ねて置いとく。
テストコードとかそのまんまぺたり。

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use LWP::Simple;

my $q = new CGI;
my $Uname = $q->param(‘namae’);
my $Upss = $q->param(‘pswd’);
my $PushTEXT = $q->param(‘pushtext’);
#httpurlを抽出して配列に格納
my @http = $PushTEXT =~ /s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+/g;
#空の配列を準備
my @gglhttp = ();

print $q->header(-charset=>”utf-8″);

my $data = get “http://ggl-shortener.appspot.com/?url=$http[2]”;
$data =~ s/{“short_url”:”|”}//g;
for( my $i=0 ; $i <= $#http ; $i++ ){
    print $http[$i];
    $gglhttp[$i] = get “http://ggl-shortener.appspot.com/?url=$http[$i]”;
    $gglhttp[$i] =~ s/{“short_url”:”|”}//g;
}

print $q->start_html(-title=>”タイトル”, -BGCOLOR=>’#ffffff’),
    $q->strong(“処理完了!”),
    $q->p(“$Uname”),
    $q->p(“$Upss”),
    $q->p(“$PushTEXT”),
    $q->p(“@http”),
    $q->p(“$#http”),
    $q->p(“$data”),
    $q->p(“@gglhttp”),
    $q->br,
    $q->a({href=>”/”}, “back”),
    $q->br,
    $q->br,
    $q->end_html;
exit;

こんな感じのフォームから中身を投げます。

<form id=”form” action=”posttest.cgi” method=”post”>
    <p>お名前:<input type=”text” name=”namae” /></p>
    <p>PASS:<input type=”password” name=”pswd” /></p>
    <p>TEXT:<textarea name=”pushtext” rows=”4″ cols=”40″>テキストエリア</textarea></p>
    <p><input type=”submit” name=”submit” value=”送信” /></p>
</form>

Visitorsでログ取りするスクリプト更新した。

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

v3になりまひた。いひひ。
変更点は手動でログ取りやっててうっかり何日か取り忘れたときの過去のログの取得機能の追加だけ。

自分の借りてるスペースは1週間分しかログを残してくれないので、その前提で書いてあります。ログのファイル名形式とかも同じ。

使い方はいつも通りワンパターンな引数つけて起動するタイプ。
第一引数はスクリプト自体の動作を指定。0ならログとってブラウザで表示。1ならログとらずにブラウザで表示。無印ならログだけとる。
第二引数は何日前のログをとるのかを指定。1~6まで。自分の借りてるスペースは1週間分しかログを残してくれないので。

なんでこんな突貫工事をしちゃったのかというと、まさに今日、昨日のログを取り忘れていたから。どうせ今後も中途半端な頻度で忘れるので毎度面倒くさがりながら前日分のログを手動で連結するくらいなら突貫工事でもいいから書いちゃえよって思ったの。

古いコードはこことかにある。どこが変わったかとか興味があったらどうぞ。「Visitorsでアクセスログを読み(ry」を書き直し。

#!/bin/sh
### v3
drv () {
    cat access_log$2 >>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 ./daily/*.*
    rm acl$rnmMt.txt ./daily/*.*
    cp access_log$2 acl1.txt
}
logs () {
    wget -P “/home/user/logs” “ftp://id:pass@domain/logdirs/access_log$2”
    drv 2 $2
    Dt=`date ‘+%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/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