2010-10-13 78 views
2

我想用C#登錄到我的eBay帳戶。我看過各種帖子,並找到以下3個選項。不幸的是,他們都沒有工作。我還列出了我獲得的響應標頭值以及Fiddler在進行登錄時顯示的值。有一個區別,因爲我只有一個「Set-Cookie」值,Fiddler顯示10個「Set-Cookie」值。我哪裏錯了?另外,爲什麼我只能得到一個「Set-Cookie」值?非常感謝任何人都可以分享工作解決方案。這裏是我試過的3個選項:用C登錄Ebay#

 string userName = "myUserName"; 
     string password = "myPassword"; 
     string myEbayUrl = "http://my.ebay.com/ws/eBayISAPI.dll?MyEbay&gbh=1"; 
     string signInUrl = "https://signin.ebay.com/ws/eBayISAPI.dll? co_partnerid=2&siteid=0&UsingSSL=1"; 
     string postData = String.Format("MfcISAPICommand=SignInWelcome&userid={0}&pass={1}", userName, password); 
     string contentType = "application/x-www-form-urlencoded"; 
     string method = "POST"; 
     string userAgent = "Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)"; 
     string pageSource; 
     CookieContainer cookieContainer = new CookieContainer(); 
     IWebProxy proxy = WebRequest.GetSystemWebProxy(); 
     proxy.Credentials = CredentialCache.DefaultCredentials; 

     //OPTION 1 
     Debug.WriteLine("OPTION 1:"); 
     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(signInUrl); 
     req.CookieContainer = cookieContainer; 
     req.Method = method; 
     req.ContentType = contentType; 
     req.UserAgent = userAgent; 
     req.Proxy = proxy; 

     ASCIIEncoding encoding = new ASCIIEncoding(); 
     byte[] loginDataBytes = encoding.GetBytes(postData); 
     req.ContentLength = loginDataBytes.Length; 
     Stream stream = req.GetRequestStream(); 
     stream.Write(loginDataBytes, 0, loginDataBytes.Length); 
     stream.Close(); 
     //login 
     HttpWebResponse signInRes = (HttpWebResponse)req.GetResponse(); 

     //loop through header items 
     foreach (var item in signInRes.Headers.AllKeys) 
     { 
     Debug.WriteLine(item + " : " + signInRes.Headers[item.ToString()]); 
     } 

     HttpWebRequest myEbayReq = (HttpWebRequest)HttpWebRequest.Create(myEbayUrl); 
     myEbayReq.CookieContainer = cookieContainer; 
     myEbayReq.Method = method; 
     myEbayReq.ContentType = contentType; 
     myEbayReq.UserAgent = userAgent; 
     myEbayReq.AllowAutoRedirect = false; 
     myEbayReq.Proxy = proxy; 
     //get MyEbay page behind login 
     using (StreamReader sr = new StreamReader(myEbayReq.GetResponse().GetResponseStream())) 
     { 
      pageSource = sr.ReadToEnd(); 
     } 
     savePage(pageSource, "option1"); 

     //OPTION 2 without cookiecontainer 
     Debug.WriteLine("OPTION 2:"); 
     string cookieHeader; 
     WebRequest request = WebRequest.Create(signInUrl); 
     request.ContentType = contentType; 
     request.Method = method; 
     request.Proxy = proxy; 
     byte[] bytes = Encoding.ASCII.GetBytes(postData); 
     request.ContentLength = bytes.Length; 
     using (Stream os = request.GetRequestStream()) 
     { 
      os.Write(bytes, 0, bytes.Length); 
     } 
     //login 
     WebResponse loginResp = request.GetResponse(); 
     cookieHeader = loginResp.Headers["Set-cookie"]; 
     //loop through header items 
     foreach (var item in loginResp.Headers.AllKeys) 
     { 
      Debug.WriteLine(item + " : " + loginResp.Headers[item.ToString()]); 
     } 
     //get MyEbay page behind login 
     WebRequest getRequest = WebRequest.Create(myEbayUrl); 
     getRequest.Proxy = proxy; 
     getRequest.Headers.Add("Cookie", cookieHeader); 
     WebResponse getResponse = getRequest.GetResponse(); 
     using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
     { 
      pageSource = sr.ReadToEnd(); 
     } 
     savePage(pageSource, "option2"); 

     //OPTION 3 using derived web client class 
     Debug.WriteLine("OPTION 3:"); 
     using (var client = new LoginWebClient()) 
     { 
      client.Proxy = proxy; 

      var values = new NameValueCollection 
      { 
       { "userid", userName }, 
       { "pass", password }, 
      }; 
      // login 
      client.UploadValues(signInUrl, values); 
      //loop through header items 
      foreach (var item in client.ResponseHeaders.AllKeys) 
      { 
       Debug.WriteLine(item +" : "+client.ResponseHeaders[item.ToString()]); 
      } 

      //get MyEbay page behind login 
      pageSource = client.DownloadString(myEbayUrl); 
     } 
     savePage(pageSource,"option3"); 

派生的Web客戶端類:

public class LoginWebClient : WebClient 
{ 
    public CookieContainer CookieContainer { get; private set; } 

    public LoginWebClient() 
    { 
     CookieContainer = new CookieContainer(); 
    } 

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

這裏有響應報頭值,我得到:

選項1:
Set-Cookie: ebay =%5Esbf%3D%23%5E;域= .ebay.com;路徑= /,DP1 = BPBF /%2344e96da9a^U1P/QEBfX0BAX19AQA ** 4e96da9a ^;域= .ebay.com;到期日= 2012年10月12日星期五12:33:30 GMT;路徑= /,CSSG = a594ba2b12b0a040b12546d5ffc24e56;域= .ebay.com;路徑=/S = CgAD4ACBMtviaYTU5NGJhMmIxMmIwYTA0MGIxMjU0NmQ1ZmZjMjRlNTblRK7X;域= .ebay.com;路徑= /;僅Http,非會話= CgADKACBWG6iaYTU5NGJhMmIxMmIwYTA0MGIxMjU0NmQ1ZmZjMjRlNTYAywABTLWuIjE5937t;域= .ebay.com;到期= 2011年10月13日星期四12:33:30 GMT;路徑=/ 服務器:Apache-狼/ 1.1 緩存控制:私人 雜注:無緩存 的Content-Type:text/html的;字符集= UTF-8 內容長度:16980 日期:週三,10月13日2010 12時33分30秒GMT

選項2:
的Set-Cookie:易趣=%5Esbf%3D%23%5E;域= .ebay.com;路徑= /,DP1 = BPBF /%2344e96da9d^U1P/QEBfX0BAX19AQA ** 4e96da9d ^;域= .ebay.com;到期日= 2012年10月12日星期五12:33:33 GMT;路徑= /,CSSG = a594c8cf12b0a02662265926ffc9c4a3;域= .ebay.com;路徑= /,S = CgAD4ACBMtvidYTU5NGM4Y2YxMmIwYTAyNjYyMjY1OTI2ZmZjOWM0YTM4WWlH;域= .ebay.com;路徑= /,非會話= CgADKACBWG6idYTU5NGM4Y2YxMmIwYTAyNjYyMjY1OTI2ZmZjOWM0YTMAywABTLWuJTFk6RbF;域= .ebay.com;到期= 2011年10月13日星期四12:33:33 GMT;路徑=/ 服務器:Apache-狼/ 1.1 緩存控制:私人 雜注:無緩存 的Content-Type:text/html的;字符集= UTF-8 內容長度:16979 日期:週三,10月13日2010 GMT 12時33分32秒

OPTION 3:
連接:保持活動 代理連接:保持活動 的Content-Length:8154 的Content-Type:text/html的 日期:週三,10月13日2010 12:33:37 GMT ETag:cd78002149191b683d4d0b3c98f6d5e3 Last-Modified:Wed,13 Oct 2010 11:55:34 GMT 服務器:Apache-狼/ 1.1 途經:1.1 SATURN

而這裏是響應頭的值即表示的Fiddler:

的Set-Cookie: DS1 = ATS/1286972903913;域= .ebay.com; Path =/
Set-Cookie: ds2 = alss/0.4cb6f76c ^;域= .ebay.com; Path =/
Set-Cookie: ebay =%5Elrtjs%3D2。6%5EsfLMD%3D0%5Esbf%3D%23a0000000004%5Ecos%3D-7%5Ecv%3D15555%5Elvmn%3D0%7C0%7C%5Esin%3Din%5Ejs%3D1%5E;域= .ebay.com;路徑=/
的Set-Cookie: DP1 = bvrvi/3%7C0%7C250707265333%7C250707988126%7C250707990497%7C4cc2d4ec^PCID/1578961514e96d96c^A1P/04cb6f76c^FM/4.3.24cdbe2b3^MPC/0%7C04cc2d4ec^PBF /% 23180c20000044e96d96c^TZO/-784cb5b3fc^U1P/ZXF1aW5veDIwMTI * 4e96d96c^IDM/14cb83979^U1F/Ewald4e96d96c ^;域= .ebay.com;到期日= 2012年10月12日星期五12:28:28 GMT;路徑=/
的Set-Cookie: NS1 = BAQAAASuJIxIvAAaAANgAXk6W2WxmMDAwYzg2fDYwMV4xMjg2ODg2ODY3MTQ4XmMybHlMbkp2ZEdoelkyaHBiR1E9XjFeM3wyfDY1fDV8NHw3XjFeMl40XjJeMTJeMTJeMl4xXjFeMF4xXjBeMV44MTMxAKUAGE6W2Ww2NzQ2MTc1Mi8wOzEwMjU4MTk5NjkvMDtugrDk7fid3JLf0Q9Jz19v95p6vg * ;域= .ebay.com;過期=星期四,10月13日12時28分28秒2011 GMT;路徑= /; HttpOnly
Set-Cookie: cssg = a4e34c0312b0a02694e761b7fff52ae9;域= .ebay.com;路徑=/
的Set-Cookie: S = BAQAAASuJIxIvAAWAAAEAC0y292hlcXVpbm94MjAxMgASAApMtvdsdGVzdENvb2tpZQADAAVMtvdsMTYzODQA9AAiTLb3bCQyJGFQOVp0bEMzJEF3V1pTamRvVTFGYW0zdGI1aC9WZjEBRQAITpbZbDRjOTlkN2Y0AAYAAUy292wwAPgAIEy292xhNGUzNGMwMzEyYjBhMDI2OTRlNzYxYjdmZmY1MmFlOQCoAAFMtvdoMQFKABdMtvdsNGNiNWE1ZTguMC4xLjIuNDEuMS4wLjMADAAKTLb3bDEwMjU4MTk5NjkAPQALTLb3bGVxdWlub3gyMDEyAO4AwUy292wzBmh0dHA6Ly9jb2lucy5zaG9wLmViYXkuY29tL1NvdXRoLUFmcmljYS0vNDgwMjUvaS5odG1sP190cmtwYXJtcz02NSUyNTNBMTIlMjU3QzY2JTI1M0EyJTI1N0MzOSUyNTNBMSUyNTdDNzIlMjUzQTQyMDMmcnQ9bmMmX2NhdHJlZj0xJl9zdGlja3k9MSZfdHJrc2lkPXAzMjg2LmMwLm0xNCZfc29wPTEmX3NjPTEjaXRlbTNhNWY1MTQ3MzUHs3TL8cV8G9bXdjQDn2O0YlX1cH0
;域= .ebay.com;路徑= /;僅Http
的Set-Cookie:非會話= BAQAAASuJIxIvAAaAABAAC06W2WxlcXVpbm94MjAxMgAzAAhOltlsNjAwMSxaQUYA8wAiTpbZbCQyJGFQOVp0bEMzJEF3V1pTamRvVTFGYW0zdGI1aC9WZjEACAAcTN0y7DEyODY5NzI3OTh4MjUwNzA3MjY1MzMzeDB4MlkAygAgVhunbDc3MzFhYjlhMTJiMGEwMjY5YTExOTlmMWZmZjk1M2I0AMsAAky1rPQxNQFMABdOltlsNGNiNWE1ZWMuMC4xLjIuNDEuMi4wLjMAnAA4TpbZbG5ZK3NIWjJQckJtZGo2d1ZuWStzRVoyUHJBMmRqNkFFa29lcENabUxwd1dkajZ4OW5ZK3NlUT09AU0AF06W2Ww0Y2I1YTVlYy4wLjEuNS40OS4wLjAuMwCdAAhOltlsMDAwMDAwMDExPLRSShRUzdDU4YsYXFXG313H7A **;域= .ebay.com;到期= 2011年10月13日星期四12:28:28 GMT; Path =/
Set-Cookie: secses = BAQAAASuJIxIvAAaAAUsAF06W2Ww0Y2I1YTVlYy4wLjEuMi40MS4xLjAuMxdf9sPE5nmJj5E24Fy2hCJhKoHt;域= .ebay.com; Path =/
Set-Cookie: lucky9 = 6866724;域= .ebay.com;到期時間=週一,2015年10月12日12:28:28 GMT; Path =/

+0

我不知道什麼是錯誤的。從你的代碼中,我看到你在完成它們之後並沒有正確地處理HttpWebResponse對象。你能先對你的響應對象調用close()嗎?其次,即使Ebay API不允許你做所有事情,但你仍然可以部分地使用它來完成登錄階段,然後嘗試看看你是否可以使用相同的底層連接訪問你的頁面? – feroze 2010-10-16 19:49:13

回答

1

我同意使用API​​的答案。如果你想做的所有事情都是在代碼中,那麼這是最好的方法。

但是,如果您對打開瀏覽器窗口感興趣,那麼我推薦使用Selenium。這是針對網絡可用性測試,但您可以使用它打開瀏覽器窗口,輸入並提交表單字段。

e.g:

var selenium = new DefaultSelenium(host,port,browserString,startUrl); 
selenium.Open("http://www.site.com"); 
selenium.Type("username","myusername"); 
selenium.Type("password","mypassword"); 
selenium.Click("submit"); 

可能是有用的(除非你想獲得頭返回,等等)。此外,您可以使用標準的XPath等獲取頁面上的元素數組,並在C#代碼中執行所需的操作。

+0

我爲host,port,browserString,startUrl提供了什麼值? – 2010-10-13 13:58:19

+0

在Selenium網站上有一些關於如何設置的文檔。在想要打開瀏覽器的計算機上運行Selenium服務器(這是一個Java應用程序),然後將主機和端口設置爲該設置。例如,browserString是'* firefox',startUrl可以是任何有效的(即http://ebay.com)。它更適合於Web測試 - 所以不太確定它的應用程序有多好。 – 2010-10-13 14:12:53

+0

謝謝你得到它的工作!看起來你可以用Selenium做一些很棒的事情。 – 2010-10-21 14:31:37

1

爲什麼不使用eBay API? Here是包含c#的代碼示例的鏈接。

+0

標準eBay API不允許您搜索已完成的項目。 – 2010-10-13 13:34:14