use of com.hsn.epic4j.bean.SelectItem 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;
}
use of com.hsn.epic4j.bean.SelectItem in project epic4j by huisunan.
the class PasswordLogin method login.
@Override
@SneakyThrows
public void login(Page page, String email, String password) {
if (StrUtil.isEmpty(email)) {
throw new CheckException("账号不能为空");
}
if (StrUtil.isEmpty(password)) {
throw new CheckException(email + " 密码不能为空");
}
log.debug("login start");
PageUtil.click(page, "div.menu-icon");
PageUtil.click(page, "div.mobile-buttons a[href='/login']");
PageUtil.click(page, "#login-with-epic");
PageUtil.type(page, "#email", email);
PageUtil.type(page, "#password", password);
PageUtil.click(page, "#sign-in[tabindex='0']");
PageUtil.findSelectors(page, 30000, true, () -> {
throw new TimeException("Check login result timeout.");
}, new SelectItem("#talon_frame_login_prod[style*=visible]", () -> {
throw new PermissionException("CAPTCHA is required for unknown reasons when logging in");
}), new SelectItem("div.MuiPaper-root[role=alert] h6[class*=subtitle1]", () -> {
Object jsonValue = page.waitForSelector("div.MuiPaper-root[role=alert] h6[class*=subtitle1]").getProperty("textContent").jsonValue();
throw new PermissionException("From Epic Games: " + jsonValue);
}), new SelectItem("input[name=code-input-0]", () -> {
throw new PermissionException("From Epic Games need code");
}), new SelectItem(".signed-in", () -> {
log.info("login success");
return SelectItem.SelectCallBack.END;
}));
log.debug("login end");
}
use of com.hsn.epic4j.bean.SelectItem in project epic4j by huisunan.
the class PageUtil method findSelectors.
/**
* 在指定范围时间内,遍历查找
*
* @param page page
* @param timeout 超时时间
* @param ignore true忽略异常
* @param timeoutBack 超时后回调
* @param selectItems 要查询的元素
*/
@SneakyThrows
public void findSelectors(Page page, Integer timeout, Boolean ignore, SelectItem.SelectCallBack timeoutBack, SelectItem... selectItems) {
WaitForSelectorOptions options = new WaitForSelectorOptions();
options.setTimeout(timeout);
// 100ms
int interval = 100;
for (int i = 0; i < timeout; i += interval) {
for (SelectItem selectItem : selectItems) {
boolean flag = false;
try {
flag = selectItem.getPagePredicate().test(page, selectItem);
} catch (Exception e) {
if (ignore)
log.debug("ignore exception", e);
else
throw e;
}
if (flag) {
boolean isContinue = selectItem.getCallback().run();
if (!isContinue) {
return;
}
}
}
TimeUnit.MILLISECONDS.sleep(interval);
}
if (timeoutBack != null) {
timeoutBack.run();
}
}
Aggregations