web-dev-qa-db-ja.com

CURLを介してajaxリクエストを送信する

APIリクエストを送信する必要があります。何らかの理由で、サーバーはCURL要求をブロックしていますが、XHR ajax要求は承認します。 Ajaxリクエストを送信できましたが、別の問題が発生します-私のWebサイトはHTTPS経由で提供されますが、送信する必要があるリクエストはHTTP経由であるため、ajaxを使用できません。

私はCURLを介してajaxリクエストをシミュレートする方法を探しています。何らかの方法で、CURLリクエストが実際にajaxリクエストであると信じるようにサーバーをだます。

これが私が試したことです。

これは私のCURLリクエストです。

$ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64)');
    curl_setopt($ch, CURLOPT_REFERER, 'server's url');
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept:application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding:gzip, deflate',
    'Accept-Language:en-US,en;q=0.9',
    'Connection:keep-alive',
    'Content-Type: application/json; charset=utf-8',
    'X-Requested-With: XMLHttpRequest',
    '__RequestVerificationToken: $token'
    ));
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, base_path().'/cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, base_path().'/cookies.txt');
    $buffer = curl_exec($ch);
    if(curl_error($ch))
    {
    $buffer =   curl_error($ch);
    }
    curl_close($ch);

return $ buffer;このカールリクエストはブロックされています

ただし、このajaxリクエストはローカルホストを経由しますが、ライブWebサイトはHTTPSを使用しているため、実際には使用できません。

 $.ajax({
      type: "get",
      xhrFields: { withCredentials:true },
      url: http://apiendpoint.com,
      success: function(data)
      {
       // console.log(data);
      }
})
13
Dhiraj

クロムでは、開発者ツールバーから作業カール式をコピーできます。 CLIから試してみてください。それが機能する場合、どの部品が必要で、どの部品が必要でないかを把握できます。その後、phpにそれを転写することができます。

developer toolbar -> network -> select a file -> right click - copy -> copy as curl

Curlからではなくphpからも同じことが起こるかどうか疑問がある場合は、 requestbin で試してください。

7
lintabá

$ a == 1が与えられると、 '$ a'は$ aに変換されますが、 "$ a"は "1"に変換されるため、トークンのヘッダーが思ったとおりではない可能性があると思います(一重引用符対二重引用符)。

あなたの例では、置き換えてみてください:

'__RequestVerificationToken: $token'

で:

"__RequestVerificationToken: $token"

それが問題を解決するかどうかをお知らせください。

Passthru( "curl command here ...");の使用を検討してください。リンタバからの提案を使用して

0
Felipe Valdes