» »

c# kako dljam html iz serverja z credentialsi (usrname, pass)

c# kako dljam html iz serverja z credentialsi (usrname, pass)

Vapo1 ::

			string URL = @"http://slo-tech.com/profili/"; //recimo(rad bi da dela na siteih kot blink ali partis recimo)
			byte[] DataByteArr;
			using (WebClient WC = new WebClient())
			{
				try
				{
					WC.Credentials = new NetworkCredential("bedak", "rojstnidan");
					DataByteArr = WC.DownloadData(URL);
				}
				catch (Exception e)
				{
					MessageBox.Show(e.Message, "Error - DownloadHtmlToString");
					throw;
				}
			}
			string s = ASCIIEncoding.UTF8.GetString(DataByteArr);



... problem je da ta koda ne dela seveda....
vedno mi dlja html na katerem te site obvesca da nisi logiran...

probal sem tudi fore z http://usenrame:passwors@slo-tech.com/p... in tudi ne dela....
problem je mogoce v "user agentu" ki bi ga lahko nastavil na Explorer ....


uglavnem mora biti nek bolj fancy way ocitno ker tole ne dela nikjer.... rad bi da bi delalo na siteih kot so partis in blink recimo...

(dejansko kode nisem probaval na "slotech/profil" -ampak predvidevam da je ista scena)

ce kdo ve kako se temu streze.. hvala


malo sem se brskal po netu in nasel tole... ampak spodja pise da ne dela v komentarjih
http://www.codeproject.com/KB/cs/Rapids...
avtor je napisal tole:
One of the reasons which led me to write this article is that in some cases you need to use HttpWebRequest to authorize users to the services like Rapidshare.com before downloading files. In these cases, if you try .NET Network Credential, you can see that the Authorization HTTP header is not generated, so you cannot authorize your users.

zanimiv je ta del kode:
//Assigning Basic Authorization HTTP Header to HttpWebRequest
            byte[] authBytes = Encoding.UTF8.GetBytes
		((param.Username + ":" + param.Password).ToCharArray());
            req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);
  • spremenilo: Vapo1 ()

arjan_t ::

to je za HTTP avtorizacijo, ki pa je te strani verjetno ne uporabljajo

najprej narediš POSt request na login stran, shraniš sesison cookie (ali kako pač stran beleži seje), in potem naprej delaš requeste in dodaš ta session cookie zraven

Vapo1 ::

super care.. ratalo mi je... res je bilo treba cookie uporabiti

ce koga zanima tule je koda ki sem jo usposobil.. vse sem skopiral iz primera ki je v linku v prvem postu


private static CookieContainer GetUriCookieContainer(string uri)
		{
			CookieContainer cookies = new CookieContainer();
			foreach (Cookie c in CookieManager.GetCookie(uri))
				cookies.SetCookies(new Uri(uri), c.ToString());
			return cookies;

		}
		class CookieManager
		{
			public class CookieStruct
			{
				//1 The Variable Name
				//2 The Value for the Variable
				//3 The Website of the Cookie’s Owner
				//4 Optional Flags
				//5 The Most Significant Integer for Expired Time, in FILETIME Format
				//6 The Least Significant Integer for Expired Time, in FILETIME Format
				//7 The Most Significant Integer for Creation Time, in FILETIME Format
				//8 The Least Significant Integer for Creation Time, in FILETIME Format
				//9 The Cookie Record Delimiter (a * character)
				public string VarName;
				public string VarValue;
				public string Domain;
				public int Flags;
				public DateTime ExpirationDate;
				public DateTime CreationDate;
			}
			public static CookieCollection GetCookie(string url)
			{
				CookieCollection ret = new CookieCollection();
				url = url.Remove(0, 7);
				string baseUrl;
				if (url.IndexOf("/") > 0) baseUrl = url.Substring(0, url.IndexOf("/")); else baseUrl = url;
				baseUrl += "/";
				string Domain = baseUrl;
				Domain = Domain.Substring(0, Domain.LastIndexOf('.'));
				while (Domain.IndexOf('.') > -1)
					Domain = Domain.Substring(Domain.IndexOf('.') + 1);
				FileInfo[] fis = SearchCookies(Domain);
				foreach (FileInfo fi in fis)
				{
					CookieStruct[] cs = ReadCookie(fi.FullName);
					foreach (CookieStruct c in cs)
						if (baseUrl.EndsWith(c.Domain) && c.ExpirationDate > DateTime.Now)
						{
							Cookie nc = new Cookie(c.VarName, c.VarValue);
							nc.Expires = c.ExpirationDate;
							nc.Domain = c.Domain;
							ret.Add(nc);
						}
				}
				return ret;
			}

			private static FileInfo[] SearchCookies(string Domain)
			{
				string path = Environment.GetFolderPath(Environment.SpecialFolder.Cookies);
				DirectoryInfo di = new DirectoryInfo(path);
				FileInfo[] fis = di.GetFiles(string.Format("*@{0}[*.txt", Domain));
				di = new DirectoryInfo(path + "//Low");
				FileInfo[] fisLow = di.GetFiles(string.Format("*@{0}[*.txt", Domain));
				FileInfo[] ret = new FileInfo[fis.Length + fisLow.Length];
				fis.CopyTo(ret, 0);
				fisLow.CopyTo(ret, fis.Length);
				return ret;
			}

			private static CookieStruct[] ReadCookie(string fn)
			{
				StreamReader sr = new StreamReader(fn);
				string cookie = sr.ReadToEnd();
				sr.Close();
				string[] data = cookie.Split('\n');
				int cookieNum = data.Length / 9;
				CookieStruct[] ret = new CookieStruct[cookieNum];
				for (int i = 0; i < cookieNum; i++)
				{
					int bline = i * 9;
					ret[i] = new CookieStruct();
					ret[i].VarName = data[bline];
					ret[i].VarValue = data[bline + 1];
					ret[i].Domain = data[bline + 2];
					ret[i].Flags = Convert.ToInt32(data[bline + 3]);
					long l = Convert.ToInt64(data[bline + 4]);
					l += Convert.ToInt64(data[bline + 5]) << 32;
					ret[i].ExpirationDate = DateTime.FromFileTime(l);
					l = Convert.ToInt64(data[bline + 6]);
					l += Convert.ToInt64(data[bline + 7]) << 32;
					ret[i].CreationDate = DateTime.FromFileTime(l);
				}
				return ret;
			}
		}




torej zdaj se das samo
req.CookieContainer = GetUriCookieContainer(URL.AbsoluteUri);
(req je HttpWebRequest)

torej webrequestu se doda cookie in potem dela.....potem s tem webrequestom lahko dljas site in te ne "redirecta" na "login" site

ampak se to.... tiste funkcije gor preberejo cookie iz diska iz lokacije Environment.SpecialFolder.Cookies ki je c:\documents and settings\user\cookies
in pazite da tudi obstaja folder c:\documents and settings\user\cookies\low .. ker ga tudi pogleda pa magari ce je prazen...
v teh folderjih cookije shranjuje explorer.. torej morate prej z explorerjem obiskati to vaso stran in se logirati da se ustvari cookie in potem dela tudi v c# aplokaciji

(priporocljivo je tudi recimo v firefoxu pogledati cookie od vase strani in ce je notri kaj v smislu "id" "pass"... potem uporablja cookije za logiranje)


.....


nevem pa kako se dobi cookie od strani... tale fora da z explorerjem dobis cookie je malo crude.. ampak deluje

Zgodovina sprememb…

  • spremenilo: Vapo1 ()

techfreak :) ::

nevem pa kako se dobi cookie od strani... tale fora da z explorerjem dobis cookie je malo crude.. ampak deluje

Header pogledaš.

pril ::

Uh, tole je pa res zakompliciran... najbolj simpl je da narediš da webClient podpira cookije potem narediš post in to je to.

lp, pl


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C#] WPF vprašanja

Oddelek: Programiranje
101109 (731) Ciklamen
»

[C# asp.NET web forma] Kam zgine cookie oz. zkj se izbriše?

Oddelek: Programiranje
61087 (901) Morenov
»

[C#] Simobilov Glasnik

Oddelek: Programiranje
134295 (1375) Mrch
»

[c#] Primerjanje datotek ...

Oddelek: Programiranje
5869 (786) OmegaM
»

Tracking v PHPju

Oddelek: Programiranje
61690 (1575) darh

Več podobnih tem