Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

amazon.rb を amzn.to に対応させる #32

Closed
hsbt opened this issue May 14, 2011 · 14 comments

Comments

Projects
None yet
3 participants
@hsbt
Copy link
Member

commented May 14, 2011

生成するリンクは amzn.to がいいなあ。もちろんオプションで変更できるようにする。

@arton

This comment has been minimized.

Copy link
Contributor

commented May 14, 2011

bit.lyに対応するだけならば、次のパッチのように単純です。
ここではamazonが短縮サービスをbit.lyから変えると厄介なのでcacheは元のままとして、amazon_urlの中で取り出す時に短縮しています(デザインで決定すべき事項1。都度変形なのでパフォーマンス上は不利。cahceに入れるのなら新たな要素の追加が必要)。
また、APIのlongIDとapiKeyをどう持つかも決定すべき事項ですね(bit.ly プラグインのようなものを追加してそこと共有するかamazonプラグイン固有とするか(設定画面のUIや、hideするレベル)、他の短縮サービスの場合はどうするか)。

--- misc/plugin/amazon.rb~  2011-04-29 07:54:12.000000000 +0900
+++ misc/plugin/amazon.rb   2011-05-14 14:49:09.000000000 +0900
@@ -123,7 +123,17 @@ def amazon_image( item )
 end
 
 def amazon_url( item )
-   item.elements.to_a( 'DetailPageURL' )[0].text
+   url = item.elements.to_a( 'DetailPageURL' )[0].text
+   begin
+       resp = amazon_fetch("http://api.bit.ly/v3/shorten?login=#{bitly.login}&apiKey=#{bitly.apikey}&longUrl=#{URI.escape(url)}&format=xml".untaint)
+       if resp =~ /<url>([^<]+)<\/url>/
+           $1
+       else
+           url
+       end
+   rescue
+       return url
+   end
 end
 
 def amazon_label( item )
@hsbt

This comment has been minimized.

Copy link
Member Author

commented May 14, 2011

tdiary-contrib に bitly.rb というプラグインが既にあり、そこでは bitly.login, bitly.key というパラメータに情報を保存しているのでそれを共有するのがよさそうです。
できれば bitly プラグインで短縮してはどうかと思ったりもしたんですが、amazon.rb の方が先に eval されてしまうので使えないのでした。とほほ。

@hsbt hsbt closed this in 28ceb3e May 14, 2011

@hsbt

This comment has been minimized.

Copy link
Member Author

commented May 14, 2011

bit.ly を使う使わないというオプションを追加して都度リクエストする形でコミットしました。キャッシュ対応等は必要があればまた対応という形にします。

@arton

This comment has been minimized.

Copy link
Contributor

commented May 14, 2011

対応ありがとうございます。
あれからいろいろ試したのですが、1日あたりの書影は少なくても月表示だと大量になる場合があるので、キャッシュしておいたほうが良いと考えるようになりました。というのは数値は明示されていませんが、per-minute, per-hour, per-ipの制限を設けているとhttp://code.google.com/p/bitly-api/wiki/ApiDocumentation にあるからです。たとえばブクマされたりしてアクセス頻度が高まると、この制限に引っ掛かる可能性が出てきます。
以下がパッチです。
短縮URLはアマゾンのレスポンスキャッシュとは別ファイル(以下のパッチでは#{asin}.urlという名前)にキャッシュするようにしています。

--- amazon.rb~  2011-05-15 02:43:42.000000000 +0900
+++ amazon.rb   2011-05-15 03:10:26.000000000 +0900
@@ -124,15 +124,22 @@ end
 
 def amazon_url( item )
    url = item.elements.to_a( 'DetailPageURL' )[0].text
+   return url unless @conf['amazon.bitly']
    begin
-       resp = @conf['amazon.bitly'] ? amazon_fetch("http://api.bit.ly/v3/shorten?login=#{@conf['bitly.login']}&apiKey=#{@conf['bitly.key']}&longUrl=#{URI.escape(url)}&format=xml".untaint) : nil
-       if resp =~ /<url>([^<]+)<\/url>/
-           $1
-       else
-           url
+       file = "#{@cache_path}/amazon/#{item.elements.to_a('ASIN')[0].text}.url".untaint
+       begin
+           File::read(file)
+       rescue Errno::ENOENT
+           resp = amazon_fetch("http://api.bit.ly/v3/shorten?login=#{@conf['bitly.login']}&apiKey=#{@conf['bitly.key']}&longUrl=#{URI.escape(url)}&format=xml".untaint)
+           if resp =~ /<url>([^<]+)<\/url>/
+               File::open(file, 'wb') {|f| f.write($1) }
+               $1
+           else
+               url
+           end
        end
    rescue
-       return url
+       url
    end
 end

@hsbt hsbt reopened this May 14, 2011

@hsbt

This comment has been minimized.

Copy link
Member Author

commented May 15, 2011

キャッシュ機能を取り込みました!

@hsbt hsbt closed this May 15, 2011

@tdtds

This comment has been minimized.

Copy link
Member

commented May 15, 2011

Closeになっちゃったけど、この機能が必要な理由がよくわからない。自分の日記にあるアフィリエイトリンクをどこかへ流用したい?

また、実装的にはサーバサイドではなく、クライアントサイドでJavaScriptを使う方がレスポンスタイムに影響が出なくて良いと思います。limitの問題があるけど、上記のような動機ならクリックアクションを契機にしてもいいわけで、サーバサイドにキャッシュのような複雑な仕組みを入れずにすみます。

@hsbt hsbt reopened this May 15, 2011

@hsbt

This comment has been minimized.

Copy link
Member Author

commented May 15, 2011

個人的には単純にクリック数を監視することができて嬉しいなあと思ってます。

ところで bit.ly って apikey が必要と思っていますが、それを隠した上でクライアントサイドで置き換えって実現できるものなのでしょうか?

@tdtds

This comment has been minimized.

Copy link
Member

commented May 15, 2011

その用途ならますますjs向きのような。botに踏まれても嬉しくないし。いっそ全a要素のクリックにフックして、あらゆるリンクを監視できるようにしてはどうだろう?

bit.ly APIはjs利用の実装も多いから問題ないと思うけど、規約は調べる必要はあるね。

@arton

This comment has been minimized.

Copy link
Contributor

commented May 15, 2011

>自分の日記にあるアフィリエイトリンクをどこかへ流用したい?
実はアフィリエイトIDは指摘されるまで考えもしてませんでしたけど、それは1つの理由になりますねぇ。
iPadや、Androidから自分のページのリンクをよそに持ち出すときに(ここでアフィリエイトIDは失念してたのでまずいかなぁという気になってきたけど)アマゾンが返すURIが長過ぎ(商品名が埋め込まれているのはある意味利便性は高いとは思うけど)で、ペーストした後の始末に困っていたのが大きいです。
で、bit.lyとamazonが契約しているということは、amzn.toで始まるURIが少なくともアマゾン向けのURIだということが保証されるということで、ならば短縮URIでも気軽に使えて良いなぁというのが本来の動機です。
-botはhrefよりもアンカーのtextのほうを見るのじゃないかなぁ。
-クライアントサイドについては、確かにlogin+apiIdが気になりますね。
ところで、今頃思いだしましたが(とtDiary+Amazon関係でここで無理やり質問してしまいますが)、そろそろAmazon用プロクシとしてwww.artonx.orgを提供できますが、どうすれば良いのでしょう?

@tdtds

This comment has been minimized.

Copy link
Member

commented May 15, 2011

bot云々は、日記をクロールする検索エンジンbot(など)が短縮URLをたどることでbit.ly側でカウントされることを指しています。人間がリンクを踏んだときだけを知りたいはずなので、サーバサイドで短縮するのは目的に合致していないだろうと。

API keyは秘密にしろとは書いてないんだよなぁ。もともと3rd partyに渡すのが目的なので。bit.lyが配布しているjsライブラリはPHP(!)のサービスを介すことでAPI keyを隠蔽してるけど、そのまま使うようなjsライブラリも普通に公開されてる。不正利用されたらリセットもできるから、特に問題ないと思いますが。もっともjsだとartonさんの要望は満たしにくいけど……。

Amazonのリバースプロキシはこちらから勝手に登録できますので、ぜひぜひ→ http://honnomemo.appspot.com/rpaproxy/

@tdtds

This comment has been minimized.

Copy link
Member

commented May 17, 2011

botが短縮URLを踏むとアクセスがカウントされてしまうことがわかったので、この実装は(少なくとも)hsbtの要件には合いません。

artonさんの要件に関しては手元でjs版が動き始めたのでそれを入れましょう(LazyLoadっぽい機能を入れたいのでまだできてないけど)。このパッチは戻して下さい。

@hsbt

This comment has been minimized.

Copy link
Member Author

commented May 17, 2011

オプションで選択可能にできることは必須と思いますけどそれも含めて差し戻しますか?

@tdtds

This comment has been minimized.

Copy link
Member

commented May 17, 2011

オプション切り替えは必要だけど、amazon.bitly周辺のコードはこっちで改めて入れます(ロジックがぜんぜん違うので)。ので、ぜんぶ戻しちゃって良いです。

@hsbt hsbt closed this in 847d55a May 17, 2011

@hsbt hsbt reopened this May 17, 2011

@hsbt

This comment has been minimized.

Copy link
Member Author

commented May 17, 2011

revert しました! js 版よろしくお願いします。

@tdtds tdtds closed this in 7140bb6 May 17, 2011

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.