Rubyによるアメブロ『いいね』自動化スクリプト(1) 『いいね』のしくみ

アメブロが11/20にシステム変更を実施した。
『ペタ』の代わりにフェイスブックもどきの『いいね』というボタンを押すしくみになった。
(アメブロの中には、フェイスブックの「いいね」ボタンもあるから話がややこしい…)
運営側がどういう意図でシステムの変更を行ったのかは判らないが、スクリプトを書いて『ペタ』貼りを自動化していた利用者としては、今回の『いいね』も自動化したくなる。

ペタの自動化スクリプト製作依頼のあった件の知り合いから、今度は『いいね』の自動化スクリプト製作依頼が来る。

ペタの時同様に、そうやって無駄にネットワークのトラフィックを増やして虚勢を張らなくても良いだろうと言ったのだが、当人にはそういう事がとても大事な様で、どうしてもと頼み込まれた。

と言うわけで、この『いいね』を自動化するスクリプトを作成する。

FireFoxのアドインHttpfoxを使って、『いいね』ボタンの表示、ボタンを押した時にブラウザとサーバーの間でどんなやりとりをしているのかを調べる。

「いいね」ボタンの表示

「いいね」ボタンHTMLの下記の様に、インラインフレームを利用して読み込まれる。

<iframe src="http://iine.blog.ameba.jp/web/display_iine.html?
receiveAmebaId=****(ブログid)
&entryId=**********(ブログ記事id 11桁の数値)
&from=entry&device=pc" name="iine" 
class="iineBtnIframe" 
allowtransparency="true" 
frameborder="0" height="34" width="100%">いいね!</iframe>

「いいね」ボタンの詳細データを入手

上のアドレスからデータをGETして、「いいね」ボタンの詳細データを入手する。

Host	iine.blog.ameba.jp
GET /web/display_iine.html?
receiveAmebaId=****
&entryId=***********
&from=entry
&device=pc 
HTTP/1.1

この時、大事なのは、
(1)リクエストヘッダーのRefererに"http://ameblo.jp/****/entry-***********.html"を入れておく事。
これを入れておかないと、データが帰ってこない。自動化スクリプト対策(?)でサーバー側でGETリクエストとリクエストヘッダーのRefererをチェックしているのだろうと考えられる。
(2)予めログインしてクッキーを入手、一緒に送信する事。
クッキーでSession-id等をサーバーに送らないと、サーバー側では誰が「いいね」をしようとしているのか判らない。(ログインとクッキーについては過去記事参照)


このリクエストの結果、下記のHTMLが得られる。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<link media="screen,print" rel="stylesheet" 
href="http://stat.ameba.jp/blog/css/user/blogIineBtn.1.000.css">
</head>

<body>
<div id="iineBtnFrame">
<form action="http://iine.blog.ameba.jp/web/exec_iine.html" method="post" id="iineForm">
<input type="hidden" name="receiveAmebaId" value="****" id="receiveAmebaId"> 
<--****はブログのid -->
<input type="hidden" name="entryId" value="**********" id="entryId"> 
<-- 記事のid 11桁の数字 -->
<input type="hidden" name="token" value="********************************"> 
<--トークン:数字とアルファベット小文字32文字の組み合わせ-->
<input type="hidden" name="from" value="entry">
<input type="hidden" name="device" value="pc">
<div id="iineBtnContent">
<p id="iineBtn" class="alreadyIine iine"><span>いいね!</span></p>
<p id="iineBtnerror"><span>いいね!</span></p>
<p id="iineCount" class="">
<span class="iineCountContent">
<span id="connected"></span>
<span id="disconnected">4</span>

</span>
<span class="iineCountFrame"></span>
</p>
</div>
</form>
</div>

<script src="http://stat.ameba.jp/blog/js/user/iineBtn.js"></script>
<script>
new Amb.IineBtnAmb.PcBlog({
setting:{
loginFlg:true,
alreadyIineFlg:false,
iineEntryTotalCount:4,
receiveAmebaId:'****',
eid:'***********',
from:'entry',
blogDomain:'http://blog.ameba.jp',
iineDomain:'http://iine.blog.ameba.jp'
}
});
</script>
</body>
</html>

を得られる。要点は
(1)32桁のトーク

<input type="hidden" name="token" value="********************************">

(2)javascriptの中に記述されている

alreadyIineFlg:false

の部分。
トークンは、良いねボタンを押した時にサーバーに送るpostの中に含める必要がある。
'alreadyIineFlg'は、その記事の「いいね」をサーバに送ってなければ'false'、既に送っていれば'true'になる。「いいね」は、既に「いいね」を送った記事に対して、再度postを送信した場合には「いいね」が取り消しになる仕組み。粗っぽい自動化スクリプトを作って、この'alreadyIineFlg'を確認せずに、重複してpostを送った場合には、せっかく過去につけた「いいね」が取り消しになってしまう。

記事に「いいね」をつける

記事に「いいね」をつけるためには、上記で得られたサーバーに下記の様にデータをPOSTする。
サーバーとポスト先のパスは

Host iine.blog.ameba.jp
POST /web/exec_iine.html HTTP/1.1

ここでもヘッダーにRefererをつけるのを忘れてはいけない

Referer	http://iine.blog.ameba.jp/web/display_iine.html?
receiveAmebaId=****&entryId=***********&from=entry&device=pc

POSTするデータは以下の通り

receiveAmebaId	****
entryId	***********
token	********************************
from	entry
device	pc


以上の一連のやりとりによって、目標の記事に「いいね」をつける事ができる。