Bläddra i källkod

Merged in mk200789/django-hackathon-starter (pull request #34)

started paypal api example + instagram stuff
David Leonard 10 år sedan
förälder
incheckning
7e957ee10b

+ 1 - 0
angular/addons/nav.html

@@ -4,6 +4,7 @@
       <li><a href="#/steamSales">Steam Sales <span class="icon"></span></a></li>
       <li><a href="#/githubUser">Github User <span class="icon"></span></a></li>
       <li><a href="#/githubTopContributions">Github Resume <span class="icon"></span></a></li>
+      <li><a href="#/instagramUser">Instagram User <span class="icon"></span></a></li>
       <li><a href="#">Dropdown</a>
         <ul class="list-unstyled">
             <li class="sub-nav"><a href="#">Sub Menu One <span class="icon"></span></a></li>

+ 1 - 0
angular/index.html

@@ -76,6 +76,7 @@
         <script src="scripts/factories/githubTopContributionsFactory.js"></script>
         <script src="scripts/factories/steamSalesFactory.js"></script>
         <script src="scripts/factories/instagramUserFactory.js"></script>
+        <script src="scripts/factories/instagramUserMediaFactory.js"></script>
 
     </head>
 

+ 43 - 0
angular/partials/instagramUser.partial.html

@@ -0,0 +1,43 @@
+<div class="jumbotron">
+  <div class="container">
+
+    <div class="row text-center"> 
+        <h1> Instagram User Data </h1>
+    </div>
+
+	    <div class="col-lg-12">
+	        <div class="table-responsive">
+	            <table class="table table-bordered table-hover table-striped tablesorter">
+	                <thead> 
+	                	<tr>
+	                		<th>Username</th>
+	                		<th>ID</th>
+	                		<th>Bio</th>
+	                		<th>Website</th>
+	                		<th>Profile Image</th>
+	                		<th>Full Name</th>
+	                		<th>Following</th>
+	                		<th>Followers</th>
+	                		<th>Total Media</th>
+	                	</tr>
+	                </thead>
+	                <tbody>
+	                	<tr data-ng-repeat="data in instagramUserData">
+	                		<td>{{data.username}}</td>
+	                		<td>{{data.id}}</td>
+	                		<td>{{data.bio}}</td>
+	                		<td>{{data.website}}</td>
+	                		<td><img src="{{data.profile_picture}}"></td>
+	                		<td>{{data.full_name}}</td>
+	                		<td>{{data.counts.follows}}</td>
+	                		<td>{{data.counts.followed_by}}</td>
+	                		<td>{{data.counts.media}}</td>
+	                	</tr>
+	                </tbody>
+	            </table>
+
+	        	<img data-ng-repeat= "i in instagramUserMediaData.data" src="{{i.images.thumbnail.url}}">
+	        </div>
+	    </div>	    
+	</div>
+</div>

+ 11 - 1
angular/scripts/app.js

@@ -40,5 +40,15 @@ var restApp = angular.module('restApp', [
             data: {
                 pageTitle: 'Top Contributions on Github'
             }
-        });
+        })
+
+        .state('instagramUser',{
+            url:'/instagramUser',
+            templateUrl: 'partials/instagramUser.partial.html',
+            controller: 'instagramUserController',
+            data : {
+                pageTitle: 'Instagram User Data'
+            }
+        });   
+
 });

+ 19 - 0
angular/scripts/controllers/instagramUserController.js

@@ -0,0 +1,19 @@
+'use strict';
+
+restApp.controller('instagramUserController', function($scope, instagramUserFactory, instagramUserMediaFactory){
+	$scope.instagramUserData = {};
+	$scope.instagramUserMediaData = {};
+
+	$scope.instagramUserData = instagramUserFactory.get().success(function(data){
+		$scope.instagramUserData = data;
+
+		console.log(data);
+	});
+	
+	$scope.instagramUserMediaData = instagramUserMediaFactory.get().success(function(data){
+		$scope.instagramUserMediaData = data;
+
+		console.log(data);
+	});
+
+})

+ 12 - 0
angular/scripts/factories/instagramUserFactory.js

@@ -0,0 +1,12 @@
+'use strict';
+
+restApp.factory('instagramUserFactory', function($http){
+	return {
+		get: function(){
+			return $http({
+				url: 'http://localhost:8000/hackathon/instagramUser/',
+				method: 'GET',
+			});
+		}
+	};
+});

+ 12 - 0
angular/scripts/factories/instagramUserMediaFactory.js

@@ -0,0 +1,12 @@
+'use strict';
+
+restApp.factory('instagramUserMediaFactory', function($http){
+	return {
+		get: function(){
+			return $http({
+				url: 'http://localhost:8000/hackathon/instagramUserMedia/',
+				method: 'GET',
+			});
+		}
+	};
+});

+ 69 - 3
hackathon_starter/hackathon/scripts/instagram.py

@@ -3,16 +3,24 @@
 instagram.py contains a handful of methods for interacting
 with Instagram data and returning the responses as JSON.
 '''
+
 import requests
 import urllib
 import urllib2
 import json
 import simplejson as json2
+import googlemaps
+from django.conf import settings
+from datetime import datetime
+from time import strftime
 
 authorization_url = 'https://api.instagram.com/oauth/authorize/?client_id='
 access_token_url = 'https://api.instagram.com/oauth/access_token'
 
 class InstagramOauthClient(object):
+	'''
+	Python Client for Instagram API.
+	'''
 
 	access_token = None
 	user_data = None
@@ -27,12 +35,15 @@ class InstagramOauthClient(object):
 				- The client_secret from registering application
 				  on Instagram.
 		'''
+
 		self.client_id 		= client_id
 		self.client_secret 	= client_secret
 
 
 	def get_authorize_url(self):
 		''' 
+		Obtains authorize url link with given client_id.
+
 		Returns:
 			auth_url: String
 				- The authorization url.
@@ -44,6 +55,8 @@ class InstagramOauthClient(object):
 
 	def get_access_token(self, code):
 		''' 
+		Obtains access token.
+
 		Parameters:
 			code: String
 				- The code is retrieved from the authorization url parameter
@@ -63,7 +76,7 @@ class InstagramOauthClient(object):
 		jsonlist = json.load(content)
 		self.access_token = jsonlist['access_token']
 		self.user_data = jsonlist['user']
-		print self.user_data
+		#print self.user_data
 		#print self.access_token
 
 
@@ -96,6 +109,8 @@ class InstagramOauthClient(object):
 
 	def get_user_info(self, access_token):
 		'''
+		Get user information.
+
 		Parameters:
 			access_token: String
 				- The access_token given after granting permission
@@ -113,7 +128,7 @@ class InstagramOauthClient(object):
 		return data
 
 
-	def get_user_media(self, access_token):
+	def get_user_media(self, user_id, access_token):
 		'''
 		Parameters:
 			access_token: String
@@ -125,8 +140,59 @@ class InstagramOauthClient(object):
 				- A dictionary containing user media information.
 		'''
 
-		user_media = 'https://api.instagram.com/v1/users/32833691/media/recent/?access_token='+access_token
+		user_media = 'https://api.instagram.com/v1/users/'+str(user_id)+'/media/recent/?access_token='+access_token
+		#user_media = 'https://api.instagram.com/v1/users/32833691/media/recent/?access_token='+access_token
 		req = requests.get(user_media)
 		content = json2.loads(req.content)
 		data = content['data']
 		return data
+
+	def search_for_location(self, address, access_token):
+		gmaps = googlemaps.Client(key=settings.GOOGLEMAP_API_KEY)
+		#geocoding and address
+		geocode_result = gmaps.geocode(address)
+		
+		if geocode_result:
+			location = geocode_result[0]['geometry']['location']
+			return location
+
+
+	def search_location_ids(self, latitude, longitude, access_token):
+		search_location = 'https://api.instagram.com/v1/locations/search?lat='+str(latitude)+'&lng='+str(longitude)+'&access_token='+access_token+"&distance=5000"
+		req = requests.get(search_location)
+		data = json2.loads(req.content)
+		list_of_ids =[]
+		if data['meta']['code'] != 200:
+			raise Exception("Invalid response %s." % data['meta']['code'])
+		search_ids = data['data']
+		for data in search_ids:
+			for i in data:
+				if i == 'id':
+					list_of_ids.append(data[i])
+		return list_of_ids
+
+	def search_location_media(self, list_location_ids, access_token):
+		media = []
+		for location in list_location_ids:
+			media_by_location = 'https://api.instagram.com/v1/locations/'+location+'/media/recent?access_token='+access_token
+			req = requests.get(media_by_location)
+			content_all = json2.loads(req.content)
+			if content_all['pagination']:
+				temp_media=[]
+				next_url = content_all['pagination']['next_url']
+				req = requests.get(next_url)
+				content = json2.loads(req.content)
+				for i in content['data']:
+					i['created_time'] = datetime.fromtimestamp(int(i['created_time'])).strftime('%Y-%m-%d %H:%M:%S')
+					temp_media.append(i)
+				media += [temp_media]
+			else:
+				for i in content_all['data']:
+					for data in i:
+						if data == 'created_time':
+							i[data]= datetime.fromtimestamp(int(i[data])).strftime('%Y-%m-%d %H:%M:%S')
+				media.append(content_all['data'])
+		return media
+
+
+

+ 98 - 0
hackathon_starter/hackathon/scripts/paypal.py

@@ -0,0 +1,98 @@
+
+'''
+paypal.py contains a handful of methods for interacting
+with Paypal data and returning the responses as JSON.
+'''
+
+import requests
+import urllib
+import urllib2
+import json
+import simplejson as json2
+import googlemaps
+from django.conf import settings
+from datetime import datetime
+from time import strftime
+import unicodedata
+
+authorization_url = 'https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize?client_id='
+access_token_url  = 'https://api.sandbox.paypal.com/v1/oauth2/token'
+
+#password:testing123
+#cafe.mui-buyer@gmail.com
+#https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize?client_id=AcOIP0f8NTl3iv5Etw2nakNrgPmjE65v84a2NQD5mm8-z-dTyhMSNHZuxHbHUaTAxLQIE0u-A2DFEY8M&response_type=code&scope=openid&redirect_uri=http://localhost:8000/hackathon/paypal/
+
+
+class PaypalOauthClient(object):
+	'''
+	Python Client for Paypal API.
+	'''
+
+	access_token = None
+	user_data = None
+
+	def __init__(self, client_id, client_secret):
+		'''
+		Parameters:
+			client_id: String
+				- The client_id from registering application
+				  on Instagram.
+			client_secret: String
+				- The client_secret from registering application
+				  on Instagram.
+		'''
+
+		self.client_id 		= client_id
+		self.client_secret 	= client_secret
+
+
+	def get_authorize_url(self):
+		''' 
+		Obtains authorize url link with given client_id.
+
+		Returns:
+			auth_url: String
+				- The authorization url.
+		'''
+
+		auth_url = authorization_url + self.client_id + '&response_type=code&scope=openid&redirect_uri=http://localhost:8000/hackathon/paypal/'
+		return auth_url
+
+
+	def get_access_token(self):
+		''' 
+		Obtains access token.
+
+		Parameters:
+			code: String
+				- The code is retrieved from the authorization url parameter
+				  to obtain access_token.
+		'''
+
+		headers = {
+					'Accept': 'application/json',
+					'Accept-Language': 'en_US',
+					'content-type': 'application/x-www-form-urlencoded'
+				  }
+		data = { 'grant_type': 'client_credentials'}
+
+
+		req = requests.post(access_token_url, data=data, headers= headers, auth=(self.client_id, self.client_secret))
+		
+		if req.status_code != 200:
+			raise Exception("Invalid response %s." %  req.status_code)
+		
+		content = unicodedata.normalize('NFKD', req.text).encode('ascii','ignore')
+		jsonlist = json2.loads(content)
+
+
+		self.access_token = jsonlist['access_token']
+
+
+	def test(self):
+		link ='https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/identity/openidconnect/userinfo/?schema=openid'
+		req = requests.get(link, headers={'Content-Type':'application/json', 'Authorization': self.access_token})
+		print req
+
+
+

+ 35 - 0
hackathon_starter/hackathon/templates/hackathon/instagram_q.html

@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<body>
+	{% include 'hackathon/base.html' %}
+	<h1 class="text-center"> {{ title }}</h1> 
+	<br>
+	<div class="container text-center">
+		<form class="form-inline" method='get' action="/hackathon/instagramMediaByLocation/">
+		  <div class="form-group">
+		    <input type="text" name="address_field" class="form-control" placeholder="address">
+		  </div>
+		  <button type="submit" class="btn btn-default">Search</button>
+		</form>
+	</div>
+
+	{% if geocode_result %}	
+	<div class="col-lg-12">
+		<div class="table-responsive">
+			<h4 class="text-center"> Latitude: {{geocode_result.lat}} </h3>
+			<h4 class="text-center"> Longitude: {{geocode_result.lng}} </h3>
+
+			<p class="text-center"> {{list_id}} </p>
+			<table class="table">
+				{% for list in media %}
+					{% for user in list %}
+						<a href="{{user.link}}" title="{{user.created_time}}"><img src="{{user.images.thumbnail.url}}"></a>
+					{% endfor %}
+				{% endfor %}
+
+			</table>
+		</div>
+	</div>
+	{% endif %}
+
+</html>

+ 7 - 0
hackathon_starter/hackathon/templates/hackathon/paypal.html

@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html>
+<body>
+	{% include 'hackathon/base.html' %}
+	<h1 class="text-center"> {{ title }}</h1> 
+	</div>	
+</html>

+ 2 - 0
hackathon_starter/hackathon/urls.py

@@ -20,7 +20,9 @@ urlpatterns = patterns('',
     url(r'^instagram/$', views.instagram, name='instagram'),
     url(r'^instagram_login/$', views.instagram_login, name='instagram_login'),
     url(r'^instagramUser/$', views.instagramUser, name='instagramUser'),
+    url(r'^instagramMediaByLocation/$', views.instagramMediaByLocation, name='instagramMediaByLocation'),#
     url(r'^instagramUserMedia/$', views.instagramUserMedia, name='instagramUserMedia'),
+    url(r'^paypal/$', views.paypal, name='paypal'),
     url(r'^tumblr_login/$', views.tumblr_login, name='tumblr_login'),
     url(r'^facebook/$', views.facebook, name='facebook'),
     url(r'^quandlSnp500/$', views.quandlSnp500, name='quandlsnp500'),

+ 34 - 1
hackathon_starter/hackathon/views.py

@@ -19,6 +19,7 @@ from scripts.twilioapi import *
 from scripts.instagram import InstagramOauthClient
 from scripts.scraper import steamDiscounts
 from scripts.quandl import *
+from scripts.paypal import PaypalOauthClient
 
 # Python
 import oauth2 as oauth
@@ -33,6 +34,7 @@ from hackathon.forms import UserForm
 
 getTumblr = TumblrOauthClient(settings.TUMBLR_CONSUMER_KEY, settings.TUMBLR_CONSUMER_SECRET)
 getInstagram = InstagramOauthClient(settings.INSTAGRAM_CLIENT_ID, settings.INSTAGRAM_CLIENT_SECRET)
+getPaypal = PaypalOauthClient(settings.PAYPAL_CLIENT_ID, settings.PAYPAL_CLIENT_SECRET)
 
 def index(request):
     context = {'hello': 'world'}
@@ -235,9 +237,40 @@ def instagramUserMedia(request):
     ''' Returns JSON response about a specific Instagram User's Media. '''
     user_id = User.objects.get(username='mk200789').id
     access_token = Profile.objects.get(user=user_id).oauth_secret
-    parsedData = getInstagram.get_user_media(access_token)
+    parsedData = getInstagram.get_user_media(32833691,access_token)
     return JsonResponse({'data': parsedData })
 
+def instagramMediaByLocation(request):
+    if request.method == 'GET':
+        if request.GET.items():
+            if request.user in User.objects.all():
+                address = request.GET.get('address_field')
+                user_id = User.objects.get(username=request.user).id
+                access_token = Profile.objects.get(user=user_id).oauth_secret
+                #lat, lng = getInstagram.search_for_location(address, access_token)
+                geocode_result = getInstagram.search_for_location(address, access_token)
+                if geocode_result:
+                    location_ids =getInstagram.search_location_ids(geocode_result['lat'], geocode_result['lng'], access_token)
+                    media = getInstagram.search_location_media(location_ids, access_token)
+                    title = address
+        else:
+            title, media,location_ids, geocode_result = 'Media by location', '','', ''
+
+
+    context = {'title': title, 'geocode_result':geocode_result, 'media':media, 'list_id':location_ids}
+    return render(request, 'hackathon/instagram_q.html', context)
+
+
+####################
+#    PAYPAL API    #
+####################
+def paypal(request):
+    #code = request.GET['code']
+    getPaypal.get_access_token()
+    getPaypal.test()
+
+    context = {'title':'paypal'}
+    return render(request, 'hackathon/paypal.html', context)
 
 ##################
 #  LINKED IN API #

+ 4 - 0
hackathon_starter/hackathon_starter/settings.py

@@ -115,4 +115,8 @@ TWITTER_TOKEN = 'F05dgLAzHEOalb4K2xDQ8Umm8'
 TWITTER_SECRET = 'Yy3a74Z7gvyhxRruJsvUtUl8uK8iv6qKkVqbZSijUxK71Z1qTY'
 INSTAGRAM_CLIENT_ID = '77dc10b9e3624e908ce437c0a82da92e'
 INSTAGRAM_CLIENT_SECRET = '8bcf3139857149aaba7acaa61288427f'
+PAYPAL_CLIENT_ID = 'AcOIP0f8NTl3iv5Etw2nakNrgPmjE65v84a2NQD5mm8-z-dTyhMSNHZuxHbHUaTAxLQIE0u-A2DFEY8M'
+PAYPAL_CLIENT_SECRET = 'EOKz-tkbFfRZavSD8T70f961v3NHRVAXXJu-5MU97YqSVKBsUH4NOoy_xQ2Am3EU3lN2m5RQiVb3eI-3'
+
+GOOGLEMAP_API_KEY = 'AIzaSyA7tttML91EGZ32S_FOOoxu-mbxN9Ojds8'
 

+ 0 - 1
ionic/www/templates/instagramUser.html

@@ -14,7 +14,6 @@
 			  <div class="col">Media: {{ data.counts.media }}</div>
     	</ion-item>
   
-
       <img collection-repeat="data in instagramUserMediaData.data"
         ng-src="{{data.images.thumbnail.url}}">
     

+ 1 - 0
requirements.txt

@@ -34,3 +34,4 @@ snowballstemmer==1.2.0
 sphinx-rtd-theme==0.1.7
 twilio==3.8.0
 wsgiref==0.1.2
+googlemaps==2.2