Я пытаюсь от 1 недели, чтобы войти на yelp, используя php, curl и api, но я не добился успеха. Я получил этот вывод из моего кода: {"message": {"field": "signature", "text": "One or more parameters are missing in request", "code": 8, "version": "1.1.1", "request_id": "2a372375b650682c"}}
Я думаю, что мой процесс структуры подписи не является правильным. Я пытался много раз, используя много кода генератора подписи, но я нахожусь в том же положении (я не успех).
Вот мой код:
/* nonce generator */
ini_set('default_mimetype', 'text/plain');
ini_set('default_charset', 'GT-I9500'); //ISO-8859-1
define('NONCE_SECRET', 'SECRET');
require_once('NonceUtil.php');
$nonces = NonceUtil::generate(NONCE_SECRET, 1);
$nonceex = explode(',',$nonces)[0];
$nonce = substr($nonceex, 0, 6).'==';
/* Time Generator */
$time = (strtotime("now"));
$p = array(
'time' => $time,
'nonce' => $nonce,
'ywsid' => 'ywsid',
'device_type' => 'Micromax+Q391/LRX21M',
'app_version' => '9.17.0',
'cc' => 'US',
'lang' => 'en',
'efs' => 'efs',
'signature' => '',
'email' => 'email',
'password' => 'password'
);
ksort($p);
$string = '';
foreach($p as $oneKey=>$oneValue) {
$string .= urlencode($oneKey) . urlencode($oneValue);
}
$hash = hash_hmac('sha1', $string, 'HMAC-SHA1', true);
$sig = '_'.base64_encode($hash);
$p['signature'] = $sig;
/* post method */
$url = 'https://auto-api.yelp.com/account/login_secure';
$ch = curl_init();
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Version/1 Yelp/v9.17.0 Carrier/Grameenphone Model/Q391 OSBuild/LRX21M Android/5.0");
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
//curl_setopt ($ch, CURLOPT_HEADER, TRUE);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array(
'x-screen-scale: 1.5',
'X-Foregrounded: true',
'Content-Type: application/x-www-form-urlencoded',
'Host: auto-api.yelp.com'
));
curl_setopt ($ch, CURLOPT_URL, $url);
if(!curl_setopt($ch, CURLOPT_URL, $url))
{
throw new \RuntimeException("curl_setopt with CURLOPT_URL failed. errno: ".curl_errno($ch).". errstr: ".curl_errstr(curl_errno($ch)));
}
curl_setopt ($ch, CURLOPT_POST, TRUE);
if(!curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($p)))
{
die("error with CURLOPT_POSTFIELDS");
};
$output = curl_exec($ch);
if(false === $output)
{
if(curl_errno($ch))
{
echo 'Curl error: ' . curl_error($ch);
}
die("error, curl_exec failed");
} else {
echo $output;
}
Пожалуйста, проверьте этот результат запроса:
POST https://auto-api.yelp.com/account/login_secure?time=1535725620&nonce=nonce&ywsid=ywsid&device_type=Micromax%2BQ391%2FLRX21M&app_version=9.17.0&cc=US&lang=en&efs=efs&signature=_fCmlWphKBRCYD%2BTtZEsb2uaifTw%3D HTTP/1.1
x-screen-scale: 1.5
X-Foregrounded: true
Accept-Encoding: gzip
Content-Length: 51
Content-Type: application/x-www-form-urlencoded
Host: auto-api.yelp.com
Connection: Keep-Alive
User-Agent: Version/1 Yelp/v9.17.0 Carrier/Grameenphone Model/Q391 OSBuild/LRX21M Android/5.0
Content-Encoding: utf-8
email=zimuakter21994%40gmail.com&password=password
Также проверьте этот результат ответа:
HTTP/1.1 200 OK
Server: nginx
Content-Type: application/json; charset=utf-8
X-Node: api_com
Set-Cookie: yuv=kMGkxrA-7onbYJ6J9KLR8aHHsDWE103uBm8RE9cUe963pwQoBqYRuvFE8g7gkFR4jDarGMEM6YAu7JubiEXJXGEutGpQN_kx; Domain=.yelp.com; Max-Age=630720000; Path=/; expires=Thu, 26-Aug-2038 14:27:01 GMT
Cache-Control: max-age=0, must-revalidate, no-cache, no-store, private
Expires: Fri, 31 Aug 2018 14:27:01 GMT
Pragma: no-cache
Set-Cookie: bse=bb82de7f35af489082963b7eae7eeae3; Domain=.yelp.com; Path=/; HttpOnly
Set-Cookie: api_s=VrCIz_UekETVc8AOS1x2mHrODFIl83pD; Max-Age=630720000; Path=/; expires=Thu, 26-Aug-2038 14:27:02 GMT; HttpOnly
Set-Cookie: api_ss=i7JtViAbGXkruXsHw5MKzc76edKhqS9A; Max-Age=630720000; Path=/; expires=Thu, 26-Aug-2038 14:27:02 GMT; secure; HttpOnly
Set-Cookie: ds=nzyugdxqoKZEk7ZoCEfOQA; Domain=.yelp.com; Max-Age=120; Path=/; expires=Fri, 31-Aug-2018 14:29:02 GMT
X-Zipkin-Id: 2cb7c23dcfe94ed0
X-Content-Type-Options: nosniff
X-Node: 10-64-147-103-uswest1bprod-5590439d-ad1b-11e8-92ce-02424775f1e2
X-Mode: rw
X-Proxied: 10-64-16-25-uswest1bprod
X-Mode: rw
X-Proxied: 10-69-117-83-uswest2aprod
Accept-Ranges: bytes
Date: Fri, 31 Aug 2018 14:27:02 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-sin18027-SIN
X-Cache: MISS
X-Cache-Hits: 0
Vary: User-Agent
Content-Length: 384
{"first_name": "Virgie K", "last_name": "Wilson", "user_id": "7rCE1Q25rle9mbIbFccRbg", "last_initial": "W", "is_confirmed": true, "gender": "f", "expiry": 1543501622, "location": "Hillsdale, IL", "name_without_period": "Virgie K W", "message": {"text": "OK", "code": 0, "version": "1.1.1", "request_id": "2cb7c23dcfe94ed0"}, "email": "[email protected]", "name": "Virgie K W."}
Прежде всего, замените свои пароли!
тогда вы должны посмотреть на эту часть:
foreach($p as $oneKey=>$oneValue) {
$string .= urlencode($oneKey) . urlencode($oneValue);
}
вам нужно разделить строки следующим образом:
$string = ""foreach($p as $oneKey=>$oneValue) {
$string .= ($string!="" ? "&" : "") .urlencode($oneKey) . "=" urlencode($oneValue);
}
Других решений пока нет …