发送点击消息

This commit is contained in:
WoNiu 2024-04-03 14:36:36 +08:00
parent 6474edc27e
commit 625579e510
7 changed files with 232 additions and 32 deletions

32
lib/windows/code.dart Normal file
View File

@ -0,0 +1,32 @@
//
List skey = [8, 1, 2, 5, 4];
//
String makecodeChar(String c, int key, int key2) {
int charCode = c.codeUnitAt(0);
charCode = (((charCode + key) ^ key2) ^ key) + 1;
return String.fromCharCode(charCode);
}
//
String cutcodeChar(String c, int key, int key2) {
int charCode = c.codeUnitAt(0);
charCode = (((charCode - 1) ^ key) ^ key2) - key;
return String.fromCharCode(charCode);
}
//
String makecode(String pstr, List pkey) {
String pp = pstr;
for (int i = 0; i < pp.length; i++) {
pp = pp.replaceRange(i, i + 1, makecodeChar(pp[i], pkey[i % 5], pkey[(i + 18) % 5]));
}
return pp;
}
//
void cutecode(String pstr, List pkey) {
for (int i = 0; i < pstr.length; i++) {
pstr = pstr.replaceRange(i, i + 1, cutcodeChar(pstr[i], pkey[i % 5], pkey[(i + 18) % 5]));
}
}

View File

@ -0,0 +1,73 @@
import 'dart:convert';
import 'dart:typed_data';
///
extension MapLittle on Map {
/// Uint8List
Uint8List toLittle({dynamic value = 0, int length = 4}){
/// map json
String mapJson = jsonEncode(this);
/// json Uint8List
final mapData = utf8.encode(mapJson);
///
final data = mapData.toLittle(value: value,length: length);
return data;
}
}
extension Uint8ListLittle on Uint8List {
/// Uint8List
Uint8List toLittle({dynamic value = 0, int length = 4}){
var mapData = this;
///
final little = ByteData(length);
///
little.setInt32(0, value,Endian.little);
/// Uint8List
var littleData = little.buffer.asUint8List();
/// Uint8List
Uint8List data = Uint8List(littleData.length + mapData.length );
/// map Uint8List Uint8List
data.setRange(0, littleData.length, littleData);
data.setRange(littleData.length, mapData.length + littleData.length, mapData);
///
return data;
}
// Uint8List转int 4
int? fromLittle({int start = 0,int length = 4}) {
if (this.length < length){
print('转小端序的数据长度不足');
return null;
}
final littleData = sublist(start,start + length);
// ByteData
ByteData byteData = littleData.buffer.asByteData();
// 32
int little = byteData.getInt32(0, Endian.little);
return little;
}
}

View File

@ -0,0 +1,24 @@
import 'dart:math';
class NumberTool {
///
/// @allNum:
/// @num:
List<int> randomNum(int allNum, {int num = 10}) {
List<int> randomNumbers = [];
int remainingNum = allNum;
for (int i = 0; i < num - 1; i++) {
int randomNumber = Random().nextInt(remainingNum) + 1;
randomNumbers.add(randomNumber);
remainingNum -= randomNumber;
}
randomNumbers.add(allNum - randomNumbers.fold(0, (prev, element) => prev + element));
return randomNumbers;
}
}

View File

@ -1,22 +1,77 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'little_extension.dart';
import 'code.dart';
class SocketTool {
connect() {
Socket.connect('127.0.0.1', 12345).then((socket) {
print(
'Connected to: ${socket.remoteAddress.address}:${socket.remotePort}');
class SocketUtils extends Socket{
//
SocketUtils._();
//
static SocketUtils? _instance;
socket.write('GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n');
//
static SocketUtils getInstance() {
_instance ??= SocketUtils._();
return _instance!;
}
socket.listen((data) {
print(String.fromCharCodes(data).trim());
print('消息');
}, onDone: () {
print('Connection closed');
socket.destroy();
});
}).catchError((error) {
print('Error: $error');
}
class Socket {
static String url = '127.0.0.1';
static int port = 12345;
RawDatagramSocket? socket;
connect() async {
socket = await RawDatagramSocket.bind('127.0.0.2', 1);
print('UDP Socket bound to ${socket?.address.address}:${socket?.port}');
//
socket?.listen((RawSocketEvent e) {
Datagram? d = socket?.receive();
if (d == null) return;
// String message = String.fromCharCodes(d.data).trim();
// print('Datagram from ${d.address.address}:${d.port}: $message');
});
heartbeat();
}
///
sendMessage(Map data){
socket?.send(dataMake(data), InternetAddress(url), port);
}
///
heartbeat(){
Timer timer = Timer(const Duration(seconds: 10), () {
Map data = {
"op": 1,
"IC": 0
};
socket?.send(dataMake(data), InternetAddress(url), port);
heartbeat();
});
}
///
List<int> dataMake(Map map){
// Map对象转换为JSON字符串
String json = jsonEncode(map);
//
String ps = makecode(json, skey);
//
Uint8List uinData = Uint8List.fromList(ps.codeUnits);
// 4
uinData = uinData.toLittle(value: uinData.length);
return uinData.toList();
}
}

View File

@ -1,6 +1,7 @@
import 'dart:ffi';
import 'package:web_synchronization_tool/windows/socket_tool.dart';
import 'package:web_synchronization_tool/windows/windowsJs.dart';
import 'package:webview_windows/webview_windows.dart';
@ -53,6 +54,7 @@ class SynchronizationWebTool{
double y = (click['y'] as int).toDouble();
clickSynchronization(x, y);
SocketUtils.getInstance().sendMessage(event);
}
if (event['scroll'] != null ) {
@ -76,6 +78,7 @@ class SynchronizationWebTool{
}
}
///
scrollSynchronization(int y){
for (var controller in childController) {
@ -84,10 +87,10 @@ class SynchronizationWebTool{
}
///
input(int value){
mainController.executeScript(WindowsJs.inputJs(value));
for (var controller in childController) {
controller.executeScript(WindowsJs.inputJs(value));
input(List<int> values){
for (int i =0;i<childController.length;i++){
WebviewController controller = childController[i];
controller.executeScript(WindowsJs.inputJs(values[i]));
}
}

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:web_synchronization_tool/windows/show_animation_utils.dart';
import 'package:web_synchronization_tool/windows/number_tool.dart';
import 'package:web_synchronization_tool/windows/synchronization_web_tool.dart';
import 'package:web_synchronization_tool/windows/windowsJs.dart';
import 'package:webview_windows/webview_windows.dart';
@ -116,6 +116,7 @@ class ShowWebWidget extends StatefulWidget {
class _ShowWebWidgetState extends State<ShowWebWidget> {
TextEditingController textController = TextEditingController();
TextEditingController numController = TextEditingController();
@override
void dispose() {
@ -151,18 +152,29 @@ class _ShowWebWidgetState extends State<ShowWebWidget> {
widget.controller.openDevTools();
},
child: const Text('开发者')),
TextButton(
onPressed: () {
widget.controller.executeScript(WindowsJs.inputJs(45));
// controller.executeScript(WindowsJs.inputJs(45));
},
child: const Text('模拟输入测试')),
TextButton(
onPressed: () {
widget.controller.loadUrl('https://www.baidu.com/');
},
child: const Text('跳转首页')),
Row(
children: [
SizedBox(width: 100, child: TextField(style: const TextStyle(fontSize: 14),controller: numController,)),
TextButton(
onPressed: () {
try{
int num = int.parse(numController.text);
if (num <= 10){
numController.text = '金额不能小于10';
return;
}
List<int> nums = NumberTool().randomNum(num,num: SynchronizationWebTool.getInstance().childController.length);
widget.controller.executeScript(WindowsJs.inputJs(nums.first));
nums.removeAt(0);
SynchronizationWebTool.getInstance().input(nums);
}catch(e){
numController.text = '请输入数字';
}
},
child: const Text('填入总金额')),
],
),
Row(
children: [
const Text('同步'),

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:web_synchronization_tool/windows/socket_tool.dart';
import 'package:web_synchronization_tool/windows/web_grid_view.dart';
import 'package:webview_windows/webview_windows.dart';
@ -41,7 +42,7 @@ class _WindowsPageState extends State<WindowsPage> {
@override
Widget build(BuildContext context) {
// SocketTool().connect();
SocketUtils.getInstance().connect();
if (initDone == false) return Container();