この記事は古いです
ここを開いて一番上に出てきた記事に最新版が貼ってあります、たぶんーーーーーーーーーー
・前々記事 シェルスクリプトからOAuth認証できるクライアントを作ったよ
・前記事 Twitterクライアントのxsltproc使わない版
投稿できるようになりました
エンコードにodを使っているので無い場合は動作しません
ちなみに今まで書いてなかったけどUTF-8の環境を想定してます
カレントディレクトリにtimeline.txt、enc.txt、dec.txt、rep.txtの名前で一時ファイルを作成します
これでFONからも投稿できるなーと思ってたりする
使い方は以前と同様で初回のみ
$ ./shtter.sh init
投稿はupdateをつける
$ ./shtter.sh update 投稿テスト
タイムラインの取得は引数なしです
shtter.sh (last update 2010/05/19)
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
}
UpdateTimeLine()
{
URL="http://api.twitter.com/1/statuses/update.xml"
TWEET="`Encode \"$@\"`"
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=$TWEET"
EURL="`UrlEncode $URL`"
EPARAM="`echo $PARAM | sed 's/%/%25/g'`"
EPARAM="`UrlEncode $EPARAM`"
QUERY="POST&$EURL&$EPARAM"
HASH="`echo -n $QUERY | openssl sha1 -hmac "$CSECRET&$ASECRET" -binary | base64`"
HASH=`UrlEncode $HASH`
POST="$PARAM&oauth_signature=$HASH"
RESULT="`wget -q -O - --post-data \"$POST\" \"$URL\"`"
}
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
}
Encode()
{
echo "$@" | grep -o '[^-_.0-9a-zA-Z]' | sort | uniq >enc.txt
cat enc.txt | while read l; do if [ "$l" == "" ]; then l=" "; fi; echo -n "$l" | od -t x1 | sed '2d; s/^0*//; s/ /%/g' | tr '[a-z]' '[A-Z]'; done | paste -d / enc.txt - >rep.sed
sed -i 's/^/s\//; s/$/\/g/' rep.sed
echo "$@" | sed -f rep.sed
rm enc.txt rep.sed
}
ARG="$1"
shift 1
case "$ARG" 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"
;;
"update")
UpdateTimeLine "$*"
;;
*)
GetTimeLine
;;
esac
0 件のコメント:
コメントを投稿