Очень странная запись чисел
Приветствую многоуважаемый All ! Тут мне уже не раз помогали, хочу попросить помощи ещё раз.
Проблема такая. Ковыряя один из скриптов, наткнулся на очень странную запись чисел например строка: +((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])) Означает число 43. По крайней мере в браузере это так, можете проверить в консоли. Путём экспериментов понял, что числа формируются из групп в круглых скобках как десятичные. Левая группа старший разряд и т.д. Сами числа находятся как число квадратных скобок [] перед которыми стоят восклицательные знаки. Однако я не уверен, что всё знаю об этом способе. Вполне мог и пропустить какие-то особенности. Если кто в курсе, подскажите, где можно узнать об этом подробнее. Мне нужно уметь парсить на питоне подобные записи. Как возникла задача. Мне в скрипте (python) нужно получать список бесплатных прокси-серверов. Причем их нужно МНОГО. Поэтому сервисы с API не годятся, там слишком мал суточный бесплатный лимит. Из платных сервисов с защитой от автоматического сканирования, мне больше всех понравился hideme. Но там применяют проверку на "человечность" веб-агента, где используется как раз такая форма записи чисел. Если кому любопытно, вот скрипт на питоне, получающий защитную страничку: Код:
import requests P.S. Предложения типа заплатить денюшку отвергаются. Не потому что жаба душит, а потому что скрипт делается для бесплатного публичного использования всеми желающими (будет выложен на гитхаб), в ОЧЕНЬ важной задаче. |
да тут все просто, в JS если интерпретатор ожидает увидеть определенный тип данных, он автоматом конвертирует булево в строку или строку в число, или наоборот
вот вам примеры преобразование типа строки к числовому типу console.log(+"555"); console.log("555"*1); console.log(+true); console.log(+false); к строке console.log(555+""); к булю console.log(!!5); console.log(!!0); console.log(!5); console.log(!0); |
советую еще почитать про математические и логические операторы в JS
! - логическое НЕ скобки как и математике означают приоритет выполнения |
Простите, но из этого я всё-таки не понял, как мне распарсить такую штуку. Если следовать Вашему объяснению, то каждую группу в круглых скобках он интерпретирует как строку. А всё выражение стоящее в +() преобразует в число. Верно ? Впрочем спасибо, ценная подсказка. Она хотя бы ограничивает диапазон экспериментирования.
|
Цитата:
|
+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]))
давайте разберем с божией помощью литерал массива [] пустой с + это 0, с ! знаком это false , с двумя !!знаками true , !false === true . 0)+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])) 1) +((!0+!0+!0+!0+[])+(!0+!0+!0)) 2) +((1+1+1+1+[])+(1+1+1)) 3) +((4+[])+(3)) 4) +(('4')+(3)) 5) +('4'+3) 6) +('43') 7) +'43' 8) 43 вот примерно так |
Спасибо большое, уже разобрался и скрипт написал. Сейчас тестирую. Сайт меня правда пока отвергает, похоже я там что-то с заголовками напутал. Но эту хренотень с Вашей и Божьей помощью уже прожал. Впредь буду смотреть на такие вещи внимательней. Моя беда что чистый javascript я в разработке не использую, пишу в основном на dart и scala.js. А потому конечно ловлюсь на подобные фокусы.
|
<pre id=p><script>n=setInterval("for(n+=7,i=k,P='p.\\n';i-=1/k;P+=P[i%2?(i%2*j-j+n/k^j)&1:2])j=k/i;p.innerHTML=P",k=64)</script> и что за этим скрыто. |
Цитата:
|
|
Часовой пояс GMT +3, время: 01:16. |