如何从PHP中的cURL和实际链接中获取HTML?

时间:2018-02-24 21:16:18

标签: php jquery curl oauth-2.0

我是cURL的新手。

当我在jquery / ajax中进行以下GET时,我在响应中收到HTML,创建一个弹出登录窗口(oauth2)。

当我在后端php脚本中使用以下代码命中同一个端点时,我会返回一个可点击的链接...当点击该链接时会转到登录页面。

我错过了什么?

PHP

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, "https://oauthserverxxx.com//login/oauth2/auth?client_id=11111&response_type=code&scope=/auth/userinfo&redirect_uri=http://localhost/oauth_complete.php");

$result = curl_exec($curl);

来自cURL的回复

  

您正在被重定向.bool(true)   1

AJAX / jquery

    $.ajax({
      type: "GET",
      url: "https://client.instructure.com//login/oauth2/auth?client_id=6666&response_type=code&redirect_uri=http://oauth_complete.php",
        // dataType: 'html',
        processData: true,
        success: function(canvasAuthHTML) {

          $('#flexModalHeader').html('Login...');
          $('#flexModalMsg').html(canvasAuthHTML);
          $('#flexModal').modal('show');
          console.log('Called Canvas - response: ' + canvasTok);
        },
        error: function (data) {
               console.log('Fail - could not get LTI auth token...');
               chrome.runtime.sendMessage({ msg: "oauthLTI", token: "failed"});
        }
      });

响应 这将弹出登录表单里面的模式 - 来自服务器的响应是详细的HTML。

1 个答案:

答案 0 :(得分:0)

可能有几件事,

首先,jQuery请求可能使用预先存在的cookie会话,你的curl请求没有任何cookie。

第二,jQuery请求跟在"Location" http-header-redirects之后,你的curl代码没有,但如果这是问题,你可以通过将CURLOPT_FOLLOWLOCATION设置为1来指示curl执行相同的操作。

第三,jQuery请求有一个用户代理字符串,你的curl请求没有(libcurl没有默认的用户代理.curl cli程序有,但libcurl,你通过php的curl_函数使用,没有。),一些网站阻止没有用户代理的请求。如果这是问题,你可以简单地复制jQuery的用户代理字符串并告诉curl将它用于CURLOPT_USERAGENT

第四,默认情况下,大多数浏览器尽可能使用压缩,但您的curl请求不支持压缩。不太可能,但可能的是,服务器处理卷曲请求的方式不同,因为它不支持压缩传输,如果这是问题,您可以通过卷曲请求启用压缩将CURLOPT_ENCODING设置为emptystring(这将启用libcurl编译的所有压缩,通常是gzip和deflate) - 实际上,我建议不管怎么做,因为你正在抓取HTML,压缩得非常好,所以除非你的cpu非常慢,它也会使代码执行得更快。这与浏览器默认执行此操作的原因相同。

.-找到罪魁祸首最可靠的方法是记录两个请求,并排比较它们,并逐一取消2个请求中的每个差异,直到请求相同。迟早,你会发现服务器响应不同的差异(我最好的猜测是位置重定向),为此,我推荐程序FiddlerProxy

相关问题