From 7633d881b0b7244707ae623152c438468b9f2044 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 20 Mar 2024 17:59:38 -0500 Subject: [PATCH 1/4] add youtube api --- .../Google/Models/GoogleVideoResult.cs | 21 +++++ .../Google/Settings/GoogleApiSettings.cs | 15 ++++ .../Controllers/AddressController.cs | 50 ----------- .../Controllers/GoogleController.cs | 82 +++++++++++++++++++ src/WebStarter/appsettings.json | 14 +++- 5 files changed, 129 insertions(+), 53 deletions(-) create mode 100644 src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs delete mode 100644 src/Infrastructure/BotSharp.OpenAPI/Controllers/AddressController.cs create mode 100644 src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs b/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs new file mode 100644 index 00000000..dc2da596 --- /dev/null +++ b/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs @@ -0,0 +1,21 @@ +namespace BotSharp.Abstraction.Google.Models; + +public class GoogleVideoResult +{ + public string Kind { get; set; } + public IList Items { get; set; } = new List(); +} + +public class VideoItem +{ + public string Kind { get; set; } + [JsonPropertyName("etag")] + public string Etag { get; set; } + public VideoItemId Id { get; set; } +} + +public class VideoItemId +{ + public string Kind { get; set; } + public string VideoId { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Abstraction/Google/Settings/GoogleApiSettings.cs b/src/Infrastructure/BotSharp.Abstraction/Google/Settings/GoogleApiSettings.cs index d43ec58b..0739550c 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Google/Settings/GoogleApiSettings.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Google/Settings/GoogleApiSettings.cs @@ -3,7 +3,22 @@ namespace BotSharp.Abstraction.Google.Settings; public class GoogleApiSettings { public string ApiKey { get; set; } + public MapSettings Map { get; set; } + public YoutubeSettings Youtube { get; set; } +} + + +public class MapSettings +{ public string Endpoint { get; set; } public string Language { get; set; } public string Components { get; set; } } + +public class YoutubeSettings +{ + public string Endpoint { get; set; } + public string Part { get; set; } + public string RegionCode { get; set; } + public string Language { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AddressController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/AddressController.cs deleted file mode 100644 index 755b8232..00000000 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/AddressController.cs +++ /dev/null @@ -1,50 +0,0 @@ -using BotSharp.Abstraction.Google.Models; -using BotSharp.Abstraction.Google.Settings; -using BotSharp.Abstraction.Options; - -namespace BotSharp.OpenAPI.Controllers; - -[Authorize] -[ApiController] -public class AddressController : ControllerBase -{ - private readonly IServiceProvider _services; - private readonly BotSharpOptions _options; - private readonly IHttpClientFactory _httpClientFactory; - private readonly ILogger _logger; - - public AddressController(IServiceProvider services, - IHttpClientFactory httpClientFactory, - BotSharpOptions options) - { - _services = services; - _options = options; - _httpClientFactory = httpClientFactory; - } - - [HttpGet("/address/options")] - public async Task GetAddressOptions([FromQuery] string address) - { - var result = new GoogleAddressResult(); - - try - { - var settings = _services.GetRequiredService(); - using var client = _httpClientFactory.CreateClient(); - var url = $"{settings.Endpoint}?key={settings.ApiKey}&" + - $"components={settings.Components}&" + - $"language={settings.Language}&" + - $"address={address}"; - - var response = await client.GetAsync(url); - var responseStr = await response.Content.ReadAsStringAsync(); - result = JsonSerializer.Deserialize(responseStr, _options.JsonSerializerOptions); - } - catch (Exception ex) - { - _logger.LogError($"Error when calling google geocoding api... ${ex.Message}"); - } - - return result; - } -} diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs new file mode 100644 index 00000000..2ccb3b50 --- /dev/null +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs @@ -0,0 +1,82 @@ +using BotSharp.Abstraction.Google.Models; +using BotSharp.Abstraction.Google.Settings; +using BotSharp.Abstraction.Options; + +namespace BotSharp.OpenAPI.Controllers; + +[Authorize] +[ApiController] +public class GoogleController : ControllerBase +{ + private readonly IServiceProvider _services; + private readonly BotSharpOptions _options; + private readonly IHttpClientFactory _httpClientFactory; + private readonly ILogger _logger; + + public GoogleController(IServiceProvider services, + IHttpClientFactory httpClientFactory, + BotSharpOptions options) + { + _services = services; + _options = options; + _httpClientFactory = httpClientFactory; + } + + [HttpGet("/address/options")] + public async Task GetAddressOptions([FromQuery] string address) + { + var result = new GoogleAddressResult(); + + try + { + var settings = _services.GetRequiredService(); + using var client = _httpClientFactory.CreateClient(); + var url = $"{settings.Map.Endpoint}?key={settings.ApiKey}&" + + $"components={settings.Map.Components}&" + + $"language={settings.Map.Language}&" + + $"address={address}"; + + var response = await client.GetAsync(url); + var responseStr = await response.Content.ReadAsStringAsync(); + result = JsonSerializer.Deserialize(responseStr, _options.JsonSerializerOptions); + } + catch (Exception ex) + { + _logger.LogError($"Error when calling google geocoding api... ${ex.Message}"); + } + + return result; + } + + [HttpGet("/video/options")] + public async Task GetVideoOptions([FromQuery] string query, [FromQuery] int? maxNumOfResults) + { + var result = new GoogleVideoResult(); + + try + { + var settings = _services.GetRequiredService(); + using var client = _httpClientFactory.CreateClient(); + var url = $"{settings.Youtube.Endpoint}?key={settings.ApiKey}&" + + $"part={settings.Youtube.Part}&" + + $"relevanceLanguage={settings.Youtube.Language}&" + + $"regionCode={settings.Youtube.RegionCode}&" + + $"q={query}"; + + if (maxNumOfResults.HasValue && maxNumOfResults > 0) + { + url += $"&maxResults={maxNumOfResults}"; + } + + var response = await client.GetAsync(url); + var responseStr = await response.Content.ReadAsStringAsync(); + result = JsonSerializer.Deserialize(responseStr, _options.JsonSerializerOptions); + } + catch (Exception ex) + { + _logger.LogError($"Error when calling google youtube search api... ${ex.Message}"); + } + + return result; + } +} diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index ed24f1db..251be7cd 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -216,10 +216,18 @@ }, "GoogleApi": { - "Endpoint": "https://maps.googleapis.com/maps/api/geocode/json", "ApiKey": "", - "Components": "country=US|country=CA", - "Language": "en" + "Map": { + "Endpoint": "https://maps.googleapis.com/maps/api/geocode/json", + "Components": "country=US|country=CA", + "Language": "en" + }, + "Youtube": { + "Endpoint": "https://www.googleapis.com/youtube/v3/search", + "RegionCode": "US", + "Language": "en", + "Part": "id" + } }, "PluginLoader": { From a88c3dd5d66d88a5504362382667126381d117eb Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 21 Mar 2024 11:53:46 -0500 Subject: [PATCH 2/4] minor change --- .../BotSharp.OpenAPI/Controllers/GoogleController.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs index 2ccb3b50..7f3b851a 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs @@ -49,7 +49,7 @@ public class GoogleController : ControllerBase } [HttpGet("/video/options")] - public async Task GetVideoOptions([FromQuery] string query, [FromQuery] int? maxNumOfResults) + public async Task GetVideoOptions([FromQuery] string query, [FromQuery] int? maxResults) { var result = new GoogleVideoResult(); @@ -63,9 +63,9 @@ public class GoogleController : ControllerBase $"regionCode={settings.Youtube.RegionCode}&" + $"q={query}"; - if (maxNumOfResults.HasValue && maxNumOfResults > 0) + if (maxResults.HasValue && maxResults > 0) { - url += $"&maxResults={maxNumOfResults}"; + url += $"&maxResults={maxResults}"; } var response = await client.GetAsync(url); From 56f7fb3d4e2ce7780ca581c1737d1f279e0855b7 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 22 Mar 2024 00:50:23 -0500 Subject: [PATCH 3/4] modify google api --- .../Google/Models/GoogleVideoResult.cs | 8 ++++++++ .../Google/Settings/GoogleApiSettings.cs | 2 -- .../BotSharp.OpenAPI/Controllers/GoogleController.cs | 8 ++++---- src/WebStarter/appsettings.json | 2 -- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs b/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs index dc2da596..750e0541 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs @@ -12,10 +12,18 @@ public class VideoItem [JsonPropertyName("etag")] public string Etag { get; set; } public VideoItemId Id { get; set; } + public VideoSnippet Snippet { get; set; } } public class VideoItemId { public string Kind { get; set; } public string VideoId { get; set; } +} + +public class VideoSnippet +{ + public string Title { get; set; } + public string Description { get; set; } + public string ChannelTitle { get; set; } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Abstraction/Google/Settings/GoogleApiSettings.cs b/src/Infrastructure/BotSharp.Abstraction/Google/Settings/GoogleApiSettings.cs index 0739550c..be7ef6a2 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Google/Settings/GoogleApiSettings.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Google/Settings/GoogleApiSettings.cs @@ -11,7 +11,6 @@ public class GoogleApiSettings public class MapSettings { public string Endpoint { get; set; } - public string Language { get; set; } public string Components { get; set; } } @@ -20,5 +19,4 @@ public class YoutubeSettings public string Endpoint { get; set; } public string Part { get; set; } public string RegionCode { get; set; } - public string Language { get; set; } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs index 7f3b851a..13faeb2d 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/GoogleController.cs @@ -23,7 +23,7 @@ public class GoogleController : ControllerBase } [HttpGet("/address/options")] - public async Task GetAddressOptions([FromQuery] string address) + public async Task GetAddressOptions([FromQuery] string address, [FromQuery] string language = "en") { var result = new GoogleAddressResult(); @@ -33,7 +33,7 @@ public class GoogleController : ControllerBase using var client = _httpClientFactory.CreateClient(); var url = $"{settings.Map.Endpoint}?key={settings.ApiKey}&" + $"components={settings.Map.Components}&" + - $"language={settings.Map.Language}&" + + $"language={language}&" + $"address={address}"; var response = await client.GetAsync(url); @@ -49,7 +49,7 @@ public class GoogleController : ControllerBase } [HttpGet("/video/options")] - public async Task GetVideoOptions([FromQuery] string query, [FromQuery] int? maxResults) + public async Task GetVideoOptions([FromQuery] string query, [FromQuery] int? maxResults, [FromQuery] string language = "en") { var result = new GoogleVideoResult(); @@ -59,7 +59,7 @@ public class GoogleController : ControllerBase using var client = _httpClientFactory.CreateClient(); var url = $"{settings.Youtube.Endpoint}?key={settings.ApiKey}&" + $"part={settings.Youtube.Part}&" + - $"relevanceLanguage={settings.Youtube.Language}&" + + $"relevanceLanguage={language}&" + $"regionCode={settings.Youtube.RegionCode}&" + $"q={query}"; diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 251be7cd..3187eb99 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -220,12 +220,10 @@ "Map": { "Endpoint": "https://maps.googleapis.com/maps/api/geocode/json", "Components": "country=US|country=CA", - "Language": "en" }, "Youtube": { "Endpoint": "https://www.googleapis.com/youtube/v3/search", "RegionCode": "US", - "Language": "en", "Part": "id" } }, From b2ac5707ae362c0c5d0a16eca2b734ded5bd8e92 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 22 Mar 2024 14:12:45 -0500 Subject: [PATCH 4/4] add web driver get attribute value --- .../Browsing/IWebBrowser.cs | 1 + .../Google/Models/GoogleVideoResult.cs | 15 +++++++++++++++ .../PlaywrightWebDriver.GetAttributeValue.cs | 18 ++++++++++++++++++ .../PlaywrightWebDriver.LocateElement.cs | 2 +- src/WebStarter/appsettings.json | 2 +- 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GetAttributeValue.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs index 3b4dcfde..376c7cac 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs @@ -24,4 +24,5 @@ public interface IWebBrowser Task EvaluateScript(string conversationId, string script); Task CloseBrowser(string conversationId); Task SendHttpRequest(BrowserActionParams actionParams); + Task GetAttributeValue(MessageInfo message, ElementLocatingArgs location, BrowserActionResult result); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs b/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs index 750e0541..442290aa 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Google/Models/GoogleVideoResult.cs @@ -26,4 +26,19 @@ public class VideoSnippet public string Title { get; set; } public string Description { get; set; } public string ChannelTitle { get; set; } + public VideoThumbnails Thumbnails { get; set; } +} + +public class VideoThumbnails +{ + public ThumbnailData Default { get; set; } + public ThumbnailData Medium { get; set; } + public ThumbnailData High { get; set; } +} + +public class ThumbnailData +{ + public string Url { get; set; } + public decimal Width { get; set; } + public decimal Height { get; set; } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GetAttributeValue.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GetAttributeValue.cs new file mode 100644 index 00000000..8b87c2c8 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GetAttributeValue.cs @@ -0,0 +1,18 @@ +namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver; + +public partial class PlaywrightWebDriver +{ + public async Task GetAttributeValue(MessageInfo message, ElementLocatingArgs location, BrowserActionResult result) + { + var page = _instance.GetPage(message.ConversationId); + ILocator locator = page.Locator(result.Selector); + var value = string.Empty; + + if (!string.IsNullOrEmpty(location?.AttributeName)) + { + value = await locator.GetAttributeAsync(location.AttributeName); + } + + return value ?? string.Empty; + } +} diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.LocateElement.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.LocateElement.cs index fd46c879..9ec68d20 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.LocateElement.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.LocateElement.cs @@ -45,7 +45,7 @@ public partial class PlaywrightWebDriver } } - if (location.Index > 0) + if (location.Index >= 0) { locator = locator.Nth(location.Index); count = await locator.CountAsync(); diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 3187eb99..356279b3 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -224,7 +224,7 @@ "Youtube": { "Endpoint": "https://www.googleapis.com/youtube/v3/search", "RegionCode": "US", - "Part": "id" + "Part": "id,snippet" } },