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 格式