Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.60 KB | None | 0 0
  1. package me.neznamy.tf2hack.TradeOffers;
  2.  
  3. import java.awt.Robot;
  4. import java.awt.Toolkit;
  5. import java.awt.datatransfer.DataFlavor;
  6. import java.awt.event.InputEvent;
  7. import java.io.BufferedReader;
  8. import java.io.BufferedWriter;
  9. import java.io.File;
  10. import java.io.FileReader;
  11. import java.io.FileWriter;
  12. import java.time.LocalTime;
  13. import java.util.ArrayList;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map.Entry;
  17.  
  18. import org.openqa.selenium.By;
  19. import org.openqa.selenium.JavascriptExecutor;
  20. import org.openqa.selenium.WebDriver;
  21. import org.openqa.selenium.WebElement;
  22. import org.openqa.selenium.chrome.ChromeDriver;
  23. import org.openqa.selenium.chrome.ChromeOptions;
  24.  
  25. public class TradeOffers {
  26.  
  27. private static WebDriver driver;
  28. private static JavascriptExecutor js;
  29. private static File config;
  30. private static String username;
  31. private static String password;
  32. private static String mainWindow;
  33. private static boolean copyCode = false;
  34. private static String copyButtonLocation = "0x0";
  35. private static List<String> ignoredOffers = new ArrayList<String>();
  36. private static List<Item> items = new ArrayList<Item>();
  37.  
  38. public static void main(String[] args) {
  39. items.add(new Item("REFINED_METAL", 9, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbZQsUYhTkhzJWhsO1Mv6NGucF1Ygzt8ZQijJukFMiMrbhYDEwI1yRVKNfD6xorQ3qW3Jr6546DNPuou9IOVK4p4kWJaA/96fx96f"));
  40. items.add(new Item("RECLAIMED_METAL", 3, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbZQsUYhTkhzJWhsO0Mv6NGucF1YJlscMEgDdvxVYsMLPkMmFjI1OSUvMHDPBp9lu0CnVluZQxA9Gwp-hIOVK4sMMNWF4/96fx96f"));
  41. items.add(new Item("SCRAP_METAL", 1, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEbZQsUYhTkhzJWhsPZAfOeD-VOn4phtsdQ32ZtxFYoN7PkYmVmIgeaUKNaX_Rjpwy8UHMz6pcxAIfnovUWJ1t9nYFqYw/96fx96f"));
  42. items.add(new Item("BATTLE_WORN_ROBOT_KB-808", 5, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEGegouTxTgsSxQt5ixMv6NGucF1Y5gvMYNiGU9xVIqMeK3aTUyJVPBBKMLDKNorAq6WXY0vZZmAYDu9ehIOVK4_IjPtrU/96fx96f"));
  43. items.add(new Item("BATTLE_WORN_ROBOT_TAUNT_PROCESSOR", 5, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEGegouTxTgsSxQt5iwMv6NGucF1Y4wtsRXjmVuyVcuYrGxNGY-IwGVUqEGDKA-oA3uDSFq7JNnVYayrr5IOVK4CVyuuBM/96fx96f"));
  44. items.add(new Item("BATTLE_WORN_ROBOT_MONEY_FURNACE", 5, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEGegouTxTgsSxQt5i-Mv6NGucF1YxmtZYCizNvxgd_NbWwZjZhcVWSA_AOWPRtrFC7UCVj6Z4zANG3r-tIOVK4uvXQm80/96fx96f"));
  45. items.add(new Item("PRISTINE_ROBOT_CURRENCY_DIGESTER", 7, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEGegouTxTgsSxQt5i3Mv6NGucF1YpttsRQ3WVplVkuNeCwZmUyc1SXV_NcBPc-8Q28Xn83655mBIDipe5IOVK4pmv2u60/96fx96f"));
  46. items.add(new Item("PRISTINE_ROBOT_BRAINSTORM_BULB", 7, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEGegouTxTgsSxQt5i0Mv6NGucF1Y5mvZINiG5qk1V9ZrKxZG5kd1eQVaRdWPduo1u8CHVn6cRhAoXu87pIOVK4pj8j204/96fx96f"));
  47. items.add(new Item("WINTER_2017_COSMETIC_CASE", 0, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYYQ4CThbjqwcR2JmxMvGNG-U_l9sn4pUbiDBqwgUrYeLnY2FhIlCRWfJYWfE59Qq7Xncz7J81V9Syo7pRcQS6s5yGbeczMaAW_A/96fx96f"));
  48. items.add(new Item("MANN_CO_SUPPLY_CRATE_KEY", 337, "https://steamcommunity-a.akamaihd.net/economy/image/fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEAaR4uURrwvz0N252yVaDVWrRTno9m4ccG2GNqxlQoZrC2aG9hcVGUWflbX_drrVu5UGki5sAij6tOtQ/96fx96f"));
  49. // items.add(new Item());
  50. try {
  51. if (configured()){
  52. initialize();
  53. Thread.sleep(1000);
  54. login(true, false);
  55. System.out.println("-------------------------------");
  56. while(true){
  57. driver.get("http://steamcommunity.com/id/__NEZNAMY__/tradeoffers/");
  58. char[] source = driver.getPageSource().toCharArray();
  59. String offerID = "";
  60. for (int i=0; i<source.length-40; i++) {
  61. if ((int)source[i] == (int)'S' &&
  62. (int)source[i+1] == (int)'h' &&
  63. (int)source[i+2] == (int)'o' &&
  64. (int)source[i+3] == (int)'w' &&
  65. (int)source[i+4] == (int)'T' &&
  66. (int)source[i+5] == (int)'r' &&
  67. (int)source[i+6] == (int)'a' &&
  68. (int)source[i+7] == (int)'d' &&
  69. (int)source[i+8] == (int)'e' &&
  70. (int)source[i+9] == (int)'O' &&
  71. (int)source[i+10] == (int)'f' &&
  72. (int)source[i+11] == (int)'f' &&
  73. (int)source[i+12] == (int)'e' &&
  74. (int)source[i+13] == (int)'r') {
  75.  
  76. for (int j=17; j<=26; j++) {
  77. offerID += source[i+j];
  78. }
  79. if (ignoredOffers.contains(offerID)) {
  80. offerID = "";
  81. } else {
  82. break;
  83. }
  84. }
  85. }
  86. if (offerID.length() == 10) {
  87. System.out.println("Received trade offer " + offerID);
  88. System.out.println();
  89. processTradeOffer(offerID);
  90. }
  91. Thread.sleep(5000);
  92. }
  93. }
  94. } catch (Exception e) {
  95. error("An error occured in the main loop:");
  96. e.printStackTrace();
  97. }
  98. }
  99. private static boolean configured() throws Exception{
  100. config = new File("config.txt");
  101. if (!config.exists()){
  102. config.createNewFile();
  103. BufferedWriter buf = new BufferedWriter(new FileWriter(config, true));
  104. buf.write("name=username");
  105. buf.write(System.getProperty("line.separator"));
  106. buf.write("password=mypassword");
  107. buf.write(System.getProperty("line.separator"));
  108. buf.write("copy-code=false");
  109. buf.write(System.getProperty("line.separator"));
  110. buf.write("copy-button-location=0x0");
  111. buf.write(System.getProperty("line.separator"));
  112. buf.close();
  113. return false;
  114. } else {
  115. return true;
  116. }
  117. }
  118. private static void initialize() throws Exception{
  119. String chromedriver = new File("chromedriver.exe").getAbsolutePath();
  120. BufferedReader br = new BufferedReader(new FileReader(config));
  121. while (true) {
  122. String line = br.readLine();
  123. if (line == null || line.isEmpty()) {
  124. break;
  125. }
  126. if (line.split("=")[0].equals("name")) username = line.split("=")[1];
  127. if (line.split("=")[0].equals("password")) password = line.split("=")[1];
  128. if (line.split("=")[0].equals("copy-code")) copyCode = Boolean.parseBoolean(line.split("=")[1]);
  129. if (line.split("=")[0].equals("copy-button-location")) copyButtonLocation = line.split("=")[1];
  130. }
  131. br.close();
  132. System.setProperty("webdriver.chrome.driver", chromedriver);
  133. ChromeOptions cOptions = new ChromeOptions();
  134. cOptions.addArguments("--mute-audio");
  135. driver = new ChromeDriver(cOptions);
  136. driver.get("http://steamcommunity.com/id/__NEZNAMY__/tradeoffers/");
  137. js = (JavascriptExecutor) driver;
  138. mainWindow = driver.getWindowHandle();
  139. }
  140. private static void login(boolean wait, boolean remember) throws Exception{
  141. driver.findElement(By.id("steamAccountName")).sendKeys(username);
  142. WebElement passwordField = driver.findElement(By.id("steamPassword"));
  143. passwordField.sendKeys(password);
  144. if (remember) driver.findElement(By.id("remember_login")).click();
  145. passwordField.submit();
  146. Thread.sleep(3000);
  147. if (copyCode) {
  148. WebElement codeField = driver.findElement(By.id("twofactorcode_entry"));
  149. codeField.sendKeys(getCode());
  150. Thread.sleep(100);
  151. codeField.submit();
  152. }
  153. if (wait) while(!driver.getCurrentUrl().startsWith("http://steamcommunity.com/id/__NEZNAMY__/tradeoffers/")) Thread.sleep(100);
  154. }
  155. private static boolean tradeLoadedSuccessfully(){
  156. return !driver.getPageSource().contains("Sorry, some kind of error has occurred:")
  157. && !driver.getPageSource().contains("Omlouváme se, vyskytla se chyba:");
  158. }
  159.  
  160. private static void processTradeOffer(String id) throws Exception {
  161. js.executeScript("ShowTradeOffer( '" + id + "' );");
  162. for (String winHandle : driver.getWindowHandles()){
  163. driver.switchTo().window(winHandle);
  164. }
  165. while (!tradeLoadedSuccessfully()){
  166. Thread.sleep(1000);
  167. driver.navigate().refresh();
  168. }
  169. process(id);
  170. driver.close();
  171. driver.switchTo().window(mainWindow);
  172. }
  173. private static void info(String text) {
  174. System.out.println(getTime() + "[INFO] " + text);
  175. }
  176. private static void error(String text) {
  177. System.out.println(getTime() + "[ERROR] " + text);
  178. }
  179. private static void process(String id){
  180. try{
  181. if (driver.getCurrentUrl().contains("https://steamcommunity.com/login")){
  182. login(false, true);
  183. Thread.sleep(3000);
  184. process(id);
  185. return;
  186. }
  187. Thread.sleep(5000);
  188. if (isOfferCorrect()){
  189. js.executeScript("ToggleReady( true )");
  190. Thread.sleep(50);
  191. try{
  192. driver.findElement(By.xpath("//*[@class='btn_green_white_innerfade btn_medium']")).click();
  193. } catch (Exception e){
  194. //not reported
  195. }
  196. Thread.sleep(50);
  197. js.executeScript("ConfirmTradeOffer()");
  198. Thread.sleep(2000);
  199. }
  200. ignoredOffers.add(id);
  201. } catch (Exception e){
  202. info("Trade offer loaded incorrectly, trying again..");
  203. driver.navigate().refresh();
  204. process(id);
  205. }
  206. }
  207. private static boolean isOfferCorrect() {
  208. HashMap<String, Integer> counts = new HashMap<String, Integer>();
  209. boolean invalid = false;
  210. int i=0;
  211. int value1 = 0;
  212. System.out.println("My items:");
  213. while (true) {
  214. try {
  215. WebElement e = driver.findElement(By.id("your_slot_" + i));
  216. WebElement tag = e.findElement(By.tagName("img"));
  217. String image = tag.getAttribute("src");
  218. Item item = Item.getByImage(image);
  219. if (item != null) {
  220. if (item.isValid()) {
  221. value1 += item.getPrice();
  222. } else {
  223. invalid = true;
  224. }
  225. if (!counts.containsKey(item.getName())) counts.put(item.getName(), 0);
  226. counts.put(item.getName(), counts.get(item.getName())+1);
  227. }
  228. } catch (Exception e) {
  229. break;
  230. }
  231. i++;
  232. }
  233. for (Entry<String, Integer> entry : counts.entrySet()) {
  234. System.out.println(entry.getKey() + " x" + entry.getValue());
  235. }
  236. counts.clear();
  237. i=0;
  238. int value2 = 0;
  239. System.out.println();
  240. System.out.println("Their items:");
  241. while (true) {
  242. try {
  243. WebElement e = driver.findElement(By.id("their_slot_" + i));
  244. WebElement tag = e.findElement(By.tagName("img"));
  245. String image = tag.getAttribute("src");
  246. Item item = Item.getByImage(image);
  247. if (item != null) {
  248. if (item.isValid()) {
  249. value2 += item.getPrice();
  250. } else {
  251. invalid = true;
  252. }
  253. if (!counts.containsKey(item.getName())) counts.put(item.getName(), 0);
  254. counts.put(item.getName(), counts.get(item.getName())+1);
  255. }
  256. } catch (Exception e) {
  257. break;
  258. }
  259. i++;
  260. }
  261. for (Entry<String, Integer> entry : counts.entrySet()) {
  262. System.out.println(entry.getKey() + " x" + entry.getValue());
  263. }
  264. if (invalid) {
  265. System.out.println("INVALID TRADE");
  266. System.out.println("-------------------------------");
  267. return false;
  268. } else {
  269. System.out.println();
  270. System.out.println("My items value: " + value1 + " scrap");
  271. System.out.println("Their items value: " + value2 + " scrap");
  272. if (value1 <= value2) {
  273. System.out.println("Trade correct. Accepting.");
  274. System.out.println("-------------------------------");
  275. return true;
  276. } else {
  277. System.out.println("Trade incorrect.");
  278. System.out.println("-------------------------------");
  279. return false;
  280. }
  281. }
  282. }
  283. private static String getCode() throws Exception{
  284. try {
  285. String oldClipboard = "";
  286. try {
  287. oldClipboard = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
  288. } catch (Exception e) {
  289.  
  290. }
  291. Robot r = new Robot();
  292. int x = Integer.parseInt(copyButtonLocation.split("x")[0]);
  293. int y = Integer.parseInt(copyButtonLocation.split("x")[1]);
  294. r.mouseMove(x, y);
  295. r.mousePress(InputEvent.BUTTON1_DOWN_MASK);
  296. Thread.sleep(50);
  297. r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
  298. Thread.sleep(50);
  299. String newClipboard = (String) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
  300. if (!newClipboard.equals(oldClipboard)){
  301. return newClipboard;
  302. } else {
  303. Thread.sleep(3000);
  304. return getCode();
  305. }
  306. } catch (Exception e) {
  307. error("An error occured when getting code, trying again..");
  308. Thread.sleep(3000);
  309. return getCode();
  310. }
  311. }
  312. private static String getTime() {
  313. LocalTime lt = LocalTime.now();
  314. String h = lt.getHour() < 10 ? "0" + lt.getHour() : lt.getHour()+"";
  315. String m = lt.getMinute() < 10 ? "0" + lt.getMinute() : lt.getMinute()+"";
  316. String s = lt.getSecond() < 10 ? "0" + lt.getSecond() : lt.getSecond()+"";
  317. return "[" + h + ":" + m + ":" + s + "]";
  318. }
  319.  
  320.  
  321.  
  322. public static class Item {
  323.  
  324. private String image;
  325. private String name;
  326. private int price;
  327.  
  328. public Item(String name, int price, String image) {
  329. this.image = image;
  330. this.price = price;
  331. this.name = name;
  332. }
  333. public String getName() {
  334. return name;
  335. }
  336. public int getPrice() {
  337. return price;
  338. }
  339. public String getImage() {
  340. return image;
  341. }
  342. public static Item getByImage(String image) {
  343. if (image == null || image.equals("null")) return null;
  344. for (Item i : items) {
  345. if (i.getImage().equals(image)) {
  346. return i;
  347. }
  348. }
  349. return new Item("UNKNOWN", 0, image);
  350. }
  351. public boolean isValid() {
  352. return price > 0;
  353. }
  354. }
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement