• 締切済み

C#でHP上の特定データを自動更新で抽出したい

ブラウザを立ち上げることなくHPに自動ログイン後、特定の表示データを抽出してリアルタイムに更新表示させたい(ブラウザでは更新ボタンのクリックが必要)。 ニコニコ動画の自動ログイン方法が公開されていますのでそれを真似て下記のプログラムを作成し、見かけ上は正常に動作していますが、これって「GetHtml」を呼ぶ度にログイン → ログアウトを繰り返すのでしょうか? もし、そうであればそれの回避方法を教えて頂けないでしょうか。(.Close()を呼ばないとか?) また、その確認方法があれば併せてお願いします。 /// ログイン (起動時1回のみ呼び出し) public bool LogIn() {  Hashtable hash = new Hashtable();  hash["username"] = "name";  hash["password"] = "123";  hash["Login"] = "login";  string s_param = "";  foreach (string s in hash.Keys)  {  s_param += string.Format("{0}={1}&", s, hash[s]);  }  HttpPost("Https", s_param); } /// POST送信 public void HttpPost(string s_url, string s_param) {  httpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(s_url);  CookieContainer cookieContainer = new CookieContainer();  httpWebRequest.CookieContainer = cookieContainer;  httpWebRequest.ContentType = "application/x-www-form-urlencoded";  byte[] data = Encoding.ASCII.GetBytes(s_param);  httpWebRequest.ContentLength = data.Length;  httpWebRequest.Method = "Post";  Stream reqStream = httpWebRequest.GetRequestStream();  reqStream.Write(data, 0, data.Length);  reqStream.Close();  WebResponse webResponse = httpWebRequest.GetResponse();  Stream resStream = webResponse.GetResponseStream();  encoder = Encoding.GetEncoding("Shift_JIS");  StreamReader streamReader = new StreamReader(resStream, encoder);  spHtml = streamReader.ReadToEnd();  streamReader.Close();  webResponse.Close(); } /// HTML受信(タイマーイベントで常時呼び出し) private string GetHtml(string s_url) {  httpWebRequest = (HttpWebRequest)WebRequest.Create(s_url);  httpWebRequest.CookieContainer = cookieContainer;  webResponse = httpWebRequest.GetResponse();  Stream resStream = webResponse.GetResponseStream();  StreamReader streamReader = new StreamReader(resStream, encoder);  string Html = streamReader.ReadToEnd();  streamReader.Close();  resStream.Close();  return Html; }

みんなの回答

回答No.1

> ニコニコ動画の自動ログイン方法が公開されていますのでそれを真似て下記のプログラムを作成し、見かけ上は正常に動作していますが、これって「GetHtml」を呼ぶ度にログイン → ログアウトを繰り返すのでしょうか? 行いません。 ログインの為のHttpPostで得られたCookieをGetHtmlの中で渡しているので。 > また、その確認方法があれば併せてお願いします。 .NETのHTTP通信はFiddlerでキャプチャできます。 http://www.fiddler2.com/fiddler2/ これを起動した状態で実行すると,どのようにアクセスしているのかがわかると思いますよ。

mark225
質問者

お礼

回答、有り難うございました。 そうですか…。ログイン→ ログアウトは繰り返していないですか…。 実はウエブサイト管理者から連絡があって1日に40万回以上のログイン→ ログアウトが繰り返えされたとのことで、原因を探っているのですが犯人はこの部分くらいしか見当たらなかったもので…。 だとすると原因は何なんでしょうねぇ。逆に困ってしまいました。 何かお気づきのことがありましたら再度ご教示頂けると有難いです。 取り敢えず、紹介して頂いたFiddlerで探ってみます。

関連するQ&A

  • C#でストリームの保存の仕方

    以下のコードのストリームstの保存を行いたいのですが、Streamのインスタンスをnewで作れないので どのようにすればよいでしょうか。お願いします。 HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create("http://www.***.co.jp"); HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse(); Stream st = webres.GetResponseStream();

  • POSTリクエストの投げ方

    ASP.NET(c sharp)、.netフレームワーク2.0環境です。 認証(ベーシック認証)付きのREST APIを使いたいのですが、 リクエストの投げ方が理解できず困っています。 URLを指定してリクエストを投げると動くものなのですが…。 使い方としては、 ・POSTリクエストを使用 ・"item"をキーにして、対象になるURLの配列を指定 とのことです。 { "item" : [ "http://www.yahoo.co.jp/test1.jpg", "http://www.google.co.jp/test2.jpg" ] } ↑サンプルとして載っていました 以下の通り作ってみましたが、うまく動きません。 URLの配列指定がうまく出来ていないのではないかと思うのですが、 方法を教えていただけないでしょうか。 宜しくお願いします。 //HttpWebRequestの作成 WebRequest webreq = WebRequest.Create("https://api.test.com"); webreq.Method = "POST"; //認証の設定 webreq.Credentials = new System.Net.NetworkCredential("test@test.com", "testpass"); //POSTするデータ string postData = "item=http://www.yahoo.co.jp/test1.jpg"; byte[] byteArray = Encoding.UTF8.GetBytes(postData); webreq.ContentType = "application/json"; webreq.ContentLength = byteArray.Length; Stream dataStream = webreq.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); WebResponse response = webreq.GetResponse(); dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string responseFromServer = reader.ReadToEnd(); reader.Close(); dataStream.Close(); response.Close();

  • twitterAPIについて

    twitterAPIについて です。 今Visual Studio 2008でC#.NETでtwitterのタイムラインを読み込んでみようと思っています。 xmlを読み込むまではできましたが、 そのxmlを抽出する方法が全く分かりません。 このさきどうすればいいのでしょうか? ユーザー1:ツイート ユーザー2:ツイート といった感じにTextBoxに並べるのが目標です。 文字列をxmlに変換する方法があるのでしょうか? 一応ソースコードを載せて起きます。(using部分、例外処理などは除く) private void XmlLoad() { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://twitter.com/statuses/home_timeline.xml"); request.Credentials = new NetworkCredential(IDtext.Text, passText.Text); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; request.Timeout = 10000; System.Net.ServicePointManager.Expect100Continue = false; WebResponse response = request.GetResponse(); Encoding enc = Encoding.GetEncoding(932); StreamReader reader = new StreamReader(response.GetResponseStream(), enc); string result = reader.ReadToEnd(); result = System.Web.HttpUtility.HtmlDecode(result); resultText.Text = result; reader.Close(); response.Close(); } private void OK_Click(object sender, EventArgs e) { XmlLoad(); } オブジェクト(TextBoxなど)は、 IDText(TextBox) passText(TextBox) OK(Button) resultText(TextBox) です! わかる方お願いします。 質問があれば答えます。

  • C#でIEの操作ができないページの操作方法

    C#でIEを操作しようとしているのですが、HTMLを取得する際にエラーが出てしまします。なぜでしょうか? yahooなどのサイトのHTMLは取得できるのですが、実際にhtmlを取得したいサイトは「型 'System.Net.WebException' のハンドルされていない例外が System.dll で発生しました 追加情報:接続が切断されました: 送信時に、予期しないエラーが発生しました。」とエラーがでます。 HTMLが取得できないサイトがあるのでしょうか? その時にどうすればHTMLを取得し、操作できるのかその方法を教えてください。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Encoding enc = Encoding.GetEncoding("Shift_JIS"); string url = "https://www.yahoo.co.jp/"; WebRequest req = WebRequest.Create(url); WebResponse res = req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st, enc); string html = sr.ReadToEnd(); sr.Close(); st.Close(); Console.WriteLine(html); } } }

  • VB2003でファイルのダウンロードについて教えて

    Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest) Dim res As WebResponse = req.GetResponse() Dim resStream As Stream = res.GetResponseStream() Dim fs As New System.IO.FileStream(SaveName, FileMode.Create, FileAccess.Write) Dim b As Integer While True b = resStream.ReadByte() If b = -1 Then Exit While fs.WriteByte(Convert.ToByte(b)) End While VB.NET2003ですが上記の方法でファイルをダウンロードしているのですが、 ブラウザで表示して転送される場合は30秒ほどなのですが、 この方法でダウンロードすると130秒くらいかかってしまいます。 ディスクに書き込む動作が足を引っ張っているのかと思って 下から2行目を消して計測してみたのですがそれでも10秒ほどしか短縮しませんでした。 タスクマネージャーで確認してもCPUリソースが50をずっと超えているのですが ブラウザなどでダウンロードする時のように高速でCPUに負担をかけずにダウンロードするには どんな方法でやれば良いでしょうか? よろしくお願い致します。

  • [C#]htmlを取得できないページがある。

    C#でhtmlソースを取得したいのですが、取得できるページと出来ないページがあって困っています。 取得方法は以下の方法を使用しています。 ===ここから=== HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest; HttpWebResponse res = null; try { res = req.GetResponse() as HttpWebResponse; } catch { MessageBox.Show(url + "指定した Web ページが応答していません!", "エラー"); } StreamReader reader = new StreamReader(res.GetResponseStream(), Encoding.GetEncoding(encode)); string htmlsource = reader.ReadToEnd(); reader.Close(); =================== htmlsourceにソースが入るのですが、取得できないページも一応ソースは取得できるのですが、 実際にIEなどのブラウザで表示した場合のソースと異なります。 ユーザーエージョンとして req.UserAgent = "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"; を設定しても結果は同じでした。 ■取得できるページ例 http://www.amazon.co.jp/s/ref=sr_nr_n_1/375-1273809-4334332?rh=n%3A465392%2Cn%3A!465610%2Cn%3A571582&bbn=465610&ie=UTF8&qid=1376454464&rnid=465610&lo=stripbooks ■取得できないページ例 http://www.amazon.co.jp/s/ref=sr_nr_n_3?rh=n%3A465392%2Cn%3A!465610%2Cn%3A492152&bbn=465610&ie=UTF8&qid=1376454590&rnid=465610&lo=stripbooks

  • フォト蔵へアップロードできません(C#)

    フォト蔵へアップロードするとエラー400が出てしまいます。 何が原因なのでしょうか?原因を教えてください。 以下コード //フォト蔵へのアップロード(注意動きません)// //送信するファイルのパス filePath="C:\\Users\\Public\\Pictures\\Sample Pictures\\test.jpg"; //送信先のURL string url1 = "http://api.photozou.jp/rest/photo_add"; //文字コード System.Text.Encoding enc = System.Text.Encoding.GetEncoding("UTF-8"); //WebRequestの作成 System.Net.HttpWebRequest req = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url1); //メソッドにPOSTを指定 req.Method = "POST"; //ベーシック認証宣言、アカウントとパスワード req.PreAuthenticate = true; NetworkCredential network = new NetworkCredential("mailaddress@hoge.com", "password"); req.Credentials = network; //ヘッダを設定 req.Headers.Add("album_id", "1234567"); //ContentTypeを設定 req.ContentType = "image/jpeg"; //POST送信するデータを作成 System.IO.FileStream fs = new System.IO.FileStream( filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); //POST送信するデータの長さを指定 req.ContentLength = fs.Length; //データをPOST送信するためのStreamを取得 System.IO.Stream reqStream = req.GetRequestStream(); //ファイルの内容を送信 byte[] readData = new byte[0x1000]; int readSize = 0; while (true) { readSize = fs.Read(readData, 0, readData.Length); if (readSize == 0) break; reqStream.Write(readData, 0, readSize); } fs.Close(); reqStream.Close(); //サーバーからの応答を受信するためのWebResponseを取得 System.Net.HttpWebResponse res = (System.Net.HttpWebResponse) req.GetResponse(); //応答データを受信するためのStreamを取得 System.IO.Stream resStream = res.GetResponseStream(); //受信 System.IO.StreamReader sr = new System.IO.StreamReader(resStream, enc); //閉じる sr.Close();

  • VB.NETで出来てC#で出来ない???

    VB.NETでは出来るのにC#で同じようにするやり方がわからなくて困っています。 VSのバージョンは2008です。 やりたいことは 『param.Item("AAA") = "111"』 このように書けるクラスを作りたいのですが、 VBで出来てC#では出来ないのでしょうか? イメージとしてはプロパティにメソッドをくっつけたようなクラス? C#ではこのように書くとエラーになります。 どのようにしたらいいでしょうか? public string Item(string Key) {  set { _param[Key] = value; } } VB Dim param As New Param() param.Item("AAA") = "111" ----Paramクラス---- Imports System.Text Public Class Param Private _Hash As New Hashtable Default Public Property Item(ByVal Key As String) As String Get Return _Hash(Key) End Get Set(ByVal value As String) _Hash(Key) = value End Set End Property End Class ---------

  • HTTPでPOSTしてgooメールにログイン

    Javaを使用して、HTTPでgooメールにログインしたいのですが、うまくいきません。 サンプルを探して試しているのですが、レスポンスに「302」が返却されます。 HTTPヘッダの情報が足りないのか、POSTするデータが足りないのか、 はたまた、その他なにかしらが足りないのか、ご存知の方がおりましたら、教えて頂けないでしょうか? 以下apacheのhttpclientを使ったレスポンスに「302」が返却されるプログラムです。 public class http_test { public static void main(String[] args) { try { String url = "https://login.mail.goo.ne.jp/id/authn/Login"; String id = "gooID"; // gooID ※質問用にダミー値を設定 String pass = "password"; // パスワード ※質問用にダミー値を設定 String params = "uname="+ id +"&pass=" + pass + "&Site=mail.goo.ne.jp&Success=http://mail.goo.ne.jp"; HttpPost httpPost = new HttpPost( url ); DefaultHttpClient httpClient = new DefaultHttpClient(); StringEntity paramEntity = new StringEntity( params ); paramEntity.setChunked( false ); paramEntity.setContentType( "application/x-www-form-urlencoded" ); httpPost.setEntity( paramEntity ); HttpResponse response = httpClient.execute( httpPost ); int status = response.getStatusLine().getStatusCode(); if ( status != HttpStatus.SC_OK ) { // ここで「302」が返却される System.out.println(status); throw new Exception( "" ); } }catch(Exception e) { e.printStackTrace(); } } }

  • HTTPSのサイトからのダウンロード方法

    HTTPSのサイトにアクセスしてブラウザではなくテキストで表示させるにはどうすればいいのでしょうか? 通常のHTTPのサイトからは下記のコードで動作するようになりました。 これでHTTPSのサイトにアクセスしても返事が返ってきません。 今アクセスしようとしているページはまだユーザー名、パスワードが不用なページです。 ブラウザで表示させれば問題なく表示されます。 ご存知の方は教えて下さい。 [サンプルコード] Private Sub btnConnect_Click(ByVal sender As System.Object,_    ByVal e As System.EventArgs) Handles btnConnect.Click 'HttpWebRequestの作成 Dim strURL As String txtResponce.Text = "" txtResponce.Refresh() If Me.rbULR1.Checked Then strURL = txtURL1.Text Else strURL = txtURL2.Text End If Dim webreq As System.Net.HttpWebRequest = _ CType(System.Net.WebRequest.Create(strURL), _ System.Net.HttpWebRequest) 'サーバーからの応答を受信するためのHttpWebResponseを取得 Dim webres As System.Net.HttpWebResponse = _ CType(webreq.GetResponse(), System.Net.HttpWebResponse) '文字コードを指定する Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding(932) '応答データを受信するためのStreamを取得 Dim st As System.IO.Stream = webres.GetResponseStream() Dim sr As New System.IO.StreamReader(st, enc) '受信して表示 Me.txtResponce.Text = sr.ReadToEnd() '閉じる sr.Close() End Sub

専門家に質問してみよう