Google Reader Subscriptions With OAuth2 - php

I'm trying to get my subscription list through OAuth2 from Google Reader.
I'm using Codeigniter and a library - CI_OPAUTH. I can get the permissions scren with no problems and give Google Reader permissions. The problem is when i get the callback header after authentication is done it give me an 403 Forbidden header.
Here are my options for the library:
$config['opauth_config'] = array(
'path' => '/mixordia/index.php/oauth/login/', //example: /ci_opauth/auth/login/
'callback_url' => '/mixordia/index.php/oauth/authenticate/', //example: /ci_opauth/auth/authenticate/
'callback_transport' => 'get', //Codeigniter don't use native session
'security_salt' => 'mixordias_salt_whwhwh_wayacross',
'debug' => true,
'Strategy' => array(
'Google' => array(
'client_id' => 'MY_ID',
'client_secret' => 'MY_SECRET',
'service' => 'reader',
'source' => 'APP Name',
'scope' => 'http://www.google.com/reader/api'
)
)
);
Here is what i get:
Array
(
[error] => Array
(
[provider] => Google
[code] => userinfo_error
[message] => Failed when attempting to query for user information
[raw] => Array
(
[response] => 0
[headers] => HTTP/1.0 403 Forbidden
WWW-Authenticate: Bearer realm="https://www.google.com/accounts/AuthSubRequest", error=insufficient_scope, scope="https://www.googleapis.com/auth/userinfo.id h ttps://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/plus.login https://www.google.com/accounts/OAuthLogin"
Content-Type: application/json; charset=UTF-8
Date: Thu, 13 Jun 2013 12:26:25 GMT
Expires: Thu, 13 Jun 2013 12:26:25 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
)
)
[timestamp] => 2013-06-13T12:26:25+00:00
)
I've stuck in this for 2 days and I don't know what I'm doing wrong in the request with the library. can you help me?

The library tries to get user's profile, which requires userinfo.profile scope (https://www.googleapis.com/auth/userinfo.profile). Add that scope to your config and it should work.

Related

Getting 405 error while running POST create session of RapidAPI Skyscanner flight search in PHP

I am trying to get location header from the response on POST create session, but getting 405 error. All other response I am getting except for the location header.
require_once 'vendor/autoload.php';
require_once 'vendor/mashape/unirest-php/src/Unirest.php';
$response = Unirest\Request::post("https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/pricing/v1.0",
array(
"X-RapidAPI-Host" => "skyscanner-skyscanner-flight-search-v1.p.rapidapi.com",
"X-RapidAPI-Key" => "d0f49284f7mshba8a904a96cf3acp19aa44jsnb4056f027c69",
"Content-Type" => "application/x-www-form-urlencoded"
),
array(
"inboundDate" => "2019-04-25",
"cabinClass" => "business",
"children" => 0,
"infants" => 0,
"country" => "IN",
"currency" => "INR",
"locale" => "en-US",
"originPlace" => "BLR-sky",
"destinationPlace" => "DEL-sky",
"outboundDate" => "2019-04-26",
"adults" => 1
)
);
print_r($response);
I expect this type of response:
"cache-control": "private"
"content-type": "application/json"
"date": "Wed, 24 Apr 2019 05:01:39 GMT"
"location": "http://partners.api.skyscanner.net/apiservices/pricing/hk1/v1.0/42ba47f0-314c-41fa-987d-fb8c5862309b"
"server": "RapidAPI-1.0.15"
"x-rapidapi-region": "AWS - ap-southeast-1"
"x-rapidapi-version": "1.0.15"
"content-length": "2"
"connection": "Close"
But, actual output is:
Unirest\Response Object ( [code] => 405 [raw_body] => {} [body] => stdClass Object ( ) [headers] => Array ( [0] => HTTP/1.1 405 Method
Not Allowed [Cache-Control] => private [Content-Type] =>
application/json [Date] => Wed, 24 Apr 2019 04:34:14 GMT [Server] =>
RapidAPI-1.0.15 [X-RapidAPI-Region] => AWS - ap-southeast-1
[X-RapidAPI-Version] => 1.0.15 [Content-Length] => 2 [Connection] =>
keep-alive ) )
I'm assuming you're using Skyscanner Flight Search API on RapidAPI Hub. Interestingly enough, I can't see any POST request supported by this API.
This can be the reason, 405 Method Not Allowed means that the HTTP method is simply not supported. For example, a client might do a POST request on a resource where POST is not implemented or it's meaningless.

How to check if remote image can be shown?

Images from an remote server sometimes won't show on my site. They are broken. And getting 403 (Forbidden) when checking in console.
So I wanna find out a way to pre-check if they are forbidden and then not show them, instead of a broken image.
So, my thought was to check http status with get_headers(). But it shows 200 OK even for the broken images.
And then I found this solution after a google search, to use before get_headers():
$default_opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Referer: http://www.fakesite.com/hotlink-check/",
)
);
stream_context_set_default($default_opts);
But that doesn't work either. I have also tried file_get_contents() but that gave result for both non-broken and broken images.
So, how to check if a remote file has an 403 error?
EDIT:
Okay so, here are recent tests I've tried with:
$image = 'http://www.arabnews.com/sites/default/files/2018/02/28/1114386-582723106.jpg';
Test 1:
<?php
$default_opts = array(
'http' => array(
'method' => "GET",
'header' => "Referer: http://www.fakesite.com/hotlink-check/",
'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
)
);
stream_context_set_default($default_opts);
$output = #get_headers($image, 1);
echo '<pre>'.print_r($output, true).'</pre>';
?>
Output:
Array
(
[0] => HTTP/1.1 200 OK
[Date] => Wed, 28 Feb 2018 14:50:39 GMT
[Content-Type] => image/jpeg
[Content-Length] => 43896
[Connection] => close
[Set-Cookie] => __cfduid=d2a28d117e8a32d5755219bcd6e1892561519829439; expires=Thu, 28-Feb-19 14:50:39 GMT; path=/; domain=.arabnews.com; HttpOnly
[X-Content-Type-Options] => nosniff
[Last-Modified] => Tue, 27 Feb 2018 22:55:30 GMT
[Cache-Control] => public, max-age=1209600
[Expires] => Wed, 14 Mar 2018 14:50:39 GMT
[X-Request-ID] => v-e065c0be-1c11-11e8-9caa-22000a6508a2
[X-AH-Environment] => prod
[X-Varnish] => 175579289 178981578
[Via] => 1.1 varnish-v4
[X-Cache] => HIT
[X-Cache-Hits] => 8
[CF-Cache-Status] => HIT
[Accept-Ranges] => bytes
[Server] => cloudflare
[CF-RAY] => 3f44328fd0247179-ORD
)
Test 2:
<?php
function get_response_code($url) {
#file_get_contents($url);
list($version, $status, $text) = explode(' ', $http_response_header[0], 3);
return $status;
}
$output = get_response_code($image);
echo '<pre>'.print_r($output, true).'</pre>';
?>
Output:
200
Test 3:
<?php
$output = getimagesize($image);
echo '<pre>'.print_r($output, true).'</pre>';
?>
Output:
Array
(
[0] => 650
[1] => 395
[2] => 2
[3] => width="650" height="395"
[bits] => 8
[channels] => 3
[mime] => image/jpeg
)
Check the image size. This is the easiest and most effective solution:
list($width, $height, $type, $attr) = getimagesize("www.url.com/img.jpg");
If especially the first two; $width and $height are set, and $type is a valid value you are good to go.
And I would display them in this case.

"Invalid State" after Vimeo API delete

Hopefully someone can help.. I'm using jQuery dropzone.js to upload the video and I can upload videos fine, but I can't "complete" the process so the videos always remain in a processing/uploading state. I'm performing the correct procedures according to the Vimeo API docs. Here are some headers/responses if they help, I've replaced some values with xxxx:
Upload request headers:
PUT /upload?ticket_id=xxxx&video_file_id=514311645&signature=acd2a6c4ba8c147651604793b081e053&v6=1 HTTP/1.1
Host: 1511923755.cloud.vimeo.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0 FirePHP/0.7.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: video/mp4
Referer: http://local.xxxx.co.uk/vimeo
Content-Length: 29158540
Origin: http://local.xxxx.co.uk
x-insight: activate
Connection: keep-alive
Upload Response headers:
HTTP/1.1 200 OK
Server: Vimeo/1.0
Content-Type: text/plain
Access-Control-Allow-Origin: *
Timing-Allow-Origin: *
Access-Control-Expose-Headers: Range
Access-Control-Allow-Headers: Content-Type, Content-Range, X-Requested-With
X-Requested-With: XMLHttpRequest
Access-Control-Allow-Methods: POST, PUT, GET, OPTIONS
Content-Length: 0
Connection: close
Date: Thu, 14 Apr 2016 08:05:19 GMT
X-Backend-Server: kopiluwak
Upload response:
<pre>Array
(
[body] =>
[status] => 308
[headers] => Array
(
[] =>
[HTTP/1.1 308 Resume Incomplete] =>
[Server] => Vimeo/1.0
[Content-Type] => text/plain
[Access-Control-Allow-Origin] => *
[Timing-Allow-Origin] => *
[Access-Control-Expose-Headers] => Range
[Access-Control-Allow-Headers] => Content-Type, Content-Range, X-Requested-With
[X-Requested-With] => XMLHttpRequest
[Access-Control-Allow-Methods] => POST, PUT, GET, OPTIONS
[Content-Length] => 0
[Connection] => close
[Range] => bytes=0-29158540
[Date] => Thu, 14 Apr 2016 08
[X-Backend-Server] => kopiluwak
)
)
</pre>
CURL DELETE:
<pre>Array
(
[47] => 1
[10036] => DELETE
[10015] =>
[10023] => Array
(
[0] => Accept: application/vnd.vimeo.*+json; version=3.2
[1] => User-Agent: vimeo.php 1.0; (http://developer.vimeo.com/api/docs)
[2] => Authorization: Bearer xxxx
)
)
</pre>
Response from DELETE:
<pre>Array
(
[body] => Array
(
[error] => Invalid state
)
[status] => 500
[headers] => Array
(
[Server] => nginx
[Content-Type] => application/vnd.vimeo.error+json
[Cache-Control] => no-cache, max-age=315360000
[Strict-Transport-Security] => max-age=15120000; includeSubDomains; preload
[Expires] => Sun, 12 Apr 2026 08
[Accept-Ranges] => bytes
[Via] => 1.1 varnish
[Fastly-Debug-Digest] => 771e16bfeec90f734db73b1b0ee67af1dae1f86d0e6c56d4585eb9958a1684b7
[Content-Length] => 25
[Date] => Thu, 14 Apr 2016 08
[Connection] => keep-alive
[X-Served-By] => cache-iad2138-IAD, cache-lcy1126-LCY
[X-Cache] => MISS, MISS
[X-Cache-Hits] => 0, 0
[X-Timer] => S1460621123.195320,VS0,VE593
[Vary] => Accept,Vimeo-Client-Id,Accept-Encoding
)
)
</pre>
I just replied to the same issue over on the Vimeo forum, and another SO thread I read - I had the same issue and am simply posting it here as there didn't seem to be a solution on this particular thread.
Also, regarding your post - there's not a lot of information provided in your post. Your delete request is not all that's required - the assumption would be that you created a valid ticket request, uploaded properly, THEN tried the del request you posted.
Your response is similar to mine below - if your upload script tried to get a ticket AFTER you already got one on your backend, this issue would popup as it did in my code.
Vimeo post:
https://vimeo.com/forums/api/topic:278394
My solution:
I solved my version of the issue - I think Vimeo corrected some stuff on their API recently because my code did not have a bug and then suddenly one appeared recently. I would bet they added rate limiting on their API gateway or potentially overwriting existing requests to clean up old requests...
Anyhow, here is my fix:
In order to complete a video upload via "Resumable HTTP PUT uploads" (developer.vimeo.com/api/upload/videos), there are 5 steps.
I do everything but the upload through my PHP backend. I was requesting a ticket through PHP as to not expose some secret info through my modified JS frontend (github.com/websemantics/vimeo-upload) but I had not edited out the ticket request properly through the JS code, so the current bug was probably being triggered on that second invalid request (i.e. overwriting or rate limiting my initial valid request through PHP). Once I bypassed the JS "upload" function properly and jumped right to JS "sendFile_", the upload works properly again.
Hope that helps somebody out there!

Cannot find image name and extension from encode url

I have a question would like to ask you, it was about php. My problem when I tried to use php function to extend image extension from an url which has form below :
http://lh3.googleusercontent.com/i_qpu5lXHddZgNaEbzEEz1CaArLCHEmVNuhwVOuDUl0aIyZHuez3s4Uf878y1n9CqB5rld2a7GSAoWzoMgrC
so , for above url is made by Google which is not show use the file name and extesion name. of course I have try to use this below function but still not work :
$image_name = basename($url);
could anyone help me.
If you are downloading the image, you can get the extension using finfo_file().
Else you can look for the content type in the headers sent by the server using get_headers()
example code
<?php
$url = 'http://lh3.googleusercontent.com/i_qpu5lXHddZgNaEbzEEz1CaArLCHEmVNuhwVOuDUl0aIyZHuez3s4Uf878y1n9CqB5rld2a7GSAoWzoMgrC';
print_r(get_headers($url));
?>
sample output
Array
(
[0] => HTTP/1.1 200 OK
[1] => Access-Control-Allow-Origin: *
[2] => ETag: "v1"
[3] => Expires: Wed, 22 Apr 2015 09:10:30 GMT
[4] => Cache-Control: public, max-age=86400, no-transform
[5] => Content-Disposition: inline;filename="unnamed.png"
[6] => Content-Type: image/png
[7] => Date: Tue, 21 Apr 2015 09:10:30 GMT
[8] => Server: fife
[9] => Content-Length: 20365
[10] => X-XSS-Protection: 1; mode=block
[11] => Alternate-Protocol: 80:quic,p=1
)

Infusionsoft API not returning orders by date

I am trying to integrate the Infusionsoft API and I am having some issues in retrieving orders. I need to get all the orders from yesterday and so far this is what I have done.
require_once("src/isdk.php");
$app = new iSDK;
if ($app->cfgCon("connectionName")) {
echo "connected<br/>";
echo "app connected<br/>";
$qry = array('DateCreated' => $app->infuDate('10/30/2014'));
$rets = array('Id', 'JobTitle', 'ContactId', 'StartDate', 'DueDate', 'JobNotes', 'ProductId', 'JobRecurringId', 'JobStatus', 'DateCreated', 'OrderType', 'OrderStatus', 'ShipFirstName', 'ShipMiddleName', 'ShipLastName', 'ShipCompany', 'ShipPhone', 'ShipStreet1', 'ShipStreet2', 'ShipCity', 'ShipState', 'ShipZip', 'ShipCountry');
$cards = $app->dsQueryOrderBy("Job", 100, 0, $qry, $rets, 'DateCreated', false);
echo "<pre>";
print_r($cards);
echo "</pre>";
} else {
echo "Connection Failed";
}
The connection and everything works fine and I am able retrieve orders using other fields like Id. But for some reason searching through date doesn't work. I am not getting any errors below is the response which I get.
xmlrpcresp Object
(
[val] => yes
[valtyp] => phpvals
[errno] => 0
[errstr] =>
[payload] =>
[hdrs] => Array
(
[server] => Apache-Coyote/1.1
[pragma] => no-cache
[cache-control] => no-cache, no-store
[expires] => Sat, 01 Nov 2014 00:19:59 GMT
[content-type] => text/xml;charset=UTF-8
[content-length] => 121
[date] => Fri, 31 Oct 2014 12:19:59 GMT
[set-cookie] => app-lb=3238199306.20480.0000; path=/
)
[_cookies] => Array
(
[app-lb] => Array
(
[value] => 3238199306.20480.0000
[path] => /
)
)
[content_type] => text/xml
[raw_data] => HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: no-cache
Cache-Control: no-cache, no-store
Expires: Sat, 01 Nov 2014 00:19:59 GMT
Content-Type: text/xml;charset=UTF-8
Content-Length: 121
Date: Fri, 31 Oct 2014 12:19:59 GMT
Set-Cookie: app-lb=3238199306.20480.0000; path=/
<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value>yes</value></param></params></methodResponse>
)
And the format of the date is below.
20141030T00:00:00
Can anyone please help me with this?
I have also gone through similar questions and haven't found a solution.
Thanks in advance for help.
For those who run into the same problem below is the solution.
Querying for date using the code below solve the problem for me.
$qry = array('DateCreated' => '2014-10-30%');

Categories