music1996taro
@music1996taro

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ルビー言語 API

require 'open-uri'
require 'json'

# 指定したURLのFacebookいいね数を取得するクラス
class FbShareCounter
# FacebookグラフAPIのURL
BASE_URL = 'http://graph.facebook.com/?id='

# target_urlにいいね数をカウントする対象URLを指定
def initialize(target_url)
@request_url = BASE_URL + target_url
end

def count
# グラフAPIにアクセス
response = open(@request_url).read

# テキストをハッシュに変換
hash = JSON.parse(response)

# いいね数を取得
hash['share']['share_count']
end
end

counter = FbShareCounter.new('http://gihyo.jp')
p counter.count

というソースコードで、コマンドプロンプトで実行した結果、

C:/samples/samples/09_03/like_counter.rb:16:in `initialize': Invalid argument @ rb_sysopen - http://graph.facebook.com/?id=http://gihyo.jp (Errno::EINVAL)
from C:/samples/samples/09_03/like_counter.rb:16:in `open'
from C:/samples/samples/09_03/like_counter.rb:16:in `count'
from C:/samples/samples/09_03/like_counter.rb:27:in `<main>'

という結果が帰ってくるのですが、なぜでしょうか?教えていただけると幸いです。

0

2Answer

library open-uriにある通り、open(@request_url)ではなくURI.open(@request_url)ですね。
使ったことのないライブラリやクラスを使うときは、まず公式のドキュメントを読みましょう。
ちなみに、Facebookのgraph APIもバージョンが上がっていて、この取得方法ではデータ取得できませんよ。

0Like

markdown での コードは

```rb
code..
```

の様に装飾してください。
markdown と競合して見づらいです

0Like

Comments

  1. @music1996taro

    Questioner

    例えば、このコードだとどうやって直せば良いのでしょうか?教えて頂けると幸いです。お手本を見せて欲しいです。

  2. いや、 こっちはその文面の修正権限が無く、 ソースも見れないので ソースとして書いているところに ``` 付けてって言っているのですが……。(詳しい書き方についてはリンクを参照のこと。

  3. (未保障動作)エスパーするのであれば 次のコードと推測はするけれど、それは確実ではないです。(元となったソースは見えないので(投稿した貴方は元のコード持っていますよね?

    ```ruby
    require 'open-uri'
    require 'json'
    
    # 指定したURLのFacebookいいね数を取得するクラス
    class FbShareCounter
      # FacebookグラフAPIのURL
      BASE_URL = 'http://graph.facebook.com/?id='
      
      # target_urlにいいね数をカウントする対象URLを指定
      def initialize(target_url)
        @request_url = BASE_URL + target_url
      end
      
      def count
        # グラフAPIにアクセス
        response = open(@request_url).read
        
        # テキストをハッシュに変換
        hash = JSON.parse(response)
        
        # いいね数を取得
       hash['share']['share_count']
      end
    end
    
    counter = FbShareCounter.new('http://gihyo.jp')
    p counter.count
    ```
    
    というソースコードで、コマンドプロンプトで実行した結果、
    ```text:output
    C:/samples/samples/09_03/like_counter.rb:16:in initialize': Invalid argument @ rb_sysopen - http://graph.facebook.com/?id=http://gihyo.jp (Errno::EINVAL) from C:/samples/samples/09_03/like_counter.rb:16:in open'
    from C:/samples/samples/09_03/like_counter.rb:16:in count' from C:/samples/samples/09_03/like_counter.rb:27:in '
    ```
    という結果が帰ってくるのですが、なぜでしょうか?教えていただけると幸いです。
    
  4. 下記の質問 の本文 を こっちの本文に反映した方がいいのではないでしょうか?

  5. @music1996taro

    Questioner

    大変失礼しました。全て編集しましたので、よろしくお願いします!

  6. こっちに反映したのであれば一旦クローズを解除した方が良いと思われます……。

  7. @music1996taro

    Questioner

    重ね重ねすみません。以後気を付けます。

Your answer might help someone💌