/// <summary> /// Metoda vstoupí do zadané místnosti. Vstup v tomto případe znamená, že metoda odešle na introstránku místnosti /// souhlas s podmínkami. /// </summary> /// <param name="rid">Room ID</param> /// <returns>Objekt třídy State. Dojde-li při komunikaci s XChatem k chybě, bude objekt obsahovat následující /// Ok = false /// Err = znění chyby /// Res = null /// Nedojde-li k chybě, bude objekt obsahovat následující /// Ok = true /// Err = "" /// Res = True v případě, že se vstup podaří (=> přesměrování na stránku s místností), False v případě, že se nepodaří. /// </returns> public State enterRoom(string rid) { State res = new State(); //link na introstránku je //http://xchat.centrum.cz/ssk/room/intro.php?rid=******* String introUrl = "http://xchat.centrum.cz/" + SessionKey + "/room/intro.php?" + rid; //je nutné odeslat POST packet s hodnotami //_btn_enter=wanna_enter_man? //btn_enter=Vstoupit do místnosti //disclaim=on //sexwarn=1 - kvůli erotickým místnostem string httpContent = "_btn_enter=wanna_enter_man?&btn_enter=Vstoupit do mistnosti&disclaim=on&sexwarn=1"; HttpWebRequest req = makeRequest(introUrl, httpContent,"POST"); //pokud vše proběhne v pořádku, bude v response.Responseuri odkaz http://xchat.centrum.cz/ssk/modchat/room/nazev-mistnosti WebResponse response = req.GetResponse(); Logger.dbgOut("Response URI: " + response.ResponseUri); Stream dataStream = response.GetResponseStream(); StreamReader sr = new StreamReader(dataStream); string responseData = sr.ReadToEnd(); return res; }
/// <summary> /// Metoda získá náhled profilové fotky uživatele. Pokud není nikdo přihlášený, vrátí null. /// </summary> /// <returns>Objekt třídy State. Dojde-li při komunikaci s XChatem k chybě, bude objekt obsahovat následující /// Ok = false /// Err = znění chyby /// Res = null /// Nedojde-li k chybě, bude objekt obsahovat následující /// Ok = true /// Err = "" /// Res = Stream dat s imagem. Pokud není nikdo přihlášený, null. /// </returns> public State getProfilePhotoPreviewStream() { State res = new State(); if (LogedIn) { //vytvoření requestu na xchat.centrum.cz/SSK/index.php String uri = "http://xchat.centrum.cz/"+SessionKey+"/index.php"; HtmlDocument page= new HtmlDocument(); //načtení stránky WebClient wc = new WebClient(); String htmlString = wc.DownloadString(uri); page.LoadHtml(htmlString); //parsování //vybrat <div id="hlavicka"> -> <span class="float2"> -> <img src="tohleto"> HtmlNode img = page.DocumentNode.SelectSingleNode("//div[contains(@id,'hlavicka')]") .SelectSingleNode(".//span[contains(@class,'float2')]") .SelectSingleNode(".//img"); //url obrázku String imgSrc = img.Attributes["src"].Value; //načtení streamu dat var req = WebRequest.Create(imgSrc); var resp = req.GetResponse(); res.Res = resp.GetResponseStream(); return res; } //pokud neni nikdo prhlaseny vrati null else { return res; } }
/// <summary> /// Meto slouží k přihlášení do xchatu. Výsledkem je session key, přes který se dá přistupovat /// do sekcí pro přihlášené uživatele. /// </summary> /// <param name="name">Uživateské jméno</param> /// <param name="pass">Uživatelské heslo</param> /// <returns>Objekt třídy State. Dojde-li při komunikaci s XChatem k chybě, bude objekt obsahovat následující /// Ok = false /// Err = znění chyby /// Res = null /// Nedojde-li k chybě, bude objekt obsahovat následující /// Ok = true /// Err = "" /// Res = session key, typováno na string. /// </returns> public State logIn(String name, String pass) { State res = new State(); String sskey = ""; //byte array s parametry url, js, name, pass, x, y //x, y můžou být 0, url nějaká url z xchatu, stačí /index.php a js=1 string httpContent = "url=" + XCHAT_URI + "/index.php&js=1&x=0&y=0&name=" + name + "&pass="******":", "%3A"); httpContent.Replace("/", "%2F"); HttpWebRequest request = makeRequest(XCHAT_URI + "/login/",httpContent,"POST"); //jako odpoveď přijde http packet, kterej bude obsahovat url s chybou/ssklíčem //v response je tato url rozdělena na segmenty -> z těchto segmentů získat potřebné věci WebResponse response = request.GetResponse(); Logger.dbgOut(((HttpWebResponse)response).StatusDescription); //když nebude login úspěšný, v response.responseuri.segments[1] bude "login/", a v query bude "...err=kod_chyby..." //jinak je v segments[1] sskey+"/" String[] responseUri = response.ResponseUri.Segments; if (responseUri.Length >= 2) { //chyba při přihlášení, třeba zjišťovat v query if(responseUri[1] == "login/") { Console.WriteLine("Chyba"); } //máme session key else if (responseUri[1].Length == SSKEY_LENGTH+1 ) { sskey = responseUri[1].Replace("/",""); SessionKey = sskey; Username = name; LogedIn = true; } } response.Close(); res.Res = sskey; return res; }
/// <summary> /// Metoda získá zprávy pro zadanou místnost. /// </summary> /// <param name="rid">Room ID</param> /// <returns>Objekt třídy State. Dojde-li při komunikaci s XChatem k chybě, bude objekt obsahovat následující /// Ok = false /// Err = znění chyby /// Res = null /// Nedojde-li k chybě, bude objekt obsahovat následující /// Ok = true /// Err = "" /// Res = List typovaný na Message. /// </returns> public State getMessages(string rid) { State res = new State(); //url ktera vede primo na frame se zpravama //http://xchat.centrum.cz/ssk/modchat?op=roomtopng&rid=4030012&js=0 String roomUri = "http://xchat.centrum.cz/" + SessionKey + "/modchat?op=roomtopng&"+rid+"&js=0"; HtmlDocument page = new HtmlDocument(); page.LoadHtml(getHtmlString(roomUri)); /*zprávy ve framu jsou v elementu body a mají následující formát * 20:09:34 <font color="#150e97"><span class="umsg_room"><b>Merchant:</b> ahoj, mi se ještě neznáme. Já jsem Merchant </span></font><br />\n 20:09:11 <font color="#000000"><span class="umsg_room"><b>Steward:</b> Ahoj</span></font><br />\n <font size="-2" class="systemtime">20:08:54 </font><font size="-2" class="systemtext">"Uživatelka <b class="system in 10-0">Steward</b> vstoupila do místnosti"</font><br />\n <font size="-2" class="systemtime">20:07:03 </font><font size="-2" class="systemtext">"Uživatel <b class="system out">risa99</b> opustil místnost"</font><br />\n * * nejlehčí asi bude použít split('\n') a z jednotlivejch řádků pak vyparsovat potřebný věci * * když je první znak na řádce číslo, je to obyčejná zpráva od uživatele, s výjimkou prvního řádku - tam jsou před správou dva tagy font * řekněme, že ten kód se skoro určitě nebude měnit, takže prvních 86 znaků na prvním řádku můžu vynechat. * * když řádek začíná tagem font s class=systemtime, jedná se systémovou zprávu (kdo přišel/odešel z místnosti atp) */ String[] rows = page.DocumentNode.SelectSingleNode("//body").InnerHtml.Split('\n'); if (rows.Length > 0) { rows[0] = rows[0].Substring(81); List<Message> msgs = new List<Message>(); foreach (String row in rows) { //kdyby se tam připletly nějaký blbosti if (row.Length < 8) { continue; } Message msg = parseMessage(row); if (msg != null) { msgs.Add(msg); } } res.Res = msgs; } return res; }