Esempio n. 1
0
    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
Esempio n. 4
0
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