1

I'm completely new to cURL and API's, but i'm attempting to build an application that uses GitHubs Code Search API.

in my XAMPP Shell, I can execute the below string with no problems

curl -u myuser https://api.github.com/search/code?q=XXX+language:XXX?access_token=XXX

Now, as i'm trying to use cURL in PHP i run into some problems, my code below:

$url = 'https://api.github.com/search/code?q=' . $term . 'language:' . $lang . 'stars:' . $stars . '?access_token=' . $token;
$cInit = curl_init();
curl_setopt($cInit, CURLOPT_URL, $url);
curl_setopt($cInit, CURLOPT_RETURNTRANSFER, 1); // 1 = TRUE
curl_setopt($cInit, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($cInit, CURLOPT_USERPWD, $user . ':' . $pwd);

$output = curl_exec($cInit);
$info = curl_getinfo($cInit, CURLINFO_HTTP_CODE);
$result = json_decode($output);

curl_close($cInit);

When i var_dump($result); The page greets me with a null value I checked the HTTP_CODE with the below code:

$info = curl_getinfo($cInit, CURLINFO_HTTP_CODE);
var_dump($info);

Which then tells me int(403) which is 403 Forbidden which relates to something authentication related. What exactly am i doing wrong in this situation?

1 Answer 1

3

Some little debugging would’ve pointed it out.

If you don't send a user agent then you will get a 403 error, outputting $output yields:

Request forbidden by administrative rules. Please make sure your request has a User-Agent header (http://developer.github.com/v3/#user-agent-required). Check https://developer.github.com for other possible causes.

A quick look at the docs your also sending access_token which is not required, as your using auth basic.

Ive changed the url and the following works fine:

<?php
$user = 'Your Github Username';
$pwd = 'Your Github Password';

$url = 'https://api.github.com/search/code?q=addClass+in:file+language:js+repo:jquery/jquery';
$cInit = curl_init();
curl_setopt($cInit, CURLOPT_URL, $url);
curl_setopt($cInit, CURLOPT_RETURNTRANSFER, 1); // 1 = TRUE
curl_setopt($cInit, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($cInit, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($cInit, CURLOPT_USERPWD, $user . ':' . $pwd);

$output = curl_exec($cInit);

$info = curl_getinfo($cInit, CURLINFO_HTTP_CODE);
$result = json_decode($output);

curl_close($cInit);

echo '<pre>'.print_r($result, true).'</pre>';

Result:

stdClass Object
(
    [total_count] => 8
    [incomplete_results] => 
    [items] => Array
        (
            [0] => stdClass Object
                (
                    [name] => classes.js
                    [path] => src/attributes/classes.js
                    [sha] => 0c90a8dffdb95ec4678f18e07623f9d111c32540
                    [url] => https://api.github.com/repositories/167174/contents/src/attributes/classes.js?ref=3d732cca6b5076a9d13eee98e2b075b37384cd91
                    [git_url] => https://api.github.com/repositories/167174/git/blobs/0c90a8dffdb95ec4678f18e07623f9d111c32540
                    [html_url] => https://github.com/jquery/jquery/blob/3d732cca6b5076a9d13eee98e2b075b37384cd91/src/attributes/classes.js
                    [repository] => stdClass Object
                        (
                            [id] => 167174
                            [name] => jquery
                            [full_name] => jquery/jquery
                            [owner] => stdClass Object
                                (
                                    [login] => jquery
                                    [id] => 70142
                                    [avatar_url] => https://avatars1.githubusercontent.com/u/70142?v=4
                                    [gravatar_id] => 
                                    [url] => https://api.github.com/users/jquery
                                    [html_url] => https://github.com/jquery
                                    [followers_url] => https://api.github.com/users/jquery/followers
                                    [following_url] => https://api.github.com/users/jquery/following{/other_user}
                                    [gists_url] => https://api.github.com/users/jquery/gists{/gist_id}
                                    [starred_url] => https://api.github.com/users/jquery/starred{/owner}{/repo}
                                    [subscriptions_url] => https://api.github.com/users/jquery/subscriptions
                                    [organizations_url] => https://api.github.com/users/jquery/orgs
                                    [repos_url] => https://api.github.com/users/jquery/repos
                                    [events_url] => https://api.github.com/users/jquery/events{/privacy}
                                    [received_events_url] => https://api.github.com/users/jquery/received_events
                                    [type] => Organization
                                    [site_admin] => 
                                )

                            [private] => 
                            [html_url] => https://github.com/jquery/jquery
                            [description] => jQuery JavaScript Library
                            [fork] => 
                            [url] => https://api.github.com/repos/jquery/jquery
                            [forks_url] => https://api.github.com/repos/jquery/jquery/forks
                            [keys_url] => https://api.github.com/repos/jquery/jquery/keys{/key_id}
                            [collaborators_url] => https://api.github.com/repos/jquery/jquery/collaborators{/collaborator}
                            [teams_url] => https://api.github.com/repos/jquery/jquery/teams
                            [hooks_url] => https://api.github.com/repos/jquery/jquery/hooks
                            [issue_events_url] => https://api.github.com/repos/jquery/jquery/issues/events{/number}
                            [events_url] => https://api.github.com/repos/jquery/jquery/events
                            [assignees_url] => https://api.github.com/repos/jquery/jquery/assignees{/user}
                            [branches_url] => https://api.github.com/repos/jquery/jquery/branches{/branch}
                            [tags_url] => https://api.github.com/repos/jquery/jquery/tags
                            [blobs_url] => https://api.github.com/repos/jquery/jquery/git/blobs{/sha}
                            [git_tags_url] => https://api.github.com/repos/jquery/jquery/git/tags{/sha}
                            [git_refs_url] => https://api.github.com/repos/jquery/jquery/git/refs{/sha}
                            [trees_url] => https://api.github.com/repos/jquery/jquery/git/trees{/sha}
                            [statuses_url] => https://api.github.com/repos/jquery/jquery/statuses/{sha}
                            [languages_url] => https://api.github.com/repos/jquery/jquery/languages
                            [stargazers_url] => https://api.github.com/repos/jquery/jquery/stargazers
                            [contributors_url] => https://api.github.com/repos/jquery/jquery/contributors
                            [subscribers_url] => https://api.github.com/repos/jquery/jquery/subscribers
                            [subscription_url] => https://api.github.com/repos/jquery/jquery/subscription
                            [commits_url] => https://api.github.com/repos/jquery/jquery/commits{/sha}
                            [git_commits_url] => https://api.github.com/repos/jquery/jquery/git/commits{/sha}
                            [comments_url] => https://api.github.com/repos/jquery/jquery/comments{/number}
                            [issue_comment_url] => https://api.github.com/repos/jquery/jquery/issues/comments{/number}
                            [contents_url] => https://api.github.com/repos/jquery/jquery/contents/{+path}
                            [compare_url] => https://api.github.com/repos/jquery/jquery/compare/{base}...{head}
                            [merges_url] => https://api.github.com/repos/jquery/jquery/merges
                            [archive_url] => https://api.github.com/repos/jquery/jquery/{archive_format}{/ref}
                            [downloads_url] => https://api.github.com/repos/jquery/jquery/downloads
                            [issues_url] => https://api.github.com/repos/jquery/jquery/issues{/number}
                            [pulls_url] => https://api.github.com/repos/jquery/jquery/pulls{/number}
                            [milestones_url] => https://api.github.com/repos/jquery/jquery/milestones{/number}
                            [notifications_url] => https://api.github.com/repos/jquery/jquery/notifications{?since,all,participating}
                            [labels_url] => https://api.github.com/repos/jquery/jquery/labels{/name}
                            [releases_url] => https://api.github.com/repos/jquery/jquery/releases{/id}
                            [deployments_url] => https://api.github.com/repos/jquery/jquery/deployments
                        )

                    [score] => 0.5187095
                )
//.. snip
Sign up to request clarification or add additional context in comments.

3 Comments

All i was missing was useragent? Wow. Guess i have more reading to do.
Using cURL on the command line will use a default valid User Agent. PHP has its own value, which may/may not be set depending on your hosting setup. Easy to miss. Also, you were trying to json_decode a non-JSON value, hence the null result and why you missed the error message.
No its all good, it doesn't say it specifically on the docs, but off somewhere else, easily missed. When a response don't json_decode dump it to screen, though you would think the response would of been in json, not plaintext lol

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.