php curl改为guzzlehttp/guzzle请求返回不一样

发布于 2022-09-13 01:21:04 字数 2626 浏览 37 评论 0

https://github.com/unkaer/xia...
这是一段小米运动账号的登录请求
我想把此文件里面的 request_post 方法改为 guzzlehttp/guzzle方式来写
原本的 request_post 方法

function request_post($url = '', $post_data = array(), $header = array()) {
    if (empty($url) || empty($post_data)) {
        return false;
    }
    if (empty($header)) {
        $header = 0;
    }
    $o = "";
    foreach ( $post_data as $k => $v )
    {
        $o.= "$k=" . urlencode( $v ). "&" ;
    }
    $post_data = substr($o,0,-1);
    $postUrl = $url;
    $curlPost = $post_data;
    $ch = curl_init();//初始化curl
    curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定网页
    curl_setopt($ch, CURLOPT_HEADER, true);// 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
    curl_setopt($ch,CURLOPT_HTTPHEADER,$header);//设置header
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
    curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
    $data = curl_exec($ch);//运行curl
    curl_close($ch);
    // print_r($data."</br>");
    return $data;
}

// 调用方法
$user = '';
$password = '';
$url = 'https://api-user.huami.com/registrations/+86'. $user.'/tokens';
$data = [
    'client_id' => 'HuaMi',
    'password' => $password,
    'redirect_uri' => 'https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html',
    'token' => 'access',
];
$header = [
    'Content-Type:application/x-www-form-urlencoded;charset=UTF-8',
    'User-Agent:MiFit/4.6.0 (iPhone; iOS 14.0.1; Scale/2.00)',
];
request_post($url, $data, $header)

我改成 guzzlehttp/guzzle,使用的 laravel

use Illuminate\Support\Facades\Http;

$user = '';
$password = '';
$url = 'https://api-user.huami.com/registrations/+86'. $user.'/tokens';
$data = [
    'client_id' => 'HuaMi',
    'password' => $password,
    'redirect_uri' => 'https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html',
    'token' => 'access',
];
$header = [
    'User-Agent' => 'MiFit/4.6.0 (iPhone; iOS 14.0.1; Scale/2.00)',
];

//改为的 guzzlehttp/guzzle 方式
$response = Http::asForm()->withHeaders($header)->post($url, $data);

$user传小米运动的账号,$password传小米运动的密码
这两个请求正确的情况下,原本的 request_post方法是返回http状态码303,我改的guzzlehttp/guzzle 方式返回是200,数据也不一样
image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

遗心遗梦遗幸福 2022-09-20 01:21:05

已解决。添加allow_redirectsfalse即可

namespace Illuminate\Http\Client
class PendingRequest
//添加此方法
withoutRedirecting()
public function login(string $user, string $password)
{
    $url = 'https://api-user.huami.com/registrations/+86'. $user.'/tokens';
    $data = [
        'client_id' => 'HuaMi',
        'password' => $password,
        'redirect_uri' => 'https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html',
        'token' => 'access',
    ];
    $header = [
        'User-Agent' => 'Dalvik/2.1.0 (Linux; U; Android 11; M2012K11AC Build/RKQ1.200826.002)',
    ];

    $location = Http::asForm()->withHeaders($header)->withoutRedirecting()->post($url, $data)->header('Location');
    parse_str(parse_url($location, PHP_URL_QUERY), $query);
    if(!isset($query['access'])){
        throw new \Exception('登录失败');
    }

    $url = "https://account.huami.com/v2/client/login";
    $data = [
        'app_name' => 'com.xiaomi.hm.health',
        'app_version' => '4.6.0',
        'code' => $query['access'],
        'country_code' => 'CN',
        'device_id' => '2C8B4939-0CCD-4E94-8CBA-CB8EA6E613A1',
        'device_model' => 'phone',
        'grant_type' => 'access_token',
        'third_name' => 'huami_phone',
    ];
    $response_query = Http::asForm()->withHeaders($header)->withoutRedirecting()->post($url, $data)->json();
    return [$response_query['token_info']['login_token'], $response_query['token_info']['user_id']];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文