1.通過Fiddler工具抓包:拿到列表頁的http請求
操作方法:https://jingyan.baidu.com/article/4dc40848617b1dc8d846f16d.html
2.通過抓包得知需要先模擬登錄,然後才能獲取列表數據
3.通過調取窗口模擬發送消息
附下面代碼:
package com.leo;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.KeyEvent;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@Component
public class SendMsgTool {
private String cookieVal = "";
@PostConstruct
private void init() throws IOException {
// 連接地址(通過閱讀html源代碼獲得,即爲登陸表單提交的URL)
String surl = "http://app.cszjxx.net:18000/api/login/zjw/user/logincode";
/**
* 首先要和URL下的URLConnection對話。 URLConnection可以很容易的從URL得到。比如: // Using
* java.net.URL and //java.net.URLConnection
*/
URL url = new URL(surl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
/**
* 然後把連接設爲輸出模式。URLConnection通常作爲輸入來使用,比如下載一個Web頁。
* 通過把URLConnection設爲輸出,你可以把數據向你個Web頁傳送。下面是如何做:
*/
connection.setDoOutput(true); //打開輸出,向服務器輸出參數(POST方式、字節)(寫參數之前應先將參數的字節長度設置到配置"Content-Length"<字節長度>)
connection.setDoInput(true);//打開輸入,從服務器讀取返回數據
connection.setRequestMethod("POST"); //設置登錄模式爲POST(字符串大寫)
connection.setInstanceFollowRedirects(false);
connection.connect();
/**
* 最後,爲了得到OutputStream,簡單起見,把它約束在Writer並且放入POST信息中,例如: ...
*/
OutputStreamWriter out = new OutputStreamWriter(connection
.getOutputStream(), "utf-8");
//其中code爲手機驗證碼,其它參數均爲登錄時需要的參數
out.write("code=731788&czxtbb=113.8&gps=263.46&idfa=23E5D7FA-BB21-4113-92F5-C1EDS210A209&jzxx=460-0-0-0&scwl=wifi&sjhm=188888888&sjxh=iPhone_X&uuid=23E5D7FA-BB21-4113-92F5-C1EDS210A209&yys=運營商"); // post的關鍵所在!
//remember to clean up
out.flush();
out.close();
//取得cookie,相當於記錄了身份,供下次訪問時使用
//HttpURLConnection.getHeaderFields()).get("Set-Cookie")用於迭代讀取Cookie,爲以後使用
//HttpURLConnection.getHeaderField("Set-Cookie")也可用於讀取Cookie,但不一定能讀取完全
cookieVal = connection.getHeaderField("Set-Cookie"); //格式:JSESSIONID=541884418E77E7F07363CCEE91D4FF7E; Path=/
System.out.println("cookieVal: " + cookieVal);
connection.disconnect();
}
@Scheduled(fixedDelay = 10000)
private void find() throws IOException, AWTException {
//登陸成功後,即可訪問其他URL了。
String s = "http://app.cszjxx.net:18000/api/family/xf/user/renchoulist";
//重新打開一個連接
URL url = new URL(s);
HttpURLConnection resumeConnection = (HttpURLConnection) url
.openConnection();
if (cookieVal != null) {
//發送cookie信息上去,以表明自己的身份,否則會被認爲沒有權限
resumeConnection.setRequestProperty("Cookie", cookieVal);//設置登陸配置
}
resumeConnection.connect();
InputStream urlStream = resumeConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(urlStream));
String ss = null;
String res = "";
while ((ss = bufferedReader.readLine()) != null) {
res += ss;
}
System.out.println(res);
JSONObject obj = JSONObject.parseObject(res);
if(obj != null && obj.getString("code").equals("200")){
JSONArray data = obj.getJSONArray("data");
for (int m = 0; m < data.size(); m++) {
JSONObject d = data.getJSONObject(m);
System.out.println(d);
String name = "紅星天鉑";
if(d.getString("lpmc").contains(name)){
String sentence = name + "已開始認籌,麻溜的拿起手機開始你的操作!";// 定義要發送的話
Robot robot = new Robot();// 創建Robot對象
robot.delay(3000);// 延遲三秒,主要是爲了預留出打開窗口的時間,括號內的單位爲毫秒
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
for (int j = 0; j < 10; j++) {//循環次數
Transferable tText = new StringSelection(sentence);
clip.setContents(tText, null);
// for (int j = 1; j <= 1; j++) {
// 以下兩行按下了ctrl+v,完成粘貼功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);// 釋放ctrl按鍵,像ctrl,退格鍵,刪除鍵這樣的功能性按鍵,在按下後一定要釋放,不然會出問題。crtl如果按住沒有釋放,在按其他字母按鍵是,敲出來的回事ctrl的快捷鍵。
robot.delay(500);// 延遲一秒再發送,不然會一次性全發佈出去,因爲電腦的處理速度很快,每次粘貼發送的速度幾乎是一瞬間,所以給人的感覺就是一次性發送了全部。這個時間可以自己改,想幾秒發送一條都可以
robot.keyPress(KeyEvent.VK_ENTER);// 回車
// }
}
// 以下三行爲將上述字符串放到剪切板內,相當於做了一次複製操作
}
}
}
bufferedReader.close();
}
}