( 현재 DownloadString과 함께 사용중인 HTTP 동사 인 GET 대신) WebClient를 POST에 계속 사용할 수 있지만 (약간) 하위 수준 클래스 WebRequest 및 WebResponse로 작업하는 것이 더 쉬울 것이라고 생각합니다.
여기에는 두 부분이 있습니다. 첫 번째는 로그인 양식을 게시하는 것이고 두 번째는 "Set-cookie"헤더를 복구하여 GET 요청과 함께 "쿠키"로 서버에 다시 보내는 것입니다. 서버는 지금부터 귀하를 식별하기 위해이 쿠키를 사용할 것입니다 (이 페이지가 "PHPSESSID"를 포함하는 Set-cookie 헤더를 반환하므로 쿠키 기반 인증을 사용한다고 가정합니다).
로그인 양식에 게시
양식 게시물은 시뮬레이션하기 쉬우 며 다음과 같이 게시물 데이터 형식을 지정하는 경우 일뿐입니다.
field1=value1&field2=value2
WebRequest 및 Scott Hanselman 에서 수정 한 코드를 사용하여 양식 데이터를 로그인 양식에 POST하는 방법은 다음과 같습니다.
string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin";
string formParams = string.Format("email_address={0}&password={1}", "your email", "your password");
string cookieHeader;
WebRequest req = WebRequest.Create(formUrl);
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];
다음은 로그인 양식의 Set-cookie 헤더에 표시되어야하는 내용의 예입니다.
PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,adt_host=-
로그인 양식 뒤에있는 페이지 가져 오기
이제 로그인해야하는 페이지에 대한 GET 요청을 수행 할 수 있습니다.
string pageSource;
string getUrl = "the url of the page behind the login";
WebRequest getRequest = WebRequest.Create(getUrl);
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
pageSource = sr.ReadToEnd();
}
편집하다:
첫 번째 POST의 결과를 확인해야하는 경우 반환 된 HTML을 다음과 같이 복구 할 수 있습니다.
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
pageSource = sr.ReadToEnd();
}
바로 아래 cookieHeader = resp.Headers["Set-cookie"];
에 배치 한 다음 pageSource에있는 문자열을 검사하십시오.