@NarD said in Как парсить 2 строки с разными классами?:
@Fox Спасибо огромное! Благодарность отправил =) И еще, как можно выбрать 2 элемент по списку в XPATH? Их просто 10 и мне нужно выбрать именно 2.
Используйте префикс >AT>
Мануал по селекторам
Я добавил логирование того что происходит в файле
C:\Users\user\AppData\Roaming\BrowserAutomationStudio\apps\23.2.2\modules\Timezones\engine.js
Теперь мой файл выглядит вот так
function _get_ip_info()
{
_ARG = _arguments()
_if_else(_ARG[1] == "database", function(){
_set_result(JSON.parse(native("timezones", "ipinfo", _ARG[0])))
},function(){
_if_else(_ARG[1] == "ip-api.com", function(){
_switch_http_client_internal()
http_client_set_fail_on_error(false)
_do(function(){
var Now = Date.now()
/* Parse request list */
var RequestList = P("ipapi", "requestlist")
if(!RequestList)
RequestList = []
else
{
RequestList = JSON.parse(RequestList)
}
/* Remove old requests */
RequestList = RequestList.filter(function(Item){return (Now - Item.date < 3 * 60 * 1000)});
/* Parse ban time */
var EndTime = P("ipapi", "endtime")
if(!EndTime)
EndTime = 0
else
{
EndTime = parseInt(EndTime)
}
/* If ban time finished, reset block */
if(EndTime > 0 && Date.now() > EndTime)
{
EndTime = 0;
PSet("ipapi", "endtime", "0")
}
/* Create request id for this thread or get old */
if(typeof(IPAPI_REQEUSTID) == "undefined")
{
IPAPI_REQEUSTID = rand()
}
/* Check if possible to do request */
var DoRequest = (RequestList.length < 5 || _ARG[2].length > 0) && EndTime == 0 && RequestList.indexOf(function(Item){return Item.id == IPAPI_REQEUSTID}) < 0
log('DoRequest = '+DoRequest)
/* Add request to data structure */
if(DoRequest)
{
RequestList.push({id: IPAPI_REQEUSTID, date: Now})
PSet("ipapi", "requestlist", JSON.stringify(RequestList))
}
_if(DoRequest, function(){
http_client_get2("http://" + (_ARG[2].length > 0 ? "pro." : "") + "ip-api.com/json/" + _ARG[0].replace(/[/g,"").replace(/]/g,"") + "?fields=status,message,countryCode,city,lat,lon,timezone,offset" + (_ARG[2].length > 0 ? ("&key=" + _ARG[2]) : ""),{method:("GET"),headers:("Accept-Encoding: gzip, deflate")})!
/* Delete request id */
var RequestList = P("ipapi", "requestlist")
log('RequestList '+RequestList)
RequestList = JSON.parse(RequestList)
RequestList = RequestList.filter(function(Item){return (Item.id != IPAPI_REQEUSTID)});
PSet("ipapi", "requestlist", JSON.stringify(RequestList))
log('RequestList '+JSON.stringify(RequestList))
var EndTime = http_client_header("X-Ttl")
var RequestLeft = http_client_header("X-Rl")
log('EndTime '+EndTime)
log('RequestLeft '+RequestLeft)
if(EndTime && RequestLeft)
{
/* Temporary ban new requests */
RequestLeft = parseInt(RequestLeft)
if(RequestLeft < 20)
{
EndTime = Date.now() + (parseInt(EndTime) + 15) * 1000
PSet("ipapi", "endtime", EndTime.toString())
}
}
if(http_client_status() == 200 || http_client_status() == 403)
{
var json = http_client_content()
log('ip-api = '+json)
try
{
var json_parsed = JSON.parse(json)
if(json_parsed["status"] == "success")
{
delete json_parsed["status"]
json_parsed["country"] = json_parsed["countryCode"]
delete json_parsed["countryCode"]
json_parsed["latitude"] = json_parsed["lat"]
delete json_parsed["lat"]
json_parsed["longitude"] = json_parsed["lon"]
var timezone_json = JSON.parse(native("timezones", "timezone_name_to_offset", json_parsed["timezone"]))
json_parsed["offset"] = timezone_json["offset"] || 0
json_parsed["dstoffset"] = timezone_json["dstoffset"] || 0
json_parsed["valid"] = true
_set_result(json_parsed)
_break(2)
}else
{
_set_result({valid:false})
_break(2)
}
}catch(e){
log(e)
}
}else{
log('http_client_status = '+http_client_status())
}
})!
sleep(3000)!
})!
http_client_set_fail_on_error(true)
_switch_http_client_main()
}, function(){
if(typeof(_ARG[3]) != "function")
{
fail("\"Custom IP information function\" parameter is not a function.")
}
_call_function(_ARG[3],{ "Ip" : (_ARG[0]) })!
var FunctionResult = _result_function()
if(typeof(FunctionResult) != "object")
{
fail("IP information function result is not an object")
}
if(typeof(FunctionResult.valid) != "boolean")
{
fail("IP information function result doesn't contain \"valid\" property.")
}
if(FunctionResult.valid)
{
if(typeof(FunctionResult.country) == "undefined")
{
fail("IP information function result doesn't contain \"country\" property.")
}
if(typeof(FunctionResult.latitude) == "undefined")
{
fail("IP information function result doesn't contain \"latitude\" property.")
}
if(typeof(FunctionResult.longitude) == "undefined")
{
fail("IP information function result doesn't contain \"longitude\" property.")
}
if(typeof(FunctionResult.timezone) == "undefined")
{
fail("IP information function result doesn't contain \"timezone\" property.")
}
if(typeof(FunctionResult.offset) == "undefined")
{
fail("IP information function result doesn't contain \"offset\" property.")
}
if(typeof(FunctionResult.dstoffset) == "undefined")
{
fail("IP information function result doesn't contain \"dstoffset\" property.")
}
}
_set_result(FunctionResult)
})!
})!
}
Логирование показало бесконечный цикл
[757856303] [11:08:14] Поток №59 : DoRequest = true
[757856303] [11:08:14] Поток №59 : RequestList [{"id":"uJKNxZ6L2e","date":1611479294981}]
[757856303] [11:08:14] Поток №59 : RequestList []
[757856303] [11:08:14] Поток №59 : EndTime
[757856303] [11:08:14] Поток №59 : RequestLeft
[757856303] [11:08:14] Поток №59 : http_client_status = -1
[757856303] [11:08:14] Поток №59 : http_client_error_string =
[757856303] [11:08:18] Поток №59 : DoRequest = true
[757856303] [11:08:18] Поток №59 : RequestList [{"id":"uJKNxZ6L2e","date":1611479298043}]
[757856303] [11:08:18] Поток №59 : RequestList []
[757856303] [11:08:18] Поток №59 : EndTime
[757856303] [11:08:18] Поток №59 : RequestLeft
[757856303] [11:08:18] Поток №59 : http_client_status = -1
[757856303] [11:08:21] Поток №59 : DoRequest = true
[757856303] [11:08:21] Поток №59 : RequestList [{"id":"uJKNxZ6L2e","date":1611479301100}]
[757856303] [11:08:21] Поток №59 : RequestList []
[757856303] [11:08:21] Поток №59 : EndTime
[757856303] [11:08:21] Поток №59 : RequestLeft
[757856303] [11:08:21] Поток №59 : http_client_status = -1
[757856303] [11:08:24] Поток №59 : DoRequest = true
[757856303] [11:08:24] Поток №59 : RequestList [{"id":"uJKNxZ6L2e","date":1611479304168}]
[757856303] [11:08:24] Поток №59 : RequestList []
[757856303] [11:08:24] Поток №59 : EndTime
[757856303] [11:08:24] Поток №59 : RequestLeft
[757856303] [11:08:24] Поток №59 : http_client_status = -1
[757856303] [11:08:27] Поток №59 : DoRequest = true
[757856303] [11:08:27] Поток №59 : RequestList [{"id":"uJKNxZ6L2e","date":1611479307230}]
[757856303] [11:08:27] Поток №59 : RequestList []
[757856303] [11:08:27] Поток №59 : EndTime
[757856303] [11:08:27] Поток №59 : RequestLeft
[757856303] [11:08:27] Поток №59 : http_client_status = -1
Который выполняется каждые 3 сек
думается мне что там где я дописал
log('http_client_status = '+http_client_status())
нужно поставить счетчик который бы увеличивался на 1, и так до тех пор пока он скажем будет меньше 10 , как только он станет равен 10 нужно вызывать fail('Не могу установить прокси более 10 раз')
но вот как в этот файл правильно вставить счетчик что б он работал для каждого потока, и при инициализации потока был равен 0
я не знаю в этом прошу мне помочь
@gomeapat, добавил счетчик и ошибку если за 10 попыток получить информацию не удалось, можно установить свое количество попыток через выполнить код _GET_IP_MAX_FAIL = количество попыток, весь модуль с изменением Timezones.zip
function _get_ip_info()
{
_ARG = _arguments()
_if_else(_ARG[1] == "database", function(){
_set_result(JSON.parse(native("timezones", "ipinfo", _ARG[0])))
},function(){
_if_else(_ARG[1] == "ip-api.com", function(){
_switch_http_client_internal()
http_client_set_fail_on_error(false)
_do(function(){
var cycle_index = _iterator();
var maximum_failes = typeof(_GET_IP_MAX_FAIL)=="undefined" ? 10 : _GET_IP_MAX_FAIL;
var Now = Date.now();
/* Parse request list */
var RequestList = P("ipapi", "requestlist")
if(!RequestList)
RequestList = []
else
{
RequestList = JSON.parse(RequestList)
}
/* Remove old requests */
RequestList = RequestList.filter(function(Item){return (Now - Item.date < 3 * 60 * 1000)});
/* Parse ban time */
var EndTime = P("ipapi", "endtime")
if(!EndTime)
EndTime = 0
else
{
EndTime = parseInt(EndTime)
}
/* If ban time finished, reset block */
if(EndTime > 0 && Date.now() > EndTime)
{
EndTime = 0;
PSet("ipapi", "endtime", "0")
}
/* Create request id for this thread or get old */
if(typeof(IPAPI_REQEUSTID) == "undefined")
{
IPAPI_REQEUSTID = rand()
}
/* Check if possible to do request */
var DoRequest = (RequestList.length < 5 || _ARG[2].length > 0) && EndTime == 0 && RequestList.indexOf(function(Item){return Item.id == IPAPI_REQEUSTID}) < 0
/* Add request to data structure */
if(DoRequest)
{
RequestList.push({id: IPAPI_REQEUSTID, date: Now})
PSet("ipapi", "requestlist", JSON.stringify(RequestList))
}
_if(DoRequest, function(){
http_client_get2("http://" + (_ARG[2].length > 0 ? "pro." : "") + "ip-api.com/json/" + _ARG[0].replace(/[/g,"").replace(/]/g,"") + "?fields=status,message,countryCode,city,lat,lon,timezone,offset" + (_ARG[2].length > 0 ? ("&key=" + _ARG[2]) : ""),{method:("GET"),headers:("Accept-Encoding: gzip, deflate")})!
/* Delete request id */
var RequestList = P("ipapi", "requestlist")
RequestList = JSON.parse(RequestList)
RequestList = RequestList.filter(function(Item){return (Item.id != IPAPI_REQEUSTID)});
PSet("ipapi", "requestlist", JSON.stringify(RequestList))
var EndTime = http_client_header("X-Ttl")
var RequestLeft = http_client_header("X-Rl")
if(EndTime && RequestLeft)
{
/* Temporary ban new requests */
RequestLeft = parseInt(RequestLeft)
if(RequestLeft < 20)
{
EndTime = Date.now() + (parseInt(EndTime) + 15) * 1000
PSet("ipapi", "endtime", EndTime.toString())
}
}
if(http_client_status() == 200 || http_client_status() == 403)
{
var json = http_client_content()
try
{
var json_parsed = JSON.parse(json)
if(json_parsed["status"] == "success")
{
delete json_parsed["status"]
json_parsed["country"] = json_parsed["countryCode"]
delete json_parsed["countryCode"]
json_parsed["latitude"] = json_parsed["lat"]
delete json_parsed["lat"]
json_parsed["longitude"] = json_parsed["lon"]
var timezone_json = JSON.parse(native("timezones", "timezone_name_to_offset", json_parsed["timezone"]))
json_parsed["offset"] = timezone_json["offset"] || 0
json_parsed["dstoffset"] = timezone_json["dstoffset"] || 0
json_parsed["valid"] = true
_set_result(json_parsed)
_break(2)
}else
{
_set_result({valid:false})
_break(2)
}
}catch(e){}
}
})!
if(cycle_index >= maximum_failes)
{
fail("Failed to get IP information in " + maximum_failes + " attempts.")
}
sleep(3000)!
})!
http_client_set_fail_on_error(true)
_switch_http_client_main()
}, function(){
if(typeof(_ARG[3]) != "function")
{
fail("\"Custom IP information function\" parameter is not a function.")
}
_call_function(_ARG[3],{ "Ip" : (_ARG[0]) })!
var FunctionResult = _result_function()
if(typeof(FunctionResult) != "object")
{
fail("IP information function result is not an object")
}
if(typeof(FunctionResult.valid) != "boolean")
{
fail("IP information function result doesn't contain \"valid\" property.")
}
if(FunctionResult.valid)
{
if(typeof(FunctionResult.country) == "undefined")
{
fail("IP information function result doesn't contain \"country\" property.")
}
if(typeof(FunctionResult.latitude) == "undefined")
{
fail("IP information function result doesn't contain \"latitude\" property.")
}
if(typeof(FunctionResult.longitude) == "undefined")
{
fail("IP information function result doesn't contain \"longitude\" property.")
}
if(typeof(FunctionResult.timezone) == "undefined")
{
fail("IP information function result doesn't contain \"timezone\" property.")
}
if(typeof(FunctionResult.offset) == "undefined")
{
fail("IP information function result doesn't contain \"offset\" property.")
}
if(typeof(FunctionResult.dstoffset) == "undefined")
{
fail("IP information function result doesn't contain \"dstoffset\" property.")
}
}
_set_result(FunctionResult)
})!
})!
}
@DoctorKrolic, нет
@DoctorKrolic, ну если это поможет с данной проблемой, то могу сделать нормальное решение и предложить добавить в основную сборку. Просто чтобы добавить в основу нужно изменять не просто engine.js, но и добавить настройку количества попыток в 3 действия использующих эту функцию.
@FastSpace, добавить инпут "Количества попыток" в действия "Прокси", "Сведения об ип", "Установить месторасположение браузера по ип"
Если подытожить все вышесказанное, то как решить проблему зависания "прокси" который использует ip-api.com?)
Если еще на примере в проекте показать, вообще красота была бы.