From 7c508c855504063a76b7e09a7d67732aad61381a Mon Sep 17 00:00:00 2001 From: pl2ufawr6 <2023312111429@whu.edu.cn> Date: Tue, 8 Apr 2025 23:05:07 +0800 Subject: [PATCH] ADD file via upload --- 获取课表/MainActivity.java | 255 +++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 获取课表/MainActivity.java diff --git a/获取课表/MainActivity.java b/获取课表/MainActivity.java new file mode 100644 index 0000000..67c49a2 --- /dev/null +++ b/获取课表/MainActivity.java @@ -0,0 +1,255 @@ +package com.example.fuckyou; + +import android.content.ContentValues; +import android.content.Intent; +import android.database.sqlite.SQLiteDatabase; +import android.os.Build; +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.View; +import android.webkit.CookieManager; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.Toast; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import android.content.Context; + +public class MainActivity extends AppCompatActivity { + public static List kebiaodata=new ArrayList<>(); + public static String getWeekdayFromSunday(String sundayStr, int weekdayNumber) throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); + + // 將字串轉成 Date + Date sundayDate = sdf.parse(sundayStr); + + // 設定 Calendar 為這個週日 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(sundayDate); + + // 計算需要加幾天(1 = 星期一, ..., 7 = 星期日) + int daysToAdd = weekdayNumber % 7; // 若是 7 (星期日),則加 0 天 + calendar.add(Calendar.DATE, daysToAdd); + + // 回傳結果 + return sdf.format(calendar.getTime()); + } + + public static List getSundaysInRange(String startDate, String endDate) { + List sundays = new ArrayList<>(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-M-d"); // 修改为无前导零的格式 + + try { + // 将日期字符串转换为 Date 对象 + Date start = dateFormat.parse(startDate); + Date end = dateFormat.parse(endDate); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(start); + + // 如果开始日期不是周日,找到下一个周日 + if (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { + calendar.add(Calendar.DAY_OF_MONTH, Calendar.SUNDAY - calendar.get(Calendar.DAY_OF_WEEK)); + } + + // 逐个添加每个周日到列表中 + while (!calendar.getTime().after(end)) { + sundays.add(dateFormat.format(calendar.getTime())); + calendar.add(Calendar.WEEK_OF_YEAR, 1); // 每次递增一周 + } + } catch (Exception e) { + e.printStackTrace(); + } + + return sundays; + } + private void getCookies(String url) throws IOException, ParseException { + CookieManager cookieManager = CookieManager.getInstance(); + String cookies = cookieManager.getCookie(url); + Map cookiesMap = new HashMap<>(); + for (String cookie : cookies.split(";")) { + String[] parts = cookie.trim().split("=", 2); + if (parts.length == 2) { + cookiesMap.put(parts[0], parts[1]); + } + } + List order = Arrays.asList( + "JSESSIONID", "iPlanetDirectoryPro", "SF_cookie_2", + "RouTe_WAF_E1268C", "PORTAL-TOKEN", "SF_cookie_1", + "web_m_site", "route" + ); + Map sortedCookies = new LinkedHashMap<>(); + for (String key : order) { + if (cookiesMap.containsKey(key)) { + sortedCookies.put(key, cookiesMap.get(key)); + } + } + StringBuilder sortedCookieHeader = new StringBuilder(); + for (Map.Entry entry : sortedCookies.entrySet()) { + sortedCookieHeader.append(entry.getKey()).append("=").append(entry.getValue()).append("; "); + } + List sundays=getSundaysInRange("2025-2-16", "2025-6-31"); + MyDatabaseHelper db=new MyDatabaseHelper(this); + db.deleteLesson(); + String nodateUrl = "https://zhlj.whu.edu.cn/mobile/homepageapi/getCurriculumData?date="; + for(String sunday : sundays) { + OkHttpClient client = new OkHttpClient(); + String apiUrl=nodateUrl+sunday; + Request request = new Request.Builder() + .url(apiUrl) + .addHeader("Cookie", sortedCookieHeader.toString()) // 设置 Cookie + .build(); + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + runOnUiThread(() -> + Toast.makeText(MainActivity.this, "請求失敗: " + e.getMessage(), Toast.LENGTH_SHORT).show() + ); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful() && response.body() != null) { + String responseData = response.body().string(); + displayCurriculumData(responseData,sunday); + } else { + runOnUiThread(() -> + Toast.makeText(MainActivity.this, "請求失敗,狀態碼: " + response.code(), Toast.LENGTH_SHORT).show() + ); + } + } + }); + } + } + public void displayCurriculumData(String responseData,String date) { + try { + JSONObject response = new JSONObject(responseData); + if (response.getInt("code") == 200) { + JSONArray data = response.getJSONArray("data"); + for (int i = 0; i < data.length(); i++) { + JSONObject dayData = data.getJSONObject(i); + int day = dayData.getInt("day"); + JSONArray curriculumList = dayData.getJSONArray("curriculumList"); + for (int j = 0; j < curriculumList.length(); j++) { + JSONObject curriculum = curriculumList.getJSONObject(j); + // 只有當有有效數據時才顯示 + if (curriculum.has("name") && curriculum.getString("name")!="null") { + Lesson temp = new Lesson(); + String today = getWeekdayFromSunday(date, day); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); + Date d = sdf.parse(today); + temp.name = curriculum.getString("name"); + temp.teacher = curriculum.getString("teacher"); + temp.classroom = curriculum.getString("classroom"); + temp.fromClass = curriculum.getInt("fromClass"); + temp.endClass = curriculum.getInt("endClass"); + temp.day = day; + temp.date = d; + MyDatabaseHelper db=new MyDatabaseHelper(this); + db.insertLesson(temp); + } + } + } + } + } catch (JSONException e) { + e.printStackTrace(); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + /* + MyDatabaseHelper db=new MyDatabaseHelper(this); + File dbFile=db.getMyDatabaseFile(); + if (dbFile.exists()) + { + boolean deleted = dbFile.delete(); + if (deleted) { + Log.d("Database", "資料庫文件已刪除"); + } else { + Log.d("Database", "無法刪除資料庫文件"); + } + }*/ + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_main); + WebView webView = findViewById(R.id.webView); + webView.getSettings().setJavaScriptEnabled(true); + WebSettings webSettings = webView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + return false; // 让 WebView 继续加载 + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + if (url.contains("zhlj.whu.edu.cn")) { // 登录成功后访问的页面 + try { + // 等待 Cookie 更新完成 + new Handler(Looper.getMainLooper()).postDelayed(() -> { + try { + getCookies(url);// 获取 cookies + webView.setVisibility(View.INVISIBLE); + } catch (IOException ex) { + ex.printStackTrace(); + } catch (ParseException e) { + throw new RuntimeException(e); + } + }, 1000); // 延迟 1 秒获取 cookie,确保 Cookie 已经更新 + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + }); + String loginUrl = "https://cas.whu.edu.cn/authserver/login?service=https%3A%2F%2Fzhlj.whu.edu.cn%2FcasLogin"; + webView.loadUrl(loginUrl); + } + public void onMyButtonClick(View view) { + Intent intent=new Intent(MainActivity.this,showkebiao.class); + startActivity(intent); + } + +} \ No newline at end of file