Hatena::ブログ(Diary)

サンデープログラミングの楽しみ このページをアンテナに追加 RSSフィード

2014-01-13

Rubyによるアメブロ『いいね』自動化スクリプト(3) 「いいね」のターゲット設定(その1)

前回までで、「いいね」をつけるスクリプトが出来たので、今回はそのターゲットの抽出方法。

依頼者の要望は、

「自分のブログ記事についた「いいね」をお返しする」

と言うこと。

なので、自分のブログ記事についた「いいね」を取得する方法を考える。

「いいね」のデータを取得するには大きく3つの方法がある。

(1)記事のいいねのリンクから、その記事についた「いいね」を新しい順に見ることができる。

(2)ログインした状態の「いいね」履歴で

(2)-1 記事毎についた「いいね」の履歴を見ることができる。記事は記事の日付時刻順ではなく、「いいね」がついた時刻の新しい順に整列される。だから大昔の記事でも「いいね」が新しくつけば、データの先頭になる。

(2)-2 「いいね」をつけてくれたユーザ毎のデータを取得できる。この時もユーザの並びは「いいね」をつけた時刻の降順。新しく「いいね」をつけてくれたユーザほど新しく表示される。

これらのいずれの場合でも、データはhtmlではなくjsonの形式で送られて来る。一回のリクエストではデータ10件のみが送られ、全件のデータを得ることは出来ない。

この一度に全件データが得られないとこら辺が、自動処理が面倒になる所なのだが、自動処理はサービス供給側の意図から外れているし、全件データ送信はトラフィックとサーバーの負荷がやたらに増えて仕方ないので妥当な処理方法という所か。(そもそも今回のシステム変更の目的が、トラフィックとサーバー負荷の低減だったのではないかという気もする)

依頼者の要求仕様のお返しとしての「いいね」をつける相手に合致するのは、単純に「いいね」時刻順でデータを得られる(3)の方法。

この(3)の場合に送られてくるデータの内容を、もう少し詳しく見る。

データを得るためのリンクを押すと以下のリクエストが送られる。

GET /api/iine_history_user.json
  ?ts=1389608323904&callback=iineHistoryUserCallback&_=1389608323908 HTTP/1.1
Host	iine.blog.ameba.jp
User-Agent	Mozilla/5.0 (Windows NT 6.0; Win64; x64; rv:29.0) Gecko/20100101 Firefox/29.0
Referer	http://blog.ameba.jp/ucs/iine/list.html

ここで"ts"、および"_"というデータは、リクエストが発生した日時をGMT1970年1月1日午前0時からの経過秒数でシリアライズされたモノ。

(どちらか片方だけで良い様な気がするのだが…)

リクエストの中には、自分のブログを表わす情報が全く入っていない。おそらく、そこら辺はクッキーで処理されているのではないかと想像しているのだが、良く分らない。


以下が送られてくるjsonのデータ例。

iineHistoryUserCallback({
    "successFlg": true,
    "lastUpdMillis": 1389364094206,
    "lastFlg": false,
    "userList": [{//1件目のデータ
        "validFlg": true,
        "amebaId": "*****",
        "blogTitle": "************",
        "iineCount": 1,
        "profile": {
            "nickname": "***",
            "profileImage": {
                "url": "http://stat.profile.ameba.jp/profile_images/******/**.jpg",
                "height": 2048,
                "width": 1536
            }
        }
    }, 

   // ...途中省略...

       {//10件目のデータ
        "validFlg": true,
        "amebaId": "****",
        "blogTitle": "*******",
        "iineCount": 4,
        "profile": {
            "nickname": "****",
            "profileImage": {
                "url": "http://stat.profile.ameba.jp/profile_images/**************/**/****.jpg",
                "height": 236,
                "width": 243
            }
        }
    }]
});

送られてくるデータは、整形されていないベタのテキストデータだが、http://jsbeautifier.org/で整形。

内容を見ると

"lastUpdMillis"という項目に 1389364094206という数値が入っている。(この項目については後述)

"lastFlg"という項目に falseが入っていて、リストがまだ続く事がわかる。

"userList"の項目は、「いいね」をつけてくれた相手のid、相手のブログタイトル、「いいね」をつけてくれた回数、相手のプロファイルデータが10件分入っている。

"lastUpdMillis"という項目は、どうもこの10件の次、つまり11件目以降の「いいね」をつけてくれたユーザーのデータをリクエストする時に必要なデータで、10件目がついた日時データの様な気がする。(もしかしたらサーバー側が11件目の日時データを返して来ているのかも知れないが…)

でこの次のデータをリクエストする場合には、

GET /api/iine_history_user.json?updMillis=1389364094206
    &ts=1389614304062&callback=iineHistoryUserCallback&_=1389614304064 HTTP/1.1

と、"lastUpdMillis"のデータを追加して送る。

このリクエストを"lastUpdMillis"の値が自分が望む日時になるまで、或いは"lastFlg"がTRUEになるまで繰り返して、データを得れば良い。。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/j_jasper/20140113/1389616753