(PHP) file_get_contents with a Authorization Header - php

How do I use file_get_contents to send a authorization header
I currently have file_get_contents get it with a user agent but I also would like to add a authorization header so I get a functional response instead of a 401 error
$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15\r\n"
)
);
$context = stream_context_create($options);
$url = file_get_contents("http://websitethatneedsaauthorizationheader.com", false, $context);
I basically need to copy the authorization header from here:
and then use that on this website and not get a 401 error
this is what it is supposed to look like with the authorization header

After the \n of the User-Agent header, add the autorization header, like this:
$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"User-Agent: SomeUser\r\nAuthorization: SomeKey"
)
);

Related

Set location in request- php

I am running an application which fetches data from amazon.ae. I use the code below.
<?php
$link = 'https://www.amazon.ae/Huawei-P20-Pro-Dual-SIM/dp/B07MMQRNYT/ref=sr_1_3?keywords=huawei&qid=1557457063&s=electronics&sr=1-3';
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n" .
"User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36\r\n"
// 'ignore_errors' => true
)
);
$context = stream_context_create($opts);
$html = file_get_contents($link, false, $context);
echo $html;
?>
My server is located in the USA. So the application opens the page as if it is browsing from the USA. This code displays the Amazon.ae page as below
The problem is - this is not how the page is displayed if a user opens the same URL from UAE. The page is displayed as below if opened from UAE.
You can see the 'price' and 'sold by' is different for both locations.
What I want to do is to fetch the page as if my application is running from UAE.
How do I make my application run the code from UAE instead of US.
Thanks in advance

file_get_contents doesn't work with some links

I'm trying to take the content of a site by file_get_contents(), but it doesn't work. I already tried to follow these codes here, but it doesn't work.
This is the code I have:
$url = "https://www.cb01.uno/";
$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n" . // check function.stream-context-create on php.net
"User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad
)
);
$context = stream_context_create($options);
echo $file = file_get_contents($url, false, $context);
It returns nothing. I tried with other site like https://www.w3schools.com and it works, so the problem isn't the HTTPS
EDIT: I tried this solution HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable and now it display:
Not Found
The requested URL /cdn-cgi/l/chk_jschl was not found on this server.

Error "HTTP code 405 Method not allowed" when using CURL for a GET request

I want to fetch response of a GET request by CURL, but get the Error "HTTP/1.1 405 Method Not Allowed" and no content is returned (except the header).
The following is my code.
$url = "http://api.example.com/Q5PLCmwYzho=/7avEU7ptYyummfheg9!0KA==?aqPI=93566&aqIIO=false&aqIP=false&aqSK=0&aqTK=14&aqSO=date&aqCI=0"
$options = array(
CURLOPT_URL => $url,
CURLOPT_HTTPGET => true, //set request type post or get
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => true,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36',
CURLOPT_HTTPHEADER => array(
'Accept: application/json, text/javascript, */*; q=0.01',
'Accept-Encoding: gzip, deflate, sdch',
//'Content-Type: application/json; charset=utf-8',
//'Access-Control-Allow-Origin: http://localhost:14189',
//'Origin: http://www.example.com',
//'Host: api.example.com',
//'Access-Control-Allow-Credentials: true',
),
CURLOPT_COOKIE => 'Cookie:scarab.profile=%2293566%7C1465411024%22; scarab.mayAdd=%5B%7B%22i%22%3A%2293566%22%7D%2C%7B%22i%22%3A%22117313%22%7D%5D; _ceg.s=o8gwtw; _ceg.u=o8gwtw; _gat=1; _dc_gtm_UA-13212406-1=1; DK-Client=CWUU,09b6ab76-f662-48b3-a1e6-f08779519236; __auc=764bbe2e155314db7ac1a950571; scarab.visitor=%22566B1DCD74FCD3A5%22; _ga=GA1.2.412464545.1465411024'
);
$ch = curl_init();
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err; //no error!
$header['errmsg'] = $errmsg;
$header['content'] = json_decode($content); // no content!
echo $response['http_code']; //output: 405
I checked the corresponding ajax request in the webpage and every curl options seems to be set correctly. The details (captured from chrome Dev tools) are shown in the image.
![1]: http://i.stack.imgur.com/XW8k1.png
What am I missing?? I searched a lot but couldn't solve the problem! I know one of the causes of this error is using an unauthorized request method for curl but the corresponding AJAX call uses GET method and get the result.
What is wrong? Any help would be appreciated.
Update: I wrote an AJAX request to fetch the data in local server (localhost) and got this error : "Cross-Origin Request Blocked". It means that I can't make request to a different domain (api.example.com) from localhost. Are there any workarounds or hack to get the response content from that server?
I was getting this error in Postman. In my case it was because I was using GET when I should have used POST. Also I was using GET params instead of POST params. Checking the proper method (specified in my java code) and using the "code" button in postman to display the curl CLI helped me.
Try to send User-Agent in your request.
If page that you requested needs any authorization then you need to send cookies with auth data.

file_get_contents not working with php file

Code:
$btc38="http://api.btc38.com/v1/depth.php?c=ltc&mk_type=btc";
$btc38_r=file_get_contents($btc38);
$btc38_a=json_decode($btc38_r,true);
I have used other webiste's API and they worked, the only one that didn't work is the above one.
all the websites that worked don't use a php files like the one above (depth.php), so maybe this is the issue.
So my question, is there any other way to parse that link into a multidimensional array?
Edit: var_dump is used just for debugging, my intention is to parse the link into an array.
Do not use the var_dump() that prints the output. And set some user agent. Without this, I've get back forbidden:
$url = "http://api.btc38.com/v1/depth.php?c=ltc&mk_type=btc";
$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"Content-type: application/json\r\n" . // check function.stream-context-create on php.net
"User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad
)
);
$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);
$btc38_a = json_decode($file, true);
var_dump($btc38_a);

how do I parse a mobile site with php file_get_content

Sorry if this is a duplicate question.
My target site redirects me to desktop site if the browser is not a mobile. I want to parse the mobile version of the site (http://mobile.mysite.com). I can't use Curl as my server is disabled for that.
what would be the useragent for mobile if it is possible at all ??!!
If you need to send custom headers like User-Agent with your file_get_contents request, the PHP answer to that are stream contexts:
$opts = array(
'http' => array(
'method' => "GET",
'header' => "Accept-language: en\r\n" .
"Cookie: foo=bar\r\n" .
"User-Agent: Foo Bar Baz\r\n"
)
);
$context = stream_context_create($opts);
file_get_contents($url, false, $context);
See stream_context_create and file_get_contents.
Pick a mobile User-Agent string and use it. They can easily be found from Google.
Here is some sample code that illustrates how to use them with file_get_contents():
<?php
// The first one I found on Google
$uaStr = 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91)';
// Create a stream context
// http://www.php.net/manual/en/context.http.php
$context = stream_context_create(array(
'http'=>array(
'user_agent' => $uaStr
)
));
// The URL
$url = "http://www.example.com/";
// Make the request
$result = file_get_contents($url, FALSE, $context);
try look this php libs:
PHP HttpClient
And if you want get mobile site, set the user agent to specific mobile browser
$userAgent = "NokiaC5-00/061.005 (SymbianOS/9.3; U; Series60/3.2 Mozilla/5.0; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525 3gpp-gba";
setUserAgent($userAgent);
To change your user agent within php without curl you may try this:
<?php
ini_set('user_agent', 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7');
$data = file_get_contents("http://www.mobile.example.com");
?>
PS: Got user agent of the iphone 4 from here !

Categories