Search in sources :

Example 1 with Retry

use of com.hsn.epic4j.aop.Retry in project epic4j by huisunan.

the class MainStart method getDefaultPage.

@Override
@Retry(message = "默认页面打开失败")
public Page getDefaultPage(Browser browser) {
    List<Page> pages = browser.pages();
    Page page = CollUtil.isNotEmpty(pages) ? pages.get(0) : browser.newPage();
    Viewport viewport = new Viewport();
    viewport.setWidth(600);
    viewport.setHeight(1000);
    viewport.setHasTouch(true);
    page.setViewport(viewport);
    return page;
}
Also used : Viewport(com.ruiyun.jvppeteer.options.Viewport) Page(com.ruiyun.jvppeteer.core.page.Page) Retry(com.hsn.epic4j.aop.Retry)

Example 2 with Retry

use of com.hsn.epic4j.aop.Retry in project epic4j by huisunan.

the class MainStart method getWeekFreeItems.

/**
 * 获取周免游戏
 */
@Retry(message = "获取周末游戏失败")
@Override
public List<Item> getWeekFreeItems(Page page) {
    Browser browser = page.browser();
    String userCountry = "CN";
    String locate = "zh-CN";
    String country = PageUtil.getJsonValue(browser, epicConfig.getUserInfoUrl(), "userInfo.country.value", String.class);
    if (StrUtil.isNotEmpty(country)) {
        userCountry = country;
        locate = locate + "-" + userCountry;
    }
    String formatUrl = StrUtil.format(epicConfig.getFreeGameUrl(), locate, userCountry, userCountry);
    log.debug(formatUrl);
    JSONObject json = PageUtil.getJson(formatUrl, browser);
    List<Item> list = new ArrayList<>();
    DateTime now = DateUtil.date();
    for (JSONObject element : json.getByPath("data.Catalog.searchStore.elements", JSONArray.class).jsonIter()) {
        if (!"ACTIVE".equals(element.getStr("status"))) {
            continue;
        }
        if (StreamSupport.stream(element.getJSONArray("categories").jsonIter().spliterator(), false).anyMatch(item -> "freegames".equals(item.getStr("path")))) {
            JSONObject promotions = element.getJSONObject("promotions");
            if (promotions == null) {
                continue;
            }
            JSONArray promotionalOffers = promotions.getJSONArray("promotionalOffers");
            if (CollUtil.isNotEmpty(promotionalOffers)) {
                if (StreamSupport.stream(promotionalOffers.jsonIter().spliterator(), false).flatMap(offerItem -> StreamSupport.stream(offerItem.getJSONArray("promotionalOffers").jsonIter().spliterator(), false)).anyMatch(offerItem -> {
                    DateTime startDate = DateUtil.parse(offerItem.getStr("startDate")).setTimeZone(TimeZone.getDefault());
                    DateTime endDate = DateUtil.parse(offerItem.getStr("endDate")).setTimeZone(TimeZone.getDefault());
                    JSONObject discountSetting = offerItem.getJSONObject("discountSetting");
                    return DateUtil.isIn(now, startDate, endDate) && "PERCENTAGE".equals(discountSetting.getStr("discountType")) && discountSetting.getInt("discountPercentage") == 0;
                })) {
                    list.add(element.toBean(Item.class));
                }
            }
        }
    }
    return list;
}
Also used : DateUtil(cn.hutool.core.date.DateUtil) Item(com.hsn.epic4j.bean.Item) java.util(java.util) SneakyThrows(lombok.SneakyThrows) Constant(com.ruiyun.jvppeteer.core.Constant) FileUtil(com.ruiyun.jvppeteer.util.FileUtil) Viewport(com.ruiyun.jvppeteer.options.Viewport) Autowired(org.springframework.beans.factory.annotation.Autowired) DateTime(cn.hutool.core.date.DateTime) StreamSupport(java.util.stream.StreamSupport) TimeException(com.hsn.epic4j.exception.TimeException) Browser(com.ruiyun.jvppeteer.core.browser.Browser) EpicConfig(com.hsn.epic4j.config.EpicConfig) Puppeteer(com.ruiyun.jvppeteer.core.Puppeteer) JSONObject(cn.hutool.json.JSONObject) LaunchOptions(com.ruiyun.jvppeteer.options.LaunchOptions) Retry(com.hsn.epic4j.aop.Retry) SelectItem(com.hsn.epic4j.bean.SelectItem) PermissionException(com.hsn.epic4j.exception.PermissionException) LaunchOptionsBuilder(com.ruiyun.jvppeteer.options.LaunchOptionsBuilder) Collectors(java.util.stream.Collectors) Page(com.ruiyun.jvppeteer.core.page.Page) CollUtil(cn.hutool.core.collection.CollUtil) StrUtil(cn.hutool.core.util.StrUtil) Slf4j(lombok.extern.slf4j.Slf4j) Component(org.springframework.stereotype.Component) BrowserFetcher(com.ruiyun.jvppeteer.core.browser.BrowserFetcher) JSONArray(cn.hutool.json.JSONArray) PageUtil(com.hsn.epic4j.util.PageUtil) ItemException(com.hsn.epic4j.exception.ItemException) Item(com.hsn.epic4j.bean.Item) SelectItem(com.hsn.epic4j.bean.SelectItem) JSONObject(cn.hutool.json.JSONObject) JSONArray(cn.hutool.json.JSONArray) DateTime(cn.hutool.core.date.DateTime) Browser(com.ruiyun.jvppeteer.core.browser.Browser) Retry(com.hsn.epic4j.aop.Retry)

Example 3 with Retry

use of com.hsn.epic4j.aop.Retry in project epic4j by huisunan.

the class MainStart method receive.

@Override
@SneakyThrows
@Retry(message = "领取失败")
public List<Item> receive(Page page, List<Item> weekFreeItems) {
    if (log.isDebugEnabled()) {
        log.debug("all free items:{}", weekFreeItems.stream().map(Item::getTitle).collect(Collectors.joining(",")));
    }
    List<Item> receiveItem = new ArrayList<>();
    for (Item item : weekFreeItems) {
        String url = "";
        if (Item.BASE_GAME.equals(item.getOfferType())) {
            url = item.getProductSlug();
        } else if (Item.DLC.equals(item.getOfferType())) {
            url = item.getUrlSlug();
        }
        String itemUrl = StrUtil.format(epicConfig.getStoreUrl(), url);
        log.debug("item url:{}", itemUrl);
        page.goTo(itemUrl);
        // age limit
        PageUtil.tryClick(page, "div[data-component=PDPAgeGate] Button", itemUrl, 8, 1000);
        PageUtil.waitForTextChange(page, "div[data-component=DesktopSticky] button[data-testid=purchase-cta-button]", "Loading");
        if (isInLibrary(page)) {
            log.debug("{} had in library", item.getTitle());
            continue;
        }
        page.waitForSelector("div[data-component=WithClickTracking] button").click();
        // epic user licence check
        log.debug("user licence check");
        PageUtil.tryClick(page, "div[data-component=makePlatformUnsupportedWarningStep] button[data-component=BaseButton", itemUrl);
        PageUtil.tryClick(page, "#agree", itemUrl);
        PageUtil.tryClick(page, "div[data-component=EulaModalActions] button[data-component=BaseButton]", itemUrl);
        String purchaseUrl = PageUtil.getStrProperty(page, "#webPurchaseContainer iframe", "src");
        log.debug("purchase url :{}", purchaseUrl);
        page.goTo(purchaseUrl);
        PageUtil.tryClick(page, "#purchase-app button[class*=confirm]:not([disabled])", page.mainFrame().url(), 20, 500);
        PageUtil.tryClick(page, "#purchaseAppContainer div.payment-overlay button.payment-btn--primary", page.mainFrame().url());
        PageUtil.findSelectors(page, 10_000, true, () -> {
            throw new TimeException("time out");
        }, new SelectItem("#purchase-app div[class*=alert]", () -> {
            if (item.isDLC()) {
                // DLC情况下,在没有本体的情况下也也可以领取
                return SelectItem.SelectCallBack.CONTINUE;
            } else {
                String message = PageUtil.getStrProperty(page, "#purchase-app div[class*=alert]:not([disabled])", "textContent");
                throw new PermissionException(message);
            }
        }), new SelectItem("#talon_frame_checkout_free_prod[style*=visible]", () -> {
            // 需要验证码
            throw new PermissionException("CAPTCHA is required for unknown reasons when claiming");
        }), new SelectItem("#purchase-app > div", (p, i) -> p.$(i.getSelectors()) == null, () -> {
            // 当订单完成刷新时,该元素不存在,是订单完成后刷新到新页面
            page.goTo(itemUrl);
            PageUtil.waitForTextChange(page, "div[data-component=DesktopSticky] button[data-testid=purchase-cta-button]", "Loading");
            if (!isInLibrary(page)) {
                throw new ItemException("An item was mistakenly considered to have been claimed");
            }
            receiveItem.add(item);
            return SelectItem.SelectCallBack.END;
        }));
    }
    if (receiveItem.isEmpty()) {
        log.info("all free week games in your library:{}", weekFreeItems.stream().map(Item::getTitle).collect(Collectors.joining(",")));
    }
    return receiveItem;
}
Also used : PermissionException(com.hsn.epic4j.exception.PermissionException) DateUtil(cn.hutool.core.date.DateUtil) Item(com.hsn.epic4j.bean.Item) java.util(java.util) SneakyThrows(lombok.SneakyThrows) Constant(com.ruiyun.jvppeteer.core.Constant) FileUtil(com.ruiyun.jvppeteer.util.FileUtil) Viewport(com.ruiyun.jvppeteer.options.Viewport) Autowired(org.springframework.beans.factory.annotation.Autowired) DateTime(cn.hutool.core.date.DateTime) StreamSupport(java.util.stream.StreamSupport) TimeException(com.hsn.epic4j.exception.TimeException) Browser(com.ruiyun.jvppeteer.core.browser.Browser) EpicConfig(com.hsn.epic4j.config.EpicConfig) Puppeteer(com.ruiyun.jvppeteer.core.Puppeteer) JSONObject(cn.hutool.json.JSONObject) LaunchOptions(com.ruiyun.jvppeteer.options.LaunchOptions) Retry(com.hsn.epic4j.aop.Retry) SelectItem(com.hsn.epic4j.bean.SelectItem) PermissionException(com.hsn.epic4j.exception.PermissionException) LaunchOptionsBuilder(com.ruiyun.jvppeteer.options.LaunchOptionsBuilder) Collectors(java.util.stream.Collectors) Page(com.ruiyun.jvppeteer.core.page.Page) CollUtil(cn.hutool.core.collection.CollUtil) StrUtil(cn.hutool.core.util.StrUtil) Slf4j(lombok.extern.slf4j.Slf4j) Component(org.springframework.stereotype.Component) BrowserFetcher(com.ruiyun.jvppeteer.core.browser.BrowserFetcher) JSONArray(cn.hutool.json.JSONArray) PageUtil(com.hsn.epic4j.util.PageUtil) ItemException(com.hsn.epic4j.exception.ItemException) Item(com.hsn.epic4j.bean.Item) SelectItem(com.hsn.epic4j.bean.SelectItem) ItemException(com.hsn.epic4j.exception.ItemException) TimeException(com.hsn.epic4j.exception.TimeException) SelectItem(com.hsn.epic4j.bean.SelectItem) SneakyThrows(lombok.SneakyThrows) Retry(com.hsn.epic4j.aop.Retry)

Aggregations

Retry (com.hsn.epic4j.aop.Retry)3 Page (com.ruiyun.jvppeteer.core.page.Page)3 Viewport (com.ruiyun.jvppeteer.options.Viewport)3 CollUtil (cn.hutool.core.collection.CollUtil)2 DateTime (cn.hutool.core.date.DateTime)2 DateUtil (cn.hutool.core.date.DateUtil)2 StrUtil (cn.hutool.core.util.StrUtil)2 JSONArray (cn.hutool.json.JSONArray)2 JSONObject (cn.hutool.json.JSONObject)2 Item (com.hsn.epic4j.bean.Item)2 SelectItem (com.hsn.epic4j.bean.SelectItem)2 EpicConfig (com.hsn.epic4j.config.EpicConfig)2 ItemException (com.hsn.epic4j.exception.ItemException)2 PermissionException (com.hsn.epic4j.exception.PermissionException)2 TimeException (com.hsn.epic4j.exception.TimeException)2 PageUtil (com.hsn.epic4j.util.PageUtil)2 Constant (com.ruiyun.jvppeteer.core.Constant)2 Puppeteer (com.ruiyun.jvppeteer.core.Puppeteer)2 Browser (com.ruiyun.jvppeteer.core.browser.Browser)2 BrowserFetcher (com.ruiyun.jvppeteer.core.browser.BrowserFetcher)2