まだ何のリストにも入れてない人リスト

つくりたい

前述のような事情で公式リストに頼りきっている私ですが、一番困るのが「リスト入れ忘れ」。それに、「どのリストにもいれてない人」っていうフィルタリングをした TL も見たいときありますよね。というわけで、自分がやりたいことはたいてい誰かもやりたいはず。うん。そのはず。で…、あれ…。おかしいな…。意外とこれが見当たらない。「まだ何のリストにも追加してない人リスト」をただぼーんとでっち上げたいだけなのに。

というわけで、今日もメンタルヘルスがひどくて夕方まで壁を見つめていたのであまりに虚しく、このままで終わったら明日死ぬかもな…。という気がしたので API をまた叩きまくって作ってみた。つーか、手間ばっかかかるだけで超簡単なんね。

#! /bin/bash

SCREENNAME=$1
PASSWORD=$2
LISTNAME=$3

# get all friends
echo "getting all friends";
curl -s "http://api.twitter.com/1/friends/ids.xml?screen_name=$SCREENNAME" | xmlstarlet sel -t -m 'ids/id' -v '.' -n > __friends
cat __friends | sort | uniq | sed -e '/^$/{d;}' > __friendsuniq
sleep 1

# get lists
echo "getting all lists";
listIDs=`curl -s -u $SCREENNAME:$PASSWORD "http://api.twitter.com/1/$SCREENNAME/lists.xml" | xmlstarlet sel -t -m 'lists_list/lists/list/id' -v '.' -n`
sleep 1

# get & push listmembers
function getListMembers {
	echo "reading cursor : $nextPageCursor"	
	page=`curl -s -u $SCREENNAME:$PASSWORD "http://api.twitter.com/1/$SCREENNAME/$listID/members.xml?cursor=$nextPageCursor"`
	echo $page | xmlstarlet sel -t -m 'users_list/users/user/id' -v '.' -n >> __listmembers
	nextPageCursor=`echo $page | xmlstarlet sel -t -m 'users_list/next_cursor' -v '.'`
	sleep 1
}

for listID in $listIDs
do
	echo "reading list : $listID"

	nextPageCursor=-1
	getListMembers

	while [ $nextPageCursor != 0 ];
	do
		getListMembers
	done		
done
cat __listmembers | sort | uniq | sed -e '/^$/{d;}' > __listmembersuniq

# diff
echo "diffing"
unlistedmembers=`diff __friendsuniq __listmembersuniq | sed -n -e '/^</{s/^< //p;}'`

# create list
echo "creating list"
LISTID=`curl -s -u $SCREENNAME:$PASSWORD -d "name=$LISTNAME" "http://api.twitter.com/1/$SCREENNAME/lists.xml" | xmlstarlet sel -t -m 'list/id' -v '.'`

# add members
echo "adding members to $LISTNAME"
for unlistedmember in $unlistedmembers
do
	echo "adding $unlistedmember";
	curl -s -u $SCREENNAME:$PASSWORD -d "id=$unlistedmember" "http://api.twitter.com/1/$SCREENNAME/$LISTID/members.xml" > /dev/null
	sleep 1
done

# clean
rm __friends;
rm __friendsuniq;
rm __listmembers;
rm __listmembersuniq;

実行

oogatta@oogatta-ubuntu:~$ ./unko2.sh oogatta password unlisted

Twitter API

Twitter API を少しでもお叩きの方ならおわかりのごとくとにかく不安定なので、あんまり信用しないでくださいね。何かを消したりする処理は入ってませんが、 Twitter 様のご機嫌が悪いとすぐ変なグループができます。ま、そんなときは Web GUI なり curl なりで消してあげください。

あと、リストに複数メンバーを一度に登録する方法がわかりませんでした。postBody を "id=00000,0000" でも "id=00000&id=00000" で送ってもだめだったし。前者だと "00000,0000" という ID として認識されちゃうし、後者だと先に書いた方しか登録されなかった。そのために、もし200人とか追加しようとすると200回 http リクエストしてて心臓に悪い。 sleep 1 入れてるけど心臓に悪いものは悪い。200秒かかるしな。

API Limit

そうそう、あとこれ、平気で GET の REST API リクエスト投げまくるので(だってそうするしかないもん!)、あっという間に API Limit きます。まぁ、プロトタイプですよねー。

ちなみに

リストに入れてない人リストを、いつでも簡単に作れるウェブサービスをご存知の方、教えてください!

その存在は知らないが、リストに入れてない人リストを、いつでも簡単に作れるウェブサービスが、あったらいいなと思う方、☆つけてください。☆が一つでもついたら上のを JS に移植してどっかいつでも叩けるようにしたいと思いマッス。腰が重いな。

でもでも、だって、自分で使う分には上のでいいし…。

シェルスクリプトはいいねえ。僕は大好きなのです。処理と処理の間、処理とI/Oの間、そういう間をつなぐプログラムって言語やOSごとに違って、僕みたいにクライアントサイドしか普段やってない人間には、なんか面倒でしょうがない。シェルスクリプトだと、その辺パイプとリダイレクトさえ覚えておけばどうにでもなるし、 "|" と ">" くらいさすがに忘れたくても忘れられません。楽ちん。処理の中身というか、処理自体は何で書いても一緒さね。