というわけで、Twitterにありがちな「文字数制限にひっかかる」を回避するための方策として「URLを短縮」と「字数が多くなったら後ろを省略」をしてみる。
ついでにもう一つ、「短縮URLを元に戻す」をやっておく。これは意外と大事な事で、例えば「ツィート中に一定のURLがあったら反応する」とかするためには必要な機能だったりする。
具体的には「フォロワーがツィッター診断メーカをやってたら自分もやる」とか。「誰かがCiNiiの論文を引用してたらRTする」とか。
						ついでにもう一つ、「短縮URLを元に戻す」をやっておく。これは意外と大事な事で、例えば「ツィート中に一定のURLがあったら反応する」とかするためには必要な機能だったりする。
具体的には「フォロワーがツィッター診断メーカをやってたら自分もやる」とか。「誰かがCiNiiの論文を引用してたらRTする」とか。
省略
とりあえず絶対必要な文字数の省略、これは楽勝だったりする。 以下はlimit文字数を超えると、後ろを削除して「(ry」と付け加える関数。
#文字列が長いときは後ろを省略するよ
def shorten_message(message,limit=140)
	strs = message.split(//u)
	if (limit < strs.length) then
		new_message=strs[0..(limit-10)].join
		return new_message.concat(" (ry")
	end
	return message
end
他の人のツィートを引用したりするbotには必要不可欠URLの短縮
URLの短縮はbit.ly版とtinyurl版を作ってみた。まずはbit.ly版。bit.lyはアカウント登録してAPI KEYを貰わないとAPIを使えない事に注意!返り値はJSON
#bit.lyを使ってURLを短縮する。ただし、アカウントの設定をしてないときは短縮せずに返す
def bitly_shorten_uri(long_url='')
	id = $config[:BITLY_ID]
	api_key = $config[:BITLY_API_KEY]
	version = 'v3'
	return long_url if(id=='' or api_key=='')
	#URLエンコードしとく事
	query = "longUrl=#{URI.encode(long_url)}&login=#{id}&apiKey=#{api_key}&format=json"
	result = JSON.parse(Net::HTTP.get("api.bit.ly", "/#{version}/shorten?#{query}"))
	return result['data']['url']  if long_url == result['data']['long_url']
	return long_url
end
会員登録しないといけないけれど、TinyURLと違って変換ログが残ったりリンクのクリック数の統計機能があったりと地味に便利。あと、bit.lyの短縮URLを元に戻すAPIも登録が必要なのでどっちにしろ会員登録(無料)することになる。。。つづいてTinyURL。こちらは普通に平文で返事か帰ってくる。会員登録とかは必要なし。
def tinyurl_shorten_url(long_url)
	query = "url=#{URI.encode(long_url)}"
	result = Net::HTTP.get("tinyurl.com", "/api-create.php?#{query}")
	return result
end
短縮URLの復元
とりあえずBit.ly、さっきも言った通りAPIキーが必要。ちなみにbit.ly傘下のj.mpもこの関数で復元可能。
#bitlyで短縮したURLを元に戻す
def bitly_expand_url(short_url)
	id = $config[:BITLY_ID]
	api_key = $config[:BITLY_API_KEY]
	version = 'v3'
	return short_url if(id=='' or api_key=='')
	
	#URLエンコードしとく事
	query = "shortUrl=#{URI.encode(short_url)}&login=#{id}&apiKey=#{api_key}&format=json"
	result = JSON.parse(Net::HTTP.get("api.bit.ly", "/#{version}/expand?#{query}"))
	return result['data']['expand'][0]['long_url']  if short_url == result['data']['expand'][0]['short_url']
	return short_url
end
つづいてTinyURL。こちらは復元のAPIを公開してない!
しかたないので [0xFF]TinyurlなどのURLを復元するJSON(P) APIで提供しているサービスを利用する。
#TinyURLで短縮したURLを元に戻す。
#TinyURLは公式では短縮URLの復元を行ってない。。。
#http://d.hatena.ne.jp/os0x/20090215/1234686704
def tinyurl_expand_url(short_url)
	query = "url=#{URI.encode(short_url)}"
	result = JSON.parse(Net::HTTP.get("ss-o.net", "/api/reurl.json?#{query}"))
	return result['url'] if result['url']!=nil
	return short_url
end
ちなみに、普通の人は[oneincのブログ]【Twitter】短縮したURLを復元できるUntiny APIをPHPで使う方法で紹介されているようにUnTinyというサービスを使うようだ。TinyURLの他にも数百のURL短縮サービスに対応しているらしいので普通の人はこちらがいいかもしれない。おれ?単にいろんなサービス使ってみたかっただけさ!
メッセージ中のURLを短縮/復元する関数
最後にメッセージ中のURLを短縮/復元する関数を作っておく。デフォルトではbit.lyのURL短縮(APIキーを取得してないときはTinyURL)、modeを「expand」にするとbit.ly、TinyURL、j.mpのURLを自動判別して元のURLに復元します。
#文章中のURLを短縮URLと置き換えるよ def replace_uri(message,mode='shorten_bitly') #bit.lyがおすすめなんだよ mode = 'shorten_tinyurl' if($config[:BITLY_ID]=='' or $config[:BITLY_API_KEY]=='') str = message.dup URI.extract(message, %w[http https ftp]) do |uri| case mode when 'shorten_bitly' new_uri = bitly_shorten_uri(uri) when 'shorten_tinyurl' new_uri = tinyurl_shorten_url(uri) when 'expand' case uri when %r(bit.ly|j.mp) new_uri = bitly_expand_url(uri) when %r(tinyurl.com) new_uri = tinyurl_expand_url(uri) end end str.gsub!(uri,new_uri) if(new_uri!=nil) end return str end
ちなみに、上の関数を書いたファイルはこちらからダウンロードできます。
PR
		トラックバック
URL : 
コメント
