基于autojs脚本语言引擎开发的安卓ipv6聊天室开源了,全网独家

说明

本文提供的代码仅供参考。
可能有些地方在最新版本的Auto.js上面需要做修改,才能运行。

Auto.js简介

Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作。
与“按键精灵”不同的是,它的模拟动作并不是简单的使用在界面定坐标点来实现,而是类似与win一般,找窗口句柄来实现的。

Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。

开发文档

Auto.js Pro开发文档优化版
文档尚在完善中,可能有文档描述和代码实际行为有出入的情况。
模板、样式、generator来自Node.js。

为什么要使用Auto.js Pro开发脚本,有什么特点?

吸引我使用Auto.js Pro的原因有很多。最主要的几个原因是:

  • Auto.js Pro能开发免ROOT的安卓脚本
  • Auto.js Pro基于节点操作,能开发全分辨率的脚本,自动适配各种安卓机型
  • Auto.js Pro丰富的UI组件,能自定义各种样式的安卓界面
  • Auto.js Pro使用的javascript的语法比较优雅,代码可读性强
  • Auto.js Pro的命令库非常的丰富,接口比较多
  • Auto.js Pro脚本文件体积比较小。1000行的代码,打包后的apk文件只有3-5M,还没有广告

相关教程

Auto.js Pro安卓全分辨率免ROOT引流脚本开发教程

示例代码

 //此代码由飞云脚本圈整理提供(www.feiyunjs.com)
"ui";
importClass("java.net.ServerSocket");
importClass("java.net.Socket");
importClass("java.net.InetAddress");
importClass("java.io.DataInputStream");
importClass("java.io.DataOutputStream");


const PORT = 10010;
const LOCALHOST = "::1";

ui.layout(
    <vertical>
        <appbar>
            <toolbar id="toolbar" title="聊天室" />
        </appbar>
        <horizontal h="70" gravity="center_vertical">
            <text textSize="14sp" textColor="#999999" text="邀请码: " marginRight="8"/>
            <text id="code" textSize="16sp" textColor="#555555" w="0" layout_weight="1"/>
            <button id="copy" text="复制" style="Widget.AppCompat.Button.Borderless.Colored" />
        </horizontal>
        <list id="messages" w="*" layout_weight="1" h="0" padding="12">
            <horizontal>
                <text textSize="16sp" textColor="#000000" text="{{this}}" />
            </horizontal>
        </list>
        <horizontal>
            <input id="input" layout_weight="1" w="0" />
            <button id="send" text="发送" style="Widget.AppCompat.Button.Colored" />
        </horizontal>
    </vertical>
);

var messages = [];

activity.setSupportActionBar(ui.toolbar);
ui.messages.setDataSource(messages);
ui.send.on("click", () => {
    let msg = {
        content: String(ui.input.text()),
        nickname: nickname
    };
    room.send(msg);
    room.emit("message", msg);
    ui.input.text("");
});
ui.copy.on("click", () => {
    setClip(ui.code.text());
    toast("已复制");
})

let storage = storages.create("org.autojs.autojs.jschat");
var nickname = storage.get("nickname", "");
dialogs.build({
    title: "聊天室",
    positive: "加入房间",
    negative: "创建房间",
    inputHint: "昵称",
    inputPrefill: nickname
}).on("positive", (dialog) => {
    nickname = String(dialog.inputEditText.text);
    storage.put("nickname", nickname);
    joinRoom();
}).on("negative", (dialog) => {
    nickname = String(dialog.inputEditText.text);
    storage.put("nickname", nickname);
    createRoom();
}).show();

var room;
var writeThread = threads.start(function () {
    setInterval(() => { }, 1000);
});

function joinRoom() {
    let code = storage.get("code", "");
    dialogs.rawInput("请输入邀请码", code)
        .then(code => {
            if (!code) {
                ui.finish();
                return;
            }
            ui.code.setText(code);
            storage.put("code", code);
            let ip = codeToIP(code);
            threads.start(function () {
                try{
                    room = RoomMember.joinRoom(ip, PORT);
                    listenRoom(room);
                }catch(e){
                    console.error(e);
                }
            });
        });
}

function createRoom() {
    let ipv6 = getLocalIpV6();
    if (!ipv6) {
        toast("不支持ipv6!");
        ui.finish();
        return;
    }
    ui.code.setText(ipToCode(ipv6));
    room = new RoomHost(PORT);
    listenRoom(room);
}

function listenRoom(room) {
    room.on("message", message => {
        console.log("message: ", message);
        ui.post(() => {
            messages.push(message.nickname + ": " + message.content);
        });
    });
}

function codeToIP(code) {
    let ip = String(java.lang.String(android.util.Base64.decode(code, 2)));
    log("codeToIP: ip = %s, code = %s", ip, code);
    return ip;
}

function ipToCode(ip) {
    let code = android.util.Base64.encodeToString(java.lang.String(ip).getBytes(), 2);
    log("ipToCode: ip = %s, code = %s", ip, code);
    return code;
}

function getLocalIpV6() {
    try {
        for (let en = java.net.NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            let intf = en.nextElement();
            for (let enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                let inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()  && !inetAddress.isLinkLocalAddress() && inetAddress instanceof java.net.Inet6Address) {
                    let ipaddress = inetAddress.getHostAddress().toString();
                    return ipaddress;
                }
            }
        }
    } catch (ex) {
        console.error(ex);
    }
    return null;
}

function RoomHost(port) {
    events.__asEmitter__(this);
    var that = this;
    this.server = new ServerSocket(port, 50, InetAddress.getByName(LOCALHOST));
    this.members = [];
    this.listenThread = threads.start(function () {
        try {
            while (true) {
                let socket = that.server.accept();
                log("client connect: ", socket);
                var member = new RoomMember(socket);
                member.on("message", message => {
                    that.emit("message", message);
                    that.members.forEach(m => {
                        if (member != m) {
                            m.send(message);
                        }
                    });
                });

                that.members.push(member);
            }
        } catch (e) {
            console.log(e);
        }
    });
    events.on("exit", () => {
        this.server.close();
    });
}

RoomHost.prototype.send = function (data) {
    this.members.forEach(member => {
        member.send(data);
    });
    //this.emit("message", data);
}


function RoomMember(socket) {
    this.socket = socket;
    events.__asEmitter__(this);
    this.inputStream = new DataInputStream(socket.getInputStream());
    this.outputStream = new DataOutputStream(socket.getOutputStream());
    var inputStream = this.inputStream;
    this.messageId = 0;
    var that = this;
    this.readThread = threads.start(function () {
        try {
            let str;
            while ((str = inputStream.readUTF()) != null) {
                let json = JSON.parse(str);
                console.log("socket %s receive: ", that.socket.toString(), json);
                if (typeof (json.type) == "string") {
                    that.emit(json.type, json.data);
                }
            }
        } catch (e) {
            console.log(e);
        }

    });
}

RoomMember.prototype.send = function (message) {
    var msg = {};
    Object.assign(msg, message);
    msg.from = this.socket.toString();
    msg.id = this.messageId++;
    var str = JSON.stringify({
        type: "message",
        data: msg
    });
    writeThread.setImmediate(() => {
        this.outputStream.writeUTF(str);
    });
}

RoomMember.joinRoom = function (hostIp, port) {
    var socket = new Socket(hostIp, port);
    let room = new RoomMember(socket);
    toastLog("加入房间成功");
    return room;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值