2010/05/12

Twitterクライアントのxsltproc使わない版

ーーーーーーーーーー
この記事は古いです
ここを開いて一番上に出てきた記事に最新版が貼ってあります、たぶん
ーーーーーーーーーー

・前記事 シェルスクリプトからOAuth認証できるクライアントを作ったよ

xsltproc入ってないんだよって人向け、xsltprocの代わりにiconvが必要です
なんとなくこっちの方がよさげ

使い方は以前と同様で初回のみ

$ ./shtter.sh init

で次回以降は引数なしです

・カレントディレクトリにtimeline.txt、dec.txt、rep.txtの名前で一時ファイルを作成します


shtter.sh (last update 2010/05/13)
This script lisence is GPL.

#!/bin/sh

CKEY="U3DhP7CpPx0bNCzdAFShg"
CSECRET="eAQ13OTo7BhroXQc5dA5oOqEuXhAf7yABVKpkbR7so"
AKEY=""
ASECRET=""
ID=""
NAME=""

GetRequestToken()
{
URL="http://twitter.com/oauth/request_token"

NONCE="`date +%s%N | md5sum | cut -c1-32`"
TIMESTAMP="`date +%s`"
PARAM="oauth_consumer_key=$CKEY&oauth_nonce=$NONCE&oauth_signature_method=HMAC-SHA1&oauth_timestamp=$TIMESTAMP&oauth_token=&oauth_version=1.0"

EURL="`UrlEncode $URL`"
EPARAM="`UrlEncode $PARAM`"
QUERY="GET&$EURL&$EPARAM"
HASH="`echo -n $QUERY | openssl sha1 -hmac "$CSECRET&" -binary | base64`"
HASH=`UrlEncode $HASH`

RTOKEN="`wget -q -O - \"$URL?$PARAM&oauth_signature=$HASH\"`"
if [ "$RTOKEN" == "" ]; then
echo "can not get request token"
exit 1
fi

RKEY="`echo $RTOKEN | sed 's/.*oauth_token=\([^&]*\).*/\1/'`"
RSECRET="`echo $RTOKEN | sed 's/.*oauth_token_secret=\([^&]*\).*/\1/'`"

echo "$RKEY $RSECRET"
}

GetAccessToken()
{
RKEY="$1"
RSECRET="$2"
PIN="$3"

URL="http://twitter.com/oauth/access_token"

NONCE="`date +%s%N | md5sum | cut -c1-32`"
TIMESTAMP="`date +%s`"
PARAM="oauth_consumer_key=$CKEY&oauth_nonce=$NONCE&oauth_signature_method=HMAC-SHA1&oauth_timestamp=$TIMESTAMP&oauth_token=$RKEY&oauth_verifier=$PIN&oauth_version=1.0"

EURL="`UrlEncode $URL`"
EPARAM="`UrlEncode $PARAM`"
QUERY="GET&$EURL&$EPARAM"
HASH="`echo -n $QUERY | openssl sha1 -hmac "$CSECRET&$RSECRET" -binary | base64`"
HASH=`UrlEncode $HASH`

ATOKEN="`wget -q -O - \"$URL?$PARAM&oauth_signature=$HASH\"`"
if [ "$ATOKEN" == "" ]; then
echo "can not get access token"
exit 1
fi

AKEY="`echo $ATOKEN | sed 's/.*oauth_token=\([^&]*\).*/\1/'`"
ASECRET="`echo $ATOKEN | sed 's/.*oauth_token_secret=\([^&]*\).*/\1/'`"
ID="`echo $ATOKEN | sed 's/.*user_id=\([^&]*\).*/\1/'`"
NAME="`echo $ATOKEN | sed 's/.*screen_name=\([^&]*\).*/\1/'`"

echo "$AKEY $ASECRET $ID $NAME"
}

GetTimeLine()
{
URL="http://api.twitter.com/1/statuses/home_timeline.xml"

NONCE="`date +%s%N | md5sum | cut -c1-32`"
TIMESTAMP="`date +%s`"
PARAM="oauth_consumer_key=$CKEY&oauth_nonce=$NONCE&oauth_signature_method=HMAC-SHA1&oauth_timestamp=$TIMESTAMP&oauth_token=$AKEY&oauth_version=1.0&status="

EURL="`UrlEncode $URL`"
EPARAM="`UrlEncode $PARAM`"
QUERY="GET&$EURL&$EPARAM"
HASH="`echo -n $QUERY | openssl sha1 -hmac "$CSECRET&$ASECRET" -binary | base64`"
HASH=`UrlEncode $HASH`

DIR="`dirname $0`"
TIMELINE="`wget -q -O - \"$URL?$PARAM&oauth_signature=$HASH\"`"

echo $TIMELINE | sed 's/<text>/\n\0/g; s/<\/screen_name>/\0\n/g' | sed -n '/^<text>.*<\/screen_name>$/!d; s/<text>\([^<]*\).*<screen_name>\([^<]*\).*/\2: \1/; p' >timeline.txt
Decode timeline.txt
rm timeline.txt
}

UrlEncode()
{
echo "$@" | sed 's/&/%26/g; s/+/%2B/g; s/\//%2F/g; s/:/%3A/g; s/=/%3D/g'
}

Decode()
{
ORG="`cat $1`"

echo $ORG | grep -o '&#[0-9]\+;' | sort | uniq >dec.txt
HEX="`sed 's/&#\([0-9]\+\);/\1/' dec.txt | while read l; do printf '%04x' $l; done`"
HEX="`echo $HEX | sed 's/\(..\)\(..\)/\\\x\2\\\x\1\\\xff\\\xfe\\\x2f\\\x00\\\x67\\\x00\\\x0a\\\x00/g'`"

sed -i 's/^/s\//' dec.txt
printf "$HEX" | iconv -f UTF-16 -t UTF-8 | paste -d / dec.txt - >rep.sed
sed -f rep.sed $1

rm dec.txt rep.sed
}

case "$1" in
"init")
RTOKEN="`GetRequestToken`"
RKEY="`echo $RTOKEN | cut -d ' ' -f1`"
RSECRET="`echo $RTOKEN | cut -d ' ' -f2`"

echo "open this url in your browsser and input pin"
echo "http://twitter.com/oauth/authorize?oauth_token=$RKEY"
echo -n "pin > "
read PIN

ATOKEN="`GetAccessToken \"$RKEY\" \"$RSECRET\" \"$PIN\"`"
AKEY="`echo $ATOKEN | cut -d ' ' -f1`"
ASECRET="`echo $ATOKEN | cut -d ' ' -f2`"
ID="`echo $ATOKEN | cut -d ' ' -f3`"
NAME="`echo $ATOKEN | cut -d ' ' -f4`"

sed -i "1,/^AKEY/ s/^\(AKEY=\)\".*\"/\1\"$AKEY\"/" "$0"
sed -i "1,/^ASECRET/ s/^\(ASECRET=\)\".*\"/\1\"$ASECRET\"/" "$0"
sed -i "1,/^ID/ s/^\(ID=\)\".*\"/\1\"$ID\"/" "$0"
sed -i "1,/^NAME/ s/^\(NAME=\)\".*\"/\1\"$NAME\"/" "$0"
;;
*)
GetTimeLine
;;
esac

0 件のコメント:

コメントを投稿