def run(self): self.server.start() while True: if self.exit.isSet(): self.server.send('exit') with self.tempfileLock: for key in self.tempfiles: self.tempfiles[key].close() return search = self._getSearch() if search == '':#Twitter returns an error for empty searches, so this is a way around it tweets = [] else: params = {'q': self._getSearch(), 'result_type': 'recent', 'lang': 'en', 'count': 100}#Check twitter API for all parameters r = requests.get('https://api.twitter.com/1.1/search/tweets.json', headers = self._headers, params = params) tweets = [ tweet for tweet in r.json()['statuses'] if 'retweeted_status' not in tweet]#No need for boring retweets with self.tweetLock: self.tweets = tweets mediaObjs = [] imgs = {} for tweet in tweets: if 'media' in tweet['entities']: mediaObjs.extend([entity for entity in tweet['entities']['media'] if entity['type'] == 'photo']) with self.tempfileLock: for mediaObj in mediaObjs: key = mediaObj['media_url'] if key in self.tempfiles: self.tempfiles[key].inUse = True continue if 'thumb' in mediaObj['sizes']: imgRequest = requests.get(key + ':thumb') elif 'small' in mediaObj['sizes']: imgRequest = requests.get(key + ':small') else: imgRequest = requests.get(key) if imgRequest.status_code == 200:#make sure the link worked temp = NamedTemporaryFile(prefix = key.replace('/', '')) temp.write(imgRequest.content)#Saves image in temp file so it only has to be downloaded once temp.seek(0)#moves to start of file imgs[key] = b64encode(temp.read()) temp.inUse = True self.tempfiles[key] = temp msg = json.dumps((tweets, imgs)) self.server.send(msg) self.deleteUnusedTempfiles() time.sleep(2)#Don't want the loop to run to often, or else you hit the twitter rate limit