def grab_ebook(self, api_client): """Grab Packt Free Learning ebook.""" logger.info("Start grabbing ebook...") utc_today = dt.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) offer_response = api_client.get( PACKT_API_FREE_LEARNING_OFFERS_URL, params={ 'dateFrom': utc_today.isoformat(), 'dateTo': (utc_today + dt.timedelta(days=1)).isoformat() } ) [offer_data] = offer_response.json().get('data') offer_id = offer_data.get('id') product_id = offer_data.get('productId') user_response = api_client.get(PACKT_API_USER_URL) [user_data] = user_response.json().get('data') user_id = user_data.get('id') claim_response = api_client.put( PACKT_API_FREE_LEARNING_CLAIM_URL.format(user_id=user_id, offer_id=offer_id), json={'recaptcha': self.solve_packt_recapcha()} ) product_response = api_client.get(PACKT_PRODUCT_SUMMARY_URL.format(product_id=product_id)) self.book_title = product_response.json()['title'] if product_response.status_code == 200 else self.book_title self.book_title = slugify_book_title(self.book_title) if claim_response.status_code == 200: logger.info('A new Packt Free Learning book has been grabbed!') elif claim_response.status_code == 409: logger.info('You have already claimed this offer.') else: logger.error('Claiming Packt Free Learning book has failed.')
def grab_ebook(self, api_client): """Grab Packt Free Learning ebook.""" logger.info("Start grabbing ebook...") utc_today = dt.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) offer_response = api_client.get( PACKT_API_FREE_LEARNING_OFFERS_URL, params={ 'dateFrom': utc_today.isoformat(), 'dateTo': (utc_today + dt.timedelta(days=1)).isoformat() } ) [offer_data] = offer_response.json().get('data') offer_id = offer_data.get('id') product_id = offer_data.get('productId') user_response = api_client.get(PACKT_API_USER_URL) [user_data] = user_response.json().get('data') user_id = user_data.get('id') claim_response = api_client.put( PACKT_API_FREE_LEARNING_CLAIM_URL.format(user_id=user_id, offer_id=offer_id), json={'recaptcha': self.solve_packt_recapcha()} ) product_response = api_client.get(PACKT_PRODUCT_SUMMARY_URL.format(product_id=product_id)) self.book_data = {'id': product_id, 'title': product_response.json()['title']}\ if product_response.status_code == 200 else None if claim_response.status_code == 200: logger.info('A new Packt Free Learning ebook "{}" has been grabbed!'.format(self.book_data['title'])) elif claim_response.status_code == 409: logger.info('You have already claimed Packt Free Learning "{}" offer.'.format(self.book_data['title'])) else: logger.error('Claiming Packt Free Learning book has failed.')
def claim_product(api_client, recaptcha_solution): """Grab Packt Free Learning ebook.""" logger.info("Start grabbing ebook...") utc_today = dt.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) offer_response = api_client.get( PACKT_API_FREE_LEARNING_OFFERS_URL, params={ 'dateFrom': utc_today.isoformat(), 'dateTo': (utc_today + dt.timedelta(days=1)).isoformat() }) # Handle case when there is no Free Learning offer offer_count = offer_response.json().get('count') if offer_count == 0: logger.info("There is no Free Learning offer right now") raise Exception("There is no Free Learning offer right now") # Sometimes they are several offers. We just get the last updated one. offer_data = max(offer_response.json().get('data'), key=itemgetter('updatedAt')) offer_id = offer_data.get('id') product_id = offer_data.get('productId') user_response = api_client.get(PACKT_API_USER_URL) [user_data] = user_response.json().get('data') user_id = user_data.get('id') product_response = api_client.get( PACKT_PRODUCT_SUMMARY_URL.format(product_id=product_id)) product_data = {'id': product_id, 'title': product_response.json()['title']}\ if product_response.status_code == 200 else None if any(product_id == book['id'] for book in get_all_books_data(api_client)): logger.info( 'You have already claimed Packt Free Learning "{}" offer.'.format( product_data['title'])) return product_data claim_response = api_client.put(PACKT_API_FREE_LEARNING_CLAIM_URL.format( user_id=user_id, offer_id=offer_id), json={'recaptcha': recaptcha_solution}) if claim_response.status_code == 200: logger.info( 'A new Packt Free Learning ebook "{}" has been grabbed!'.format( product_data['title'])) elif claim_response.status_code == 409: logger.info( 'You have already claimed Packt Free Learning "{}" offer.'.format( product_data['title'])) else: logger.error('Claiming Packt Free Learning book has failed.') return product_data
def claim_product(api_client): """Grab Packt Free Learning ebook.""" logger.info("Start grabbing ebook...") utc_today = dt.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) offer_response = api_client.get( PACKT_API_FREE_LEARNING_OFFERS_URL, params={ 'dateFrom': utc_today.isoformat(), 'dateTo': (utc_today + dt.timedelta(days=1)).isoformat() }) [offer_data] = offer_response.json().get('data') offer_id = offer_data.get('id') product_id = offer_data.get('productId') user_response = api_client.get(PACKT_API_USER_URL) [user_data] = user_response.json().get('data') user_id = user_data.get('id') product_response = api_client.get( PACKT_PRODUCT_SUMMARY_URL.format(product_id=product_id)) product_data = {'id': product_id, 'title': product_response.json()['title']}\ if product_response.status_code == 200 else None if any(product_id == book['id'] for book in get_all_books_data(api_client)): logger.info( 'You have already claimed Packt Free Learning "{}" offer.'.format( product_data['title'])) return product_data # Stop using anti captcha service logger.info( 'Bypass trying to solve ReCAPTCHA on Packt Free Learning website...') #recaptcha_solution = solve_recaptcha(anticaptcha_key, PACKT_FREE_LEARNING_URL, PACKT_RECAPTCHA_SITE_KEY) # New claim response without captcha claim_response = api_client.put( PACKT_API_FREE_LEARNING_CLAIM_URL.format(user_id=user_id, offer_id=offer_id), #json={'recaptcha': recaptcha_solution} ) if claim_response.status_code == 200: logger.info( 'A new Packt Free Learning ebook "{}" has been grabbed!'.format( product_data['title'])) elif claim_response.status_code == 409: logger.info( 'You have already claimed Packt Free Learning "{}" offer.'.format( product_data['title'])) else: logger.error('Claiming Packt Free Learning book has failed.') return product_data