public JsActions(IElement element, string elementType, ILocalizedLogger logger, IBrowserProfile browserProfile) { this.element = element; this.elementType = elementType; this.browserProfile = browserProfile; Logger = logger; }
private async Task ConnectInternalAsync(string input, IBrowserProfile browserProfile) { var roomName = GetRoomNameFromInput(input); if (string.IsNullOrEmpty(roomName)) { throw new Exception("invalid input"); } var livePageUrl = "https://www.showroom-live.com/" + roomName; var livePageHtml = await _server.GetAsync(livePageUrl); var match = Regex.Match(livePageHtml, "room_id=(\\d+)"); if (!match.Success) { throw new Exception("room_idが無い"); } var room_id = match.Groups[1].Value; var liveInfo = await Api.GetLiveInfo(_server, room_id); if (liveInfo.LiveStatus == 1) { //放送終了? return; } await _messageProvider.ReceiveAsync(liveInfo.BcsvrHost, liveInfo.BcsvrKey); return; }
public async Task ConnectInternalAsync(string input, IBrowserProfile browserProfile) { var channelName = Tools.ExtractUserId(input); if (string.IsNullOrEmpty(channelName)) { SendSystemInfo("入力値からチャンネル名を取得できませんでした", InfoType.Error); return; } var cc = GetCookieContainer(browserProfile, "mixer.com"); await InitAsync(); //var p2 = new MetadataProvider2(_server, _siteOptions); //p2.MetadataUpdated += P2_MetadataUpdated; //p2.Master = p1; try { var dummy = new DummyImpl(_server, input, _logger, cc, _siteOptions, _p1); var connectionManager = new ConnectionManager(_logger); _autoReconnector = new NewAutoReconnector(connectionManager, dummy, new MessageUntara(), _logger); await _autoReconnector.AutoReconnectAsync(); } finally { //p1.MessageReceived -= P1_MessageReceived; //p1.MetadataUpdated -= P1_MetadataUpdated; //p2.MetadataUpdated -= P2_MetadataUpdated; } }
private async Task ConnectInternalAsync(string input, IBrowserProfile browserProfile) { var autoReconnectMode = false; var cc = GetCookieContainer(browserProfile, "pscp.tv"); var broadcastId = Tools.ExtractLiveId(input); var(avp, broadcastInfo) = await Api.GetAccessVideoPublicAsync(_server, broadcastId); await Api.GetAccessVideoAsync(_server, broadcastId, cc); if (!IsBroadcastRunning(broadcastInfo)) { SendSystemInfo("放送が終了しているため切断します", InfoType.Notice); AfterDisconnected(); return; } var acp = await Api.GetAccessChatPublicAsync(_server, avp.ChatToken); _messageProvider = new MessageProvider(new Websocket(), _logger); //_messageProvider. _messageProvider.Received += MessageProvider_Received; var hostname = Tools.ExtractHostnameFromEndpoint(acp.Endpoint); if (hostname.Contains("replay")) { SendSystemInfo("", InfoType.Error); return; } await _messageProvider.ReceiveAsync(hostname, acp.AccessToken, broadcastId); }
public Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { var cc = GetCookieContainer(browserProfile); var cookies = Tools.ExtractCookies(cc); var info = new CurrentUserInfo(); string name = null; string displayName = null; foreach (var cookie in cookies) { switch (cookie.Name) { case "login": name = cookie.Value; break; case "twilight-user": { //"{\"authToken\":\"rkpavalsbvBovec0qj2l5r5q0mnlm4\",\"displayName\":\"abckk\",\"id\":\"124821926\",\"login\":\"ob112\",\"roles\":{\"isStaff\":false},\"version\":2}" var decoded = System.Web.HttpUtility.UrlDecode(cookie.Value); var match = Regex.Match(decoded, "\"displayName\":\"([^\"]+)\""); if (match.Success) { displayName = match.Groups[1].Value; } } break; } } info.Username = displayName ?? name; info.IsLoggedIn = !string.IsNullOrEmpty(name); return(Task.FromResult <ICurrentUserInfo>(info)); }
public override async Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { var cc = GetCookieContainer(browserProfile); var myInfo = await Api.GetMyInfo(_server, cc); return(await Task.FromResult(new CurrentUserInfo { Username = myInfo.Nickname, IsLoggedIn = myInfo.IsLogin })); }
protected BrowserFactory(IActionRetrier actionRetrier, IBrowserProfile browserProfile, ITimeoutConfiguration timeoutConfiguration, ILocalizedLogger localizedLogger) { ActionRetrier = actionRetrier; BrowserProfile = browserProfile; TimeoutConfiguration = timeoutConfiguration; LocalizedLogger = localizedLogger; }
public static IMyUserInfo GetUserInfoFromCookie(IBrowserProfile browserProfile) { var cookies = browserProfile.GetCookieCollection("mildom.com"); if (cookies.Exists(item => item.Name == "user")) { var cookie = cookies.Where(item => item.Name == "user").First(); var val = cookie.Value; var decoded = System.Web.HttpUtility.UrlDecode(val); var userInfoLow = Tools.Deserialize <Low.UserInfo.RootObject>(decoded); string gid; if (cookies.Exists(c => c.Name == "gid")) { gid = cookies.Where(item => item.Name == "gid").First().Value; } else { gid = ""; } return(new LoggedinUserInfo(userInfoLow, gid)); } else if (cookies.Exists(item => item.Name == "gid")) { var cookie = cookies.Where(item => item.Name == "gid").First(); var gid = cookie.Value; var guestName = Tools.CreateGuestName(); return(new AnonymousUserInfo(gid, guestName)); } else { var gid = ""; var guestName = Tools.CreateGuestName(); return(new AnonymousUserInfo(gid, guestName)); } }
public override async Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { var userInfo = new CurrentUserInfo { }; return(await Task.FromResult(userInfo)); }
public DummyImpl(IDataServer server, string input, IBrowserProfile browserProfile, ILogger logger, IMildomSiteOptions siteOptions, MessageProvider p1) { _server = server; _input = input; _browserProfile = browserProfile; _logger = logger; _siteOptions = siteOptions; _p1 = p1; //_p2 = p2; }
public async Task ConnectAsync(string input, IBrowserProfile browserProfile) { var cc = GetCookieContainer(browserProfile); var list = GetCommentProviderInternals(_options, _siteOptions, _userStoreManager, _dataSource, _logger, this, SiteContextGuid); var cu = await GetCurrentUserInfo(browserProfile); if (cu.IsLoggedIn) { foreach (var f in list) { var isValid = f.IsValidInput(input); if (isValid) { _internal = f; break; } } } else { //未ログインでもWebSocket経由なら取れる。 var f = new NewLiveInternalProvider(_options, _siteOptions, _userStoreManager, _logger, _dataSource) { SiteContextGuid = SiteContextGuid, }; var isValid = f.IsValidInput(input); if (isValid) { _internal = f; } } if (_internal == null) { //非対応のInput //AfterDisconnected(); return; } BeforeConnect(); _internal.MetadataUpdated += (s, e) => MetadataUpdated?.Invoke(s, e); _internal.MessageReceived += (s, e) => MessageReceived?.Invoke(s, e); try { await _internal.ConnectAsync(input, cc); } catch (Exception ex) { throw new NicoException("", $"input={input},browser={browserProfile.Type}({browserProfile.ProfileName})", ex); } finally { AfterDisconnected(); } }
public DummyImpl(IDataServer server, IUrl url, IBrowserProfile browserProfile, ILogger logger, IPeriscopeSiteOptions siteOptions, MessageProvider p1, MessageUntara messageSetter) { _server = server; _url = url; _browserProfile = browserProfile; _logger = logger; _siteOptions = siteOptions; _p1 = p1; _messageSetter = messageSetter; //_p2 = p2; }
protected virtual List <Cookie> GetCookies(IBrowserProfile browserProfile) { List <Cookie> cookies = null; try { cookies = browserProfile.GetCookieCollection("mixch.tv"); } catch { } return(cookies ?? new List <Cookie>()); }
public async Task ConnectAsync(string input, IBrowserProfile browserProfile) { BeforeConnecting(); try { await ConnectInternalAsync(input, browserProfile); } finally { AfterDisconnected(); } }
public async Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { var cc = CreateCookieContainer(browserProfile); var me = await Api.GetMeAsync(_server, cc); return(new CurrentUserInfo { Username = me.AccountName, UserId = me.UserPath, IsLoggedIn = !string.IsNullOrEmpty(me.UserPath), }); }
protected virtual CookieContainer CreateCookieContainer(IBrowserProfile browserProfile) { var cc = new CookieContainer();//まずCookieContainerのインスタンスを作っておく。仮にCookieの取得で失敗しても/live_chatで"YSC"と"VISITOR_INFO1_LIVE"が取得できる。これらは/service_ajaxでメタデータを取得する際に必須。 try { var cookies = browserProfile.GetCookieCollection("youtube.com"); cc.Add(cookies); } catch { } return(cc); }
public async Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { var cc = GetCookieContainer(browserProfile); string userId = null; var cookies = Tools.ExtractCookies(cc); foreach (var cookie in cookies) { if (cookie.Name == "user_session") { var match = Regex.Match(cookie.Value, "^user_session_(\\d+)_"); if (match.Success) { userId = match.Groups[1].Value; } } } var info = new CurrentUserInfo(); if (!string.IsNullOrEmpty(userId)) { string displayName = null; try { displayName = await API.GetDisplayNameFromUserId(_dataSource, userId); } catch (Exception ex) { _logger.LogException(ex, $"user_id={userId}"); } if (string.IsNullOrEmpty(displayName)) { try { var cauUser = await API.GetNicoCasUserInfo(_dataSource, userId); displayName = cauUser.Name; } catch (Exception ex) { _logger.LogException(ex, $"user_id={userId}"); } } if (string.IsNullOrEmpty(displayName)) { displayName = "(不明)"; } info.IsLoggedIn = true; info.Username = displayName; info.UserId = userId; } return(info); }
private async Task ConnectInternalAsync(string input, IBrowserProfile browserProfile) { if (_ws != null) { throw new InvalidOperationException(""); } var cookies = GetCookies(browserProfile); LiveUrlInfo liveUrlInfo; try { liveUrlInfo = await Tools.GetLiveId(_dataSource, input); } catch (InvalidInputException ex) { _logger.LogException(ex, "無効な入力値", $"input={input}"); SendSystemInfo("無効な入力値です", InfoType.Error); AfterDisconnected(); return; } // TODO: 過去のコメントを取得する while (!_isExpectedDisconnect) { _ws = CreateMixchWebsocket(); _ws.Received += WebSocket_Received; var wsTask = _ws.ReceiveAsync(liveUrlInfo, "", null); var tasks = new List <Task> { wsTask }; while (tasks.Count > 0) { var t = await Task.WhenAny(tasks); try { await wsTask; } catch (Exception ex) { _logger.LogException(ex); } tasks.Remove(wsTask); SendSystemInfo("wsタスク終了", InfoType.Debug); } _ws.Received -= WebSocket_Received; } }
/// <summary> /// Instantiate browser. /// </summary> /// <param name="webDriver">Instance of Selenium WebDriver for desired web browser.</param> public Browser(RemoteWebDriver webDriver) { Driver = webDriver; Logger = AqualityServices.LocalizedLogger; LocalizationManager = AqualityServices.Get <ILocalizationManager>(); browserProfile = AqualityServices.Get <IBrowserProfile>(); conditionalWait = AqualityServices.ConditionalWait; var timeoutConfiguration = AqualityServices.Get <ITimeoutConfiguration>(); SetImplicitWaitTimeout(timeoutConfiguration.Implicit); SetPageLoadTimeout(timeoutConfiguration.PageLoad); SetScriptTimeout(timeoutConfiguration.Script); }
public async Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { var cc = CreateCookieContainer(browserProfile); //cookie: lang=ja; device=PC; _ga=GA1.2.942154475.1539615843; __gads=ID=88a3291937a6efee:T=1539615844:S=ALNI_MYcBerafVCLa-gDyYh9JnTfgleU-A; PHPSESSID=o1c7pk8c59qhruldatq57rg320; AWSELB=1DABC705044630618CF68466538D9E569C7CC479D88EB62F0E575B53AB66195021246B2874519AA68BDD9EC54E82BF3783441568103E6D3709DD7C06C7DE99E0A0C470B14E; _gid=GA1.2.1053933165.1541004736; init_dt=20181101023826; GED_PLAYLIST_ACTIVITY=W3sidSI6IkRNZGYiLCJ0c2wiOjE1NDEwMDc1NjEsIm52IjoxLCJ1cHQiOjE1NDEwMDc1MDYsImx0IjoxNTQxMDA3NTYxfV0.; random=RDMYEFRDLLPBQZJSRBUF; token=7bb004826a2d9b00d4bc6e3d933c88757e61b1c2; uuid=7A4E34CD-F8DD-3748-5A4A-3B2FD8D03DFC; access_token=1a9b0308-f56a-479d-bb63-43469ec90c1a; ci_session=CzIJaQI0Aj0AIl0sWTZRZVFgADxUdVBzDWkGdFF3BzBSaQE%2BV15RPVpmAXkIMg95Xj0AMVA3Aj1WdVdlAzIBYQsyUWNbNgVsVjRSNFcxUGELagkxAjUCNABgXWpZaVEyUWMAM1QyUGYNbgY0UTUHbVI3ATNXNVE2WjoBeQgyD3lePQAzUDYCPVZ1Vz0DYQEiC35RD1tvBThWdlJqV3dQPAsnCSoCIQI8ADBdZVk9UWFRZAA3VGdQNw05BjFRMQduUj0BI1c7UWVaMgFhCCsPY153AF1QZAJjVjNXIwNlASILeVFyWzUFKFY4UjJXMlBvC3EJZQIyAikAaF1mWT5RelFiADdUYVAuDT4GPlEmB2JSdQFqVzhRblogAS4Ieg9vXnUAXVBhAmZWI1cwAyIBagt5UWpbPgVhViBSIVc6UCYLaQlrAjkCJQArXTpZb1EsUSUAdVQyUHINLgY8UWUHY1IyAWpXelEnWjgBagg5DzBeJQB3UHYCYlYlVw4DdAE%2BC2FRNVtgBXlWOVJwVztQZgthCWkCIQI3AGBdbFk%2BUWJRYwBgVDVQZQ09BjRRPQdoUjABYlc5UWVaZAFjCGgPaV41ADdQMgI%2BVjNXYQM1ATcLblFnW28FeVY5UnBXO1BkC2IJaQIhAnMAPF0tWWFRPVE%2BAGdUO1BfDWUGY1EmB2JSdQFqVzJRYlo4AXkIPg9LXjMAR1A2AjNWFFcVAy0BFwsyURRbSgV2VjFSNFc1UG0LfglmAkICMwAYXXJZP1EWUWIAQFQTUDgNSAY3UTcHHVJAARNXI1FvWnEBYQg4DztePQAgUHcCYlY0VykDdQEiC29RIltRBTJWZlIhVzpQJgtpCWsCOQIlAGtdb1k4UWxRZwAyVGBQMQ0uBjxRdwdjUjcBZVc7UXZabQErCGwPZF51AGdQZgJYViJXIgNlASMLVVE5W2oFeVY5UnBXO1BjC2kJcQIyAjQAbl1qWTVRYFFyAD1UKlBzDTYGP1E%2BB3tSbwEjV15ROFptATwIYA9kXiUAOVBnAj1WZldqA3MBaws7UWJbNAV5Vm1Sc1dkUDsLIQk2AmACWAAsXSxZaVEmUXIAPVQ2UDoNPQY9UX8HKlI8AWFXMFFuWiABLgh6D29edQBdUHYCc1Y2VyUDdQEiCyhRa1t9BWFWNlI5VyNQNwsyCT0CZAIlAGJdIllx var me = await API.GetMeAsync(_dataSource, cc); return(new CurrentUserInfo { IsLoggedIn = !string.IsNullOrEmpty(me.UserPath), UserId = me.UserPath, Username = me.DisplayName, }); }
public override async Task ConnectAsync(string input, IBrowserProfile browserProfile) { BeforeConnect(); _first.Reset(); _cc = GetCookieContainer(browserProfile, "twitcasting.tv"); _broadcasterId = Tools.ExtractBroadcasterId(input); _lastCommentId = 0; var(context, contextRaw) = await API.GetLiveContext(_server, _broadcasterId, _cc); if (!string.IsNullOrEmpty(context.AudienceId)) { SendSystemInfo($"ログイン済みユーザID:{context.AudienceId}", InfoType.Notice); IsLoggedIn = true; } else { SendSystemInfo("未ログイン", InfoType.Notice); IsLoggedIn = false; } //配信歴がある場合は初期コメントを取得する if (context.MovieId > 0) { var initialComments = await GetInitialComments(context.MovieId); foreach (var initialComment in initialComments) { RaiseMessageReceived(initialComment); } } var p1 = new WebsocketMessageProvider(new Websocket(), _server); p1.MessageReceived += P1_MessageReceived; var p2 = new MetadataProvider(_logger, _server, _broadcasterId, _messenger); p2.ItemReceived += P2_ItemReceived; p2.LiveIdReceived += P2_LiveIdReceived; p2.MetadataReceived += P2_MetadataReceived; _autoReconnector = new TwicasAutoReconnector(_broadcasterId, _cc, _server, _logger, p1, p2); try { await _autoReconnector.AutoReconnectAsync(); } finally { _autoReconnector = null; AfterDisconnected(); } }
public override async Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { var cc = GetCookieContainer(browserProfile); try { var myInfo = await Api.GetMyInfo(_server, cc); return(await Task.FromResult(new CurrentUserInfo { Username = myInfo.Nickname, IsLoggedIn = myInfo.IsLogin })); } catch (NotLoggedInException) { return(await Task.FromResult(new CurrentUserInfo { Username = "******", IsLoggedIn = false })); } }
public async Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { var cc = GetCookieContainer(browserProfile); var cookies = Tools.ExtractCookies(cc); var me = await Api.GetMyAsync(_server, cookies); var info = new CurrentUserInfo { IsLoggedIn = me != null ? !string.IsNullOrEmpty(me.UserId) : false, Username = me?.DisplayName, UserId = me?.UserId }; return(info); }
protected virtual CookieContainer CreateCookieContainer(IBrowserProfile browserProfile) { var cc = new CookieContainer(); try { var cookies = browserProfile.GetCookieCollection("whowatch.tv"); foreach (var cookie in cookies) { cc.Add(cookie); } } catch { } return(cc); }
public override async Task ConnectAsync(string input, IBrowserProfile browserProfile) { BeforeConnect(); var nicoInput = Tools.ParseInput(input); if (nicoInput is InvalidInput invalidInput) { SendSystemInfo("未対応の形式のURLが入力されました", InfoType.Error); AfterDisconnected(); return; } _isFirstConnection = true; reload: _isDisconnectedExpected = false; _disconnectCts = new CancellationTokenSource(); try { await ConnectInternalAsync(nicoInput, browserProfile); } catch (ApiGetCommunityLivesException ex) { _isDisconnectedExpected = true; SendSystemInfo("コミュニティの配信状況の取得に失敗しました", InfoType.Error); _logger.LogException(ex, "", $"input:{input}, browser:{browserProfile.Type}"); } catch (SpecChangedException ex) { _isDisconnectedExpected = true; SendSystemInfo("サイトの仕様変更があったためコメント取得を継続できません", InfoType.Error); _logger.LogException(ex, "", $"input:{input}, browser:{browserProfile.Type}"); } catch (Exception ex) { _logger.LogException(ex, "", $"input:{input}, browser:{browserProfile.Type}"); } _dataProps = null; if (!_isDisconnectedExpected) { _isFirstConnection = false; goto reload; } var m = new NicoDisconnected(""); var s = new DisconnectedMessageMetadata(m, _options, _siteOptions); var c = new NicoMessageContext(m, s, new NicoMessageMethods()); RaiseMessageReceived(c); AfterDisconnected(); }
private async Task ConnectInternalAsync(string input, IBrowserProfile browserProfile) { var roomName = GetRoomNameFromInput(input); if (string.IsNullOrEmpty(roomName)) { throw new Exception("invalid input"); } var livePageUrl = "https://www.showroom-live.com/" + roomName; var livePageHtml = await _server.GetAsync(livePageUrl); var match = Regex.Match(livePageHtml, "room_id=(\\d+)"); if (!match.Success) { throw new Exception("room_idが無い"); } var room_id = match.Groups[1].Value; var messageProvider = new MessageProvider(new Websocket(), _logger); messageProvider.Received += MessageProvider_Received; var connector = new PeriscopeConnector(_server, room_id, messageProvider, _logger); var me = new MessageUntara(); me.SystemInfoReiceved += Me_SystemInfoReiceved; _autoReconnector = new AutoReconnector(connector, me); await _autoReconnector.AutoConnect(); me.SystemInfoReiceved -= Me_SystemInfoReiceved; messageProvider.Received -= MessageProvider_Received; //var liveInfo = await Api.GetLiveInfo(_server, room_id); //if(liveInfo.LiveStatus == 1) //{ // //放送終了? // return; //} //_pingTimer.Enabled = true; //try //{ // await _messageProvider.ReceiveAsync(liveInfo.BcsvrHost, liveInfo.BcsvrKey); //} //finally //{ // _pingTimer.Enabled = false; //} //return; }
public override async Task ConnectAsync(string input, IBrowserProfile browserProfile) { BeforeConnect(); try { await ConnectInternalAsync(input, browserProfile); } catch (Exception ex) { _logger.LogException(ex, "", $"input={input}"); } finally { AfterDisconnected(); } }
private static IWebDriver CreateDriver(IBrowserProfile browserProfile) { Logger.Info($"{browserProfile.BrowserName} driver initialization"); switch (browserProfile.BrowserName) { case BrowserName.Chrome: SetUpDriver(new ChromeConfig(), browserProfile.DriverSettings); return(new ChromeDriver((ChromeOptions)browserProfile.DriverSettings.DriverOptions)); case BrowserName.Firefox: SetUpDriver(new FirefoxConfig(), browserProfile.DriverSettings); return(new FirefoxDriver((FirefoxOptions)browserProfile.DriverSettings.DriverOptions)); default: throw new ArgumentOutOfRangeException($"Browser {browserProfile.BrowserName} is not supported."); } }
protected virtual CookieContainer GetCookieContainer(IBrowserProfile browserProfile) { var cc = new CookieContainer(); try { var cookies = browserProfile.GetCookieCollection("live.line.me"); foreach (var cookie in cookies) { cc.Add(cookie); } } catch (Exception ex) { _logger.LogException(ex); } return(cc); }
public async Task <ICurrentUserInfo> GetCurrentUserInfo(IBrowserProfile browserProfile) { // FIXME: コメビュでhttpsアクセスするとWeb版で開いているライブ視聴画面でアイテムの送信ができなくなる。 // リロードで直るので何らかのセッション不整合が起きている模様。 // 今現在はユーザー情報を使っていないのでログイン情報の取得を停止する // var cc = CreateCookieContainer(browserProfile); // var me = await API.GetMeAsync(_dataSource, cc); // return new CurrentUserInfo // { // IsLoggedIn = !string.IsNullOrEmpty(me.UserId), // UserId = me.UserId, // Username = me.DisplayName, // }; // return(new CurrentUserInfo { }); }