mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - Facebook API で「いいね」一覧取得!

[ sns ] [ Facebook, Ruby ]

こんばんは。

Ruby + Facebook API で自分のアカウントの「いいね」している一覧を取得する方法についてです。

ただし、Facebook API 用の RubyGems ライブラリは使用しません。
忠実に、HTTP リクエストを投げて戻ってきた JSON 形式のデータを取得する方法です。

0. 前提条件

  • Ruby 2.0.0-p247 で作成・動作確認。
  • 当然 Facebook アカウント取得済み。
  • 当然 Facebook アプリ作成済み。
  • アクセストークンには複数種類があることを認識している。(「Facebook API - アクセストークン!」も参照)
  • Facebook アプリの詳細設定で、2013/10/02 からデフォルト設定になる “October 2013 Breaking Changes” を今から適用したいので、この設定を「有効」にする。(後述の参考サイトを参照)
    (現在は、"USER_ID/likes" がデフォルトでは全件取得するが、2013/10/02 以降はデフォルトで25件取得しページング機能も有効になる。この機能を今から利用するということ)
  • Facebook API は非常に頻繁に仕様変更があるため、当記事の内容が通用しなくなる可能性は非常に大きい。

1. Ruby スクリプト作成

以下のような Ruby スクリプトを作成する。
実際に使用する場合は、定数に値を設定する。

【2013.10.03 Facebook API の仕様変更に伴い、offset オプションを使用しないよう修正】

fb_api_likes.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
require 'json'
require 'net/https'

# 各種定数
URL_BASE   = "https://graph.facebook.com/{ユーザID or ユーザ名}"
APP_ID     = "{Facebook アプリの APP-ID}"
APP_SECRET = "{Facebook アプリの APP-SECRET}"
LIMIT      =  25  # 1回に取得する件数

# [CLASS] Facebook API
class FbApiLikes
  def initialize
    # App Access Token 取得
    @token = get_token
  end

  # Facebook 情報取得
  def get_info
    begin
      cnt_all =  0   # 総件数 初期化

      # データ取得
      json = fetch_data

      # データが存在しなければ終了
      return unless json["data"]
      cnt_all += json["data"].size

      # 取得データを画面表示 (名前、ID、日時(UTC))
      json["data"].each do |j|
        puts "* #{j["name"]}"
        puts "\t[ #{j["id"]}, #{j["created_time"]} ]"
      end

      # 次ページ URL 取得
      next_url = json["paging"]["next"]

      # 次ページが存在する限り LOOP
      while next_url
        # データ取得
        json = fetch_data(next_url)

        # データが存在しなければ終了
        cnt = json["data"].size
        cnt_all += cnt
        break if cnt == 0

        # 取得データを画面表示 (名前、ID、日時(UTC))
        json["data"].each do |j|
          puts "* #{j["name"]}"
          puts "\t[ #{j["id"]}, #{j["created_time"]} ]"
        end

        # 次ページ offset 取得
        next_url = json["paging"]["next"]
      end

      # 総件数表示
      puts "TOTAL: #{cnt_all} likes."
    rescue => e
      STDERR.puts "[ERROR][#{self.class.name}.get_info] #{e}"
      exit 1
    end
  end

private

  # App Access Token 取得
  # ( ここでのアクセストークンは、
  #   User に紐付いている User Access Token ではない。
  #   Facebook アプリに紐付いていている App Access Token のこと。 )
  def get_token
    begin
      uri = URI.parse("https://graph.facebook.com/oauth/access_token")
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
      res = http.request(Net::HTTP::Get.new(
        "#{uri.request_uri}?client_id=#{APP_ID}&client_secret=#{APP_SECRET}&grant_type=client_credentials"
      ))
      return res.body.split("=")[1]
    rescue => e
      STDERR.puts "[ERROR][#{self.class.name}.get_token] #{e}"
      exit 1
    end
  end

  # 情報取得実体
  def fetch_data(url = "")
    begin
      uri = URI.parse(URL_BASE)
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE

      if url == ""
        res = http.request(Net::HTTP::Get.new(
          "#{uri.request_uri}?access_token=#{@token}&limit=#{LIMIT}"
        ))
      else
        res = http.request(Net::HTTP::Get.new(url))
      end

      return JSON.parse(res.body)
    rescue => e
      STDERR.puts "[ERROR][#{self.class.name}.fetch_data] #{e}"
      exit 1
    end
  end
end

# 開始メッセージ
puts "#### Get Facebook Likes [ START ]"

# Facebook 「いいね」情報取得
obj_main = FbApiLikes.new
obj_main.get_info

# 終了メッセージ
puts "#### Get Facebook Likes [ E N D ]"

2. Ruby スクリプト実行

作成した Ruby スクリプトを実行してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ ruby fb_api_likes.rb

#### Get Facebook Likes [ START ]

* ご縁の国しまね
        [ 508692832535015, 2013-07-31T11:17:28+0000 ]
* NTTドコモ(NTT DOCOMO)
        [ 124946600918797, 2013-07-13T08:38:10+0000 ]
* 島根県雲南市役所
        [ 598070113565938, 2013-07-12T13:54:18+0000 ]
* とりりん~鳥取大学~
        [ 562343010455837, 2013-06-26T12:03:53+0000 ]
* 松江歴史館
        [ 271046983030508, 2013-06-26T12:00:59+0000 ]

===< 途中省略 >===

* Kei Nishikori
        [ 331199495270, 2012-03-26T02:22:34+0000 ]
* 島根スサノオマジック
        [ 129160933813749, 2012-03-18T03:04:04+0000 ]
* くらしまねっと
        [ 291578434230865, 2012-03-06T08:30:58+0000 ]
* Facebook navi (フェイスブックナビ)
        [ 211790478849971, 2011-12-07T08:20:48+0000 ]
* フェイスブック ジャパン
        [ 365989369023, 2011-12-07T08:20:47+0000 ]
TOTAL: 120 likes.

#### Get Facebook Likes [ E N D ]

正常に取得できている。

参考サイト

プログラムを作成・実行する前に、どのようなリクエストでどのような値が取得できるかを以下のサイトで事前に確認できる。(ブラウザで確認するより断然確認しやすい)

その他、ドキュメントは以下を参照。(ページング仕様も掲載されている)

2013/10/02 からの仕様変更については以下を参照。


今回は「いいね」している一覧を取得したが、当然友達の一覧等様々な情報が取得できます。ドキュメントを参考にするとよい。

Facebook 公式では、各種情報を簡単に一覧で確認することが容易ではない場合が多いですが、Facebook API を使用して自分で使いやすようなアプリを作成すると良いかも知れません。

また、Facebook API 用の RubyGems ライブラリも各種存在するようですが、単純にデータを取得するだけならライブラリは必要ありません。(今のところ)

以上。

Comments