前提
言語 C#
フレームワーク .NET 6
CloudFlareを使用しているサイトに対してGetリクエストを行ってjsonの結果を取得したいが想定と違う結果が返ってくる
以下のサイトにブラウザからアクセスするとjson形式で値が返ってくる
https://api-mainnet.magiceden.io/rpc/getListedNFTsByQueryLite?q=%7B%22%24match%22%3A%7B%22collectionSymbol%22%3A%22darleygo_genesis_horses%22%2C%22takerAmount%22%3A%7B%22%24lte%22%3A2000000000%7D%7D%2C%22%24sort%22%3A%7B%22takerAmount%22%3A1%7D%2C%22%24skip%22%3A0%2C%22%24limit%22%3A20%2C%22status%22%3A%5B%5D%7D
実際に返ってくる値
html
1<!DOCTYPE html> 2<html lang="en-US"> 3<head> 4 <title>Just a moment...</title> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> 7 <meta name="robots" content="noindex,nofollow" /> 8 <meta name="viewport" content="width=device-width,initial-scale=1" /> 9 <link href="/cdn-cgi/styles/cf-errors.css" rel="stylesheet" /> 10 11<script> 12 (function(){ 13 window._cf_chl_opt={ 14 cvId: '2', 15 cType: 'managed', 16 cNounce: '11349', 17 cRay: '73a06d4c69848072', 18 cHash: '8a609977e5c11d7', 19 cUPMDTk: "\/rpc\/getListedNFTsByQueryLite?q=%7B%22%24match%22%3A%7B%22collectionSymbol%22%3A%22darleygo_genesis_horses%22%2C%22takerAmount%22%3A%7B%22%24lte%22%3A2000000000%7D%7D%2C%22%24sort%22%3A%7B%22takerAmount%22%3A1%7D%2C%22%24skip%22%3A0%2C%22%24limit%22%3A20%2C%22status%22%3A%5B%5D%7D&__cf_chl_tk=aTk4NkH.1bk2qTLw4D8YZ8uDaRxZgZAjMr1KwjxSLmA-1660382972-0-gaNycGzNBuU", 20 cFPWv: 'g', 21 cTTimeMs: '1000', 22 cTplV: 3, 23………(中略)……… 24 25 <div class="footer" role="contentinfo"> 26 <div class="footer-inner"> 27 <div class="clearfix diagnostic-wrapper"> 28 <div class="ray-id">Ray ID: <code>73a06d4c69848072</code></div> 29 </div> 30 <div class="text-center"> 31 Performance & security by 32 <a rel="noopener noreferrer" href="https://www.cloudflare.com?utm_source=challenge&utm_campaign=m" target="_blank">Cloudflare</a> 33 </div> 34 </div> 35 </div> 36</body> 37</html>
実現したいこと
ブラウザからアクセスした時と同様のjsonを取得したい
試したこと
一旦、以下の3つの方法でアクセスしてみましたが、jsonではなく上記のhtmlが返されました。
・ WebRequest
・ HTTPclient
・ Playwrightのリクエストコンテキスト
次に、CloudFlareのAnti DDos Protection機能を備えてそうなライブラリを使用してみました。
・https://github.com/elcattivo/CloudFlareUtilities
・https://github.com/zingz0r/CloudFlare.Client
・https://github.com/RyuzakiH/CloudflareSolverRe
これらを試しても同様にHTMLしか返ってきていない事までは確認済みです。
どういう取得の仕方をしているのかを念のため記載しておきます。
ライブラリのusage通りの取得方法です。
C#
1static async Task Main(string[] args) 2{ 3 // Create the clearance handler. 4 var handler = new ClearanceHandler 5 { 6 MaxRetries = 2 // Optionally specify the number of retries, if clearance fails (default is 3). 7 }; 8 _httpClient = new HttpClient(handler); 9 var fuga = await _httpClient.GetRequestAsync<MagicEdenDarley>(URL); 10} 11 12public static async Task<T?> GetRequestAsync<T>(this HttpClient httpClient, string url) 13{ 14 using (var request = new HttpRequestMessage(new HttpMethod("GET"), url)) 15 using (var res = await httpClient.SendAsync(request)) 16 { 17 try 18 { 19 var json = await res.Content.ReadAsStringAsync(); 20 return JsonSerializer.Deserialize<T?>(json); 21 } 22 catch 23 { 24 return default; 25 } 26 } 27} 28