2
0
mirror of https://gitee.com/hotlcc/wechat4j.git synced 2025-06-08 19:44:07 +08:00

提交代码

This commit is contained in:
hotlcc 2018-08-15 15:42:38 +08:00
parent a0f2ccc9d2
commit d71d34b01b

View File

@ -28,8 +28,7 @@ import org.slf4j.LoggerFactory;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.PrintWriter;
import java.io.PrintStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -183,24 +182,24 @@ public class Wechat {
/** /**
* 获取uuid登录时 * 获取uuid登录时
* *
* @param ps * @param pw
* @param time * @param time
* @return * @return
*/ */
private String getWxUuid(PrintStream ps, int time) { private String getWxUuid(PrintWriter pw, int time) {
ps.print("尝试正常方式获取uuid..."); pw.print("尝试正常方式获取uuid...");
ps.flush(); pw.flush();
for (int i = 0; i <= time; i++) { for (int i = 0; i <= time; i++) {
if (i > 0) { if (i > 0) {
ps.print("\t第" + i + "次尝试..."); pw.print("\t第" + i + "次尝试...");
ps.flush(); pw.flush();
} }
JSONObject result = webWeixinApi.getWxUuid(httpClient); JSONObject result = webWeixinApi.getWxUuid(httpClient);
if (result == null) { if (result == null) {
ps.println("\t失败出现异常"); pw.println("\t失败出现异常");
ps.flush(); pw.flush();
return null; return null;
} }
@ -208,23 +207,23 @@ public class Wechat {
String uuid = result.getString("uuid"); String uuid = result.getString("uuid");
if (!"200".equals(code)) { if (!"200".equals(code)) {
String msg = result.getString("msg"); String msg = result.getString("msg");
ps.println("\t失败" + msg); pw.println("\t失败" + msg);
ps.flush(); pw.flush();
return null; return null;
} }
if (StringUtil.isEmpty(uuid)) { if (StringUtil.isEmpty(uuid)) {
ps.print("\t失败"); pw.print("\t失败");
if (i == 0 && time > 0) { if (i == 0 && time > 0) {
ps.print(",将重复尝试" + time + ""); pw.print(",将重复尝试" + time + "");
} }
ps.println(); pw.println();
ps.flush(); pw.flush();
continue; continue;
} }
ps.println("\t成功值为" + uuid); pw.println("\t成功值为" + uuid);
ps.flush(); pw.flush();
return uuid; return uuid;
} }
return null; return null;
@ -235,35 +234,35 @@ public class Wechat {
* *
* @return * @return
*/ */
private boolean getAndShowQRCode(PrintStream ps, String uuid, int time) { private boolean getAndShowQRCode(PrintWriter pw, String uuid, int time) {
ps.print("获取二维码..."); pw.print("获取二维码...");
ps.flush(); pw.flush();
for (int i = 0; i <= time; i++) { for (int i = 0; i <= time; i++) {
if (i > 0) { if (i > 0) {
ps.print("\t第" + i + "次尝试..."); pw.print("\t第" + i + "次尝试...");
ps.flush(); pw.flush();
} }
byte[] data = webWeixinApi.getQR(httpClient, uuid); byte[] data = webWeixinApi.getQR(httpClient, uuid);
if (data == null || data.length <= 0) { if (data == null || data.length <= 0) {
ps.print("\t失败"); pw.print("\t失败");
if (i == 0 && time > 0) { if (i == 0 && time > 0) {
ps.print("将重新获取uuid并重复尝试" + time + ""); pw.print("将重新获取uuid并重复尝试" + time + "");
} }
ps.println(); pw.println();
ps.flush(); pw.flush();
getWxUuid(ps, 0); getWxUuid(pw, 0);
CommonUtil.threadSleep(2000); CommonUtil.threadSleep(2000);
continue; continue;
} }
ps.println("\t成功请扫描二维码"); pw.println("\t成功请扫描二维码");
ps.flush(); pw.flush();
ps.println(QRCodeUtil.toCharMatrix(data)); pw.println(QRCodeUtil.toCharMatrix(data));
ps.flush(); pw.flush();
QRCodeUtil.openQRCodeImage(data); QRCodeUtil.openQRCodeImage(data);
return true; return true;
} }
@ -276,39 +275,39 @@ public class Wechat {
* *
* @return * @return
*/ */
private JSONObject waitForConfirm(PrintStream ps, String uuid) { private JSONObject waitForConfirm(PrintWriter pw, String uuid) {
ps.print("等待手机端扫码..."); pw.print("等待手机端扫码...");
ps.flush(); pw.flush();
boolean flag = false; boolean flag = false;
while (true) { while (true) {
JSONObject result = webWeixinApi.getRedirectUri(httpClient, LoginTipEnum.TIP_0, uuid); JSONObject result = webWeixinApi.getRedirectUri(httpClient, LoginTipEnum.TIP_0, uuid);
if (result == null) { if (result == null) {
ps.println("\t失败出现异常"); pw.println("\t失败出现异常");
ps.flush(); pw.flush();
return null; return null;
} }
String code = result.getString("code"); String code = result.getString("code");
if ("408".equals(code)) { if ("408".equals(code)) {
ps.print("."); pw.print(".");
ps.flush(); pw.flush();
continue; continue;
} else if ("400".equals(code)) { } else if ("400".equals(code)) {
ps.println("\t失败二维码失效"); pw.println("\t失败二维码失效");
ps.flush(); pw.flush();
return null; return null;
} else if ("201".equals(code)) { } else if ("201".equals(code)) {
if (!flag) { if (!flag) {
ps.println(); pw.println();
ps.print("请确认登录..."); pw.print("请确认登录...");
ps.flush(); pw.flush();
flag = true; flag = true;
} }
continue; continue;
} else if ("200".equals(code)) { } else if ("200".equals(code)) {
ps.println("\t成功认证完成"); pw.println("\t成功认证完成");
ps.flush(); pw.flush();
return result; return result;
} else { } else {
return null; return null;
@ -319,21 +318,21 @@ public class Wechat {
/** /**
* 获取登录认证码登录时 * 获取登录认证码登录时
*/ */
private boolean getLoginCode(PrintStream ps, String redirectUri) { private boolean getLoginCode(PrintWriter pw, String redirectUri) {
ps.print("获取登录认证码..."); pw.print("获取登录认证码...");
ps.flush(); pw.flush();
JSONObject result = webWeixinApi.getLoginCode(httpClient, redirectUri); JSONObject result = webWeixinApi.getLoginCode(httpClient, redirectUri);
if (result == null) { if (result == null) {
ps.println("\t失败出现异常"); pw.println("\t失败出现异常");
ps.flush(); pw.flush();
return false; return false;
} }
String ret = result.getString("ret"); String ret = result.getString("ret");
if (!"0".equals(ret)) { if (!"0".equals(ret)) {
ps.println("\t失败错误的返回码(" + ret + ")"); pw.println("\t失败错误的返回码(" + ret + ")");
ps.flush(); pw.flush();
return false; return false;
} }
@ -342,8 +341,8 @@ public class Wechat {
skey = result.getString("skey"); skey = result.getString("skey");
wxuin = result.getString("wxuin"); wxuin = result.getString("wxuin");
ps.println("\t成功"); pw.println("\t成功");
ps.flush(); pw.flush();
return true; return true;
} }
@ -351,37 +350,37 @@ public class Wechat {
/** /**
* push方式获取uuid登录时 * push方式获取uuid登录时
* *
* @param ps * @param pw
* @param wxuin * @param wxuin
* @return * @return
*/ */
private String getWxUuid(PrintStream ps, String wxuin) { private String getWxUuid(PrintWriter pw, String wxuin) {
ps.print("尝试push方式获取uuid..."); pw.print("尝试push方式获取uuid...");
ps.flush(); pw.flush();
JSONObject result = webWeixinApi.pushLogin(httpClient, urlVersion, wxuin); JSONObject result = webWeixinApi.pushLogin(httpClient, urlVersion, wxuin);
if (result == null) { if (result == null) {
ps.println("\t失败出现异常"); pw.println("\t失败出现异常");
ps.flush(); pw.flush();
return null; return null;
} }
String ret = result.getString("ret"); String ret = result.getString("ret");
if (!"0".equals(ret)) { if (!"0".equals(ret)) {
ps.println("\t失败错误的返回码(" + ret + ")"); pw.println("\t失败错误的返回码(" + ret + ")");
ps.flush(); pw.flush();
return null; return null;
} }
String uuid = result.getString("uuid"); String uuid = result.getString("uuid");
if (StringUtil.isEmpty(uuid)) { if (StringUtil.isEmpty(uuid)) {
ps.println("\t失败空值"); pw.println("\t失败空值");
ps.flush(); pw.flush();
return null; return null;
} }
ps.println("\t成功值为" + uuid); pw.println("\t成功值为" + uuid);
ps.flush(); pw.flush();
return uuid; return uuid;
} }
@ -418,30 +417,30 @@ public class Wechat {
* *
* @return * @return
*/ */
private boolean wxInitWithRetry(PrintStream ps, int time) { private boolean wxInitWithRetry(PrintWriter pw, int time) {
ps.print("正在初始化数据..."); pw.print("正在初始化数据...");
ps.flush(); pw.flush();
for (int i = 0; i <= time; i++) { for (int i = 0; i <= time; i++) {
if (i > 0) { if (i > 0) {
ps.print("\t第" + i + "次尝试..."); pw.print("\t第" + i + "次尝试...");
ps.flush(); pw.flush();
} }
if (!wxInit()) { if (!wxInit()) {
ps.print("\t失败"); pw.print("\t失败");
if (i == 0 && time > 0) { if (i == 0 && time > 0) {
ps.print(",将重复尝试" + time + ""); pw.print(",将重复尝试" + time + "");
} }
ps.println(); pw.println();
ps.flush(); pw.flush();
CommonUtil.threadSleep(2000); CommonUtil.threadSleep(2000);
continue; continue;
} }
ps.println("\t成功"); pw.println("\t成功");
ps.flush(); pw.flush();
return true; return true;
} }
@ -480,18 +479,15 @@ public class Wechat {
/** /**
* 自动登录 * 自动登录
*/ */
public boolean autoLogin(OutputStream os, boolean tryPushLogin) { public boolean autoLogin(PrintWriter pw, boolean tryPushLogin) {
// 0获取消息打印流 // 0获取消息打印流
PrintStream ps = null; if (pw == null) {
if (os != null) { pw = new PrintWriter(System.out);
ps = new PrintStream(os);
} else {
ps = System.out;
} }
// 1判断是否已经登录 // 1判断是否已经登录
if (isOnline) { if (isOnline) {
ps.println("当前已是登录状态,无需登录"); pw.println("当前已是登录状态,无需登录");
return true; return true;
} }
@ -502,45 +498,45 @@ public class Wechat {
// 2.1获取uuid // 2.1获取uuid
String uuid = null; String uuid = null;
if (tryPushLogin && StringUtil.isNotEmpty(wxuin)) { if (tryPushLogin && StringUtil.isNotEmpty(wxuin)) {
uuid = getWxUuid(ps, wxuin); uuid = getWxUuid(pw, wxuin);
} }
if (StringUtil.isEmpty(uuid)) { if (StringUtil.isEmpty(uuid)) {
uuid = getWxUuid(ps, time); uuid = getWxUuid(pw, time);
} }
if (StringUtil.isEmpty(uuid)) { if (StringUtil.isEmpty(uuid)) {
ps.println("无法获取uuid登录不成功"); pw.println("无法获取uuid登录不成功");
ps.flush(); pw.flush();
return false; return false;
} }
// 2.2获取并显示二维码 // 2.2获取并显示二维码
if (!getAndShowQRCode(ps, uuid, time)) { if (!getAndShowQRCode(pw, uuid, time)) {
ps.println("无法获取二维码,登录不成功"); pw.println("无法获取二维码,登录不成功");
ps.flush(); pw.flush();
return false; return false;
} }
// 2.3等待确认 // 2.3等待确认
result = waitForConfirm(ps, uuid); result = waitForConfirm(pw, uuid);
if (result == null) { if (result == null) {
ps.println("手机端认证失败,登录不成功"); pw.println("手机端认证失败,登录不成功");
ps.flush(); pw.flush();
return false; return false;
} }
urlVersion = result.getString("urlVersion"); urlVersion = result.getString("urlVersion");
// 2.4获取登录认证码 // 2.4获取登录认证码
if (!getLoginCode(ps, result.getString("redirectUri"))) { if (!getLoginCode(pw, result.getString("redirectUri"))) {
ps.println("无法获取登录认证码,登录不成功"); pw.println("无法获取登录认证码,登录不成功");
ps.flush(); pw.flush();
return false; return false;
} }
// 3初始化数据 // 3初始化数据
if (!wxInitWithRetry(ps, time)) { if (!wxInitWithRetry(pw, time)) {
ps.println("初始化数据失败,请重新登录"); pw.println("初始化数据失败,请重新登录");
ps.flush(); pw.flush();
return false; return false;
} }
ps.println("微信登录成功,欢迎你:" + getLoginUserNickName(false)); pw.println("微信登录成功,欢迎你:" + getLoginUserNickName(false));
ps.flush(); pw.flush();
try { try {
isOnlineLock.lock(); isOnlineLock.lock();