前提
言語 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
<!DOCTYPE html><html lang="en-US"><head> <title>Just a moment...</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta name="robots" content="noindex,nofollow" /> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link href="/cdn-cgi/styles/cf-errors.css" rel="stylesheet" /> <script> (function(){ window._cf_chl_opt={ cvId: '2', cType: 'managed', cNounce: '11349', cRay: '73a06d4c69848072', cHash: '8a609977e5c11d7', 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", cFPWv: 'g', cTTimeMs: '1000', cTplV: 3, ………(中略)……… <div class="footer" role="contentinfo"> <div class="footer-inner"> <div class="clearfix diagnostic-wrapper"> <div class="ray-id">Ray ID: <code>73a06d4c69848072</code></div> </div> <div class="text-center"> Performance & security by <a rel="noopener noreferrer" href="https://www.cloudflare.com?utm_source=challenge&utm_campaign=m" target="_blank">Cloudflare</a> </div> </div> </div></body></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#
static async Task Main(string[] args){ // Create the clearance handler. var handler = new ClearanceHandler { MaxRetries = 2 // Optionally specify the number of retries, if clearance fails (default is 3). }; _httpClient = new HttpClient(handler); var fuga = await _httpClient.GetRequestAsync<MagicEdenDarley>(URL);} public static async Task<T?> GetRequestAsync<T>(this HttpClient httpClient, string url){ using (var request = new HttpRequestMessage(new HttpMethod("GET"), url)) using (var res = await httpClient.SendAsync(request)) { try { var json = await res.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize<T?>(json); } catch { return default; } }}

0 コメント