Google AJAX Feed APIを使って多数のブログの記事から記事内の最初の画像を1枚だけ取得しようと思います。作って画像を取得はできるようになったのですが、記事内に画像があっても取得できない場合があります。一度その記事をリンクから行き表示させれば、こっちでも画像を取得できるようなのですが・・。わけがわからずどうすればいいのか手詰まりしています。どうぞご指南よろしくお願いします。

下記が内容になります
http://blog.livedoor.jp/gameexcavation/java.txt

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2010/12/20 23:34:48
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント500pt

コードだけ提示されてもよくわからないですね。

ざっと見た感じ画像のsrcの正規表現がよくないかと、

var imgCheck = entry.content.match(/(src="http:){1}[\S_-]+((\.jpg)|(\.JPG))/);

相対パスで記述されている場合はhttp~で始まらないのでそれが原因かもしれません。


(コメント欄を有効にしたほうが有益です)

id:numb08

ご回答ありがとうございます。

2010/12/20 00:12:36

その他の回答2件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493ここでベストアンサー

ポイント500pt

コードだけ提示されてもよくわからないですね。

ざっと見た感じ画像のsrcの正規表現がよくないかと、

var imgCheck = entry.content.match(/(src="http:){1}[\S_-]+((\.jpg)|(\.JPG))/);

相対パスで記述されている場合はhttp~で始まらないのでそれが原因かもしれません。


(コメント欄を有効にしたほうが有益です)

id:numb08

ご回答ありがとうございます。

2010/12/20 00:12:36
id:Lhankor_Mhy No.2

回答回数813ベストアンサー獲得回数232

ポイント100pt

的外れな回答でしたら、すみません。コメント欄が空いていたらそちらに書くのですが。

 

>http://help.fc2.com/blog/qa/group16/810/:title>

Q.FC2ブログに置いた画像が他のサイトで表示しません。 A.FC2ブログを画像の置き場にする事を防いだり、サーバーの負担を軽減する為です。ご了承ください。 ※banner.jpg, banner.png, banner.gifでアップロードした場合のみ、他のWEBサイトのURLから呼び出せます。

<<

 

>http://d.hatena.ne.jp/toshi123/20080226/p1:title>

なんで表示されないかというと、画像へのアクセスに対してリファラをチェックしていて、外のサーバからだとはじかれてしまうためです。

<<

「一度その記事をリンクから行き表示させれば、こっちでも画像を取得できる」ということですので、リファラチェックかセッション管理をしているような気がします。

id:numb08

回答ありがとうございます。皆様の意見を参考にいろいろいじってはみたものの、やっぱり改善できませんでした。Lhankor_Mhyさんが言うようなことが原因だったら少し難しそうですね。表示できない場合違う画像を代替することができればいいのですが。もう少し勉強してみます。ちなみにここのコメント欄ってどうするのでしょうか?

2010/12/18 13:32:47
id:mamamaz No.3

回答回数2ベストアンサー獲得回数0

友達とかにきいてみればいいじゃないかとおもいます。

id:numb08

┐(´ー`)┌

2010/12/20 00:11:52
  • id:Cherenkov
    正規表現の部分を.match(/<img.+(src="[^"]+)/i)は試してみました?
    現状動く状態のものを確認できると一番いいんですが。
  • id:numb08
    >>Cherenkovさんへ
    match(/<img.+(src="[^"]+)/i)は試してみました。でも結果同じでやはり画像を読み込んでくれないことがあります。そこで1つ気が付いたのですが上で答えていただいた方の言うようにFC2ブログのリファラチェックかどうか調べてみました。読み込んでくれない先のサイトはFC2ブログのみということがわかりました。こちらが原因じゃなく読み込み先のFC2ブログの仕様が原因の可能性が大きいのかもしれません。となるとどうしようもない気がするので、読み込まない場合に代替の画像を(NO IMAGE画像)を表示させる方法を探してみようと思います。ご意見ありがとうございました。あと現状動く状態のものについては、アダルトサイトですがよければ見ていただければとい。http://blog.livedoor.jp/erohakkutsu/
  • id:Cherenkov
    fc2の仕様を回避するサービスを作ってみました。
    fc2画像のURLの先頭にhttp://refchop.heroku.com/を付けるだけでfc2画像が表示されます。
    <img src="http://refchop.heroku.com/http://blog-imgs-35-origin.fc2.com/t/o/s/gazou.jpg">
    こういう感じで使います。
    動くサンプル: http://jsfiddle.net/waEAy/

    よかったら試してみてください。
  • id:Cherenkov
    var imgCheck = entry.content.match(/(src="http:){1}[\S_-]+((\.jpg)|(\.JPG))/);
    の後に以下を追記するだけでいいと思います。
    if(/\.fc2\.com/.test(imgCheck)) {
    imgCheck = imgCheck.replace(/src="/,'src="http://refchop.heroku.com/');
    }
  • id:numb08
    回答ありがとうございます。そんな方法があるのですね。
    if(/\.fc2\.com/.test(imgCheck)) {
    imgCheck = imgCheck.replace(/src="/,'src="http://refchop.heroku.com/');
    }
    上記を付け足してみましたが、エラーを起こしダメでした(imgCheckの前にvar入れてもだめ)
    むずかしいですね。みなさまのおかげでかなり前進したと思います。もう少し探ってみます。
  • id:Cherenkov
    useFeedでhtmlを組む所がimgCheck[0]になっているのを忘れていました。すいません。
    imgCheckは配列になっているべきなので
    if(/\.fc2\.com/.test(imgCheck)) {
    imgCheck = [imgCheck.replace(/src="/,'src="http://refchop.heroku.com/')];
    }
    こうしてみてください。
  • id:numb08
    何度もすいません。ありがとうございます。
    やってみましたがエラーでした。”if(/\.fc2\.com/.test(imgCheck)) ”の部分が「オブジェクトでサポートされていないプロパティまたはメゾットです」という表示がでました。
  • id:Cherenkov
    なるほど、ではこれで
    if(/\.fc2\.com/.test(imgCheck[0])) {
    imgCheck = [imgCheck.replace(/src="/,'src="http://refchop.heroku.com/')];
    }

    だめならこうとか。
    if(imgCheck[0].match(/\.fc2\.com/)) {
    imgCheck = [imgCheck.replace(/src="/,'src="http://refchop.heroku.com/')];
    }

    ブラウザはなにをお使いですか?
    (このステップが成功したらリファラを偽装してみたい)
  • id:numb08
    上記2つとも同じエラーでした。ちなみにホームページビルダー14で作成とチェックをしています。FIREFOX3.68にてlivedoorブログ上でやっても同じでした。他力本願で申し訳ありません。今の自分の知識ではこれ以上進めませんので、、。自分でももう少し探ってみます。
  • id:numb08
    1つ補足です。ホームページビルダーでは全画像取得し表示されます。それをブログ上に乗せると特定のサイトからの画像が表示されなくなります。
  • id:Cherenkov
    あ、中の[0]が無かった…。これでどうでしょう。
    if(/\.fc2\.com/.test(imgCheck[0])) {
    imgCheck = [imgCheck[0].replace(/src="/,'src="http://refchop.heroku.com/')];
    }

    こちらは気にしないで下さい。自分の案が実証できるか見届けたいのでどこまでも付き合いますよ。
  • id:numb08
    現在
    var imgCheck = entry.content.match(/(src="http:){1}[\S_-]+((\.jpg)|(\.JPG))/);
    if(/\.fc2\.com/.test(imgCheck[0])) {
    imgCheck = [imgCheck[0].replace(/src="/,'src="http://refchop.heroku.com/')];
    }
    この状態にて別のエラーがでました。
    var imgCheck = entry.content.match(/(src="http:){1}[\S_-]+((\.jpg)|(\.JPG))/);
    この行にて「"0"はNullまたはオブジェクトではありません」と。
  • id:Cherenkov
    if(/\.fc2\.com/.test(imgCheck[0])) {

    if(imgCheck && /\.fc2\.com/.test(imgCheck[0])) {
    にするとどうですか。
  • id:numb08
    できました!完璧です!ほんとうにありがとうございます。あとは地道になんとか作っていこうと思います。次におっしゃっていたリファラを偽装というのは何でしょうか?
  • id:Cherenkov
    おお。よかった。
    表示されるまでに若干ラグがありますね。どうしようもありませんが^^;
    (refchopでキャッシュを効かせれば2回目からは効果あるかも)

    fc2のリファラチェック対策としてよくあるのが、クライアント側でリファラを無効にしたり、同一ホストからのアクセスに偽装するものがありますが、
    これは各ユーザが専用のスクリプトを導入する必要があるので、今回のようなサービス提供側がとる対策として適切ではありません。

    そこでrefchopでは、アクセスを受けると、herokuのバーチャルマシン(?)がrubyを使ってfc2から画像をgetしてきて、
    そのバイナリデータをそのままresponse.bodyとして返すことでプロキシみたいなことをやっています。

    正直ちゃんと動作する理由がよくわかってないんですけど、おそらくgetするときにリファラが無効になってる(?)のだと思います。
    一応リファラ偽装のコードも書いてみたんですけど、ローカルのテストでは偽装できていないようでした。まだrefchopには適用していません。
    https://github.com/cherenkov/refchop/blob/master/refchop.rb#L27

    fc2がheroku経由のアクセスを禁止したりすればすぐ使えなくなる手のサービスであることは了解しておいてください。
  • id:Lhankor_Mhy
    串まで作ってあげる回答者は初めて見ました。
    すごいアフターフォローですねー。
  • id:numb08
    Cherenkov様、ご親切に感謝します。ありがたく使わせていただきます。
    お2人のおかけげ問題が解決しました。今回はここで質問を終了とさせていただきます。ほんとうにありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません