packageorg.rx.service.media;importio.netty.channel.Channel;importio.netty.handler.codec.http.HttpHeaderNames;importio.netty.handler.codec.http.HttpRequest;importio.netty.handler.codec.http.HttpResponse;importlombok.SneakyThrows;importlombok.extern.slf4j.Slf4j;importorg.rx.core.util.ImageUtil;importorg.rx.bot.util.AwtBot;importorg.rx.common.Disposable;importorg.rx.common.InvalidOperationException;importorg.rx.socks.http.HttpClient;importorg.rx.socks.proxyee.intercept.HttpProxyIntercept;importorg.rx.socks.proxyee.intercept.HttpProxyInterceptInitializer;importorg.rx.socks.proxyee.intercept.HttpProxyInterceptPipeline;importorg.rx.socks.proxyee.server.HttpProxyServer;importorg.rx.socks.proxyee.server.HttpProxyServerConfig;importorg.rx.util.ManualResetEvent;import java.awt.*;importjava.awt.image.BufferedImage;import staticorg.rx.util.AsyncTask.TaskFactory;/*** helper = new JdLoginBot(config.getJd().getLoginPort());
* while (caller.getCurrentUrl().equals(loginUrl)) {
* try {
* String key = helper.produceKey();
* log.info("produce key {}", key);
* caller.navigateUrl(key, BodySelector);
* log.info("consume key {}", caller.getCurrentUrl());
*
* Thread.sleep(2000);
* } catch (Exception e) {
* log.error("login", e);
* }
* }*/@Deprecated
@Slf4jpublic final class JdLoginBot extendsDisposable {private static finalBufferedImage jdKey;static{
Class owner= JdLoginBot.class;
jdKey= ImageUtil.getImageFromResource(owner, "/bot/jdKey.png");
}privateString loginKey;privateManualResetEvent waiter;privateAwtBot bot;privatePoint lastPoint;privateHttpProxyServer proxyServer;public JdLoginBot(intport) {
waiter= newManualResetEvent();
bot=AwtBot.getBot();
TaskFactory.run(()->listen(port));
}
@Overrideprotected voidfreeObjects() {
proxyServer.close();
}private void listen(intport) {
HttpProxyServerConfig config= newHttpProxyServerConfig();
config.setHandleSsl(true);
proxyServer= newHttpProxyServer().serverConfig(config)
.proxyInterceptInitializer(newHttpProxyInterceptInitializer() {
@Overridepublic voidinit(HttpProxyInterceptPipeline pipeline) {
pipeline.addLast(newHttpProxyIntercept() {
@Overridepublic void beforeRequest(Channel clientChannel, HttpRequest httpRequest, HttpProxyInterceptPipeline pipeline) throwsException {
String host=httpRequest.headers().get(HttpHeaderNames.HOST);
String s=httpRequest.headers().get(HttpHeaderNames.COOKIE);
System.out.println("[rxcookie]: " +s);if (host != null) {
String url;if (httpRequest.uri().indexOf("/") == 0) {if (httpRequest.uri().length() > 1) {
url= host +httpRequest.uri();
}else{
url=host;
}
}else{
url=httpRequest.uri();
}
log.info("Request: {}", url);if (url.startsWith("passport.jd.com/uc/nplogin?")) {
log.info("JdLoginBot detect {}", url);
loginKey= "http://" +url;
waiter.set();
Thread.sleep(3000);
clientChannel.close();return;
}
}
httpRequest.headers().set(HttpHeaderNames.USER_AGENT, HttpClient.IE_UserAgent);
pipeline.beforeRequest(clientChannel, httpRequest);
}
@Overridepublic void afterResponse(Channel clientChannel, Channel proxyChannel, HttpResponse httpResponse, HttpProxyInterceptPipeline pipeline) throwsException {
httpResponse.headers().add("intercept", "rxProxy");
pipeline.afterResponse(clientChannel, proxyChannel, httpResponse);
}
});
}
});
proxyServer.start(port);
}
@SneakyThrowspublic synchronizedString produceKey() {try{
lastPoint=bot.clickByImage(jdKey);
log.info("step1 clickByImage ok");
}catch(InvalidOperationException e) {if (lastPoint != null) {
bot.mouseLeftClick(lastPoint);
log.info("step1 retry clickByImage {} ok", lastPoint);
}else{throwe;
}
}
waiter.waitOne(6 * 1000);
waiter.reset();
log.info("step2 wait proxy callback");try{
log.info("step2 get key {}", loginKey);if (loginKey == null) {throw new InvalidOperationException("produce empty key");
}returnloginKey;
}finally{
loginKey= null;
TaskFactory.scheduleOnce(()->{
log.info("step3 try close it");//bot.saveScreen();
int y = (int) bot.getScreenRectangle().getHeight();
bot.clickAndAltF4(218, y - 20);
log.info("step3 closed it");
},2 * 1000);
}
}
}