i'm using the following php to connect to bing api:
how can i add filter (Size:Small)?
the code is from bing documentation and it works fine.
i'm using this code to connect to bing and redirect the response to an iOS app.
please help...
<?php
{
$accountKey = ‘XXXXXXXXX’;
$auth = base64_encode("$accountKey:$accountKey");
$data = array(
'http' => array(
'request_fulluri' => true,
'ignore_errors' => true,
'header' => "Authorization: Basic " . $auth));
$context = stream_context_create($data);
$query = isset($_GET['q']) ? $_GET['q'] : htmlspecialchars($_GET["searchtext"]);
$serviceOp = isset($_GET['sop']) ? $_GET['sop'] : 'Web';
$market = isset($_GET['market']) ? $_GET['market'] : 'en-us';
$ServiceRootURL = 'https://api.datamarket.azure.com/Bing/Search/';
$WebSearchURL = $ServiceRootURL . 'Image?$format=json&Image.Filters=+filterui:imagesize-large+filterui:photo-photo+filterui:face-face&Query=';
$request = $WebSearchURL . urlencode( '\'' . $query. '\'') ;
// Get the response from Bing.
$response = file_get_contents($request, 0, $context);
$jsonobj = json_decode($response);
// echo('<ul ID="resultList">');
header('Content-Type: application/json');
echo($response);
?>
First remove all image filters from $WebSearchURL variable,
and then add your image filters with this way:
$request = $WebSearchURL . urlencode( '\'' . $query. '\'').'&ImageFilters=';
$request = $request . urlencode( '\'' .'Size:Large+Face:Face'. '\'');
Hope it works with you :)
Related
I am trying to sign an AWS API request and then use cURL.
The purpose is to submit a tracking number to API of the service provider, and use the response.
I am a complete noob to AWS API and cannot find my fault after numerous testing.
I have tried numerous ways but all leads to {"message":"Forbidden"}.
Here is my current script:
<?php
$accessKeyId = "AKIA55D**********";
$secretAccessKey = "NQ0xcl**********";
$method ='GET';
$uri = '/tracking/shipments';
$secretKey = $secretAccessKey;
$access_key = $accessKeyId;
$region = 'af-south-1';
$service = 'execute-api';
$host = "https://api.shiplogic.com";
$alg = 'sha256';
$date = new DateTime('Africa/Johannesburg');
$dd = $date->format( 'Ymd\THis\Z' );
$amzdate2 = new DateTime( 'Africa/Johannesburg' );
$amzdate2 = $amzdate2->format( 'Ymd' );
$amzdate = $dd;
$algorithm = 'AWS4-HMAC-SHA256';
$canonical_uri = $uri;
$canonical_querystring = '';
$canonical_headers = "host:".$host."\n"."x-amz-date:".$amzdate."\n";
$signed_headers = 'host;x-amz-date';
$canonical_request = "".$method."\n".$canonical_uri."\n".$canonical_querystring."\n".$canonical_headers."\n".$signed_headers;
$credential_scope = $amzdate2 . '/' . $region . '/' . $service . '/' . 'aws4_request';
$string_to_sign = "".$algorithm."\n".$amzdate ."\n".$credential_scope."\n".hash('sha256', $canonical_request)."";
//string_to_sign is the answer..hash('sha256', $canonical_request)//
$kSecret = 'AWS4' . $secretKey;
$kDate = hash_hmac( $alg, $amzdate2, $kSecret, true );
$kRegion = hash_hmac( $alg, $region, $kDate, true );
$kService = hash_hmac( $alg, $service, $kRegion, true );
$kSigning = hash_hmac( $alg, 'aws4_request', $kService, true );
$signature = hash_hmac( $alg, $string_to_sign, $kSigning );
$authorization_header = $algorithm . ' ' . 'Credential=' . $access_key . '/' . $credential_scope . ', ' . 'SignedHeaders=' . $signed_headers . ', ' . 'Signature=' . $signature;
$headers = [
'content-type'=>'application/json',
'x-amz-date'=>$amzdate,
'Authorization'=>$authorization_header];
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.shiplogic.com/tracking/shipments?tracking_reference=M3RPH',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'X-Amz-Date: '.$amzdate.'',
'Authorization: ' . $authorization_header . ''
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
The response I receive is {"message":"Forbidden"}
What am I doing wrong?
Install Amazon's PHP SDK as already pointed out in the comments.
composer require aws/aws-sdk-php
The documentation of the API you're trying to call has 1 PHP code sample and it uses that SDK. All you need to do is insert your credentials.
use Aws\Credentials\Credentials;
use Aws\Signature\SignatureV4;
use Psr\Http\Message\RequestInterface;
function sign(
RequestInterface $request,
string $accessKeyId,
string $secretAccessKey
): RequestInterface {
$signature = new SignatureV4('execute-api', 'af-south-1');
$credentials = new Credentials($accessKeyId, $secretAccessKey);
return $signature->signRequest($request, $credentials);
}
You can see both the input $request and the return value are of the same RequestInterface type. So it gives you a modified request object with a proper signature (if your key and params are valid).
If you're using curl, you may not have this request object yet. Amazon's API uses the PSR-7 standard request interface, most frameworks implement this if they have a request object.
If you don't have a request object at hand, you could use Guzzle's implementation for it. The required packages are already installed as dependencies of Amazon's SDK. You can install both highlighted packages from the Github permalink.
$request = new GuzzleHttp\Psr7\Request(
'GET',
'https://api.shiplogic.com/tracking/shipments',
[
// Maybe you still need headers.
]
);
$signed_request = sign($request);
$client = new \GuzzleHttp\Client();
$response = $client->send($signed_request);
As mentioned in the comments creating your own implementation of security components should be avoided as much as possible. It's a lot easier to rewrite your code to use this request object, especially for future maintenance.
Also keep in mind that your credentials might simply be invalid, or have no access to the resource you're requesting. At first sight most of your implementation seemed to follow what's expected from the signing protocol (though you just need 1 tiny mistake and it won't work), so if you're sure you checked everything it might be as simple as that.
Can anybody help me to rewrite the following request in curl or anything similar which is available in php 5.6? I'm new with http request in PHP and I'm not able to use the HttpRequest class cause it can't be found on the server. Other suggestions are welcome too. Maybe there is already a library?
$path = "content/images/calendarmotiv/";
$fail = true;
$tmp = $_FILES['imagetarget']['tmp_name'];
$name = basename($_FILES['imagetarget']['name']);
if(move_uploaded_file($tmp, $path.$name))
{
// http request body
$now = new DateTime('NOW');
$body = json_encode(array(
"name" => $name,
"width" => 1024.0,
"image_url" => base64_encode($path.$name),
"active_flag" => 1,
"application_metadata_url" => base64_encode($_POST["metadata"]))
);
$http_verb = "POST";
$content_md5 = md5($body);
$content_type = "application/json";
$date = str_replace("+0000", "GMT", $now->format(DateTime::RFC1123));
$request_path = "<a href='https://vws.vuforia.com/targets'> https://vws.vuforia.com/targets</a>";
// auth string for header
$string_to_sign = $http_verb . "\n" . $content_md5 . "\n" . $content_type . "\n" . $date . "\n" . $request_path;
$secret_key = "mykey";
$signature = hash_hmac("sha1", $string_to_sign, $secret_key);
$authstring = "VWS " . $secret_key . ":" . $signature;
// the request
$request = new HttpRequest($request_path, HttpRequest::METH_POST);
$request->setContentType($content_type);
$request->setBody($body);
$request->addHeaders(array(
"Date" => $date,
"Authorization" => $authstring));
$request->send();
echo $request->getRequestMessage();
echo $request->getResponseMessage();
}
I've created a Vuforia client class in PHP for basic operations with Vuforia target database:
https://github.com/FionNoir/VuforiaClient
As per the new oauth 2.0 for linkedin.
I am unable to get user profile details.
I have set the attributes in my app but still cant get the details.
Can somebody help me the code snippet to get user details.
public function fetch($method, $resource, $body = '') {
$opts = array(
'http' => array(
'method' => $method,
'header' => "Authorization: Bearer " .
$_SESSION['oauth_access_token'] . "\r\n" .
"x-li-format: json\r\n"
)
);
$url = 'api.linkedin.com' . $resource;
if (count($this->$params)) {
$url .= '?' . http_build_query($this->$params);
}
$context = stream_context_create($opts);
$response = file_get_contents($url, false, $context);
return json_decode($response);
}
$xml_response = $LinkedInn->fetch("GET","/v1/people/~");
Please check your permissions in your code when you are logging in with linked-in.
Look at this link-
https://developer.linkedin.com/support/developer-program-transition
I'm trying to rewrite an fopen() POST request to work with a proxy.
The code is based on an example on the Paypal site (https://www.x.com/developers/PayPal/documentation-tools/code-sample/216632).
My default workarounds for fopen() as well as for file_get_contents() and cURL lib don't work for the relatively complex post header and contents. (Either fail to go through proxy or get Invalid request: {0}, even when no proxy is set)
Here's the (simplified) post example code:
$url = trim('https://svcs.sandbox.paypal.com/AdaptiveAccounts/AddBankAccount');
$API_UserName = "sbapi_1287090601_biz_api1.paypal.com"; //TODO
$API_Password = "1287090610"; //TODO
$API_Signature = "ANFgtzcGWolmjcm5vfrf07xVQ6B9AsoDvVryVxEQqezY85hChCfdBMvY"; //TODO
$API_SANDBOX_EMAIL_ADDRESS = "rishaque#paypal.com"; //TODO
$API_DEVICE_IPADDRESS = "127.0.0.1"; //TODO
$API_AppID = "APP-80W284485P519543T";
$API_RequestFormat = "XML";
$API_ResponseFormat = "XML";
$xml = simplexml_load_string($xml_str);
$contents = $xml->asXML();
try
{
$params = array("http" => array(
"method" => 'POST',
"content" => $contents,
'header' => 'X-PAYPAL-SECURITY-USERID: ' . $API_UserName ."\r\n" .
'X-PAYPAL-SECURITY-PASSWORD: ' . $API_Password . "\r\n" .
'X-PAYPAL-SECURITY-SIGNATURE: ' . $API_Signature . "\r\n" .
'X-PAYPAL-REQUEST-DATA-FORMAT: ' . $API_RequestFormat . "\r\n" .
'X-PAYPAL-RESPONSE-DATA-FORMAT: ' . $API_ResponseFormat . "\r\n" .
'X-PAYPAL-APPLICATION-ID: ' . $API_AppID . "\r\n" .
'X-PAYPAL-SANDBOX-EMAIL-ADDRESS: ' . $API_SANDBOX_EMAIL_ADDRESS . "\r\n" .
'X-PAYPAL-DEVICE-IPADDRESS: ' . $API_DEVICE_IPADDRESS . "\r\n" ));
$ctx = stream_context_create($params);
$fp = #fopen($url, 'r', false, $ctx); // PROXIFY!
$response = stream_get_contents($fp);
if ($response === false) {
throw new Exception("php error message = " . "$php_errormsg");
}
fclose($fp);
// ... handle the response content ...
}
catch(Exception $e)
{
echo 'Message: ||' .$e->getMessage().'||';
}
?>
My proxy file_get_contents():
if (!empty($_context_params)) {
$http_arr = $_context_params['http'];
$http_arr['proxy'] = $proxy_path;
$http_arr['request_fulluri'] = true;
$_context_params['http'] = $http_arr;
}
else
{
$_context_params = array( 'http' => array( 'proxy' => $proxy_path, 'request_fulluri' => true ) );
}
return file_get_contents( $_url, false, stream_context_create( $_context_params ) );
My proxied fopen:
$parsed_proxy_path = parse_url($proxy_path);
$_proxy_name = $parsed_proxy_path['host'];
$_proxy_port = $parsed_proxy_path['port'];
$proxy_fp = fsockopen( $_proxy_name, $_proxy_port );
if ( !$proxy_fp )
return false;
$parsed_url = parse_url($_url);
$host = $parsed_url['host'];
$request = "GET $_url HTTP/1.0\r\nHost:$host\r\n\r\n";
fputs( $proxy_fp, $request );
return $proxy_fp;
My cURL experiment: (CodeIgniter curl lib takes care of proxy for me)
$http_params = $params['http'];
$this->curl->create($this->cfg->paypal_req_url);
$this->curl->option('header', true);$this->curl->option('verbose', true);
$this->curl->option('useragent', 'cURL/PHP');
$this->curl->http_header($http_params['header']);
$this->curl->http_header("Content-length: ".strlen($contents));
$this->curl->post(array("content"=> $contents));
$res = $this->curl->execute();
Any ideas where to go from here? I'm a bit stuck..
How do I debug the request going out from cURL? Is the request even reproducible with cURL?
Will it work with GET instead of POST?
Is XMLRPC an option?
Note: The example code works for me when not behind a proxy.
Thanks in advance,
Alex
Here's the code I used to get it to work with cURL.
Note: It uses the codeigniter cURL lib by Phil Sturgeon.
Note: I resolved to switching from XML to query string for the contents.
$contents = array(
"actionType"=>"PAY",
"cancelUrl"=>$cancel_url,
"returnUrl"=>$return_url,
"currencyCode"=>$currency,
"sender"=>$sendingmail,
"memo"=>$memo,
"requestEnvelope.errorLanguage"=>$error_lang,
"receiverList.receiver.amount"=>$amount,
"receiverList.receiver.email"=>$receivingmail,
);
if (isset($notification_url)) { $contents["ipnNotificationUrl"]=$notification_url; }
if ($receivingmail == $this->cfg->paypal_email) { $contents["feesPayer"]="SENDER"; }
if ($sendingmail == $this->cfg->paypal_email) { $contents["senderEmail"]=$sendingmail; }
// ------------------------------
// create request and add headers
// ------------------------------
$options = array( "useragent" => "cURL/PHP" );
$this->curl->create($this->cfg->paypal_req_url);
$this->curl->http_header("Content-type", "application/x-www-form-urlencoded");
$this->curl->http_header("X-PAYPAL-SECURITY-USERID", $this->cfg->paypal_user_name);
$this->curl->http_header("X-PAYPAL-SECURITY-SIGNATURE", $this->cfg->paypal_signature);
$this->curl->http_header("X-PAYPAL-SECURITY-PASSWORD", $this->cfg->paypal_password);
$this->curl->http_header("X-PAYPAL-APPLICATION-ID", $this->cfg->paypal_app_id);
$this->curl->http_header("X-PAYPAL-REQUEST-DATA-FORMAT", "NV");
$this->curl->http_header("X-PAYPAL-RESPONSE-DATA-FORMAT", "XML");
$this->curl->post($contents, $options);
$response = $this->curl->execute();
For those stuck with PHP4 it might be useful answering the original question of getting it to work through proxy with fopen?
Cheers,
Alex
I am able to get access_token for multiple permissions like emails, contacts, docs, etc. using oAuth 2.0. I have access_token
I got contacts using the following code.
$url = 'https://www.google.com/m8/feeds/contacts/default/full?max- results='.$max_results.'&oauth_token='.$access_token;
$response_contacts= curl_get_file_contents($url);
Now i want to get users Emails using this access_token.
i used this url . but it gives 401 unauthorized Error
$url = 'https://mail.google.com/mail/feed/atom&oauth_token='.$access_token;
$response_emails= curl_get_file_contents($url);
please guide me how can i get emails using access_token.
I've seen references to the Gmail feed using oauth_token as a request parameter. However, once I used the OAuth Playground I discovered that you need to pass your OAuth information as an Authorization header, as you'll see below.
<?php
$now = time();
$consumer = ...; // your own value here
$secret = ...; // your own value here
$nonce = ...; // same value you've been using
$algo = "sha1";
$sigmeth = "HMAC-SHA1";
$av = "1.0";
$scope = "https://mail.google.com/mail/feed/atom";
$path = $scope;
$auth = ...; // an object containing outputs of OAuthGetAccessToken
$args = "oauth_consumer_key=" . urlencode($consumer) .
"&oauth_nonce=" . urlencode($nonce) .
"&oauth_signature_method=" . urlencode($sigmeth) .
"&oauth_timestamp=" . urlencode($now) .
"&oauth_token=" . urlencode($auth->oauth_token) .
"&oauth_version=" . urlencode($av);
$base = "GET&" . urlencode($path) . "&" . urlencode($args);
$sig = base64_encode(hash_hmac($algo, $base,
"{$secret}&{$auth->oauth_token_secret}", true));
$url = $path . "?oauth_signature=" . urlencode($sig) . "&" . $args;
// Create a stream
$opts = array(
"http" => array(
"method" => "GET",
"header" => "Authorization: OAuth " .
"oauth_version=\"{$av}\", " .
"oauth_nonce=\"{$nonce}\", " .
"oauth_timestamp=\"{$now}\", " .
"oauth_consumer_key=\"{$consumer}\", " .
"oauth_token=\"{$auth->oauth_token}\", " .
"oauth_signature_method=\"{$sigmeth}\", " .
"oauth_signature=\"{$sig}\"\r\n"
)
);
$context = stream_context_create($opts);
$out = file_get_contents($path, false, $context);
?>