‘Twitter’ タグのついている投稿

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

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’`

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>

さっきまでにやったこと。自分用

2010年5月17日 雑記

何となくメモ。

Kindle 2 PDF書き出し用のOpenOffice.orgテンプレート上げた。
DL – http://templates.services.openoffice.org/ja/node/3983

Twitter appでConsumer keyとConsumer secret発行してもらった。
あとはxAuthの利用申請。早めにやっつけろ。忘れる前に。

落描きした。2日に分けて描いたらグダグダに。

ひとまず、こんな感じ。素で忘れるので。

シェルスクリプトから自動で短縮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文字未満ならつぶやく。そうでないならエラーで終了。

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

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

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

数値文字参照の問題解決した。

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

末尾一行だけ差し替え。
w3mが標準で入ってたので、これでデコードする。
あとの細かいところはまたあとでやる。

#!/bin/bash
IDPASS=`sed -n $1p ~/dir/ips.list`
curl -u $IDPASS -o ~/dir/friends_timeline.xml http://twitter.com/statuses/friends_timeline.xml
grep ‘<text>’ ~/dir/friends_timeline.xml | sed -e ‘s/</text>| <text>//g’ >~/dir/test.html
w3m -dump ‘~/dir/test.html’ >~/dir/test.txt

ここまでやった。出来てるのか自信無いけど。

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

もう何がなんだか・・・
あとはprintの所をHTML::Entitiesで置き換えれば良いのかな?

とりあえず今できるのはこのくらい。
もう寝なきゃ。

#!/bin/bash
IDPASS=`sed -n $1p ~/dir/ips.list`
curl -u $IDPASS -o ~/dir/friends_timeline.xml http://twitter.com/statuses/friends_timeline.xml
grep ‘<text>’ ~/dir/friends_timeline.xml | sed -e ‘s/</text>| <text>//g’ >~/dir/test.txt
perl -e ‘open(IN, “< ~/dir/test.txt”); while(<IN>){print $_;}’

シェルスクリプトでTwi(ry — prompter関数の中身。

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

昨日の続き。昨日の記事では実体参照にするべき文字をサラッと生で書いてて一部消えてたので、その辺の訂正も兼ねて。
昨日のはココ。既に修正済。【シェルスクリプトでTwitterに投稿。リストで台詞生成編】

もう如何に面倒臭くなく実装するかしか考えてない感じなのでサラッと説明終わらせちゃう。
このスクリプトの肝はスクリプトその物ではなくスクリプトから参照されるリストの方なので、スクリプト側ではそう難しいことはやっていません。

そんなわけで昨日も貼ったけどもスクリプト。今日は一部だけ。

#台詞生成関数
prompter () {
  count=1
  #10分毎にリストを切り替え
  case “$mt” in
    0* ) mt=00 ;;
    1* ) mt=10 ;;
    2* ) mt=20 ;;
    3* ) mt=30 ;;
    4* ) mt=40 ;;
    5* ) mt=50 ;;
  esac
  for (( i = 0; i < 4; i++ ))
  {
    #テキスト行数取得
    ttnum=`wc -l </home/user/dir/$hr/$mt/$count.txt`
    #1行抽出・配列格納
    prpt[i]=`sed -n $((($RANDOM % $ttnum) + 1))p /home/user/dir/$hr/$mt/$count.txt`
    count=$((count + 1))
  }
  for (( i = 0; i < ${#prpt[*]}; i++ ))
  {
    #テキスト生成
    fprpt=”$fprpt””${prpt[i]}”
  }
  IPS=`sed -n $1p /home/user/dir/ips.list`
  curl -u $IPS -d status=”$fprpt” http://twitter.com/statuses/update.xml
}

昨日はprompter関数を呼ぶまでの流れをやったので今日はprompter関数の処理内容を軽く。

1行目 変数countに1を代入。
3〜8行目 caseで変数mtの値を評価して、値を丸めるて変数mtに代入。
9〜16行目 変数ttnumにwcコマンドで/home/user/dir/$hr/$mt/$count.txtの行数を代入。
配列変数prpt[i]にsed -n $((($RANDOM % $ttnum) + 1))pで/home/user/dir/$hr/$mt/$count.txtの指定行を代入。変数countに1追加。これらをfor文で4回ループ。
17〜21行目 これは簡単。変数fprptに変数fprptと配列変数prpt[i]を展開しながら代入。これ一行でできたりしないのかしら?

あとは、この前書いた【シェルスクリプトでTwitterに投稿。】にある2行のスクリプトでTwitterに投稿される。と言う流れ。

ダラダラと書いてきましたがこんな感じです。ホントに軽く。だって、読んでる人が何を知らないかを知らないし。そもそも読んでる人がいるのかも知らないし。

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

シェルスクリプトでTwitterに投稿。リストで台詞生成編

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

botです。もうそのまんま。

こういうのはあんまり出しちゃいけない気もするけども出しちゃう。なぜなら汎用性が薄いから。
このスクリプトの動作サンプルはココ。フォローしてあげてください。話しかけても学習しない上にテスト中だから、ちょいちょいつぶやき消えたりしますがw

そんなわけで、スクリプト。

#!/bin/bash

#台詞生成関数
prompter () {
  count=1
  #10分毎にリストを切り替え
  case “$mt” in
    0* ) mt=00 ;;
    1* ) mt=10 ;;
    2* ) mt=20 ;;
    3* ) mt=30 ;;
    4* ) mt=40 ;;
    5* ) mt=50 ;;
  esac
  for (( i = 0; i < 4; i++ ))
  {
    #テキスト行数取得
    ttnum=`wc -l </home/user/dir/$hr/$mt/$count.txt`
    #1行抽出・配列格納
    prpt[i]=`sed -n $((($RANDOM % $ttnum) + 1))p /home/user/dir/$hr/$mt/$count.txt`
    count=$((count + 1))
  }
  for (( i = 0; i < ${#prpt[*]}; i++ ))
  {
    #テキスト生成
    fprpt=”$fprpt””${prpt[i]}”
  }
  IPS=`sed -n $1p /home/user/dir/ips.list`
  curl -u $IPS -d status=”$fprpt” http://twitter.com/statuses/update.xml
}

#時・分変数
hr=`date ‘+%H’`
mt=`date ‘+%M’`
wkd=`date ‘+%w’`

#曜日チェック
case “$wkd” in
  [1-5] ) echo “平日” ;;
  * ) hr=”h”$hr ;;
esac
#特定時間帯チェック
case “$hr” in
  h0[2-5] | h1[0-3] | h1[7-9] ) ck=1 ;;
  0[2-5] | 1[0-3] | 1[7-9] ) ck=1 ;;
  * ) ck=0 ;;
esac

#実行部
#特定時間帯チェックがオン(1)なら投稿回数半減
if [ $ck -eq 1 ]
then
  case “$mt” in
    ?[0-4] ) prompter 1 ;;
    ?[5-9] ) echo “1回休み” ;;
  esac
else
  prompter 1
  exit 1
fi

prompter関数は最終実行部分なのでまずは無視してください。

とりあえず、処理の流れを軽く説明すると、

スクリプト実行で、まず最初に時・分・曜日をそれぞれhr、mt、wkd変数に格納。
次に変数wkdに格納された数値をcaseで評価、平日と土日を振り分け。

※平日の振り分けがecho “平日”となっていますが、これはテスト段階でそうしていたものを放置しているだけです。cronで実行した場合、画面には何も反応は帰ってこないので。

で、ここで振り分け結果が土日(0か6)だった場合、変数hrに格納された数値の頭にホリデイのhを一文字追加。
次に特定時間帯チェックで変数hrに格納された数値・文字列を評価。変数ckに0か1を格納。
if文で変数ckを評価、真ならcaseで変数mtを評価し変数mtに格納された数値の末尾が0〜4ならprompter関数を引数1で実行。
偽ならprompter関数を引数1で実行。

これで後はprompter関数が適当に乱数を使ってつぶやいてくれます。

ちょっと今回は説明ここまでにしときます。取り急ぎリストに修正入れないといけないので。
次回はprompter関数がなにやってるのか説明します。説明無くても大体分かると思いますが。

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

WordPressのつぶやき表示プラグインTwitter Streamをちょっとだけ日本語に対応させる。

2010年1月20日 スクリプト関連, 雑記

あくまでちょっと。
通常Twitter Stream上で表示されるつぶやきの投稿時間の表示は10 minute agoとか1 hour agoとか表示されるんだけども、日本語混じりのサイトでは何だかそこだけ浮きます。
そこで、投稿時間の表示だけ地味に日本語化しようと思います。

弄るのは358行目から3行くらいと365行目、379行目のみ。超簡単w

実際のコードはこんな感じ。

//Work out the time in the AGO tense. Thanks to http://css-tricks.com for this snippet…
function twitter_stream_time_ago($time)
{
$singular = array(__(“second”, ‘twit_stream’), __(“minute”, ‘twit_stream’), __(“hour”, ‘twit_stream’), __(“day”, ‘twit_stream’), __(“week”, ‘twit_stream’), __(“month”, ‘twit_stream’), __(“year”, ‘twit_stream’), __(“decade”, ‘twit_stream’));
$plural = array(__(“seconds”, ‘twit_stream’), __(“minutes”, ‘twit_stream’), __(“hours”, ‘twit_stream’), __(“days”, ‘twit_stream’), __(“weeks”, ‘twit_stream’), __(“months”, ‘twit_stream’), __(“years”, ‘twit_stream’), __(“decades”, ‘twit_stream’));

$lengths = array(“60″,”60″,”24″,”7″,”4.35″,”12″,”10”);

$now = time();

$difference = $now – $time;
$tense = __(“ago”, ‘twit_stream’);

for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}

$difference = round($difference);

if($difference != 1) {
$period = $plural[$j];
} else {
$period = $singular[$j];
}

return “{$difference} {$period} {$tense}”;
}

これをこんな感じに書き換えます。
358、359行目 時間の単位を日本語に。
365行目 agoを日本語に。
379行目 余分なスペースを削除。

//Work out the time in the AGO tense. Thanks to http://css-tricks.com for this snippet…
function twitter_stream_time_ago($time)
{
$singular = array(__(“秒”, ‘twit_stream’), __(“分”, ‘twit_stream’), __(“時間”, ‘twit_stream’), __(“日”, ‘twit_stream’), __(“週”, ‘twit_stream’), __(“月”, ‘twit_stream’), __(“年”, ‘twit_stream’), __(“decade”, ‘twit_stream’));
$plural = array(__(“秒”, ‘twit_stream’), __(“分”, ‘twit_stream’), __(“時間”, ‘twit_stream’), __(“日”, ‘twit_stream’), __(“週”, ‘twit_stream’), __(“月”, ‘twit_stream’), __(“年”, ‘twit_stream’), __(“decades”, ‘twit_stream’));

$lengths = array(“60″,”60″,”24″,”7″,”4.35″,”12″,”10”);

$now = time();

$difference = $now – $time;
$tense = __(“前”, ‘twit_stream’);

for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}

$difference = round($difference);

if($difference != 1) {
$period = $plural[$j];
} else {
$period = $singular[$j];
}

return “{$difference}{$period}{$tense}”;
}

これでTwitter Streamが中途半端に日本語対応になりましたw