У меня проблема: система считывает именно последнее письмо, а не только что полученное, поэтому при использовании этого 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
Как получить OTP и постоянное использование Java? ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1719063697
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;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78527719/how-to-receive-otp-and-continuous-usage-java[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия