網頁

Related Posts Plugin for WordPress, Blogger...

[分享]用 Java 寫 Facebook 自動練功外掛

Java 是透過 JVM 執行程式,就是不能動比較底層的東西,如同戴了套子很多事情是很難發生的,所以市面上少有用 Java 製作的外掛,要寫外掛第一個想到的也不會是 Java。但是不碰底層的記憶體資料,一樣有其他表層的東西,是繁瑣且重複具規則性的,像不少練功行為,是需要一直用滑鼠點某些特定畫面,這時候用 Java 來處理,絕對是遊刃有餘的。下面就來介紹,如何使用 java.awt 下的 Robot 類別,來寫 FarmVille 的自動犁田機器人。

java.awt.Robot 這個類別,顧名思義就是機器人,它可以控制鍵盤、滑鼠、抓螢幕…,方法項目不多,但比起市面上一些滑鼠鍵盤控制軟體(如 EZScript),java.awt.Robot 不但功能性有過之而無不及,撰寫彈性更是 Macro、Script 程式無法比擬的。
image

FarmVille 是有提供犁田工具,不過一次犁四格的道具,使用上是有受到汽油量的限制,一格一格去犁的熱情,一般人大概到十來級就消退了吧!偏偏耕田整地是主要的經驗值與金錢來源,這時候有個自動犁田的方法,不知道有多好。
image

觀察一下規則不難發現,犁田、播種、收割都是有規則性的重複動作,每格田的大小也都一致,這就意味著滑鼠只要依規則移動,且固定按下滑鼠左鍵,就可以完成耕作的動作。
image
既然有規則,java.awt.Robot 類別也提供滑鼠移動 mouseMove、按下按鈕 mousePress、釋放按鈕 mouseRelease 等方法,那要用 Java 完成農耕機器人,理論上是沒問題了。

還有樣前置工作必須先完成,就是計算田地間隔,以方便 xy 軸作適當的位移,個人作法是抓圖用繪圖軟體看座標:1. 先拉出紅線找出田地的中心點。2. 取多個紅線交叉點用藍點標注。 3. 計算藍點像素差異。(取越多點會越準確,這裡取得是 25,12)
image

再來就寫 Code 啦,簡單使用幾個 Method 而已,就直接用 Main Method 動工,偷懶一下。
import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.InputEvent;

public class fvRobot {

    // 田地大小 / * \
    private static int leftNum = 16;
    private static int rightNum = 16;
   
    public static void main(String[] args) {
        // 建立 Robot、座標 物件
        Robot robot = null;
        Point location = null;
       
        // 起始座標、變數
        int x = 0;
        int y = 0;
        int xStep = 25; // 田地間 x 間隔
        int yStep = 12; // 田地間 y 間隔
        int stepFlag = 1; // 間隔折返值
        try {
            // 初始 Robot 物件
            robot = new Robot();

            // 延遲 10 秒使滑鼠有足夠時間移到田的頂點
            robot.delay(10000);

            // 取得滑鼠資訊(座標)
            location = MouseInfo.getPointerInfo().getLocation();
            x = (int) location.getX();
            y = (int) location.getY();

            for (int i = 0; i < rightNum; i++) {
                for (int j = 0; j < leftNum - 1; j++) {
                    // 點選滑鼠左鍵
                    robot.mousePress(InputEvent.BUTTON1_MASK);
                    robot.mouseRelease(InputEvent.BUTTON1_MASK);
                   
                    // 移動滑鼠(換格)
                    robot.mouseMove(x -= xStep * stepFlag, y += yStep * stepFlag);
                   
                    // 延遲 1 秒
                    robot.delay(250);
                }

                // 點選滑鼠左鍵
                robot.mousePress(InputEvent.BUTTON1_MASK);
                robot.mouseRelease(InputEvent.BUTTON1_MASK);
               
                // 跳脫最後一次滑鼠移動
                if (i + 1 == rightNum)
                    break;
               
                // 移動滑鼠(換行)
                robot.mouseMove(x += xStep, y += yStep);
               
                // 延遲 1 秒
                robot.delay(250);
               
                // 倒置移動方向
                stepFlag *= -1;
            }
        } catch (AWTException e) {
            e.printStackTrace();
        } finally {
            robot = null;
            location = null;
        }
    }
}

初步測試是成功的,但偶而會點到其他物件(如:角色、樹木),導致彈出小視窗,剩下動作就全部失效。
image

可以精進的部份很多,如:加上 GUI 界面方便設定要犁的範圍、判斷顏色避免誤開小視窗、計時機制自動收割…,誰說 Java 不能寫外掛?誰說程式課一定很無趣?強烈建議授課老師,作些與切身有關實用的課題,用 Java 玩 Facebook 程式設計應用,可以從簡單的 Class、Method 呼叫使用,進化到物件導向,再以 GUI 強化物件導向基礎,這堂課可教超過半個學期,半個學期都在玩 Facebook,又何必半夜不睡覺玩 Facebook 呢?希望有看到此篇劣作的老師們,好好思考這個問題。

考量到不是每個人都(必須)寫程式,但此範例又過於陽春,在不久的將來,會提供至少有設定畫面的 FV 機器人,此篇就先給大家聞香,有 Java 修改能力的人,就先參考嘗試看看吧!

5 則留言 :

  1. 哈囉,這個facebook遊戲在那,有網址嗎,我來試試

    回覆刪除
  2. 你的網站有點慢...

    回覆刪除
  3. 你說 FarmVille 種田遊戲?這篇參考看看

    網站慢?基本上這是 Google 的服務,應該還好吧!?不過有些外部元件確實是會卡,這也是努力要改善的目標@@"

    回覆刪除
  4. 你好,我是java的初學者,看到你的範例,我也想自己寫一個來測試,但是要怎麼在jFrame裏顯示網頁的資料(顯示出來的都是html碼),我是用netbean開發工具,在java提供的元件中,我好像找不到可以顯示網頁的元件..,是要再外加元件還是有什麼其他方式呢???謝謝.

    回覆刪除
  5. Java API 目前應該還沒有提供完整的 HTML Component,據我所知是需要第三方 Library,呼叫系統瀏覽器,或者是直接用 Java 寫的瀏覽器才有辦法較完整的支援 HTML,以上範例並不是設計一個專門 for 遊戲用的瀏覽器,只是在瀏覽器外面對遊戲"操作"。

    另外 Java 預設元件支援部分的 HTML 功能,可以參考 這個網頁

    回覆刪除