Brings up the pull-model scraper: the .NET C2 hands skin+wear jobs to Python nodriver workers that scrape cs.money and post results back, plus the supporting Core/EFCore data model, migrations, and docker-compose orchestration. IPRoyal proxying lets workers scale horizontally with a distinct residential exit IP each: every worker process mints its own sticky session at startup, and an in-process forwarding proxy injects the gateway auth so Chromium talks only to an auth-free localhost endpoint (zero CDP). On a Cloudflare challenge a worker rotates to a fresh session/IP and re-warms. Verified end-to-end against live IPRoyal: distinct US residential exits per worker and IP rotation on demand. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
31 lines
1.2 KiB
C#
31 lines
1.2 KiB
C#
using System.ComponentModel.DataAnnotations;
|
|
|
|
namespace BlueLaminate.Scraper.CsFloat;
|
|
|
|
/// <summary>
|
|
/// Configuration for <see cref="CsFloatListingsClient"/>, bound from the
|
|
/// <c>CsFloat</c> configuration section. Defaults match the live API so the
|
|
/// client works with no configuration beyond the key.
|
|
/// </summary>
|
|
public sealed class CsFloatOptions
|
|
{
|
|
public const string SectionName = "CsFloat";
|
|
|
|
/// <summary>
|
|
/// Developer key CSFloat requires on the <c>Authorization</c> header. Falls
|
|
/// back to the legacy <c>CSFLOAT_API_KEY</c> environment variable (wired in the
|
|
/// composition root). Only commands that hit the API need it.
|
|
/// </summary>
|
|
public string? ApiKey { get; set; }
|
|
|
|
/// <summary>Active-listings endpoint.</summary>
|
|
public string BaseUrl { get; set; } = "https://csfloat.com/api/v1/listings";
|
|
|
|
/// <summary>
|
|
/// Listings per page. CSFloat caps this at 50; values outside [1, 50] are
|
|
/// rejected at startup rather than silently clamped.
|
|
/// </summary>
|
|
[Range(1, 50, ErrorMessage = "CsFloat:MaxLimit must be between 1 and 50 (the CSFloat API page cap).")]
|
|
public int MaxLimit { get; set; } = 50;
|
|
}
|