Exemple #1
0
  def fromJSONFields(self,fromJSON,auxData=None):

    super(LinkedInConnectEvent, self).fromJSONFields(fromJSON,auxData)

    # query for the connection's profile image and bio
    connection = self.raw_json['updateContent']['person']['connections']['values'][0]

    if connection['id'] != 'private':

      url = 'http://api.linkedin.com/v1/people/id=%s:(headline,summary,picture-url)' % connection['id']
  
      try:
        # request the user's updates 
        contentJSON = make_request(auxData,url,{'x-li-format':'json'})
        contentObj = json.loads(contentJSON)
  
        self.headline = contentObj.get('headline')
        self.summary = contentObj.get('summary')
        self.photo = contentObj.get('pictureUrl')
  
      except urllib2.URLError:
        self.log.error('***ERROR*** parse error')
        self.log.error(contentJSON)
        pass

    return self
  def get_author_profile(self,afm,db_session,oauth_config):
    
    # Create our OAuth consumer instance
    consumer = oauth.Consumer(oauth_config['key'], oauth_config['secret'])
    token = oauth.Token(key=afm.access_token,secret=afm.access_token_secret)
    client = oauth.Client(consumer, token)

    # request the user's profile
    content = make_request(client,'https://api.twitter.com/1/account/verify_credentials.json')
    str_content = content.decode('utf-8')

    respJSON = json.loads(str_content)

#    print json.dumps(respJSON, sort_keys=True, indent=2)
    
    profileJSON = {}

    if respJSON.has_key('name'):
      profileJSON['name'] = respJSON['name']

    if respJSON.has_key('location'):
      profileJSON['location'] = respJSON['location']

    if respJSON.has_key('profile_image_url'):
      profileJSON['picture_url'] = respJSON['profile_image_url']

    if respJSON.has_key('description'): 
      profileJSON['headline'] = respJSON['description']
      
    profileJSON['public_profile_url'] = 'https://twitter.com/#!/%s' % respJSON['screen_name']

    return profileJSON
def linkedin_callback(request):
  
  # the oauth_token is request as a query arg; the auth_token_secret is in session store
  oauth_token = request.params['oauth_token']
  oauth_token_secret = request.session['oauth_token_secret']

  oauth_verifier = request.params['oauth_verifier']
  
  # Step 3: Once the consumer has redirected the user back to the oauth_callback
  # URL you can request the access token the user has approved. You use the
  # request token to sign this request. After this is done you throw away the
  # request token and use the access token returned. You should store this
  # access token somewhere safe, like a database, for future use.
  consumer = oauth.Consumer(oAuthConfig[FEATURE]['key'], oAuthConfig[FEATURE]['secret'])
  
  token = oauth.Token(oauth_token,oauth_token_secret)
  token.set_verifier(oauth_verifier)

  client = oauth.Client(consumer, token)
  
  resp, content = client.request(oAuthConfig[FEATURE]['access_token_url'], "POST")
  access_token = dict(urlparse.parse_qsl(content))

  # these are the real deal and need to be stored securely in the DB
  accessToken = access_token['oauth_token']
  accessTokenSecret = access_token['oauth_token_secret']

  # Create our OAuth consumer instance
  token = oauth.Token(key=accessToken,secret=accessTokenSecret)
  client = oauth.Client(consumer, token)

  response = make_request(client,'http://api.linkedin.com/v1/people/~:(id)',{'x-li-format':'json'})
  respJSON = json.loads(response)
  linkedinId = respJSON['id']

  json_payload = json.dumps({'access_token':accessToken,'access_token_secret':accessTokenSecret,'auxillary_data':{'id':linkedinId}})
  headers = {'Content-Type':'application/json; charset=utf-8'}
  req = RequestWithMethod('%s/v1/authors/%s/features/%s' %
                            (request.registry.settings['mi.api.endpoint'],authenticated_userid(request),FEATURE),
                          'PUT',
                          json_payload,
                          headers)
  res = urllib2.urlopen(req)
  resJSON = json.loads(res.read())

  try:
    request.session['linkedin_access_token'] = accessToken
    request.session['linkedin_access_token_secret'] = accessTokenSecret
  except Exception, e:
    print e
def twitter_callback(request):
  
  # the oauth_token is request as a query arg; the auth_token_secret is in session store  
  oauth_token = request.params['oauth_token']
  oauth_token_secret = request.session['oauth_token_secret']

  oauth_verifier = request.params['oauth_verifier']
  
  # Step 3: Once the consumer has redirected the user back to the oauth_callback                                                                                                           
  # URL you can request the access token the user has approved. You use the                                                                                                                
  # request token to sign this request. After this is done you throw away the                                                                                                              
  # request token and use the access token returned. You should store this                                                                                                                 
  # access token somewhere safe, like a database, for future use.                                                                                                                          
  consumer_key = oAuthConfig[FEATURE]['key']
  consumer_secret = oAuthConfig[FEATURE]['secret']
  consumer = oauth.Consumer(consumer_key, consumer_secret)
  token = oauth.Token(oauth_token,oauth_token_secret)
  client = oauth.Client(consumer, token)

  token.set_verifier(oauth_verifier)

  resp, content = client.request(oAuthConfig[FEATURE]['access_token_url'], "POST")
  access_token = dict(urlparse.parse_qsl(content))

  # these are the real deal and need to be stored securely in the DB                                                                                                                       
  oauth_token = access_token['oauth_token']
  oauth_token_secret = access_token['oauth_token_secret']

  token = oauth.Token(oauth_token,oauth_token_secret)
  client = oauth.Client(consumer, token)

  userInfoJSON = json.loads(make_request(client,'https://api.twitter.com/1/account/verify_credentials.json').decode('utf-8'))

  json_payload = json.dumps({'access_token':oauth_token,'access_token_secret':oauth_token_secret,'auxillary_data':{'id':userInfoJSON['id']}})
  headers = {'Content-Type':'application/json; charset=utf-8'}      
  req = RequestWithMethod('%s/v1/authors/%s/features/%s' % 
                            (request.registry.settings['mi.api.endpoint'],authenticated_userid(request),FEATURE), 
                          'PUT',
                          json_payload,
                          headers)
  res = urllib2.urlopen(req)
  resJSON = json.loads(res.read())

  try:
    request.session['twitter_access_token'] = oauth_token
    request.session['twitter_access_token_secret'] = oauth_token_secret
  except Exception, e:
    print e
Exemple #5
0
  def build_one(self,afm,dbSession,oauthConfig,incremental):

    super(LinkedInFullCollector, self).build_one(afm,dbSession,oauthConfig,incremental)

    # get the name of the author  
    authorName = dbSession.query(Author.author_name).filter_by(id=afm.author_id).one()

    auxData = json.loads(afm.auxillary_data)
    userId = auxData['id']

    # setup what we need for oauth
    consumer = oauth.Consumer(oauthConfig['key'], oauthConfig['secret'])
    token = oauth.Token(key=afm.access_token,secret=afm.access_token_secret)
    client = oauth.Client(consumer, token)

    try:

      # request the user's profile
      response = make_request(client,'http://api.linkedin.com/v1/people/~:(picture-url)',{'x-li-format':'json'})
      respJSON = json.loads(response)
  
      profileImageURL = respJSON['pictureUrl'] if respJSON.has_key('pictureUrl') else None
        
      traversal = self.beginTraversal(dbSession,afm,profileImageURL)

      # optimization to request only those since we've last updated
      args = {'scope':'self',
              'type':['APPS','CMPY','CONN','JOBS','JGRP','PICT','PRFX','RECU','PRFU','QSTN','SHAR','VIRL'],
              'count':PAGE_SIZE}

      # incremental
      if traversal.baselineLastUpdateTime:
        # since a little before the last update time
        args['after'] = '%s000' % int(mktime(traversal.baselineLastUpdateTime.timetuple()))
      # full
      else:
        # limit to only one year of data
        args['after'] = '%s000' % int(mktime((traversal.now - FULL_LOOKBACK_WINDOW).timetuple()))

      offset = 0;
#      args['start'] = offset

      url = '%s?%s' % ('http://api.linkedin.com/v1/people/~/network/updates',urllib.urlencode(args, True))

      while url and traversal.totalAccepted < 200:

        # request the user's updates 
        content = make_request(client,url,{'x-li-format':'json'})

        try:
          rawJSON = json.loads(content)
        except:
          self.log.error('***ERROR*** parse error')
          self.log.error(content)
          continue

#        print json.dumps(rawJSON, sort_keys=True, indent=2)

        if rawJSON.get('_total',0) == 0:
          url = None
          continue

        LinkedInEvent.eventsFromJSON(self,rawJSON,traversal,afm.author_id,userId,client)

        # setup for the next page (if any)
        if rawJSON['_total'] < PAGE_SIZE:
          url = None
        else:
          offset = offset + PAGE_SIZE
#          args['start'] = offset
          url = '%s?%s' % ('http://api.linkedin.com/v1/people/~/network/updates',urllib.urlencode(args, True))
          
      self.endTraversal(traversal,authorName)
      
    except Exception, e:
      self.log.error('****ERROR****')
      self.log.error(e)
      dbSession.rollback()
      raise #continue
Exemple #6
0
  def build_one(self,afm,dbSession,oauthConfig,incremental):

    super(TwitterFullCollector, self).build_one(afm,dbSession,oauthConfig,incremental)

    # get the name of the author  
    authorName = dbSession.query(Author.author_name).filter_by(id=afm.author_id).one()

    consumer = oauth.Consumer(oauthConfig['key'], oauthConfig['secret'])
    token = oauth.Token(afm.access_token, afm.access_token_secret)
    
    client = oauth.Client(consumer, token)

    auxData = json.loads(afm.auxillary_data)
    userId = int(auxData['id'])

    try:
  
      # API endpoing for querying user info
      url = '%s%s' % (oauthConfig['endpoint'],USER_INFO)
      userInfoJSON = json.loads(make_request(client,url))
  
      twitterUserId = userInfoJSON['id']
      
      if twitterUserId != userId:
        raise Exception("Bad state - mis-matched twitter user ids")

      profileImageUrl = userInfoJSON['profile_image_url'] if userInfoJSON.has_key('profile_image_url') else None 

      traversal = self.beginTraversal(dbSession,afm,profileImageUrl)
      page = 1

      # API endpoint for getting user timeline
      url = '%s%s?%s' % (oauthConfig['endpoint'],USER_TIMELINE,urllib.urlencode({'include_rts':'1','include_entities':'1','count':'200','page':page}))

      while url and traversal.totalAccepted < 200:

        content = make_request(client,url)
        
        try:
          rawJSON = json.loads(content)
        except:
          self.log.error('***ERROR*** parse error')
          self.log.error(content)
          continue

        if len(rawJSON) == 0:
          url = None
          continue

        for post in rawJSON:
  
          # process the item
          #print json.dumps(post, sort_keys=True, indent=2)
  
          event = Event.TwitterEvent(afm.author_id).fromJSON(post)
  
          self.writeEvent(event,traversal)
      
        # setup for the next page (if any)
        page = page + 1
        url = '%s%s?%s' % (oauthConfig['endpoint'],USER_TIMELINE,urllib.urlencode({'include_rts':'1','include_entities':'1','count':'200','page':page}))

      self.endTraversal(traversal,authorName)
      
    except Exception, e:
      self.log.error('****ERROR****')
      self.log.error(e)
      dbSession.rollback()
      raise #continue
def linkedin_confirmation(request):
  
  # check if the linkedin access token is already in the session store.  If not we'll need to retrieve
  # from the API
  access_token = request.session.get('linkedin_access_token')

  if not access_token:

    req = urllib2.Request('http://%s/v1/authors/%s/features/%s' % 
                              (request.registry.settings['mi.api.endpoint'],authenticated_userid(request),FEATURE))
    res = urllib2.urlopen(req)
    resJSON = json.loads(res.read())

    # ??? TODO - enhance the error handling
    access_token = resJSON['access_token']
    if not access_token:
      raise UnexpectedAPIResponse('missing access_token for Instagram for author %s' % authenticated_userid(request))

    access_token_secret = resJSON['access_token_secret']
    if not access_token_secret:
      raise UnexpectedAPIResponse('missing access_token_secret for Instagram for author %s' % authenticated_userid(request))

    request.session['linkedin_access_token'] = access_token
    request.session['linkedin_access_token_secret'] = access_token_secret
      
  accessToken = request.session['linkedin_access_token']
  accessTokenSecret = request.session['linkedin_access_token_secret']

  # Create our OAuth consumer instance
  consumer = oauth.Consumer(oAuthConfig[FEATURE]['key'], oAuthConfig[FEATURE]['secret'])
  token = oauth.Token(key=accessToken,secret=accessTokenSecret)
  client = oauth.Client(consumer, token)

  # request the user's profile
  response = make_request(client,'http://api.linkedin.com/v1/people/~:(id,first-name,last-name,headline,public-profile-url)',{'x-li-format':'json'})
  respJSON = json.loads(response)
  firstname = respJSON['firstName']
  lastname = respJSON['lastName']
  headline = respJSON['headline']
  profileURL = respJSON['publicProfileUrl']
  print json.dumps(respJSON, sort_keys=True, indent=2)

  # request the user's network status
  response = make_request(client,'http://api.linkedin.com/v1/people/~/network/network-stats',{'x-li-format':'json'})
  respJSON = json.loads(response)
  firstdegree = respJSON['values'][0]
  seconddegree = respJSON['values'][1]
#  print json.dumps(respJSON, sort_keys=True, indent=2)

  # request the user's connections
  response = make_request(client,'http://api.linkedin.com/v1/people/~/connections',{'x-li-format':'json'})
  respJSON = json.loads(response)
  connections = []
  for connection in respJSON['values']:
    if connection['id'] == 'private':
      continue
    image = '<img src="%s"/>' % connection['pictureUrl'] if 'pictureUrl' in connection else ''
    connections.append('<li>%s %s %s</li>' % (connection['firstName'], connection['lastName'], image))
#  print json.dumps(respJSON, sort_keys=True, indent=2)

  # query the api for some feature events to display to the user
  req = urllib2.Request('http://%s/v1/authors/%s/features/%s/featureEvents' % 
                          (request.registry.settings['mi.api.endpoint'],authenticated_userid(request),FEATURE)) 
  res = urllib2.urlopen(req)
  resJSON = json.loads(res.read())
  
  updates = []
  for event in resJSON['events']:
    title = event['content']['label'] if event['content']['label'] else ''
    timestamp = datetime.utcfromtimestamp(event['create_time'])
    updates.append('<p>%s (Created: %s)</p>' % (title,timestamp.isoformat()))

  message = ''
  messages = request.session.pop_flash()
  if len(messages) > 0:
    message = messages[0]

  return{'message':message, 'title':'LinkedIn feature',
         'firstname':firstname,'lastname':lastname,'headline':headline,'profileURL':profileURL,
         'firstdegree':firstdegree,'seconddegree':seconddegree,
         'updates': ''.join(updates),
         'connections': ''.join(connections)}