def feed_push_update(feed_key): feed = ndb.Key(urlsafe=feed_key).get() if not feed: return "No feed", 404 data = request.stream.read() if feed.hub_secret: server_signature = request.headers.get('X-Hub-Signature', None) signature = hmac.new(feed.hub_secret, data).hexdigest() if server_signature != signature: logger.warn('Got PuSH subscribe POST for feed key=%s w/o valid signature: sent=%s != expected=%s', feed_key, server_signature, signature) return '' logger.info('Got PuSH body: %s', data) logger.info('Got PuSH headers: %s', request.headers) Entry.update_for_feed(feed, publish=True, skip_queue=True) return ''
def update_all_feeds(interval_id): """Update all feeds for a specific interval""" if request.headers.get('X-Appengine-Cron') != 'true': return jsonify_error(message='Not a cron call') feeds = Feed.for_interval(interval_id) for feed in feeds: feed.prepare_request() errors = 0 success = 0 for feed in feeds: try: Entry.update_for_feed(feed, publish=True) success += 1 except FetchException, e: errors += 1 pass except Exception, e: errors += 1 logger.exception('Failed to update feed:%s' % (feed.feed_url, ))
def tq_feed_poll(): """Poll some feeds feed""" if not request.headers.get('X-AppEngine-QueueName'): raise ndb.Return(jsonify_error(message='Not a Task call')) keys = request.form.get('keys') if not keys: logger.info('Task Queue poll no keys') raise ndb.Return(jsonify_error(code=500)) success = 0 errors = 0 entries_created = 0 logger.info('Getting feeds') ndb_keys = [ndb.Key(urlsafe=key) for key in keys.split(',')] feeds = yield ndb.get_multi_async(ndb_keys) logger.info('Got %d feed(s)', len(feeds)) futures = [] for i, feed in enumerate(feeds): if not feed: errors += 1 logger.info("Couldn't find feed for key: %s", ndb_keys[i]) continue futures.append((i, Entry.update_for_feed(feed))) for i, future in futures: try: parsed_feed, num_new_entries = yield future entries_created += num_new_entries success += 1 except: errors += 1 feed = feeds[i] logger.exception('Failed to update feed:%s, i=%s' % (feed.feed_url, i)) logger.info('Polled feeds entries_created: %s success: %s errors: %s', entries_created, success, errors) raise ndb.Return(jsonify(status='ok'))