Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.IO;
- using System.Net;
- using System.Text;
- using System.Collections;
- using System.Windows.Forms;
- using System.Reflection;
- namespace PostTest
- {
- public class CookiePostClass
- {
- public System.Net.CookieContainer cContainer =
- new System.Net.CookieContainer();
- public string PostData(string url, string data)
- {
- //文字コードを指定する
- Encoding enc = Encoding.GetEncoding("euc-jp");
- byte[] postDataBytes = Encoding.ASCII.GetBytes(data);
- //WebRequestの作成
- HttpWebRequest webreq =
- (HttpWebRequest)WebRequest.Create(url);
- webreq.Method = "POST";
- webreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0";
- webreq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
- webreq.Headers.Add("Accept-Language", "ja");
- webreq.Headers.Add("Accept-Encoding", "gzip, deflate");
- webreq.KeepAlive = true;
- // Keep-Aliveをヘッダに付加するため
- var sp = webreq.ServicePoint;
- var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
- prop.SetValue(sp, (byte)0, null);
- // ヘッダをブラウザのものと揃えるため
- webreq.Referer = "http://kids.yahoo.co.jp/";
- webreq.ContentType = "application/x-www-form-urlencoded";
- webreq.ContentLength = postDataBytes.Length;
- webreq.ServicePoint.Expect100Continue = false;
- webreq.AllowAutoRedirect = false;
- //CookieContainerプロパティを設定する
- webreq.CookieContainer = new CookieContainer();
- //要求元のURIに関連したCookieを追加し、要求に使用する
- webreq.CookieContainer.Add(cContainer.GetCookies(webreq.RequestUri));
- foreach (Cookie c in cContainer.GetCookies(webreq.RequestUri))
- {
- // 別にforeachしなくても良かった.結果は変わらずなので無視
- webreq.Headers.Add("Cookie", c.ToString());
- }
- // 書き込み
- Stream reqStream = webreq.GetRequestStream();
- reqStream.Write(postDataBytes, 0, postDataBytes.Length);
- reqStream.Close();
- //サーバーからの応答を受信するためのWebResponseを取得
- HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse();
- //受信したCookieのコレクションを取得する
- CookieCollection cookies = webreq.CookieContainer.GetCookies(webreq.RequestUri);
- //Cookie名と値を列挙する
- foreach (Cookie cook in cookies)
- Console.WriteLine("{0}={1}", cook.Name, cook.Value);
- //取得したCookieを保存しておく
- cContainer.Add(cookies);
- if (Array.IndexOf(webres.Headers.AllKeys, "Location") > -1)
- {
- // リダイレクト無効にしてあるので手動でリダイレクト
- Console.WriteLine("Locate: " + webres.Headers["Location"]);
- return GetHtml(webres.Headers["Location"]);
- }
- webres.Cookies = cContainer.GetCookies(new Uri(url));
- //応答データを受信するためのStreamを取得
- Stream st = webres.GetResponseStream();
- StreamReader sr = new StreamReader(st, enc);
- //受信して表示
- string html = sr.ReadToEnd();
- //閉じる
- sr.Close();
- return html;
- }
- public string GetHtml(string url)
- {
- //文字コードを指定する
- System.Text.Encoding enc =
- System.Text.Encoding.GetEncoding("euc-jp");
- //WebRequestの作成
- System.Net.HttpWebRequest webreq =
- (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
- restart:
- webreq.CookieContainer = cContainer;
- webreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0";
- webreq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
- webreq.AllowAutoRedirect = false;
- //サーバーからの応答を受信するためのWebResponseを取得
- System.Net.HttpWebResponse webres =
- (HttpWebResponse)webreq.GetResponse();
- //受信したCookieのコレクションを取得する
- System.Net.CookieCollection cookies =
- webreq.CookieContainer.GetCookies(webreq.RequestUri);
- //取得したCookieを保存しておく
- cContainer.Add(cookies);
- //Console.WriteLine("ResponseUri:: " + webres.ResponseUri.ToString());
- if (Array.IndexOf(webres.Headers.AllKeys, "Location") > -1)
- {
- // 手動リダイレクト
- webreq = (HttpWebRequest)WebRequest.Create(webres.Headers["Location"]);
- goto restart;
- }
- //応答データを受信するためのStreamを取得
- System.IO.Stream st = webres.GetResponseStream();
- System.IO.StreamReader sr = new System.IO.StreamReader(st, enc);
- //受信して表示
- string html = sr.ReadToEnd();
- //閉じる
- sr.Close();
- return html;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment