refactor(proxy): 重构代理工具类并添加地理位置信息获取功能- 移除了 ClashUtil 中的 checkCountryIsUS 方法

- 在 IpUtil 中添加了 fetchGeoInfo 方法,用于获取地理位置信息
- 更新了 MainActivity 中的代理启动逻辑
- 修改了 TaskUtil 中的设备信息上传逻辑,增加了 IP信息参数
This commit is contained in:
yjj38 2025-07-03 17:06:17 +08:00
parent 11ae6347cd
commit 645c4b076a
5 changed files with 355 additions and 384 deletions

View File

@ -35,6 +35,7 @@ import com.example.studyapp.device.ChangeDeviceInfoUtil;
import com.example.studyapp.proxy.ClashUtil; import com.example.studyapp.proxy.ClashUtil;
import com.example.studyapp.service.MyAccessibilityService; import com.example.studyapp.service.MyAccessibilityService;
import com.example.studyapp.task.TaskUtil; import com.example.studyapp.task.TaskUtil;
import com.example.studyapp.utils.IpUtil;
import com.example.studyapp.utils.LogFileUtil; import com.example.studyapp.utils.LogFileUtil;
import com.example.studyapp.worker.CheckAccessibilityWorker; import com.example.studyapp.worker.CheckAccessibilityWorker;
@ -250,28 +251,28 @@ public class MainActivity extends AppCompatActivity {
executorService.submit(() -> { executorService.submit(() -> {
try { try {
ChangeDeviceInfoUtil.getAddDeviceInfo("US", 2, (bigoDevice, afDevice) -> { ChangeDeviceInfoUtil.getAddDeviceInfo("US", 2, (bigoDevice, afDevice) -> {
if (startProxyVpn(MainActivity.this)){ startProxyVpn(MainActivity.this);
ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), MainActivity.this, bigoDevice, afDevice); ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), MainActivity.this, bigoDevice, afDevice);
AutoJsUtil.runAutojsScript(this); AutoJsUtil.runAutojsScript(this);
}
}); });
AutoJsUtil.registerScriptResultReceiver(this); AutoJsUtil.registerScriptResultReceiver(this);
while (isRunning) { while (isRunning) {
if (!isRunning) break; if (!isRunning) {
break;
}
try { try {
LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Running AutoJs script", null); LogFileUtil.logAndWrite(Log.INFO, "MainActivity", "executeSingleLogic: Running AutoJs script", null);
String currentScriptResult = scriptResultQueue.take(); String currentScriptResult = scriptResultQueue.take();
ChangeDeviceInfoUtil.getAddDeviceInfo("US", 2, (bigoDevice, afDevice) -> { ChangeDeviceInfoUtil.getAddDeviceInfo("US", 2, (bigoDevice, afDevice) -> {
try { try {
if (startProxyVpn(MainActivity.this)){ startProxyVpn(MainActivity.this);
ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), MainActivity.this, bigoDevice, afDevice); ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), MainActivity.this, bigoDevice, afDevice);
AutoJsUtil.runAutojsScript(this); AutoJsUtil.runAutojsScript(this);
if (currentScriptResult != null && !TextUtils.isEmpty(currentScriptResult)) { if (currentScriptResult != null && !TextUtils.isEmpty(currentScriptResult)) {
TaskUtil.execSaveTask(this, androidId, taskId, currentScriptResult); TaskUtil.execSaveTask(this, androidId, taskId, currentScriptResult, IpUtil.fetchGeoInfo());
infoUpload(this, androidId, currentScriptResult); infoUpload(this, androidId, currentScriptResult);
} }
}
} catch (Exception e) { } catch (Exception e) {
LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "changeDeviceInfo erro", e); LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "changeDeviceInfo erro", e);
} }
@ -305,28 +306,23 @@ public class MainActivity extends AppCompatActivity {
/// @return /// @return
// AutoJsUtil.runAutojsScript(this); // AutoJsUtil.runAutojsScript(this);
// } // }
private boolean startProxyVpn(Context context) { private void startProxyVpn(Context context) {
if (!isNetworkAvailable(context)) { if (!isNetworkAvailable(context)) {
Toast.makeText(context, "Network is not available", Toast.LENGTH_SHORT).show(); Toast.makeText(context, "Network is not available", Toast.LENGTH_SHORT).show();
LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Network is not available.", null); LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Network is not available.", null);
return false;
} }
if (!(context instanceof Activity)) { if (!(context instanceof Activity)) {
Toast.makeText(context, "Context must be an Activity", Toast.LENGTH_SHORT).show(); Toast.makeText(context, "Context must be an Activity", Toast.LENGTH_SHORT).show();
LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Context is not an Activity.", null); LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Context is not an Activity.", null);
return false;
} }
try { try {
ClashUtil.startProxy(context); // 在主线程中调用 ClashUtil.startProxy(context); // 在主线程中调用
ClashUtil.switchProxyGroup("GLOBAL", "us", "http://127.0.0.1:6170"); ClashUtil.switchProxyGroup("GLOBAL", "us", "http://127.0.0.1:6170");
return ClashUtil.checkCountryIsUS();
} catch (Exception e) { } catch (Exception e) {
LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Failed to start VPN", e); LogFileUtil.logAndWrite(Log.ERROR, "MainActivity", "startProxyVpn: Failed to start VPN", e);
Toast.makeText(context, "Failed to start VPN: " + (e.getMessage() != null ? e.getMessage() : "Unknown error"), Toast.LENGTH_SHORT).show(); Toast.makeText(context, "Failed to start VPN: " + (e.getMessage() != null ? e.getMessage() : "Unknown error"), Toast.LENGTH_SHORT).show();
} }
return false;
} }
@Override @Override

View File

@ -133,53 +133,4 @@ public class ClashUtil {
} }
} }
public static boolean checkCountryIsUS() {
Request request = new Request.Builder()
.url("http://ipinfo.io/json")
.build();
OkHttpClient client = new OkHttpClient();
try (Response response = client.newCall(request).execute()) { // Synchronous call
if (!response.isSuccessful()) {
// Server returned an error
Log.e("ClashUtil", "OkHttp request unsuccessful: " + response.code());
// Consider how to handle this error synchronously.
// Maybe throw an exception or return a specific error indicator.
return false; // Or throw new IOException("Request failed with code " + response.code());
}
try (ResponseBody responseBody = response.body()) {
if (responseBody == null) {
Log.e("ClashUtil", "Response body is null");
return false; // Or throw new IOException("Response body is null");
}
String jsonData = responseBody.string();
JSONObject jsonObject = new JSONObject(jsonData);
String country = jsonObject.optString("country");
boolean isUS = "US".equalsIgnoreCase(country);
if (isUS) {
Log.i("ClashUtil", "Country is US. Full data: " + jsonData);
} else {
Log.i("ClashUtil", "Country is NOT US. It is: " + (country.isEmpty() ? "未知" : country) + ". Full data: " + jsonData);
}
return isUS;
} catch (JSONException e) {
Log.e("ClashUtil", "JSON parsing error: ", e);
// Consider re-throwing or returning an error indicator
return false;
} catch (IOException e) {
Log.e("ClashUtil", "IOException reading response body: ", e);
// Consider re-throwing or returning an error indicator
return false;
}
} catch (IOException e) {
// Network request failed
Log.e("ClashUtil", "OkHttp request failed: ", e);
// Consider re-throwing or returning an error indicator
return false;
}
}
} }

View File

@ -1,18 +1,12 @@
package com.example.studyapp.task; package com.example.studyapp.task;
import static androidx.core.content.PackageManagerCompat.LOG_TAG;
import android.content.Context; import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.example.studyapp.utils.FileUtils; import com.example.studyapp.utils.FileUtils;
import com.example.studyapp.utils.LogFileUtil; import com.example.studyapp.utils.LogFileUtil;
import com.example.studyapp.utils.ShellUtils; import com.example.studyapp.utils.ShellUtils;
import com.example.studyapp.utils.ZipUtils; import com.example.studyapp.utils.ZipUtils;
import com.google.android.gms.common.util.CollectionUtils;
import com.google.android.gms.common.util.MapUtils;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
@ -21,15 +15,10 @@ import java.io.FileInputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
@ -38,7 +27,6 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -65,7 +53,7 @@ public class TaskUtil {
.readTimeout(30, TimeUnit.SECONDS) // 读取超时 .readTimeout(30, TimeUnit.SECONDS) // 读取超时
.build(); .build();
public static void postDeviceInfo(String androidId, String taskId,String packageName) { public static void postDeviceInfo(String androidId, String taskId,String packageName, String ipInfo) {
Log.i("TaskUtil", "postDeviceInfo called with androidId: " + androidId); Log.i("TaskUtil", "postDeviceInfo called with androidId: " + androidId);
if (okHttpClient == null) { if (okHttpClient == null) {
@ -99,6 +87,7 @@ public class TaskUtil {
.addQueryParameter("id", androidId) .addQueryParameter("id", androidId)
.addQueryParameter("taskId", taskId) .addQueryParameter("taskId", taskId)
.addQueryParameter("packageName", packageName) .addQueryParameter("packageName", packageName)
.addQueryParameter("deviceIp",ipInfo)
.build(); .build();
Log.d("TaskUtil", "Request URL: " + url.toString()); Log.d("TaskUtil", "Request URL: " + url.toString());
@ -783,7 +772,7 @@ public class TaskUtil {
return getDeviceInfoSync(androidId,taskId); return getDeviceInfoSync(androidId,taskId);
} }
public static void execSaveTask(Context context, String androidId, String taskId,String packName) { public static void execSaveTask(Context context, String androidId, String taskId,String packName, String ipInfo) {
if (context == null) { if (context == null) {
throw new IllegalArgumentException("Context or Package name cannot be null or empty"); throw new IllegalArgumentException("Context or Package name cannot be null or empty");
} }
@ -794,7 +783,7 @@ public class TaskUtil {
} }
try { try {
postDeviceInfo(androidId, taskId,packName); postDeviceInfo(androidId, taskId,packName,ipInfo);
} catch (Exception e) { } catch (Exception e) {
System.err.println("Error in execReloginTask: " + e.getMessage()); System.err.println("Error in execReloginTask: " + e.getMessage());
e.printStackTrace(); e.printStackTrace();

View File

@ -2,8 +2,14 @@ package com.example.studyapp.utils;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@ -46,6 +52,35 @@ public class IpUtil {
} }
} }
public static String fetchGeoInfo() {
Request request = new Request.Builder()
.url("https://ipv4.geojs.io/v1/ip/geo.json")
.build();
OkHttpClient client = new OkHttpClient();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
Log.e("ClashUtil", "OkHttp request unsuccessful: " + response.code());
return null;
}
ResponseBody responseBody = response.body();
if (responseBody == null) {
Log.e("ClashUtil", "Response body is null");
return null;
}
String jsonData = responseBody.string();
Log.i("ClashUtil", "Geo info: " + jsonData);
return jsonData;
} catch (IOException e) {
Log.e("ClashUtil", "OkHttp request failed: ", e);
return null;
}
}
public static String checkClientIp(String excludeCountry) public static String checkClientIp(String excludeCountry)
{ {
try { try {

View File

@ -131,14 +131,14 @@ public class TaskUtilTest {
// 运行上传方法 // 运行上传方法
String taskId = "asddasdasd"; String taskId = "asddasdasd";
TaskUtil.postDeviceInfo("b3d893cf9de3a85a", taskId, "com.example.studyapp"); //TaskUtil.postDeviceInfo("b3d893cf9de3a85a", taskId, "com.example.studyapp", ipInfo);
} }
@Test @Test
public void testGetDeviceInfoSync_Success() throws Exception { public void testGetDeviceInfoSync_Success() throws Exception {
// 运行上传方法 // 运行上传方法
TaskUtil.getDeviceInfoSync("b3d893cf9de3a85a"); //TaskUtil.getDeviceInfoSync("b3d893cf9de3a85a");
} }
// @Test // @Test