Ruby の Cookie 情報取得について質問です。「取得できるサイトとできないサイトの違い」と、「取得する方法」をご教授ください。
現在、以下のコードで Cookie の情報を取得するプログラムを作っています。
require 'net/http'
uri = URI.parse('http://www.google.co.jp')
http = Net::HTTP.new(uri.host)
http.start
response = http.get '/'
p response.get_fields('Set-Cookie')
上のコードのように "www.google.co.jp" などはちゃんと取得できるのですが、中には取得できないサイトもあります。
取得できない場合は、コマンドプロンプトに "nil" と表示されます。
例えば、 "http://auctions.yahoo.co.jp/" を Chrome ブラウザの EditCookie でみてみると、複数の Cookie を確認できます。
しかし上記のコードを試してみると、取得できません。
・この原因は何なのか
・解決方法("auctions.yahoo.co.jp" からの取得方法を知りたいわけではなく、取得できないサイト一般についての解決策)
この2点をご教授いただければ幸いです。
No.1
- 回答日時:
取得できるわけないでしょ。
仮に銀行のCookieを読み取れるってことは、そのURIを踏めば、
誰のでも自由に銀行口座を操作することが可能になるってことですよ。
Cookieの概念を理解するように。
http://detail.chiebukuro.yahoo.co.jp/qa/question …
そんなん読み取れたら脆弱性でブラウザに問題あり。
この回答への補足
説明足らずで申し訳ありません。
Cookie の情報というのは、他人のものではありません。
最終的にしたいことは、Cookie に指定した値を入力して送信したいということです。
そのためのとっかかり(Cookie の受信)ができないので困っています。
No.2
- 回答日時:
実際に試してないので全く見当はずれかも知れませんが……。
auctions.yahoo.co.jpということでふと思ったのですが、それらのクッキーは、ひょっとしてHTTPSアクセスで利用されるのではありませんか。HTTPSアクセスでのクッキーにはSecure属性が設定され、HTTPからは見ることができなくなりますので。
この回答への補足
ご回答ありがとうございます。
HTTPS アクセス時は、 require 'net/https' を使用した別のコードが必要になるんですね。
色々調べることができました。ありがとうございます。
No.3
- 回答日時:
えーと。
。。。まだ説明が良くわからないのですが、RubyでProxyを作りたいのでしょうか?
これであれば答えは先ほどと同じでできないになります。
単純にauctions.yahoo.co.jpからCookieがないと言う質問であれば、
http://auctions.yahoo.co.jpにアクセスしてもCookieは発行されていないので、Nilが正解です。
この辺はFireFoxのLive HTTP HEADERSなどで生の情報を確認しましょう。
また、基本的にヤフオクなどはSSLで暗号化した通信を行うので、
HTTPで通信するだけでは機能的に実現できないことが多いです。
HTTPS通信を利用し、セッションのCookieの一時保管等が必要になるところもあります。
私も昔Perlで作ったことがありますが(証券系のWebサイトに自分のIDでログインし自動的に株価情報を取得し解析する)、ハードルは結構高いです。
少なくてもJavascriptでCookieの操作(IEのアドレスから動かすことが可能です。
たとえばjavascript:alert(document.cookie)とIEのアドレスに入れてみましょう。)、
HTTP_HEADERの解析、Cookieの解析とCookieの改造する知識。
この程度は自分でできるようにならないと厳しいですよ。
この回答への補足
当初したかったことは、下記サイトの内容です。
http://d.hatena.ne.jp/mzp/20070216/cookie
上記サイトのやり方で受信が可能なサイトと不可能なサイトがあるので、悩んでいたのです。
もっと言ってしまうと、下記サイトにアクセスし以下の流れを実行したかったのです。
http://www.cardbotmtgo.com/
このサイトはトレーディングカードの価格を表示するサイトです。
1.サイト内の Cookie "Deck" の値をこちらで設定(例えば Abandon Hope という名前のカードの値段を知りたい場合は "deck=Abandon%20Hope%28TE%23107%29" としたい)
2.こちらで設定した Cookie を送信
3.新たに取得したHTMLから、内容をスクレイピング
という感じです。
しかし FireFox の Live HTTP Headers 及び GoogleChrome の chrome://net-internals/ で調べたところ、このサイトも Set-Cookie がありませんでした。
その代わり、GET のところで "Cookie: listBox-setFilter=ALL%20SETS; listBox-rarityFilter=ALL%20RARITIES; deck=Abandon%20Hope%28TE%23107%29" という表示があったので、そこのところの処理を Ruby でうまくできないかと考えています。
再度質問の確認に戻りますが、知りたいことは
・Cookie は存在するのに Set-Cookie が存在しない意味
・Cookie を送信する方法
です。
mozomozo123さんが仰るように Ruby ではできないのであれば、他の言語で試してみたいと思います。
その際に最適の言語、それからお勧めの書籍を教えていただければ幸いです。
No.4ベストアンサー
- 回答日時:
ああ、なるほど。
私はこのサイトのソースを3分しか見ていないので
見落としがあるかもしれませんが、
このサイトはCookieをJavascriptで発行していますね。
ブラウザであればJavascriptが動作しますが、
Rubyでブラウザがわりのことをしようと思ったら、
Javascriptを独自に解析しないといけません。
この場合、セッションのキーがCookieで発行されていなければ、
そのままCookieで送っている情報をRubyで送ればOKなことが多いです。
Cookieの送信の仕方は、下記のサイトに記述があります。
http://d.hatena.ne.jp/mzp/20070216/cookie
仰るとおり、Javascript による Cookie の処理でした。
Ruby の Net::HTTP では動作しないためにこのような状況になったのですね。
Net::HTTP による Cookie の送信も効果がありませんでしたので、
Watir を利用して処理しようと思います。
色々勉強になりました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Chrome(クローム) google earth PROをクリックすると下記の表示がされPROが開きません 2 2022/07/28 10:25
- Google Drive Google Earth PRO が 次のメツセージが出て開けません 2 2022/10/08 18:46
- その他(プログラミング・Web制作) バッチファイルでPCのモデル名を取得したい 1 2022/03/31 10:58
- PHP sessioncookieをではなくcookieを使わなければならない理由について… 4 2022/11/07 13:01
- Chrome(クローム) 【Google】「同期は有効です」と表示されているがブックマークが同期されていない 2 2022/11/17 13:32
- JavaScript Javascriptを使ってQRコード読み取り、取得した情報をPOSTしたいと思っています。 1 2023/04/28 15:18
- HTML・CSS 別サイトのHTML内にある情報を自動取得して、自分のサイトに組込む方法を教えてください。 例えば、Y 1 2023/06/15 08:09
- その他(ブラウザ) 最近、いろいろなブラウザでログインができません。 2 2022/03/29 00:04
- その他(セキュリティ) Yahoo! JAPANのID取得について 1 2022/11/30 23:00
- オープンソース gmailでのimap設定 1 2022/09/15 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「取得先」という表現について
-
Yahoo! JAPAN IDを新規取得でき...
-
DMMの動画を全件取得したのです...
-
自分の掲示板にアクセス解析を...
-
ps3で久しぶりにCDの音楽情報取...
-
IEを使わないでhtmlテキストを...
-
format関数について
-
ローカルのコンピュータ名を取...
-
先日NISAの投資信託で、初めて...
-
アクセスの度にIPアドレスを変...
-
積立投資してます。現在平均取...
-
ドライブ文字からハードウェア...
-
【C#】FindWindowExの使い方を...
-
一つのアドで各サイトに自動転送
-
PHP の cURL で、htmlを画像へ...
-
EXCEL、マクロ-改ページ行番号...
-
Excel VBA:特定の文字列以降(...
-
検索サイト「goo」で、医療法人...
-
IPアドレスとMACアドレスを取得...
-
C#で特定LANアダプタの状態を取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「取得先」という表現について
-
IEを使わないでhtmlテキストを...
-
Yahoo! JAPAN IDを新規取得でき...
-
自動車教習所について 質問 普...
-
アクセスの度にIPアドレスを変...
-
format関数について
-
Excel VBA:特定の文字列以降(...
-
ローカルのコンピュータ名を取...
-
不正競争防止法に該当するので...
-
ps3で久しぶりにCDの音楽情報取...
-
【VBA】EXCELブックを開かずに...
-
PHP の cURL で、htmlを画像へ...
-
VBS「開いているページ」のURL...
-
VBAでPDFファイルの文書のプロ...
-
ミュージックのアートワークを...
-
EXCEL、マクロ-改ページ行番号...
-
各クライアントマシンのログイ...
-
VB or VBScriptでPCの製造番号...
-
IPアドレスとMACアドレスを取得...
-
【C#】FindWindowExの使い方を...
おすすめ情報