ไธไธชๅบไบ bogdanfinn/tls-client ็ .NET TLS ๅฎขๆท็ซฏๅบ๏ผ้่ฟๅ็ไบๆไฝ (P/Invoke) ่ฐ็จ Go ็ผ่ฏ็ๅจๆ้พๆฅๅบ๏ผๆไพ้ซ็บง TLS ๆ็บนๆจกๆๅ่ฝใ
LuYao.TlsClient ๆฏไธไธช่ทจๅนณๅฐ็ .NET ๅบ๏ผๅ ่ฎธๅผๅ่ ๅจ .NET ๅบ็จ็จๅบไธญไฝฟ็จ้ซ็บง TLS ๅฎขๆท็ซฏๅ่ฝใ่ฏฅๅบๅฐ่ฃ ไบ tls-client Go ๅบ็ๅ่ฝ๏ผๅฏไปฅๆจกๆๅ็งๆต่งๅจๅๅฎขๆท็ซฏ็ TLS ๆ็บน๏ผ็ป่ฟๆไบๅบไบ TLS ๆ็บน็ๅ็ฌ่ซๆบๅถใ
- ๅคๆต่งๅจ TLS ๆ็บนๆจกๆ๏ผๆฏๆๆจกๆ ChromeใFirefoxใSafariใOpera ็ญๅค็งๆต่งๅจ็ไธๅ็ๆฌ
- ่ทจๅนณๅฐๆฏๆ๏ผๆฏๆ Windows (x86/x64)ใLinux (x64/ARM64)ใmacOS (x64/ARM64)ใAlpine Linux
- ๅค .NET ็ๆฌๅ ผๅฎน๏ผๆฏๆ .NET Framework 4.5/4.6.1ใ.NET Standard 2.0/2.1ใ.NET 6/7/8
- Native AOT ๆฏๆ๏ผ.NET 8+ ๅบ็จๅฏไฝฟ็จ Native AOT ็ผ่ฏ๏ผ่ทๅพๆดๅฟซ็ๅฏๅจ้ๅบฆๅๆดๅฐ็ๅ ๅญๅ ็จ ๐
- HttpClient ้ๆ๏ผๆไพ
TlsClientHttpMessageHandler๏ผๅฏๆ ็ผ้ๆๅฐๆ ๅ .NET HttpClient ๅทฅไฝๆต - ไผ่ฏ็ฎก็๏ผๆฏๆ Cookie ไผ่ฏ็ฎก็ใ่ชๅฎไนไปฃ็ใ้ๅฎๅๆงๅถ็ญ
- ็ตๆดป้ ็ฝฎ๏ผๆฏๆ่ชๅฎไน TLS ้ ็ฝฎใHTTP ๅคด้กบๅบใ่ถ ๆถ่ฎพ็ฝฎ็ญ
้่ฟ NuGet ๅ ็ฎก็ๅจๅฎ่ฃ ๏ผ
dotnet add package LuYao.TlsClientๆๅจ้กน็ฎๆไปถไธญๆทปๅ ๏ผ
<PackageReference Include="LuYao.TlsClient" Version="*" />using LuYao.TlsClient;
// ๅๅปบ TLS ๅฎขๆท็ซฏๅฎไพ
using var client = new TlsClient();
// ้
็ฝฎๅฎขๆท็ซฏ
client.TLSClientIdentifier = ClientIdentifiers.Chrome_124; // ๆจกๆ Chrome 124
client.Proxy = "http://proxy.example.com:8080"; // ๅฏ้๏ผ่ฎพ็ฝฎไปฃ็
client.FollowRedirect = true; // ่ชๅจ่ท้้ๅฎๅ
client.Timeout = TimeSpan.FromSeconds(30); // ่ฎพ็ฝฎ่ถ
ๆถ
// ๅๅปบ่ฏทๆฑ
var request = client.CreateRequest();
request.RequestUrl = "https://example.com";
request.RequestMethod = "GET";
request.Headers["User-Agent"] = "Mozilla/5.0...";
// ๅ้่ฏทๆฑ
var response = client.Request(request);
// ๅค็ๅๅบ
Console.WriteLine($"็ถๆ็ : {response.Status}");
Console.WriteLine($"ๅๅบไฝ: {response.Body}");using System.Net.Http;
using LuYao.TlsClient;
// ๅๅปบ TLS ๅฎขๆท็ซฏ
var tlsClient = new TlsClient
{
TLSClientIdentifier = ClientIdentifiers.Chrome_124,
FollowRedirect = true,
Timeout = TimeSpan.FromSeconds(30)
};
// ไฝฟ็จ TlsClientHttpMessageHandler ๅๅปบ HttpClient
using var httpClient = new HttpClient(new TlsClientHttpMessageHandler(tlsClient));
// ๅไฝฟ็จๆฎ้ HttpClient ไธๆ ทไฝฟ็จ
var response = await httpClient.GetAsync("https://example.com");
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);using var client = new TlsClient();
// ๆทปๅ Cookies
var addCookiesInput = new AddCookiesToSessionInput
{
SessionId = client.SessionId,
Url = "https://example.com",
Cookies = new List<Cookie>
{
new Cookie
{
Name = "session_id",
Value = "abc123",
Domain = "example.com",
Path = "/"
}
}
};
client.AddCookiesToSession(addCookiesInput);
// ่ทๅ Cookies
var getCookiesInput = new GetCookiesFromSessionInput
{
SessionId = client.SessionId,
Url = "https://example.com"
};
var cookies = client.GetCookiesFromSession(getCookiesInput);
foreach (var cookie in cookies.Cookies)
{
Console.WriteLine($"{cookie.Name}: {cookie.Value}");
}ๅบๆไพไบๅค็ง้ขๅฎไน็ๆต่งๅจ TLS ๆ็บนๆ ่ฏ๏ผ้่ฟ ClientIdentifiers ็ฑป๏ผ๏ผ
- Chrome: Chrome_103 ่ณ Chrome_124
- Firefox: Firefox_102 ่ณ Firefox_110
- Safari: Safari_15_6_1, Safari_16_0, Safari_IOS_15_5/15_6/16_0 ็ญ
- Opera: Opera_89 ่ณ Opera_91
- ็งปๅจๅบ็จ: NikeใZalandoใMeshใConfirmed ็ญ็นๅฎๅบ็จ็ๆ็บน
- Android OkHttp: Okhttp4_Android_7 ่ณ Okhttp4_Android_13
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ .NET ๅบ็จ็จๅบ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ HttpClient (ๅฏ้) โ โ
โ โโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ โ
โ โ TlsClientHttpMessageHandler โ โ
โ โโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ โ
โ โ TlsClient โ โ
โ โ - ไผ่ฏ็ฎก็ โ โ
โ โ - ้
็ฝฎ้้กน โ โ
โ โ - JSON ๅบๅๅ โ โ
โ โโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ โ
โ โ NativeMethods โ โ
โ โ - P/Invoke ่ฐ็จ โ โ
โ โ - ๅ
ๅญๅฐ้ๅค็ โ โ
โ โโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโ
โ P/Invoke / FFI
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅ็ๅจๆ้พๆฅๅบ (Go ็ผ่ฏ) โ
โ tls-client.dll / libtls-client.so โ
โ โ
โ - TLS ๆกๆๅค็ โ
โ - ๆต่งๅจๆ็บนๆจกๆ โ
โ - HTTP/HTTPS ่ฏทๆฑๅค็ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- ่่ดฃ: ไธป่ฆๅฎขๆท็ซฏ็ฑป๏ผ็ฎก็ TLS ไผ่ฏๅ่ฏทๆฑ
- ๅ่ฝ:
- ไผ่ฏ็ๅฝๅจๆ็ฎก็
- ่ฏทๆฑ้ ็ฝฎๅๆง่ก
- Cookie ็ฎก็
- JSON ๅบๅๅ/ๅๅบๅๅ
- ่่ดฃ: HttpMessageHandler ๅฎ็ฐ๏ผ็จไบไธๆ ๅ HttpClient ้ๆ
- ๅ่ฝ:
- ๅฐ HttpRequestMessage ่ฝฌๆขไธบ RequestInput
- ๅฐ Response ่ฝฌๆขไธบ HttpResponseMessage
- ๆฏๆๆตๅผ่พๅบๅไธดๆถๆไปถๅค็
- ่่ดฃ: P/Invoke ๅฃฐๆ๏ผ่ฐ็จๅ็ Go ๅบ
- ๆนๆณ:
Request: ๅ้ HTTP/HTTPS ่ฏทๆฑDestroySession: ้ๆฏๆๅฎไผ่ฏDestroyAll: ้ๆฏๆๆไผ่ฏGetCookiesFromSession: ่ทๅไผ่ฏ CookiesAddCookiesToSession: ๆทปๅ Cookies ๅฐไผ่ฏFreeMemory: ้ๆพๅ็ๅ ๅญ
- ่่ดฃ: ๅฎไนไธ Go ๅบไบคไบ็ๆฐๆฎ็ฑปๅ
- ไธป่ฆ็ฑปๅ:
RequestInput: ่ฏทๆฑๅๆฐResponse: ๅๅบๆฐๆฎCookie: Cookie ไฟกๆฏCustomTlsClient: ่ชๅฎไน TLS ้ ็ฝฎTransportOptions: ไผ ่พ้้กน
- ่่ดฃ: ๆไพ้ขๅฎไน็ๆต่งๅจ TLS ๆ็บนๆ ่ฏ็ฌฆ
- ๅ ๅซ: 50+ ็งไธๅๆต่งๅจๅๅบ็จ็ TLS ๆ็บน
่ฏฅๅบ้่ฟ่ฟ่กๆถๆ ่ฏ็ฌฆ (RID) ๆฏๆๅคๅนณๅฐ๏ผ
| ๅนณๅฐ | ๆถๆ | RID | ๅ็ๅบๆ ผๅผ |
|---|---|---|---|
| Windows | x86 | win-x86 | tls-client.dll |
| Windows | x64 | win-x64 | tls-client.dll |
| Linux | x64 | linux-x64 | libtls-client.so |
| Linux | ARM64 | linux-arm64 | libtls-client.so |
| Alpine Linux | x64 | alpine-x64 | libtls-client.so |
| macOS | x64 | osx-x64 | libtls-client.dylib |
| macOS | ARM64 | osx-arm64 | libtls-client.dylib |
.NET 6.0 / 7.0 / 8.0:
- System.Text.Json (ๅ
็ฝฎ)
- ็จ้: JSON ๅบๅๅๅๅๅบๅๅ
- ็นๆง: ๆฏๆ AOT ็ผ่ฏ๏ผ.NET 8 ไฝฟ็จๆบไปฃ็ ็ๆๅจ
- ่ฎธๅฏ่ฏ: MIT
.NET Framework 4.5/4.6.1 ๅ .NET Standard 2.0/2.1:
- Newtonsoft.Json (v13.0.3)
- ็จ้: JSON ๅบๅๅๅๅๅบๅๅ
- ่ฎธๅฏ่ฏ: MIT
- System.Net.Http (ไป
.NET Framework 4.5 ๅ 4.6.1)
- ็จ้: HTTP ๅฎขๆท็ซฏๅ่ฝ
- ๆฅๆบ: .NET Framework ๅ ็ฝฎ
- tls-client (Go ็ผ่ฏ็ๅจๆ้พๆฅๅบ, v1.9.1)
- ๆฅๆบ: bogdanfinn/tls-client
- ็จ้: ๆไพๆ ธๅฟ TLS ๅฎขๆท็ซฏๅ่ฝ
- ่ฎธๅฏ่ฏ: BSD 3-Clause
ๅบๆฏๆไปฅไธ .NET ็ฎๆ ๆกๆถ๏ผ
- .NET Framework 4.5
- .NET Framework 4.6.1
- .NET Standard 2.0
- .NET Standard 2.1
- .NET 6.0
- .NET 7.0
- .NET 8.0
- Nuke.Common: ๆๅปบ่ชๅจๅๆกๆถ
- GitVersion: ็ๆฌ็ฎก็
- .NET SDK: ็จไบ็ผ่ฏๅๆๅปบ
| ๅฑๆง | ็ฑปๅ | ้ป่ฎคๅผ | ่ฏดๆ |
|---|---|---|---|
SessionId |
string | GUID | ไผ่ฏๅฏไธๆ ่ฏ็ฌฆ |
TLSClientIdentifier |
string | Chrome_124 | TLS ๆ็บนๆ ่ฏ็ฌฆ |
Proxy |
string | null | ไปฃ็ๆๅกๅจๅฐๅ |
FollowRedirect |
bool | false | ๆฏๅฆ่ชๅจ่ท้้ๅฎๅ |
InsecureSkipVerify |
bool | false | ๆฏๅฆ่ทณ่ฟ SSL ่ฏไนฆ้ช่ฏ |
DisableIPV6 |
bool | false | ๆฏๅฆ็ฆ็จ IPv6 |
DisableIPV4 |
bool | false | ๆฏๅฆ็ฆ็จ IPv4 |
LocalAddress |
string | null | ๆฌๅฐ็ปๅฎๅฐๅ |
StreamOutput |
bool | false | ๆฏๅฆไฝฟ็จๆตๅผ่พๅบ |
Timeout |
TimeSpan | 0 (ๆ ้ๅถ) | ่ฏทๆฑ่ถ ๆถๆถ้ด |
WithDebug |
bool | false | ๆฏๅฆๅฏ็จ่ฐ่ฏๆจกๅผ |
ForceHttp1 |
bool | false | ๆฏๅฆๅผบๅถไฝฟ็จ HTTP/1.1 |
- CertificatePinning: ่ฏไนฆๅบๅฎ้ ็ฝฎ
- CustomTlsClient: ่ชๅฎไน TLS ๅฎขๆท็ซฏ้ ็ฝฎ
- TransportOptions: ไผ ่พๅฑ้้กน๏ผๆจๅท่ถ ๆถใ็ฉบ้ฒ่ฟๆฅ่ถ ๆถ็ญ๏ผ
- HeaderOrder: ่ชๅฎไน HTTP ๅคด้กบๅบ
- ProxyRotation: ไปฃ็่ฝฎๆข้ ็ฝฎ
luyao-tls-client/
โโโ src/
โ โโโ LuYao.TlsClient/ # ไธป้กน็ฎๆบไปฃ็
โ โโโ TlsClient.cs # ๆ ธๅฟๅฎขๆท็ซฏ็ฑป
โ โโโ TlsClientHttpMessageHandler.cs # HttpClient ้ๆ
โ โโโ NativeMethods.cs # P/Invoke ๅฃฐๆ
โ โโโ Types.cs # ๆฐๆฎ็ฑปๅๅฎไน
โ โโโ ClientIdentifiers.cs # ๆต่งๅจๆ ่ฏ็ฌฆ
โ โโโ CStringMarshaler.cs # C ๅญ็ฌฆไธฒๅฐ้ๅจ
โ โโโ ...
โโโ build/ # ๆๅปบ่ๆฌๅ้
็ฝฎ
โ โโโ Build.cs # Nuke ๆๅปบๅฎไน
โ โโโ Consts.cs # ๅธธ้ๅฎไน
โ โโโ ...
โโโ .github/
โ โโโ workflows/ # GitHub Actions ๅทฅไฝๆต
โ โโโ continuous.yml # ๆ็ปญ้ๆ
โ โโโ Publish_NuGet_Manual.yml # NuGet ๅๅธ
โโโ LuYao.TlsClient.sln # Visual Studio ่งฃๅณๆนๆก
โโโ README.md # ๆฌๆๆกฃ
# Windows
.\build.cmd Compile
# Linux/macOS
./build.sh Compile# Windows
.\build.cmd Pack
# Linux/macOS
./build.sh Pack้กน็ฎไฝฟ็จ GitHub Actions ่ชๅจๅๅๅธๆต็จ๏ผ้่ฟ Publish_NuGet_Manual ๅทฅไฝๆตๆๅจ่งฆๅใ
ไป .NET 8 ๅผๅง๏ผๆฌๅบๅฎๅ จๆฏๆ Native AOT ็ผ่ฏ๏ผ่ฟๆๅณ็ๆจๅฏไปฅ๏ผ
- ๐ ๆดๅฟซ็ๅฏๅจ้ๅบฆ๏ผๆ ้ JIT ็ผ่ฏ๏ผๅฏๅจ้ๅบฆๆๅ 50-80%
- ๐พ ๆดๅฐ็ๅ ๅญๅ ็จ๏ผๅ ๅญไฝฟ็จ้ไฝ 20-40%
- ๐ฆ ่ชๅ ๅซ้จ็ฝฒ๏ผๆ ้ๅฎ่ฃ .NET ่ฟ่กๆถ
- โก ๅ็ๆง่ฝ๏ผ็ผ่ฏไธบๅนณๅฐๅ็ไปฃ็
ๅจๆจ็ .NET 8 ้กน็ฎไธญๅฏ็จ AOT๏ผ
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<PublishAot>true</PublishAot>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="LuYao.TlsClient" Version="*" />
</ItemGroup>
</Project>็ถๅๅๅธไธบๅ็ๅฏๆง่กๆไปถ๏ผ
dotnet publish -c Release -r win-x64 # Windows
dotnet publish -c Release -r linux-x64 # Linux
dotnet publish -c Release -r osx-arm64 # macOS (Apple Silicon)๐ ่ฏฆ็ปๆๆกฃ๏ผ
- ๅฎๆด AOT ๆฏๆๆๅ - ๆทฑๅ ฅไบ่งฃ AOT ๅ่ฝๅๆไฝณๅฎ่ทต
- AOT ็คบไพๅบ็จ - ๅฏ่ฟ่ก็ๅฎๆด็คบไพไปฃ็
ๆณจๆ๏ผAOT ๅ่ฝไป ๅจ .NET 8.0 ๅๆด้ซ็ๆฌๅฏ็จใๅฏนไบ่พๆง็ๆกๆถ๏ผๅบๅฐ่ชๅจไฝฟ็จๆ ๅ็ JIT ็ผ่ฏใ
- ๆณๅพๅ้ๅพทไฝฟ็จ: ๆญคๅบๅบไป ็จไบๅๆณ็ฎ็ใไฝฟ็จๆญคๅบ็ป่ฟ็ฝ็ซไฟๆคๅฏ่ฝ่ฟๅๆๅกๆกๆฌพๆๅฝๅฐๆณๅพใ
- ๅ็ๅบไพ่ต: ้่ฆ็กฎไฟ็ฎๆ ๅนณๅฐ็ๅ็ๅจๆ้พๆฅๅบๅฏ็จใ
- ๅ
ๅญ็ฎก็: ๅบๅฎ็ฐไบ
IDisposable๏ผไฝฟ็จๅฎๆฏๅๅบๆญฃ็กฎ้ๆพ่ตๆบใ - ็บฟ็จๅฎๅ
จ: ๆฏไธช
TlsClientๅฎไพ็ปดๆค็ฌ็ซ็ไผ่ฏ๏ผๅปบ่ฎฎๆฏไธช็บฟ็จไฝฟ็จ็ฌ็ซๅฎไพใ
ๆฌ้กน็ฎๅบไบ bogdanfinn/tls-client ๆๅปบ๏ผ่ฏท้ตๅพช็ธๅบ็ๅผๆบ่ฎธๅฏ่ฏใ
- ๆบไปฃ็ ไปๅบ
- bogdanfinn/tls-client - ๅบๅฑ Go TLS ๅฎขๆท็ซฏๅบ
- NuGet ๅ
ๆฌข่ฟๆไบค Issue ๅ Pull Request ๆฅๆน่ฟ่ฟไธช้กน็ฎใ
ๆๅๆดๆฐ: 2025-10-23