private static void Thread_check_End_Broadcasting(object i_connect_) { i_connect C = (i_connect)i_connect_; int endtimeout = 2; bool is_end = false; if (!Ldriver.Has_int_key(C.No)) //현재 해당 연결이 없거나 삭제되었으면 확인하지 않는다. { return; } IWebDriver dr_ = (IWebDriver)Ldriver.Select_key(C.No); while (endtimeout-- > 0) { try { IWebElement nn = dr_.FindElement(By.Id("layerAirOff")); string ddds = nn.Text; if (ddds.Contains("방송을 종료하였습니다")) { is_end = true; break; } } catch { } Thread.Sleep(1000); } if (is_end) { TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Failure)); TefreecaUnit_interface.Add_Response(Command_Server.End_Broadcasting, C.Order_No); Console.WriteLine("Ended Broadcasting. "); } }
private static void StartServer(String hostName, UInt16 hostPort, bool noneproxy, bool tester_) { init_Server(); TC = null; TC = new TefreecaUnit_interface(noneproxy, tester_); while (true) { Thread.Sleep(1000); Console.WriteLine("Connecting Server [{0}:{1}]", hostName, hostPort); TC.ConnectToServer(hostName, hostPort); if (!TC.is_connected()) { Console.WriteLine("Failure Connect, Reconnecting.."); continue; } else { TefreecaUnit_interface.Tefreeca_client_event += Eventer_Tefreeca_client_event; break; } } }
private static void Thread__Enter_Afreeca_Room(object connection_) { i_connect C = (i_connect)connection_; if (Enter_Afreeca_Room_to_Mobile() && (!tester)) //테스터면 절대 안됨. { C.URL = C.URL.Replace("play.afreecatv.com", "m.afreecatv.com/#/player"); } try { int timeout_ = timeout; bool connected = false; if (C.Proxy == "") { Console.WriteLine("ERROR: Can't connect. \r\n Not set proxy Server."); return; } var chromeOptions = new ChromeOptions(); if (!none_proxy) { string server = Convert.ToString(C.Proxy); var proxy = new Proxy(); proxy.HttpProxy = server; chromeOptions.Proxy = proxy; } //시크릿 모드로.. 섹션 분리 chromeOptions.AddArgument("--incognito"); chromeOptions.AddArgument("--silent"); IWebDriver Driver = new ChromeDriver(@".\", chromeOptions); lock (Ldriver) { Ldriver.Insert(C.No, Driver); } Driver.Navigate().GoToUrl(C.URL); if (C.URL.Contains("m.afreecatv.com")) //모바일 ========================================================= { while (true) { Console.Write("X{0}.", timeout_); try { IWebElement btn_normal_q = WebDriverExtensions.FindElement(Driver, By.ClassName("low"), 5); IWebElement startBtnGroup = WebDriverExtensions.FindElement(Driver, By.Id("startBtnGroup"), 5); //startBtnGroup if (btn_normal_q != null) { string disp = startBtnGroup.GetCssValue("display"); if (disp.Contains("none")) //없으면 접속된거 { ReadOnlyCollection <IWebElement> in_broadcasting = WebDriverExtensions.FindElements(Driver, By.TagName("dd"), 5); bool is_inbroad = false; foreach (IWebElement ele in in_broadcasting) { if (is_방송에_입장하셨습니다(ele.Text)) { is_inbroad = true; break; } } if (is_inbroad) { connected = true; TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Connected)); process_do_Low(); //모든 크롬 창 최소화. break; } } else //있으면 접속안된거.. { Thread.Sleep(2000); WebDriverExtensions.element_click(Driver, btn_normal_q); } } } catch { } if (timeout_-- <= 0) //0이하면 탈출.. { break; } Thread.Sleep(1000); } if (!connected) { if (!none_proxy && timeout > 100) { TefreecaUnit_interface.Add_Command(Command_Client.Change_Proxy, null); } else { if (timeout <= 100) { timeout += 20; } TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Failure)); } } } //============================================================================================ else //pc { while (true) { try { Console.Write("X{0}.", timeout_); IWebElement nn = Driver.FindElement(By.XPath("//*[@id=\"broad_info\"]/dl/dt")); if (!is_방송을_불러오고_있습니다(nn.Text.ToString())) //연결되면 { connected = true; TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Connected)); process_do_Low(); //모든 크롬 창 최소화. break; } } catch { } if (SideBreak_ConnectNo != -1) //사이드 브레이크 발동 { //if (SideBreak_ConnectNo == C.No) //{ SideBreak_ConnectNo = -1; break; //} } if (timeout_-- <= 0) //0이하면 탈출.. { break; } Thread.Sleep(1000); // 접속을 검사함.. 계속 계속.. 다 될때 까지 다되면 끗. } if (!connected) { if (!none_proxy && timeout > 100) { TefreecaUnit_interface.Add_Command(Command_Client.Change_Proxy, null); } else { if (timeout <= 100) { timeout += 20; } TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Failure)); } } } } catch (Exception ex) { Console.WriteLine("AFREECA ERROR: " + ex.ToString()); TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Failure)); //연결 실패로 바꾼다. } }
public static void Eventer_Tefreeca_client_event(object sender, EventArgs e) { try { Tefreeca_client_EventArgs RecieveEventArg = e as Tefreeca_client_EventArgs; if (RecieveEventArg == null) { return; } Unit_Event_Type type = RecieveEventArg.type; switch (type) { case Unit_Event_Type.Account_Check_Login: { int connect_no = RecieveEventArg.data_int; //실질적인 로그인 시도. if (!Ldriver.Has_int_key(connect_no)) //드라이브가 없으면 바로 삭제한것으로 간주 { return; } IWebDriver drv = (IWebDriver)Ldriver.Select_key(connect_no); if (login_check(drv)) { i_Updated_Connection_Account iua = new i_Updated_Connection_Account(); iua.Connect_No = connect_no; iua.State = State_Account_on_connected.Logged_Account; TefreecaUnit_interface.Add_Command(Command_Client.Updated_Connection_Account, iua); } else //로긴 상태가 아니라면, 로긴을 해야하는데.. 그래서 다시 setting 로 바꿔서 로긴시도하게끔 만듬. { i_Updated_Connection_Account iua = new i_Updated_Connection_Account(); iua.Connect_No = connect_no; iua.State = State_Account_on_connected.Setting; TefreecaUnit_interface.Add_Command(Command_Client.Updated_Connection_Account, iua); } } break; case Unit_Event_Type.Account_Login: //ㄹ { i_Account_Set iac = (i_Account_Set)RecieveEventArg.Data_object_list[0]; //실질적인 로그인 시도. if (!Ldriver.Has_int_key(iac.Connect_No)) //드라이브가 없으면 바로 삭제한것으로 간주 { return; } IWebDriver drv = (IWebDriver)Ldriver.Select_key(iac.Connect_No); login_afreeca(drv, iac.ID, iac.PW); //여기선 로긴만 한다. } break; case Unit_Event_Type.Check_End_broadcast: //방송이 진행중에 종료되었는지 확인하는 코드 { foreach (i_connect C in RecieveEventArg.Data_object_list) { Thread th = new Thread(new ParameterizedThreadStart(Thread_check_End_Broadcasting)); th.Start(C); //웹브라우저 객체를 매게변수로 넘긴다. } } break; case Unit_Event_Type.Disconnect_All: { Shutdown_ALL(); } break; case Unit_Event_Type.Disconnect_connect: //하나의 연결 해제. { i_connect C = (i_connect)RecieveEventArg.Data_object_list[0]; if (!Ldriver.Has_int_key(C.No)) //드라이브가 없으면 바로 삭제한것으로 간주 { TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Close)); return; } TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Closing)); Thread th = new Thread(new ParameterizedThreadStart(Close_Driver)); th.Start(Ldriver.Select_key(C.No)); //웹브라우저 객체를 매게변수로 넘긴다. th.Join(); TefreecaUnit_interface.Add_Command( //상태를 업데이트 하도록 한다. Command_Client.Updated_Connection, new i_Updated_Connection(C.No, i_Updated_Connection_Type.State_Connect, State_Connect.Close)); try { Ldriver.Remove(C.No); } catch { Console.WriteLine("Already remove webdriver : {0}", C.No); } } break; case Unit_Event_Type.Order_Connect: { i_connect C = JsonConvert.DeserializeObject <i_connect>(RecieveEventArg.data_string); Command_Connect(C); } break; case Unit_Event_Type.Order_Disconnect: { } break; case Unit_Event_Type.Connect_sideBreak: { SideBreak_ConnectNo = RecieveEventArg.data_int; } break; default: { } break; } } catch (Exception ex) { Console.WriteLine("Error : {0}", ex.ToString()); //throw; } }