x乎上刷到的帖子
试了几次,没试出来,想着能不能暴力一点,把所有可能的微信号输出出来,然后微信自动添加好友。
参考这位大佬的帖子
他是通过键盘发消息,我是通过鼠标点击。
package Api;
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.awt.event.MouseEvent;
public class AutoAdd {
public static void main(String[] args) throws InterruptedException {
// 要搜索的微信号、手机号等等(此处有一个bug)
String friendNickName = "weixinhao";
searchMyFriendAndSend(friendNickName);
}
/**
* 出现一个bug,聊天记录中不能有搜索的值不然就会先弹出聊天记录,导致搜索微信号的坐标不对了
* @param friendNickName
* @throws InterruptedException
*/
private static void searchMyFriendAndSend(String friendNickName) throws InterruptedException {
// 创建Robot对象
Robot robot = getRobot();
//打开微信 Ctrl+Alt+W
assert robot != null;
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_W);
//释放Ctrl按键,像Ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_ALT);
// 该延迟不能少,否则无法搜索
robot.delay(1000);
// Ctrl + F 搜索指定好友
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_F);
robot.keyRelease(KeyEvent.VK_CONTROL);
// 将好友昵称发送到剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(friendNickName);
clip.setContents(tText, null);
// 以下两行按下了ctrl+v,完成粘贴功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.delay(1000);
robot.keyPress(KeyEvent.VK_ENTER);
robot.delay(2000);
//这是当前鼠标的坐标值
Point point = MouseInfo.getPointerInfo().getLocation();
System.out.println(point);
//这是你的屏幕坐标信息
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
System.out.println(screenSize);
// 鼠标移动,瞬移到屏幕指定的(x,y)位置:此位置搜索微信号位置
robot.mouseMove(1200,312);
point(1200,312,robot);
robot.delay(1000);
Thread.sleep(1* 1000); // 休眠 1 秒
// 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
robot.mousePress(MouseEvent.BUTTON1_MASK);
// robot.delay(1000);
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
robot.delay(1000);
// 鼠标移动,瞬移到屏幕指定的(x,y)位置:此位置是搜索账号异常,然后点击确定
robot.mouseMove(1344,596);
point(1344,596,robot);
// 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
robot.mousePress(MouseEvent.BUTTON1_MASK);
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
robot.delay(1000);
// 鼠标移动,瞬移到屏幕指定的(x,y)位置:此位置是添加好友位置
robot.mouseMove(1642,574);
point(1642,574,robot);
robot.delay(1000);
Thread.sleep(1* 1000); // 休眠 1 秒
// 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
robot.mousePress(MouseEvent.BUTTON1_MASK);
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
robot.delay(1000);
//我是xxx
String Im="我是李xx";
AutoIm(Im,1479,223,robot);
//备注xxx
String note="想似手机号的人";
AutoIm(note,1472,335,robot);
// 鼠标移动,瞬移到屏幕指定的(x,y)位置:此位置是确定添加好友位置
robot.mouseMove(1265,948);
point(1265,948,robot);
// 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
robot.mousePress(MouseEvent.BUTTON1_MASK);
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
robot.delay(1000);
}
/**
* 函数的目的是确定鼠标的坐标,不然鼠标的坐标老对不上
* 1、输入的值(鼠标想去的坐标)
* 2、循环判断。当前的鼠标的坐标和想要去的坐标的区别,如果当前坐标和想去的绝对值小于等2,就退出去。
* @param x
* @param y
* @throws InterruptedException
*/
private static void point(int x,int y,Robot robot) throws InterruptedException{
robot.mouseMove(x,y);
Point point = MouseInfo.getPointerInfo().getLocation();
while(Math.abs(x-point.getX())>2||Math.abs(y-point.getY())>2){
robot.mouseMove(x,y);
point = MouseInfo.getPointerInfo().getLocation();
}
}
/**
* 添加好友之我是xxx
* 1、先把之前的删除了
* 2、剪切板里获取自己输入的
* @return
*/
private static void AutoIm(String Im,int x,int y,Robot robot) throws InterruptedException{
point(x,y,robot);//使鼠标位置定位到对应位置上
// 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
robot.mousePress(MouseEvent.BUTTON1_MASK);
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
//先清除自带的(最多20次)
for(int i=0;i<20;i++){
robot.keyPress(KeyEvent.VK_BACK_SPACE);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_BACK_SPACE);
}
// 将我是xxx发送到剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(Im);
clip.setContents(tText, null);
// 以下两行按下了ctrl+v,完成粘贴功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.delay(1000);
Thread.sleep(5*1000);
}
/**
* 备注,其实函数和自动添加我是xxx一样的
* 1、先把之前的删除了
* 2、剪切板里获取自己输入的
* @return
*/
private static void AutoNote(String Im,int x,int y,Robot robot) throws InterruptedException{
point(x,y,robot);//使鼠标位置定位到对应位置上
// 鼠标(按下/松开)事件,buttons可以填写 MouseEvent.BUTTON1_MASK 等
robot.mousePress(MouseEvent.BUTTON1_MASK);
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
//先清除自带的(最多20次)
for(int i=0;i<15;i++){
robot.keyPress(KeyEvent.VK_BACK_SPACE);
robot.delay(100);
robot.keyRelease(KeyEvent.VK_BACK_SPACE);
}
// 将我是xxx发送到剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(Im);
clip.setContents(tText, null);
// 以下两行按下了ctrl+v,完成粘贴功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.delay(1000);
Thread.sleep(5*1000);
}
//获取Robot
private static Robot getRobot(){
// 创建Robot对象
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
return robot;
}
}
代码应该很好理解,就是讲一下里面的获取坐标值,每个电脑应该不一样。
先给代码:这个代码就是不断获取你当前鼠标的坐标值。
@Test()
public void test() throws InterruptedException{
//这个函数不断执行,获取当前鼠标坐标
while(true){
Point point = MouseInfo.getPointerInfo().getLocation();
System.out.println(point);
// System.out.println(System.currentTimeMillis());
Thread.sleep(5 * 1000); // 休眠 3 秒
// System.out.println(System.currentTimeMillis());
// [x=1479,y=223] [x=1472,y=335]
}
}
看上图,代码核心就是模拟鼠标点击事件。
所以先让鼠标移动到图中红框的位置,再模拟点击。这时我们要先获取红框坐标(鼠标点击坐标),再模拟鼠标点击。
这是我电脑的配置信息,所以x轴最大1920,y轴是1080,坐标原点在左上角。
参考链接:
https://blog.csdn.net/qq_42761569/article/details/109121451?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165249887016781685397462%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165249887016781685397462&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-7-109121451-null-null.nonecase&utm_term=java%E5%BE%AE%E4%BF%A1%E8%87%AA%E5%8A%A8%E5%8A%A0%E5%A5%BD%E5%8F%8B&spm=1018.2226.3001.4450