2010-10-13 41 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