Checking in to foursquare is more likely the same as posting a shout out, tweet or status in social network like facebook and twitter.
Foursquare follows authentication via OAuth and this post will teach you how to do it via back-end using PERL and PHP.
I assume you already read my post on how to
Login to foursquare via back-end in PERL. You should be able to understand it first to proceed with authentication and do the check-in in users behalf.
Just follow the simple steps for your implementation.
1. You must have a Client ID and the Callback URL. If you don't have yet, create one by going to foursquare developers link -
http://developer.foursquare.com/
2. To register a new consumer, click the "Manage OAuthConsumers"
link or go to OAuth page -
https://foursquare.com/oauth/
3. Enter your Application Name, Application Website, and Callback URL. Please take note that your Callback URL will be your Redirect URI.
4. After successful registration, Client ID and Client Secret will be generated.
5. What we need from now is the Client ID and once we have it, we can now start the coding part.
6. First thing we have to do is to login to users account via back-end. Please see post -
Login to foursquare via back-end in PERL
7. After successful login, next step is to authenticate your application. To authenticate your app, you should pass a Client ID and your Callback URL that was registered from Consumer Registration.
$client_id = '<your client id>';
$redirect_uri = '<your callback url>';
$response = $lwpua->get("https://foursquare.com/oauth2/authenticate?client_id=$client_id&response_type=code&display=touch&redirect_uri=$redirect_uri", @header);
$form_data = $response->content;
$form_data =~ s/\n//g;
8. If this is the first time you authenticate your app, return page will be asking users permission to "Allow" the application to access account details and transact in users behalf. We can do this in back-end by implementing REGEX to get the NAME parameter of the value="Allow", then passed it on to authentication URL - https://foursquare.com/oauth2/authenticate.
$form_data =~ /form method="post" action="(.*?)"(.*?)input value="Allow" type="submit" name="(.*?)" class="input_button"/ig;
$form_action = $1;
$form_allow = $3;
$response = $lwpua->get("https://foursquare.com/oauth2/authenticate?$form_allow=Allow", @header);
$form_data = $response->content;
9. After allowing the application, foursquare will redirect the user to redirect URI that we set on step #7. Your callback URL or redirect URI must capture the CODE parameter and exchange it with TOKEN. This can now be done via PHP.
10. Foursquare will pass the CODE parameter via GET method on our Callback URL. Our Callback URL should be able to capture it and use it in exchange of an access token. To get an access token, we should pass the CODE parameter, Client ID, Client Secret, Callback URL, and Grant Type to the access token URL - https://foursquare.com/oauth2/access_token. Client ID, Client Secret, and Callback URL are data from the consumer registration, and the Grant Type should be equal to "authorization_code". Please take note that this is now on PHP.
$client_id = '<your client id>';
$client_secret = '<your client secret>';
$redirect_uri = '<your callback url>';
$grant_type = 'authorization_code';
$code = $_GET['code'];
$oauthurl = "https://foursquare.com/oauth2/access_token?client_id=$client_id&client_secret=$client_secret&grant_type=$grant_type&redirect_uri=$redirect_uri&code=$code";
11. As per implementation below, I use the open stream to get the contents and convert it to JSON which will then return an object with an access token.
$url_handler = fopen("$oauthurl", 'r');
$json = json_decode(stream_get_contents($url_handler));
fclose($url_handler);
$token = $json->access_token;
13. Now that you have the Token, we are now ready to do the Foursquare Check-in. Going back to PERL, what we need to do here is to do a POST request to Foursquare API URL - https://api.foursquare.com/v2/checkins/add. venueId will be the place or location you want to check-in, shout is optional if you want your post to have a custom message, broadcast can be of public or private, and lastly the oauth_token which is the access token we get from step #12. Again, this is now in PERL.
$intVenueID = "<the venue id you want to check-in>";
$strShout = "<your shout message>";
$strToken = "<your access token>";
$response = $lwpua->post("https://api.foursquare.com/v2/checkins/add",
['venueId' => $intVenueID,
'shout' => $strShout,
'oauth_token' => $strToken,
'broadcast' => 'public,faceboook,twitter'], @header);
print $response->content;
That's it!! Hope you were able to follow. In case you don't, you can refer to the scripts below. Good luck and enjoy!!
- Here's the PERL script, it composes of 2 sub functions: check_foursquare_login() and post_foursquare_checkin()
#!/usr/bin/perl
require LWP::UserAgent;
use strict;
use warnings;
use HTTP::Cookies;
my $lwpua = LWP::UserAgent->new;
my $user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6";
my @header = ('Referer' => 'https://foursquare.com',
'User-Agent' => $user_agent);
my $cookie_file = "cookies.dat";
my $cookie_jar = HTTP::Cookies->new(
file => $cookie_file,
autosave => 1,
ignore_discard => 1);
$lwpua->cookie_jar($cookie_jar);
my $strUser = "<your foursquare username>";
my $strPass = "<your foursquare password>";
my $client_id = "15NGPG2GHI3S1UFMST01FOO0ABPXNFFTGJVTVSZS55W1UN4A";
my $redirect_uri = "http://localhost/foursquare/foursquare.php";
my $status = "testing foursquare status";
my $form_data = &check_foursquare_login($strUser, $strPass, $client_id, $redirect_uri);
if ($form_data =~ /^OK\|/)
{
my ($strTag, $intUserID, $strToken) = split /\|/, $form_data, 3;
&post_foursquare_checkin($intUserID, $strToken, '', $status);
unlink($cookie_file);
print "done!";
}
else
{
$form_data =~ /form method="post" action="(.*?)"(.*?)input value="Allow" type="submit" name="(.*?)" class="input_button"/ig;
my $form_action = $1;
my $form_allow = $3;
my $response = $lwpua->get("https://foursquare.com/oauth2/authenticate?$form_allow=Allow", @header);
$form_data = $response->content;
if ($form_data =~ /^OK\|/)
{
my ($strTag, $intUserID, $strToken) = split /\|/, $form_data, 3;
&post_foursquare_checkin($intUserID, $strToken, '', $status);
unlink($cookie_file);
print "done!";
}
else
{
unlink($cookie_file);
print "error authentication!";
}
}
sub check_foursquare_login
{
my ($strUser, $strPass, $client_id, $redirect_uri) = @_;
# log-in to foursquare
my $response = $lwpua->post('https://foursquare.com/mobile/login',
['username' => $strUser,
'password' => $strPass], @header);
$cookie_jar->extract_cookies( $response );
$cookie_jar->save;
$response = $lwpua->get("https://foursquare.com/oauth2/authenticate?client_id=$client_id&response_type=code&display=wap&redirect_uri=$redirect_uri", @header);
$form_data = $response->content;
$form_data =~ s/\n//g;
return $form_data;
}
sub post_foursquare_checkin
{
my ($strUserID, $strToken, $intVenueID, $strShout) = @_;
my ($response);
$response = $lwpua->post("https://api.foursquare.com/v2/checkins/add",
['venueId' => $intVenueID,
'shout' => $strShout,
'oauth_token' => $strToken,
'broadcast' => 'public,faceboook,twitter'], @header);
return $response->content;
}
1;
- Here's the PHP script. Save this in your web server and set this as your callback URL in consumer registration.
<?
$client_id = "15NGPG2GHI3S1UFMST01FOO0ABPXNFFTGJVTVSZS55W1UN4A"; // hotshots client id
$client_secret = "NEHCL3UL0KS1QJD22NLIQ5RMR4BL4IUZIJZW25VHSJ4JPZKB";
$grant_type = "authorization_code";
$redirect_uri = "http://localhost/foursquare/foursquare.php";
$code = $_GET['code'];
if ($code) {
// get access token
$oauthurl = "https://foursquare.com/oauth2/access_token?client_id=$client_id&client_secret=$client_secret&grant_type=$grant_type&redirect_uri=$redirect_uri&code=$code";
$url_handler = fopen("$oauthurl", 'r');
$json = json_decode(stream_get_contents($url_handler));
fclose($url_handler);
$token = $json->access_token;
if ($token) {
$info_contents = `curl https://api.foursquare.com/v2/users/self?oauth_token=$token`;
$json = json_decode($info_contents);
$userid = $json->response->user->id;
echo "OK|$userid|$token";
}
}
?>