首页 > 解决方案 > 如何禁用 Gmail Api guava 20

问题描述

我实现了 Gmail API 以从电子邮件中获取一些确认令牌。当您从 git 运行“Gradle run”命令时,会自动使用 Gmail Api 来访问这个 guava 依赖项 guava 20,但是这种依赖项给我带来了一些问题,所以我必须添加 guava 25。

现在我想禁用旧的番石榴依赖 > 但我不知道怎么做。我已经尝试了 Stackoverflow 的所有已知解决方案,但没有任何帮助。最后,我直接从文件夹中删除了该依赖项,但现在我的代码无法编译,所以我不知道该怎么做。

图片1 邮件接口

package GmailAPIPackage;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.StringUtils;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.gmail.model.Label;
import com.google.api.services.gmail.model.ListLabelsResponse;
import com.google.api.services.gmail.model.ListMessagesResponse;
import com.google.api.services.gmail.model.Message;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class GmailQuickstart {

private static final String APPLICATION_NAME = "Gmail API Java Quickstart";

private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

private static final String TOKENS_DIRECTORY_PATH = "tokens";

/**
* Global instance of the scopes required by this quickstart.
* If modifying these scopes, delete your previously saved tokens/ folder.
*/

private static final List<String> SCOPES = Collections.singletonList(GmailScopes.GMAIL_MODIFY);

private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

/**
* Creates an authorized Credential object.
* @param HTTP_TRANSPORT The network HTTP Transport.
* @return An authorized Credential object.
* @throws IOException If the credentials.json file cannot be found.
*/

private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {

// Load client secrets.

InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);

if (in == null) {
throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}

GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

// Build flow and trigger user authorization request.

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))

.setAccessType("offline")
.build();

LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}

public static void getToken() throws GeneralSecurityException, IOException {

// Build a new authorized API client service.

final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)

.build();

// Print the labels in the user's account.

String user = "me";

ListLabelsResponse listResponse = service.users().labels().list(user).execute();
List<Label> labels = listResponse.getLabels();

if (labels.isEmpty()) {

System.out.println("No labels found.");

} else {

System.out.println("Labels:");

for (Label label: labels) {

System.out.printf("- %s\n", label.getName());

}
}

// Access Gmail inbox

Gmail.Users.Messages.List request = service.users().messages().list(user).setQ("from: " + "notification@casinosieger.com");

ListMessagesResponse messagesResponse = request.execute();

request.setPageToken(messagesResponse.getNextPageToken());

        // Get ID of the email you are looking for
        String messageId = messagesResponse.getMessages().get(0).getId();

        Message message = service.users().messages().get(user, messageId).execute();
        
        

        // Print email body

        String emailBody = StringUtils
                .newStringUtf8(Base64.decodeBase64(message.getPayload().getParts().get(0).getParts().get(1).getBody().getData()));

        System.out.println("Email body : " + emailBody);   
}
}

RegFirstCase 主类

package GmailAPIPackage;
import java.io.IOException;
import org.openqa.selenium.JavascriptExecutor;
import java.security.GeneralSecurityException;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.WebDriverWait;
import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.StringUtils;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.model.ListMessagesResponse;
import com.google.api.services.gmail.model.Message;

public class RegFirstCase extends GmailQuickstart{
    
public static void main(String[] args) throws GeneralSecurityException, IOException, InterruptedException {
    
System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Selenium\\selenium-java-3.141.59\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https:\\www.casinosieger.com\\en\\register");
driver.manage().window().maximize();

int i = ThreadLocalRandom.current().nextInt(100000, 1000000);

driver.findElement(By.id("username")).sendKeys("Stefan" + i);
driver.findElement(By.id("email")).sendKeys("stefan.t+" +i+ "@condor-gaming.com");
driver.findElement(By.id("password")).sendKeys("Gordana1994");

Actions act =  new Actions(driver);
act.moveToElement(driver.findElement(By.id("terms"))).click().perform();

driver.findElement(By.id("is_of_legal_age")).click();
driver.findElement(By.id("register")).click();

Thread.sleep(5000);

GmailQuickstart.getToken();
System.out.println("Stigao dovde");
Pattern p = Pattern.compile("(https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([[\\w+,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?(token)(\\=)([^\"]+)");  
Matcher m = p.matcher("token=(.*)");  
boolean b = m.matches();  
System.out.println(b);


}
}

摇篮文件

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'GmailQuickstart'
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = '1.0'

repositories {
    mavenCentral()
    google()
}

dependencies {
    implementation 'com.google.api-client:google-api-client:1.24.1'
    implementation 'com.google.oauth-client:google-oauth-client-jetty:1.24.1'
    implementation 'com.google.apis:google-api-services-gmail:v1-rev95-1.24.1'
}
configurations.all {
    exclude group: 'com.google.guava:guava-jdk5:20.0' , module: 'guava-jdk5'
}

未直接从文件夹中删除 guava 20 时的错误消息:

Exception in thread "main" java.lang.NoSuchMethodError: 'com.google.common.util.concurrent.SimpleTimeLimiter com.google.common.util.concurrent.SimpleTimeLimiter.create(java.util.concurrent.ExecutorService)'
    at org.openqa.selenium.net.UrlChecker.<init>(UrlChecker.java:62)
    at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:197)
    at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:188)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:79)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:213)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
    at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:181)
    at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:168)
    at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:123)
    at GmailAPIPackage.RegFirstCase.main(RegFirstCase.java:33)

运行 gradle 依赖项后的错误消息:

C:\Users\Stefan.T\Desktop\GmailApi>gradle dependencies
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\Stefan.T\Desktop\GmailApi\build.gradle' line: 14

* What went wrong:
A problem occurred evaluating root project 'GmailApi'.
> Could not find method compile() for arguments [com.google.api-client:google-api-client:1.23.0] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 27s

C:\Users\Stefan.T\Desktop\GmailApi>
   

在此处输入图像描述

标签: gradlegmailgmail-apiguava

解决方案


我已经找到了一个解决方案,我从头开始创建了一个新的 Gradle 项目(不是通过 Gmail 说明从这里:https ://developers.google.com/gmail/api/quickstart/java#prerequisites 现在一切都按预期工作. 我只是想补充一点,我不明白为什么 Gmail 没有更新他们的说明(他们使用了很多不是最新的东西),因此我们正在失去神经:D


推荐阅读