n0tr00t / Sreg

Sreg可对使用者通过输入email、phone、username的返回用户注册的所有互联网护照信息。
MIT License
1.23k stars 399 forks source link

怎样在php里构造请求头? #7

Closed ChenZhongPu closed 4 years ago

ChenZhongPu commented 9 years ago

我在浏览器里面访问 https://passport.baidu.com/v2/?regphonecheck&phone=18789482356, 得到的返回信息是: screen shot 2015-03-24 at 1 29 28 am

但在PHP里面请求时,错误代码是 ({"errno":110000,"index":null,"errmsg":"\u6210\u529f"})。(这个Unicode是成功的意思)。我应该是请求头构造错了。

   $url='https://passport.baidu.com/v2/?regphonecheck&phone=18789482356';
//    $html = file_get_contents($url);
//    echo $html;

    $opts = array('https' =>
    array(
        'method' => 'GET',
        'header'  =>  array(
            'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
            'HOST' => parse_url($url)['host']
        )
    ));

    $context = stream_context_create($opts);
    $stream = fopen($url, 'r', false, $context);

    echo stream_get_contents($stream);

请问,这个请求头应该怎么构造?

davexpro commented 9 years ago

PHP有几个函数不支持https,你可以尝试用curl然后curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

ChenZhongPu commented 9 years ago

@Captain-D 我尝试了你说的方法,下面是更新后的代码:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://passport.baidu.com/v2/?regphonecheck&phone=18789482356");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER,array('User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
    'Host:passport.baidu.com'));

curl_exec($ch);

输出还是 {"errno":110000,"index":null,"errmsg":"\u6210\u529f"}.

ChenZhongPu commented 9 years ago

补充,奇怪的是请求58同城的,可以成功:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://passport.58.com/ajax/checkemail?email=2453085348%40qq.com");

//curl_setopt($ch, CURLOPT_HTTPHEADER,array('Host:passport.58.com'));
//curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6');
curl_exec($ch);

甚至不需要设置请求头。

我又试了当当的,也不需要请求头,也成功了:


curl_setopt($ch, CURLOPT_URL,"https://login.dangdang.com/p/email_checker.php");
curl_setopt($ch, CURLOPT_POST, true);
$data = array('email' => '18789482356@163.com');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
//curl_setopt($ch, CURLOPT_HTTPHEADER,array('Host:passport.58.com'));
//curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6');
curl_exec($ch);

那百度的为什么不行?

samshuai commented 4 years ago

百度应该是某种方法做了人机验证的