문제

C#을 사용하는 것이 비교적 새로운 것이며 웹 사이트에서 소스 코드의 일부를 읽는 응용 프로그램이 있습니다. 그 모든 것이 작동합니다. 그러나 문제는 해당 페이지 에이 소스 코드에 액세스하기 위해 사용자가 로그인해야한다는 것입니다. 내 프로그램은 처음에 사용자를 웹 사이트에 로그인하는 방법이 필요합니다. 그 후에 완료된 후에는 소스 코드에 액세스하고 읽을 수 있습니다.

로그인 해야하는 웹 사이트는 다음과 같습니다.

나는 하루 종일이 작업을 수행하는 방법에 대해 검색했지만 예를 들어 보았지만 운이 없었습니다.

미리 감사드립니다

올바른 솔루션이 없습니다

다른 팁

WebClient를 사용하여 계속 게시 할 수 있습니다 (Get 대신 HTTP 동사 현재 DownloadString과 함께 사용하고 있지만 (약간) 하위 수준 클래스 WebRequest 및 Webresponse와 함께 작업하는 것이 더 쉽다고 생각합니다.

여기에는 두 부분이 있습니다. 첫 번째는 로그인 양식을 게시하는 것입니다. 두 번째는 "Set -Cookie"헤더를 복구하고 Get 요청과 함께 서버로 "쿠키"로 다시 보내는 것입니다. 서버는이 쿠키를 사용하여 지금부터 귀하를 식별 할 것입니다 (쿠키 기반 인증을 사용하고 있다고 가정하면 페이지가 "phpsessid"를 포함하는 세트 쿠키 헤더를 반환 할 때 상당히 확신합니다).


로그인 양식에 게시합니다

양식 게시물은 시뮬레이션하기 쉽고 다음과 같이 게시물 데이터를 형식화하는 경우입니다.

field1=value1&field2=value2

WebRequest 및 코드를 사용하여 적응했습니다 Scott Hanselman, 다음은 로그인 양식에 양식 데이터를 게시하는 방법입니다.

string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
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"];

다음은 로그인 양식의 세트 쿠키 헤더에서 볼 수있는 예입니다.

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();
}

편집하다:

첫 번째 게시물의 결과를보아야하는 경우 다음과 같이 반환 한 HTML을 복구 할 수 있습니다.

using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
    pageSource = sr.ReadToEnd();
}

바로 아래에 배치하십시오 cookieHeader = resp.Headers["Set-cookie"]; 그런 다음 PageSource에서 고정 된 문자열을 검사하십시오.

WebClient에서 파생 된 클래스를 만들고 GetWebRequest 메소드를 재정의하고 CookieContainer 객체를 설정하여 물건을 상당히 단순화 할 수 있습니다. 항상 동일한 CookieContainer 인스턴스를 설정하면 쿠키 관리가 자동으로 처리됩니다.

그러나 httpwebrequest가 전송되기 전에 유일한 방법은 WebClient에서 상속하고 해당 방법을 무시하는 것입니다.

public class CookieAwareWebClient : WebClient
{
    private CookieContainer cookie = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = cookie;
        }
        return request;
    }
}

var client = new CookieAwareWebClient();
client.BaseAddress = @"https://www.site.com/any/base/url/";
var loginData = new NameValueCollection();
loginData.Add("login", "YourLogin");
loginData.Add("password", "YourPassword");
client.UploadValues("login.php", "POST", loginData);

//Now you are logged in and can request pages    
string htmlSource = client.DownloadString("index.php");

매튜 브린 들리, 귀하의 코드는 내가 필요한 일부 웹 사이트 (로그인 포함)에 매우 효과적이지만 변경해야했습니다. HttpWebRequest 그리고 HttpWebResponse 그렇지 않으면 나는 얻는다 404 나쁜 요청 원격 서버에서. 또한 코드를 사용하여 해결 방법을 공유하고 싶습니다. Moodle을 기반으로 한 웹 사이트, 그러나 그것은 당신의 발걸음에서 작동하지 않았습니다. "로그인 양식 뒤에 페이지를 가져옵니다"성공할 때 전기 로그인, 헤더 'Set-Cookie' 다른 웹 사이트에도 불구하고 아무것도 반환하지 않았습니다.

그래서 나는 이것이 다음 요청을 위해 쿠키를 저장해야한다고 생각합니다. 그래서 이것을 추가했습니다.


로 "로그인 양식에 게시합니다"코드 블록 :

var cookies = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookies;


그리고 "로그인 양식 뒤에 페이지를 가져옵니다" :

HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(resp.Cookies);
getRequest.Headers.Add("Cookie", cookieHeader);


이렇게하면 저를하겠습니다 로그인하십시오 그리고 "로그인 뒤에있는 페이지"(웹 사이트 기반 Moodle)의 소스 코드를 받으십시오. 이것이 모호한 사용이라는 것을 알고 있습니다. CookieContainer 그리고 httpcookies는 먼저 요청을 서버로 보내기 전에 저장된 쿠키 세트가 먼저 요청 될 수 있기 때문에 먼저 요청할 수 있기 때문입니다. 이것은 어쨌든 문제없이 작동하지만 여기에 읽을 수있는 좋은 정보가 있습니다. WebRequest 그리고 WebResponse 샘플 프로젝트 및 튜토리얼 :
.NET에서 HTTP 컨텐츠 검색
.NET에서 httpwebrequest 및 httpwebresponse를 사용하는 방법

때로는 전환하는 데 도움이 될 수 있습니다 AllowAutoRedirect 로그인을 모두 설정합니다 POST 그리고 페이지 GET 동일한 사용자 에이전트를 요청합니다.

request.UserAgent = userAgent;
request.AllowAutoRedirect = false;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top