Как получить OTP и постоянное использование Java?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как получить OTP и постоянное использование Java?

Сообщение Anonymous »

У меня проблема: система считывает именно последнее письмо, а не только что полученное, поэтому при использовании этого OTP с «истёкшим сроком действия» возникает ошибка. Работаю только с Thread.sleep, и я не знаю, как избежать этого Thread.sleep и заменить его некоторым ожиданием.
Вот версия, которая работает правильно, но с Thread.sleep.
public class GmailAPI {
public static final String CREDENTIALS_FILE_PATH = "src/resources/credentials.json";
private static final String APPLICATION_NAME = "triodos_email";
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
private static final String USER_ID = "me"; //current emailId
private static final Logger log = LogManager.getLogger(GmailAPI.class);
static Gmail service = null;

public static String getOTPFromInbox() throws InterruptedException {
Thread.sleep(5000);
ListMessagesResponse listOfMessages = GmailAPI.getListOfMessages(CREDENTIALS_FILE_PATH);
Message firstEmailInList = GmailAPI.getParticularMessageFromListMessagesResponseBy(0, listOfMessages);
return GmailAPI.getOTPFromMessageSnippet(Objects.requireNonNull(firstEmailInList));
}

public static GoogleCredentials getGoogleCredentials() throws IOException {
try (InputStream credentialsStream = new FileInputStream(CREDENTIALS_FILE_PATH)) {
GoogleCredentials credentials = GoogleCredentials.fromStream(credentialsStream)
.createScoped(Arrays.asList("https://www.googleapis.com/auth/gmail.modify"));
return credentials;
}
}

public static ListMessagesResponse getListOfMessages(String credentialsFilePath) {
log.info(String.format("Reading Gmail API credentials from: %s", credentialsFilePath));
try {
GoogleCredentials credentials = getGoogleCredentials();
HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);

final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
.setApplicationName(APPLICATION_NAME)
.build();

log.info("Getting list of messages from Gmail inbox...");
Gmail.Users.Messages.List list = service.users().messages().list(USER_ID);
ListMessagesResponse listMessagesResponse = list.execute();
if (listMessagesResponse.getMessages().size() == 0) {
log.error("Empty list of messages. Check GmailAPI.getListOfMessages()");
throw new IllegalArgumentException();
}
return listMessagesResponse;
} catch (IOException | GeneralSecurityException e) {
log.error(String.format("Exception was thrown in GmailAPI.getListOfMessages(): %s", e));
return null;
}
}

public static Message getParticularMessageFromListMessagesResponseBy(Integer messageSequenceNumber, ListMessagesResponse listOfMessages) {
String messageId = listOfMessages.getMessages().get(messageSequenceNumber).getId();
try {
log.info(String.format("Getting %d message from the ...", messageSequenceNumber));
Message message = service.users().messages().get(USER_ID, messageId).execute();
return message;
} catch (IOException e) {
log.error(String.format("IOException was thrown in GmailAPI.getParticularMessageFromListMessagesResponse(): %s", e));
return null;
}
}

public static String getOTPFromMessageSnippet(Message message) {
String regEx = ":";
log.info("Getting OTP from message snippet...");
log.info(String.format("Splitting email body snippet string by '%s'", regEx));
//check validity of OTP (if it contains letters or not enough digits)
String body = StringUtils.newStringUtf8(Base64.decodeBase64(message.getPayload().getParts().get(0).getParts().get(0).getBody().getData()));
Document doc = Jsoup.parse(body);
Elements otpElements = doc.select(".email-otp strong");
String otp = otpElements.text();
if (otp.length() != 6 || !otp.matches("\\d+")) {
log.error(String.format("Provided OTP invalid and contains either letters or short digits sequence: %s", otp));
log.error("Check GmailAPI.getOTPFromMessageSnippet() method ");
throw new IllegalArgumentException();
}
return otp;
}
}


Подробнее здесь: https://stackoverflow.com/questions/785 ... usage-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»