Unraveling the URL Enigma with Power Automate’s C# Plugin
Tags: powerautomate, hacks, powerfuldevs
Published: 2024-07-01 07:00:43

## Intro:
Emails often contain links that are valuable for various reasons. Power Automate by Microsoft is a tool that can automate many tasks, but it doesn’t have a built-in feature to Find all (as in excel) instance of a specific string. Felling in love with bring in your own c# code as a plugin helped to solve a small problem of extracting URL from an email body.


## C# Code:

Piggy backing on the previous blog on the framework the only change is 

{% embed https://dev.to/balagmadhu/sorcerers-code-spellbinding-regex-match-in-power-automates-c-plugin-3b3o %}

```
using System.Net;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

public class Script : ScriptBase
{
   public override async Task<HttpResponseMessage> ExecuteAsync()
{
    // Check if the operation ID matches what is specified in the OpenAPI definition of the connector
    if (this.Context.OperationId == "URLextract")
    {
        // Corrected method name
        return await this.HandleURLextractOperation().ConfigureAwait(false);
    }

    // Handle an invalid operation ID
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);
    response.Content = CreateJsonContent($"Unknown operation ID '{this.Context.OperationId}'");
    return response;
}

  private async Task<HttpResponseMessage> HandleURLextractOperation()
    {
        HttpResponseMessage response;

    // The structure of the message body of the incoming request looks like this:
    // {
    //   "urltext": "<some text>"
    // }
        var contentAsString = await this.Context.Request.Content.ReadAsStringAsync().ConfigureAwait(false);
        var contentAsJson = JObject.Parse(contentAsString);

        // Extract the input text from the request content
	var inputText = (string)contentAsJson["urltext"];

	// Call the ExtractUrls method to get the list of URLs
        var urls = await ExtractUrls(inputText);

        // Create a JSON object to hold the response content
        JObject output = new JObject
        {
            ["urls"] = JArray.FromObject(urls)
        };

        response = new HttpResponseMessage(HttpStatusCode.OK);
        response.Content = CreateJsonContent(output.ToString());
        return response;
    }

// The ExtractUrls method provided by the user
    public async Task<List<string>> ExtractUrls(string inputText)
    {
        // Define a regular expression to match URLs
        var urlRegex = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
        
        // Find matches in the input text
        var matches = urlRegex.Matches(inputText);

        // Create a list to hold the URLs
        var urls = new List<string>();

        foreach (Match match in matches)
        {
            // Add each URL to the list
            urls.Add(match.Value);
        }

        // Return the list of URLs
        return urls;
    }
    // Helper method to create JSON content
    private StringContent CreateJsonContent(string jsonString)
    {
        return new StringContent(jsonString, System.Text.Encoding.UTF8, "application/json");
    }
}
```

## Magic:

![demo](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3d3NW91ZTdiZ3puOGduMzVrcng2cjlnczd5eWY3cTN5dm12enQ5dyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/mrVl2WJYIWUn1flvLI/giphy.gif)

This JSON output organizes the URLs neatly, making it easy to process and utilize them in various applications.