質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

1227閲覧

【C#】CloudFlareを使用しているサイトからGetリクエストを取得したい

OXamarin

総合スコア59

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2022/08/13 09:42

前提

言語 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 &amp; 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/08/13 12:46

ブラウザでないと結果が得られないというのは普通にあって、例えば SPA などブラウザでスクリプトが動いて結果を表示するのですが、それと似たような話ではないのですか?
退会済みユーザー

退会済みユーザー

2022/08/14 23:09

質問者さん、無言ですが、回答したのでそれに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
guest

回答1

0

質問のコメント、

ブラウザでないと結果が得られないというのは普通にあって、例えば SPA などブラウザでスクリプトが動いて結果を表示するのですが、それと似たような話ではないのですか?

・・・と書きましたが、自分が少し調べてみた限りはそのようで、ブラウザが初期画面(質問の「実際に返ってくる値」に書いてある html)を受けた後スクリプトが動いて結果を表示するということのように見えます。

質問に書いてある url から curl で取得した html ソースから初期画面を作ってブラウザに表示してみましたが、以下のようになります。

イメージ説明

"api-mainnet.magiceden.io needs to review the security of your connection before proceeding." と書いてあように、この後何らかの処理を行うようです。

したがって、WebRequest とか HttpClient とかで初期画面の html ソースを取得しても何ともならないということではないかと思います。

なお、上に書いたように「html ソースから初期画面を作ってブラウザに表示」しても、接続がセキュアと確認できないためか、その先には進みませんでした。

ちなみに、質問に書いてある url をクリックしてブラウザから要求をかけ、Web サーバーとどういうやり取りをしているのか Fiddler で調べてみたら、以下の画像のようになっていました。

イメージ説明

初期画面の html ソースを受信した後、外部には要求は出ておらず、ブラウザ内部で接続がセキュアと確認し、初期画面の html ソースを処理して JSON 文字列を出力(右下のウィンドウ)しているように見えます。

どうやってやってるかは分かりません。質問者さんの方で html ソースを解析するとか、CloudFlare に聞くとかして調べて、何か分かったら教えていただけると幸いです。

投稿2022/08/14 01:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OXamarin

2022/08/15 01:03

Python だとCloudScraperというAnti DDos Protectionのライブラリを使用すればレスポンスが取得できる事がわかっています。 https://github.com/VeNoMouS/cloudscraper なので、ブラウザ以外でも結果が得られる事までは把握しているのですが、.NET の場合だとどのようにすれば突破できるのかはまだ分かっていません。fiddlerのレスポンスは欲しい情報ですね。何が違うのやら…
退会済みユーザー

退会済みユーザー

2022/08/15 01:25

Fiddler を使って、「Anti DDos Protectionのライブラリ」と「.NET の場合」の両方の要求・応答をキャプチャして、違いを調べてみてはいかがですか? そこにヒントが見つかるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問