aardio 文档

aardio 范例: ChatGPT - 自动搜寻免费服务器,出错自动更换(重新运行也可更换服务器)

import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="ChatGPT - 自动搜寻免费服务器,出错自动更换(重新运行也可更换服务器)";right=877;bottom=647)
winform.add()
/*}}*/

import win.ui.loadingMask;
var frmMask = win.ui.loadingMask(winform);
frmMask.text = "正在努力查找免费服务器 ...";
frmMask.show();
winform.show();

import wsock.tcp.socks5Server;
//创建 socks5Server 以实现动态修改 WebView2 浏览器控件的 SOCKS5 代理服务端地址
var socks5Server = wsock.tcp.socks5Server.async("127.0.0.1",0);
socks5Server.start();

import web.view; 
var wb = web.view(winform,{ 
    startArguments = {
        proxyServer = socks5Server.getUrl();//中转代理,后面会调用 socks5Server.setUpstreamProxy
    };
    userDataDir = _STUDIO_INVOKED ? io.appData("/aardio/webview2/user-data/chatgpt-test");
    language =  "zh-CN";  
})

wb.cdp("Storage.clearDataForOrigin",  {
    "origin": "https://chatgpt.com",
    "storageTypes": "all"
    });

wb.onDocumentComplete = function(url){ 


    if(string.find(wb.location,"^chrome\-error\://")){ 

        winform.text = "ChatGPT - 遇到错误"
        winform.setTimeout(  
            function (){ 

                frmMask.show(false);
                wb.html = $`/chatgpt.retry.html`

                if(#winform.proxyList){
                    var proxy = table.shift(winform.proxyList);
                    socks5Server.setUpstreamProxy(proxy); 
                    wb.go("https://chatgpt.com?q=");

                    frmMask.show();
                    frmMask.text = "正在载入 ChatGPT ..."
                }
            }
        );
    } 

}

import thread.command;
var threadCommand = thread.command();

threadCommand.$onProxyFound2 = function(proxyList){
    winform.proxyList = proxyList;
}

//线程命令名首字符为 $ 表示异步调用(调用代码不等待返回)
threadCommand.$onProxyFound1 = function(proxy){ 

    //动态修改上游代理服务器
    socks5Server.setUpstreamProxy(proxy);

    frmMask.text = "正在载入 ChatGPT ..."
    winform.text = "ChatGPT 正在载入,请稍候数秒 ..."

    winform.show(3/*_SW_MAXIMIZE*/);

    wb.go("https://chatgpt.com?q=");
    wb.waitEle2(`div[contenteditable="true"]#prompt-textarea p[data-placeholder]`);
    wb.waitEle(`div[contenteditable="true"]#prompt-textarea p[data-placeholder]`,`
        this.textContent = '联网搜索并回答: ';
        this.classList.remove('placeholder');
        this.parentElement.focus(); 
        var range = document.createRange();
        var sel = window.getSelection();
        range.selectNodeContents(this);
        range.collapse(false);
        sel.removeAllRanges();
        sel.addRange(range);`);

    wb.waitEle(`#page-header`,`this.style.display="none"`);
    wb.waitEle(`//div[button[contains(., '登录')] and button[contains(., '免费注册')]]`,`this.style.display="none"`)
    wb.waitEle(`div[role="dialog"] a.cursor-pointer.underline`,`this.click()`)  
    wb.waitEle(`button[data-testid="close-button"]`,`this.click();`)  

    winform.text = "ChatGPT 欢迎您!"
    frmMask.close();
    wb.focus();
};

thread.invoke(
    function(threadCommand){
        import web.rest.github;
        import thread.works;

        //创建 300 个检测线程
        var works = thread.works( 250,
            function(proxy) { 
                import wsock.tcp.socks5Client;  

                //检测 SOCKS5 » HTTP » HTTPS 可用性
                if(wsock.tcp.socks5Client.testHttp(proxy.ip,proxy.port,"chatgpt.com")){
                    return proxy;
                } 
            }
        );  

        //自网络获取最新 SOCKS5 服务器列表
        var proxies = web.rest.github.getJson("proxifly","free-proxy-list","proxies/protocols/socks5/data.json");

        //添加到 SOCKS5 连通性检测队列
        works.pushAll(proxies)

        //获取最快返回的 SOCKS5 服务器 
        var proxy1 = works.pop(1,true/*同步等待*/); 

        //线程命令名首字符为 $ 表示异步调用(调用代码不等待返回)
        threadCommand.$onProxyFound1(proxy1[["proxy"]]);

        var proxyList = [ works.pop(3,true/*同步等待*/) ]; 

        proxyList = table.map(proxyList,lambda (v) v.proxy);
        threadCommand.$onProxyFound2(proxyList);

        //退出其余检测线程
        works.quit(10); 
    },threadCommand
)

win.loopMessage(); 
Markdown 格式