Source code for pliers.stimuli.api
''' Stimuli that are inherently associated with remote resources. '''
import logging
import os
from .base import load_stims
from .compound import CompoundStim
from .image import ImageStim
from .text import TextStim
from .video import VideoStim
from pliers.utils import (APIDependent, attempt_to_import,
verify_dependencies)
twitter = attempt_to_import('twitter')
[docs]class TweetStimFactory(APIDependent):
'''
An object from which to generate TweetStims, creates an Api instance from
the python-twitter library
Args:
consumer_key (str): A valid consumer key for the Twitter API
consumer_secret (str): A valid consumer secret key for the Twitter API
access_token_key (str): A valid access token for the Twitter API
access_token_secret (str): A valid access token secret for the
Twitter API
To get these credentials, visit https://dev.twitter.com/.
'''
_env_keys = ('TWITTER_CONSUMER_KEY', 'TWITTER_CONSUMER_SECRET',
'TWITTER_ACCESS_TOKEN_KEY', 'TWITTER_ACCESS_TOKEN_SECRET')
[docs] def __init__(self, consumer_key=None, consumer_secret=None,
access_token_key=None, access_token_secret=None,
rate_limit=None):
verify_dependencies(['twitter'])
if consumer_key is None or consumer_secret is None or \
access_token_key is None or access_token_secret is None:
try:
consumer_key = os.environ['TWITTER_CONSUMER_KEY']
consumer_secret = os.environ['TWITTER_CONSUMER_SECRET']
access_token_key = os.environ['TWITTER_ACCESS_TOKEN_KEY']
access_token_secret = os.environ['TWITTER_ACCESS_TOKEN_SECRET']
except KeyError:
raise ValueError("Valid Twitter API credentials "
"must be passed the first time a TweetStim "
"is initialized.")
self.api = twitter.Api(consumer_key=consumer_key,
consumer_secret=consumer_secret,
access_token_key=access_token_key,
access_token_secret=access_token_secret)
self.consumer_key = consumer_key
self.consumer_secret = consumer_secret
self.access_token_key = access_token_key
self.access_token_secret = access_token_secret
super().__init__(rate_limit=rate_limit)
@property
def api_keys(self):
return [self.consumer_key,
self.consumer_secret,
self.access_token_key,
self.access_token_secret]
def check_valid_keys(self):
verify_dependencies(['twitter'])
try:
self.api.VerifyCredentials()
return True
except twitter.error.TwitterError as e:
logging.warning(str(e))
return False
def get_status(self, status_id):
if self.validate_keys():
status = self.api.GetStatus(status_id)
return TweetStim(status)
else:
raise twitter.error.TwitterError('Invalid or expired token.')
[docs]class TweetStim(CompoundStim):
'''
Represents the text and associated media from a single tweet.
Args:
status (python-twitter Status object): the Status from which to
extract information, can either be generated from the TweetFactory
or user-provided.
'''
_allowed_types = (TextStim, ImageStim, VideoStim)
_allow_multiple = True
_primary = TextStim
[docs] def __init__(self, status):
self.status = status
elements = [TextStim(text=status.text)]
if status.media:
media_stims = load_stims([m.media_url for m in status.media])
elements.extend(media_stims)
super().__init__(elements=elements)