提问人:Michael 提问时间:9/4/2023 最后编辑:Michael 更新时间:9/4/2023 访问量:75
为什么我的无限重复的 selenium java 代码有内存泄漏?
Why does my infinitely repeating selenium java code have memory leak?
问:
我创建了一个程序,可以自动执行公司的工作。我打开了 3 个 Chrome 选项卡,使用 giris1ActionPerformed 方法登录了 3 个不同的银行。在手动输入公司电话的 OTP 后,我使用 giris2ActionPerformed 方法导航到每家银行的帐户活动页面。
在此之后,我使用 baslaActionPerformed 方法开始我的无限重复循环,我逐一前往每家银行,找到新到账的付款,并将它们写入 Google 电子表格页面。执行此操作后,我等待 30 秒并重复该过程。
该程序可以正常工作,但存在内存泄漏。在具有 16 GB 内存的笔记本电脑中,此程序持续 5 小时。随着时间的流逝,它消耗的RAM越来越多。最后,它崩溃了。
我在 basla 方法中确实有一个线程,但我认为这不会导致内存泄漏。因为我不会继续创建新线程。我只有一个线程。在那个线程中,我有一个无限循环。
我熟悉调试,但不熟悉分析软件项目。使用 Netbeans IDE 的配置文件工具是否有助于查找内存泄漏?
为了保护隐私,我用“XXX”替换了银行密码和谷歌表格 ID。
package bankaotomasyonu;
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.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.ValueRange;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.chrome.ChromeDriver;
public class ControlPanel extends javax.swing.JFrame
{
private WebDriver driver;
private String ziraatHandle;
private String isHandle;
private String garantiHandle;
private Sheets service;
private float satisFiyatiDakika = 0.06667F;
private float satisFiyati = 10;
private float alisFiyati = 14;
private final String APPLICATION_NAME = "Bank Automation";
private final String CREDENTIALS_FILE_PATH = "/credentialsClient1.json";
private final String TOKENS_DIRECTORY_PATH = "tokens";
private final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);
public ControlPanel()
{
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents()
{
giris1 = new javax.swing.JButton();
giris2 = new javax.swing.JButton();
basla = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
errorScreen = new javax.swing.JTextPane();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Ertürkler Banka");
giris1.setText("Giriş 1");
giris1.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
giris1ActionPerformed(evt);
}
});
giris2.setText("Giriş 2");
giris2.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
giris2ActionPerformed(evt);
}
});
basla.setText("Başla");
basla.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
baslaActionPerformed(evt);
}
});
jScrollPane2.setViewportView(errorScreen);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(20, 20, 20)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addComponent(giris1)
.addGap(18, 18, 18)
.addComponent(giris2)
.addGap(18, 18, 18)
.addComponent(basla)
.addGap(0, 335, Short.MAX_VALUE)))
.addGap(20, 20, 20))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(20, 20, 20)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(giris1)
.addComponent(basla)
.addComponent(giris2))
.addGap(20, 20, 20)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 204, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(20, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void giris1ActionPerformed(java.awt.event.ActionEvent evt)
{
System.setProperty("webdriver.chrome.driver", "C:\\Banka Otomasyon\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
// Ziraat Bankası
driver.get("https://kurumsal.ziraatbank.com.tr/Transactions/Login/FirstLogin.aspx?customertype=crp");
driver.findElement(By.id("ctl00_c_CorporateIdentityTextBox")).sendKeys("XXX");
driver.findElement(By.id("ctl00_c_CorporatePinTextBox")).sendKeys("XXX"); // 3/6 Ayda bir değişen
driver.findElement(By.id("ctl00_c_CorporateUserNameTextBox")).sendKeys("XXX");
driver.findElement(By.id("ctl00_c_CorporateLoginButton")).click();
ziraatHandle = driver.getWindowHandle();
// İş Bankası
driver.switchTo().newWindow(WindowType.TAB);
driver.get("https://www.isbank.com.tr/TicariInternet/Transactions/Login/FirstLogin.aspx");
driver.findElement(By.id("CustomerNumberTextBox")).sendKeys("XXX");
driver.findElement(By.id("CorporateCustomerNumberTextbox")).sendKeys("XXX");
driver.findElement(By.id("PinTextBox")).sendKeys("XXX"); // 3/6 Ayda bir değişen
driver.findElement(By.id("ctl00_t_NextButton")).click();
isHandle = driver.getWindowHandle();
// Garanti Bankası
driver.switchTo().newWindow(WindowType.TAB);
driver.get("https://sube.garantibbva.com.tr/isube/login/login/passwordentrycorporate-tr");
driver.findElement(By.id("custno")).sendKeys("XXX");
driver.findElement(By.id("password")).sendKeys("XXX"); // 3/6 Ayda bir değişen
driver.findElement(By.id("userid")).sendKeys("XXX");
driver.findElement(By.id("formSubmit")).click();
garantiHandle = driver.getWindowHandle();
}
private void giris2ActionPerformed(java.awt.event.ActionEvent evt)
{
try
{
// Ziraat Bankası - Vadesiz Hesaplarım
driver.switchTo().window(ziraatHandle);
driver.switchTo().frame("mainFrame");
driver.findElement(By.xpath("/html/body/form/div[3]/div[2]/div[1]/"
+ "section[1]/div[2]/div[1]/div[1]/div/a")).click();
Thread.sleep(1000);
// 5013 NOLU HESAP
driver.switchTo().frame("iframe1");
driver.findElement(By.id("ctl00_c_GridDemandDeposit_AccountListSelector"
+ "_ctl11_ctl03_AccountName2Panel")).click();
Thread.sleep(1000);
// Hesap hareketleri
driver.switchTo().frame("mainFrame");
driver.findElement(By.id("ctl00_c_AccountHistoryButton")).click();
// İş Bankası - Hesaplar
driver.switchTo().window(isHandle);
driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/div[3]/div[2]/"
+ "div[1]/div[1]/div[1]")).click();
// Hesaplarım
driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/div[3]"
+ "/div[2]/div[1]/div[1]/div[1]/div[2]/div[1]/div")).click();
Thread.sleep(1000);
// Hesap Hareketleri
driver.findElement(By.cssSelector("#MenuEntityList_tutorialElement_actions"
+ " > div:nth-child(3) > div")).click();
// Garanti Bankası - Hesap ve Ürün
driver.switchTo().window(garantiHandle);
driver.findElement(By.id("primary1")).click();
// Hesap
driver.findElement(By.cssSelector("#primaryLi1 > ul > li:nth-child(1) > a")).click();
Thread.sleep(1000);
// Dönem
driver.findElement(By.cssSelector("#dateRangeText > div > div > div > div > div > div")).click();
Thread.sleep(1000);
// Son 7 gün
driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[4]/div/div/div/"
+ "div/div[3]/div[2]/div[4]/div/div[2]/div/div[2]/div[2]/div[1]/div[2]/"
+ "div/form/div[1]/div/div[1]/div[1]/div/div/div/div/div/ul/li[3]/a")).click();
Thread.sleep(1000);
// Görüntüle
driver.findElement(By.id("updateSubmitButton")).click();
}
catch (Exception e)
{
//System.out.println(e);
//e.printStackTrace();
showError("GIRIS 2", e.toString());
}
}
private void baslaActionPerformed(java.awt.event.ActionEvent evt)
{
try
{
final HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
service = new Sheets.Builder(httpTransport, JSON_FACTORY, getCredentials(httpTransport))
.setApplicationName(APPLICATION_NAME).build();
new Thread(new Runnable()
{
@Override
public void run()
{
while (true)
{
try
{
driver.switchTo().window(ziraatHandle);
ziraatBank();
driver.switchTo().window(isHandle);
isBank();
driver.switchTo().window(garantiHandle);
garantiBank();
Thread.sleep(30000);
}
catch (Exception e)
{
//System.out.println(e);
//e.printStackTrace();
showError("BASLA 2", e.toString());
}
}
}
}).start();
}
catch (Exception e)
{
//System.out.println(e);
//e.printStackTrace();
showError("BASLA 1", e.toString());
}
}
void ziraatBank() throws IOException, GeneralSecurityException, InterruptedException
{
List<Object> lastCustomer;
String lastAciklama;
String lastAmount;
ArrayList<String> aciklamaList = new ArrayList<>();
String aciklama;
String amountString = "0";
String customerName = "";
String dekontText;
String[] dekontTextArray;
// Hesap Hareketlerini Güncelle 1
driver.switchTo().frame("iframe1");
boolean successfullRead = false;
while (!successfullRead)
{
try
{
driver.findElement(By.cssSelector("#ctl00_InnerContentWrapperPanel > a")).click();
successfullRead = true;
}
catch (Exception e)
{
}
}
successfullRead = false;
// Hesap Hareketlerini Güncelle 2
while (!successfullRead)
{
try
{
driver.switchTo().frame("mainFrame");
successfullRead = true;
}
catch (Exception e)
{
}
}
successfullRead = false;
for (short row = 1; row <= 3; row++)
{
if ("MALTEPE E5 - 5013".equals(driver.findElement(By.cssSelector("#ctl00_c_AccountBoxSelector_AccountListSelector_ctl11 "
+ "> tbody > tr:nth-child(" + row + ") > td.firstColumn > div:nth-child(1)")).getText()))
{
driver.findElement(By.cssSelector("#ctl00_c_AccountBoxSelector_AccountListSelector_ctl11 "
+ "> tbody > tr:nth-child(" + row + ") > td.firstColumn > div:nth-child(1)")).click();
break;
}
}
while (!successfullRead)
{
try
{
driver.switchTo().frame("iframe1");
successfullRead = true;
}
catch (Exception e)
{
}
}
// Find which row is the last customer
lastCustomer = readLastCustomer("A1:B1");
lastAciklama = lastCustomer.get(0).toString();
lastAmount = lastCustomer.get(1).toString();
short rowNumber = 0;
do
{
rowNumber++;
successfullRead = false;
while (!successfullRead)
{
try
{
aciklamaList.add(driver.findElement(By.cssSelector("#ctl00_c_GridAccountHistoryList"
+ " > tbody > tr:nth-child(" + rowNumber + ") > td.description")).getText());
amountString = driver.findElement(By.xpath("/html/body/form/"
+ "div[3]/div[3]/div[3]/div[1]/div/div[3]/div[2]/div[2]/div/div/"
+ "table/tbody/tr[" + rowNumber + "]/td[4]")).getText();
successfullRead = true;
}
catch (Exception e)
{
}
}
} while (!((lastAciklama.equals(aciklamaList.get(rowNumber - 1))) && (lastAmount.equals(amountString))));
// If last row is the last customer, quit
if (rowNumber != 1)
{
// Process new customers (the ones after the last customer)
do
{
rowNumber--;
aciklama = aciklamaList.get(rowNumber - 1);
// Date
String date = driver.findElement(By.cssSelector("#ctl00_c_GridAccountHistoryList >"
+ " tbody > tr:nth-child(" + rowNumber + ") > td.firstColumn.nowrap.date")).
getText().replace("/", ".");
// Amount
amountString = driver.findElement(By.xpath("/html/body/form/"
+ "div[3]/div[3]/div[3]/div[1]/div/div[3]/div[2]/div[2]/div/div/"
+ "table/tbody/tr[" + rowNumber + "]/td[4]")).getText();
if (amountString.startsWith("-"))
{
writeLastCustomer("A1:B1", aciklama, amountString);
continue;
}
float amount = Float.parseFloat(amountString.replace(".", "").
replace(",", ".").replace(" TL", ""));
// Dekontu aç
driver.findElement(By.cssSelector("#ctl00_c_GridAccountHistoryList > tbody >"
+ " tr:nth-child(" + rowNumber + ") > td:nth-child(6) > a")).click();
// Dekont isim
driver.switchTo().frame("GenericCustomModalFrame");
driver.switchTo().frame("mainFrame");
dekontText = driver.findElement(By.xpath("/html/body/form/div[3]"
+ "/div/div[2]/div/table[2]/tbody/tr/td/table[1]/tbody/tr[2]/td/div/"
+ "table[2]/tbody/tr/td/table/tbody/tr/td[1]")).getText();
// Dekontu kapat
Thread.sleep(250);
driver.switchTo().defaultContent();
driver.switchTo().frame("iframe1");
driver.findElement(By.xpath("/html/body/form/div[4]/div/div/div[1]/button")).click();
// Customer name
if (dekontText.contains("Borçlu Adı Soyadı : ")) // Mobil havale
customerName = dekontText.split("Borçlu Adı Soyadı : ")[1].split("\n")[0];
else if (dekontText.contains("Gönd: ")) // Fast
{
dekontTextArray = dekontText.split("Gönd: ");
// Aciklamada fast varsa VE ilk satır alt cizgi değilse bu kod çalışacak
if (aciklama.contains("FAST") && !dekontText.startsWith("_") && !dekontText.startsWith("."))
customerName = dekontTextArray[1].split(dekontText.split("\n")[0])[0];
// 1- fast yoksa. 2- fast varsa VE ilk satır alt çizgiyse.
else
{
dekontTextArray = dekontTextArray[1].split(" ");
for (byte counter = 0; counter <= 2; counter++)
if (Character.isUpperCase(dekontTextArray[counter].charAt(0)))
customerName += dekontTextArray[counter] + " ";
}
customerName = customerName.trim().toUpperCase(Locale.forLanguageTag("TR"));
}
else if (dekontText.contains("Gönderen : ")) // Referanslı Gelen Havale
customerName = dekontText.split("Gönderen : ")[1].split("\n")[0]; // Buranın toUpperCase e ihtiyacı varsa, toUpperCase i assagı at.
else
{
writeLastCustomer("A1:B1", aciklama, amountString);
showError("ZİRAAT BANKASI", aciklama);
continue;
}
// Google Sheets
appendToGoogleSheets(date, amount, customerName, "ZİRAAT BANKASI");
// Last customer text file
writeLastCustomer("A1:B1", aciklama, amountString);
customerName = "";
} while (rowNumber > 1);
}
driver.switchTo().defaultContent();
}
void isBank() throws IOException, GeneralSecurityException
{
List<Object> lastCustomer;
String lastAciklama;
String lastAmount;
ArrayList<String> aciklamaList = new ArrayList<>();
String aciklama;
String amountString = "0";
String customerName = "";
// Hesap Hareketlerini Güncelle
driver.findElement(By.cssSelector(" #UpdateActivitiesSubMenu_tutorialElement "
+ "> div.sub-menu-item-text")).click();
// Find which row is the last customer
lastCustomer = readLastCustomer("A2:B2");
lastAciklama = lastCustomer.get(0).toString();
lastAmount = lastCustomer.get(1).toString();
short rowNumber = 0;
do
{
rowNumber++;
boolean successfullRead = false;
while (!successfullRead)
{
try
{
aciklamaList.add(driver.findElement(By.xpath("/html/body/form/div[4]/"
+ "div[3]/div[2]/div/div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/"
+ "div[" + rowNumber + "]/div/div/div[4]/div[2]/div/div")).getText());
amountString = driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/"
+ "div[2]/div/div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/div["
+ rowNumber + "]/div/div/div[6]/div[1]/div/div/div/div/div[1]")).getText().replace(" ", "");
successfullRead = true;
}
catch (Exception e)
{
}
}
} while (!((lastAciklama.equals(aciklamaList.get(rowNumber - 1))) && (lastAmount.equals(amountString))));
// If last row is the last customer, quit
if (rowNumber != 1)
{
// Process new customers (the ones after the last customer)
do
{
rowNumber--;
aciklama = aciklamaList.get(rowNumber - 1);
// Date
String date = driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/div[2]/"
+ "div/div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/div[" + rowNumber
+ "]/div/div/div[2]/div[1]/div/div/div/div[1]")).getText().replace("/", ".");
// Amount
amountString = driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/"
+ "div[2]/div/div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/div["
+ rowNumber + "]/div/div/div[6]/div[1]/div/div/div/div/div[1]")).getText().replace(" ", "");
if (amountString.startsWith("-") || aciklama.contains("VODAFONE"))
{
writeLastCustomer("A2:B2", aciklama, amountString);
continue;
}
float amount = Float.parseFloat(amountString.substring(1).replace(",", ""));
// Customer Name
if (driver.findElement(By.xpath("/html/body/form/div[4]/div[3]/div[2]/div/"
+ "div[1]/div[3]/div/div[9]/div/div[2]/div[3]/div[3]/div[" + rowNumber
+ "]/div/div/div[2]/div[2]/div/div")).getText().equals("Bankamatik"))
{
String[] arrOfAciklama = aciklama.split(" ");
if (arrOfAciklama.length > 1 & arrOfAciklama.length < 4)
customerName = (arrOfAciklama.length == 2) ? arrOfAciklama[1] + " "
+ arrOfAciklama[0] : arrOfAciklama[1] + arrOfAciklama[2] + arrOfAciklama[0];
else
{
writeLastCustomer("A2:B2", aciklama, amountString);
showError("İŞ BANKASI", aciklama);
continue;
}
}
else if (aciklama.contains("tarafından"))
{
customerName = aciklama.split("tarafından", 2)[0].trim();
}
else if (aciklama.contains("*"))
{
if (Character.isDigit(aciklama.split("\\*")[1].charAt(0)))
customerName = aciklama.split("\\*")[0];
else
customerName = aciklama.split("\\*")[1];
}
else
{
writeLastCustomer("A2:B2", aciklama, amountString);
showError("İŞ BANKASI", aciklama);
continue;
}
customerName = customerName.toUpperCase(Locale.forLanguageTag("TR"));
// Google Sheets
appendToGoogleSheets(date, amount, customerName, "İŞ BANKASI");
// Save last customer
writeLastCustomer("A2:B2", aciklama, amountString);
} while (rowNumber > 1);
}
}
void garantiBank() throws IOException, GeneralSecurityException, InterruptedException
{
List<Object> lastCustomer;
String lastAciklama;
String lastAmount;
ArrayList<String> aciklamaList = new ArrayList<>();
String aciklama;
String amountString = "0";
String customerName = "";
String dekontText;
// Görüntüle
driver.findElement(By.id("updateSubmitButton")).click();
Thread.sleep(500);
// Find which row is the last customer
lastCustomer = readLastCustomer("A3:B3");
lastAciklama = lastCustomer.get(0).toString();
lastAmount = lastCustomer.get(1).toString();
short rowNumber = 0;
do
{
rowNumber++;
boolean successfullRead = false;
while (!successfullRead)
{
try
{
aciklamaList.add(driver.findElement(By.cssSelector("#myAccountActivitiesGrid > tbody > tr:nth-child("
+ rowNumber + ") > td.customHoverEnabled > div > div:nth-child(1)")).getText());
amountString = driver.findElement(By.cssSelector("#myAccountActivitiesGrid > "
+ "tbody > tr:nth-child(" + rowNumber + ") > td:nth-child(4) > div")).getText();
successfullRead = true;
}
catch (Exception e)
{
}
}
} while (!((lastAciklama.equals(aciklamaList.get(rowNumber - 1))) && (lastAmount.equals(amountString))));
// If last row is the last customer, quit
if (rowNumber != 1)
{
// Process new customers (the ones after the last customer)
do
{
rowNumber--;
aciklama = aciklamaList.get(rowNumber - 1);
// Amount
amountString = driver.findElement(By.cssSelector("#myAccountActivitiesGrid > "
+ "tbody > tr:nth-child(" + rowNumber + ") > td:nth-child(4) > div")).getText();
if (amountString.startsWith("-") || aciklama.startsWith("PK"))
{
writeLastCustomer("A3:B3", aciklama, amountString);
continue;
}
float amount = Float.parseFloat(amountString.substring(1).
replace(".", "").replace(",", ".").replace(" TL", ""));
// Dekontu aç
driver.findElement(By.cssSelector("#myAccountActivitiesGrid > tbody > "
+ "tr:nth-child(" + rowNumber + ") > td:nth-child(3) > a")).click();
Thread.sleep(1000);
// Dekont date
String date = driver.findElement(By.cssSelector(" #receiptScroll " // you can try putting this into an infinite loop like ziraat guncelleme
+ "> div > table.receiptContainerTable > tbody > tr:nth-child(1) "
+ "> td:nth-child(1) > table > tbody > tr:nth-child(2) > td > pre")).
getText().split("İŞLEM TARİHİ : ")[1].split("\n")[0].trim().
replace("/", "."); // substring(1).trim().replace("/", ".");
// Dekont isim
dekontText = driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[7]/div[1]/div/div/"
+ "div[2]/form/div[2]/div/table[2]/tbody/tr[2]/td/table/tbody/tr[2]/td/pre")).getText();
// Dekontu kapat
driver.findElement(By.xpath("/html/body/div[2]/div[4]/div[7]/div[1]/div/div/div[1]/a")).click();
// Customer name
if (dekontText.contains("BORÇLU HESAP")) // hesaptan hesaba havale
customerName = dekontText.split("\n")[3].substring(42).trim();
// "gelen fast", "gelen eft", "kredi kartindan hesaba havale", "hesaba havale (kasadan)" (atm)
else if (dekontText.contains("GÖNDEREN "))
{
customerName = dekontText.split("GÖNDEREN ")[1].split("\n")[0].trim().substring(2);
//customerName = dekontText.split("\n")[1].substring(21).trim();
}
else
{
writeLastCustomer("A3:B3", aciklama, amountString);
showError("GARANTİ BANKASI", aciklama);
continue;
}
// Google Sheets
appendToGoogleSheets(date, amount, customerName, "GARANTİ BANKASI");
// Last customer text file
writeLastCustomer("A3:B3", aciklama, amountString);
} while (rowNumber > 1);
}
}
void appendToGoogleSheets(String date, float amount, String customerName, String bankName) throws IOException, GeneralSecurityException
{
String spreadsheetId = "XXX"; //XXX
String range = "A:K";
List<List<Object>> newValues = new ArrayList<>();
float dakika = Math.round(amount / satisFiyatiDakika);
float adet = Math.round((amount / satisFiyati) * 100.0F) / 100.0F;
float maliyet = Math.round((adet * alisFiyati) * 100.0F) / 100.0F;
float fark = Math.round((amount - maliyet) * 100.0F) / 100.0F;
newValues.add(Arrays.asList(date, amount, dakika, adet, maliyet, fark,
"", "", customerName, bankName, "X+"));
// Append the new data starting from the first empty row in column A
ValueRange valueRange = new ValueRange().setValues(newValues);
service.spreadsheets().values().append(spreadsheetId, range, valueRange)
.setValueInputOption("RAW").execute();
}
List readLastCustomer(String range) throws IOException
{
String spreadsheetId = "XXX";
ValueRange response = service.spreadsheets().values().get(spreadsheetId, range).execute();
List<List<Object>> values = response.getValues();
return values.get(0);
}
void writeLastCustomer(String range, String aciklama, String amount) throws IOException
{
String spreadsheetId = "XXX";
ValueRange valueRange = new ValueRange().setValues(Arrays.asList(
Arrays.asList((Object) aciklama, (Object) amount)));
service.spreadsheets().values().update(spreadsheetId, range, valueRange)
.setValueInputOption("RAW").execute();
}
void showError(String banka, String aciklama)
{
Toolkit.getDefaultToolkit().beep();
errorScreen.setText(errorScreen.getText() + banka + " " + aciklama + "\n\n");
}
private Credential getCredentials(final HttpTransport httpTransport) throws IOException
{
InputStream credentialsStream = ControlPanel.class
.getResourceAsStream(CREDENTIALS_FILE_PATH);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
new InputStreamReader(credentialsStream));
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline").build();
return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver.Builder().setPort(8888).build())
.authorize("user");
}
/**
* @param args the command line arguments
*/
public static void main(String args[])
{
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try
{
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels())
{
if ("Nimbus".equals(info.getName()))
{
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}
catch (ClassNotFoundException ex)
{
java.util.logging.Logger.getLogger(ControlPanel.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
catch (InstantiationException ex)
{
java.util.logging.Logger.getLogger(ControlPanel.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
catch (IllegalAccessException ex)
{
java.util.logging.Logger.getLogger(ControlPanel.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
catch (javax.swing.UnsupportedLookAndFeelException ex)
{
java.util.logging.Logger.getLogger(ControlPanel.class
.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
new ControlPanel().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton basla;
private javax.swing.JTextPane errorScreen;
private javax.swing.JButton giris1;
private javax.swing.JButton giris2;
private javax.swing.JScrollPane jScrollPane2;
// End of variables declaration
}
答: 暂无答案
评论