fix: primeira versao
This commit is contained in:
parent
dede34a105
commit
4d430e9a18
146
Controllers/CallRHController.cs
Normal file
146
Controllers/CallRHController.cs
Normal file
@ -0,0 +1,146 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using OpenRHCall.Models;
|
||||
using PuppeteerSharp;
|
||||
|
||||
namespace OpenRHCall.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("[controller]")]
|
||||
public class CallRHController : ControllerBase
|
||||
{
|
||||
private readonly ILogger<CallRHController> _logger;
|
||||
|
||||
public CallRHController(ILogger<CallRHController> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
[HttpPost(Name = "Create")]
|
||||
public async Task<IActionResult> Create(CallRequest request)
|
||||
{
|
||||
if (request == null) return BadRequest();
|
||||
if (string.IsNullOrEmpty(request.Nome)) return BadRequest();
|
||||
if (string.IsNullOrEmpty(request.Email)) return BadRequest();
|
||||
if (string.IsNullOrEmpty(request.TipoSolicitacao)) return BadRequest();
|
||||
if (string.IsNullOrEmpty(request.Descricao)) return BadRequest();
|
||||
if (string.IsNullOrEmpty(request.WhatsApp)) return BadRequest();
|
||||
|
||||
// Download and launch browser
|
||||
await new BrowserFetcher().DownloadAsync();
|
||||
|
||||
#if DEBUG
|
||||
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
|
||||
{
|
||||
Headless = false
|
||||
});
|
||||
#else
|
||||
var browser = await Puppeteer.LaunchAsync(GetLaunchOptions());
|
||||
#endif
|
||||
|
||||
var page = await browser.NewPageAsync();
|
||||
|
||||
try
|
||||
{
|
||||
// Navigate to the form page - replace with your actual URL
|
||||
await page.GoToAsync("https://app.pipefy.com/portals/efdbbe89-b25e-40e3-8026-8120b05c137c");
|
||||
|
||||
await page.WaitForSelectorAsync("a[data-title^='Solicita']");
|
||||
|
||||
await page.ClickAsync("a[data-title^='Solicita']");
|
||||
|
||||
var elementFrame = await page.WaitForSelectorAsync("#iFrameResizer0");
|
||||
|
||||
var frame = await elementFrame.ContentFrameAsync();
|
||||
|
||||
await frame.WaitForSelectorAsync("#publicForm-ShortText-nome_do_solicitante");
|
||||
|
||||
// Fill Nome Completo
|
||||
await frame.TypeAsync("#publicForm-ShortText-nome_do_solicitante", request.Nome);
|
||||
|
||||
// Fill Email
|
||||
await frame.TypeAsync("#publicForm-Email-email_do_solicitante", request.Email);
|
||||
|
||||
// Fill Celular
|
||||
await frame.TypeAsync("#publicForm-ShortText-celular_com_whatsapp", request.WhatsApp);
|
||||
|
||||
// Select Tipo da solicitação
|
||||
await frame.WaitForSelectorAsync(".sc-ayeQl.ituYoD");
|
||||
await frame.ClickAsync("[data-testid='select-field']");
|
||||
|
||||
await frame.WaitForSelectorAsync($"div[data-testid='list-item-content']:has(div[title='{request.TipoSolicitacao}'])",
|
||||
new WaitForSelectorOptions { Visible = true });
|
||||
|
||||
await PressionarSetaAteOpcao(frame, page, request.TipoSolicitacao);
|
||||
|
||||
// Fill Descrição
|
||||
await frame.TypeAsync("#publicForm-LongText-informa_es_adicionais", request.Descricao);
|
||||
|
||||
//// Submit form
|
||||
// Wait for submission to complete - adjust selector based on success indicator
|
||||
await frame.ClickAsync("#submit-form-button");
|
||||
await frame.WaitForNavigationAsync();
|
||||
|
||||
return Ok(new { message = "Solicitação criada com sucesso!" });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return BadRequest(new { error = ex.Message });
|
||||
}
|
||||
finally
|
||||
{
|
||||
await browser.CloseAsync();
|
||||
}
|
||||
}
|
||||
|
||||
async Task PressionarSetaAteOpcao(IFrame frame, IPage page, string opcaoDesejada)
|
||||
{
|
||||
bool opcaoEncontrada = false;
|
||||
int maxTentativas = 30; // Limite de segurança para não ficar em loop infinito
|
||||
int tentativa = 0;
|
||||
|
||||
while (!opcaoEncontrada && tentativa < maxTentativas)
|
||||
{
|
||||
// Pega o elemento selecionado atual
|
||||
var elementoSelecionado = await frame.EvaluateExpressionAsync<string>(
|
||||
"document.querySelector('div[data-focused=\"true\"] div[data-lib=\"lumen\"]')?.getAttribute('title')");
|
||||
|
||||
if (elementoSelecionado == opcaoDesejada)
|
||||
{
|
||||
opcaoEncontrada = true;
|
||||
await page.Keyboard.PressAsync("Enter");
|
||||
break;
|
||||
}
|
||||
|
||||
await page.Keyboard.PressAsync("ArrowDown");
|
||||
await Task.Delay(200);
|
||||
tentativa++;
|
||||
}
|
||||
|
||||
if (!opcaoEncontrada)
|
||||
{
|
||||
throw new Exception($"Opção {opcaoDesejada} não encontrada após {maxTentativas} tentativas");
|
||||
}
|
||||
}
|
||||
|
||||
private static LaunchOptions GetLaunchOptions()
|
||||
{
|
||||
return new LaunchOptions
|
||||
{
|
||||
Headless = true,
|
||||
ExecutablePath = "/usr/bin/google-chrome-stable",
|
||||
Args = new[]
|
||||
{
|
||||
"--no-sandbox",
|
||||
"--disable-setuid-sandbox",
|
||||
"--disable-dev-shm-usage",
|
||||
"--disable-gpu"
|
||||
},
|
||||
DefaultViewport = new ViewPortOptions
|
||||
{
|
||||
Width = 1920,
|
||||
Height = 1080
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
76
Dockerfile
Normal file
76
Dockerfile
Normal file
@ -0,0 +1,76 @@
|
||||
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||
WORKDIR /src
|
||||
COPY ["OpenRHCall.csproj", "./"]
|
||||
RUN dotnet restore
|
||||
COPY . .
|
||||
RUN dotnet publish -c Release -o /app/publish
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
|
||||
WORKDIR /app
|
||||
|
||||
# Install dependencies for Chrome
|
||||
RUN apt-get update && apt-get install -y \
|
||||
wget \
|
||||
gnupg2 \
|
||||
apt-transport-https \
|
||||
ca-certificates \
|
||||
libglib2.0-0 \
|
||||
libnss3 \
|
||||
libatk1.0-0 \
|
||||
libatk-bridge2.0-0 \
|
||||
libcups2 \
|
||||
libdrm2 \
|
||||
libxkbcommon0 \
|
||||
libxcomposite1 \
|
||||
libxdamage1 \
|
||||
libxfixes3 \
|
||||
libxrandr2 \
|
||||
libgbm1 \
|
||||
libpango-1.0-0 \
|
||||
libcairo2 \
|
||||
libasound2 \
|
||||
libxcb1 \
|
||||
libxcb-dri3-0 \
|
||||
libxcursor1 \
|
||||
libxtst6 \
|
||||
fonts-ipafont-gothic \
|
||||
fonts-wqy-zenhei \
|
||||
fonts-thai-tlwg \
|
||||
fonts-kacst \
|
||||
fonts-symbola \
|
||||
fonts-noto \
|
||||
fonts-freefont-ttf \
|
||||
--no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Chrome
|
||||
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
|
||||
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y google-chrome-stable --no-install-recommends \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Create chrome-user and configure permissions
|
||||
RUN groupadd -r chrome-user \
|
||||
&& useradd -r -g chrome-user -G audio,video chrome-user \
|
||||
&& mkdir -p /home/chrome-user/Downloads \
|
||||
&& mkdir -p /app/.local/share \
|
||||
&& chown -R chrome-user:chrome-user /home/chrome-user \
|
||||
&& chown -R chrome-user:chrome-user /app
|
||||
|
||||
# Copy published app
|
||||
COPY --from=build /app/publish .
|
||||
RUN chown -R chrome-user:chrome-user /app
|
||||
|
||||
# Set environment variables for Chrome
|
||||
ENV PUPPETEER_EXECUTABLE_PATH "/usr/bin/google-chrome-stable"
|
||||
ENV CHROME_EXECUTABLE_PATH "/usr/bin/google-chrome-stable"
|
||||
|
||||
# Switch to chrome-user
|
||||
USER chrome-user
|
||||
|
||||
EXPOSE 8080
|
||||
EXPOSE 80
|
||||
ENTRYPOINT ["dotnet", "OpenRHCall.dll"]
|
||||
|
||||
|
||||
11
Models/CallRequest.cs
Normal file
11
Models/CallRequest.cs
Normal file
@ -0,0 +1,11 @@
|
||||
namespace OpenRHCall.Models
|
||||
{
|
||||
public class CallRequest
|
||||
{
|
||||
public string Nome { get; set; }
|
||||
public string Email { get; set; }
|
||||
public string WhatsApp { get; set; }
|
||||
public string TipoSolicitacao { get; set; }
|
||||
public string Descricao { get; set; }
|
||||
}
|
||||
}
|
||||
14
OpenRHCall.csproj
Normal file
14
OpenRHCall.csproj
Normal file
@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="PuppeteerSharp" Version="20.0.5" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
6
OpenRHCall.http
Normal file
6
OpenRHCall.http
Normal file
@ -0,0 +1,6 @@
|
||||
@OpenRHCall_HostAddress = http://localhost:5025
|
||||
|
||||
GET {{OpenRHCall_HostAddress}}/weatherforecast/
|
||||
Accept: application/json
|
||||
|
||||
###
|
||||
25
OpenRHCall.sln
Normal file
25
OpenRHCall.sln
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.11.35327.3
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRHCall", "OpenRHCall.csproj", "{C8B6CDA5-A799-4A0A-B614-2C6FC91B0C60}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{C8B6CDA5-A799-4A0A-B614-2C6FC91B0C60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C8B6CDA5-A799-4A0A-B614-2C6FC91B0C60}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C8B6CDA5-A799-4A0A-B614-2C6FC91B0C60}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C8B6CDA5-A799-4A0A-B614-2C6FC91B0C60}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {3B443C84-6E02-48FA-BB66-7B9E0872B883}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
27
Program.cs
Normal file
27
Program.cs
Normal file
@ -0,0 +1,27 @@
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
|
||||
builder.Services.AddControllers();
|
||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
//if (app.Environment.IsDevelopment())
|
||||
//{
|
||||
// app.UseSwagger();
|
||||
// app.UseSwaggerUI();
|
||||
//}
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI();
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
app.MapControllers();
|
||||
|
||||
app.Run();
|
||||
41
Properties/launchSettings.json
Normal file
41
Properties/launchSettings.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:18589",
|
||||
"sslPort": 0
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"applicationUrl": "http://localhost:5025",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"applicationUrl": "https://localhost:7070;http://localhost:5025",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
8
appsettings.Development.json
Normal file
8
appsettings.Development.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
9
appsettings.json
Normal file
9
appsettings.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user