2010/05/19

投稿できるようになりました

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

・前々記事 シェルスクリプトから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 件のコメント:

コメントを投稿