Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Очень странная запись чисел (https://javascript.ru/forum/css-html/72395-ochen-strannaya-zapis-chisel.html)

eugenk 26.01.2018 00:27

Очень странная запись чисел
 
Приветствую многоуважаемый All ! Тут мне уже не раз помогали, хочу попросить помощи ещё раз.
Проблема такая. Ковыряя один из скриптов, наткнулся на очень странную запись чисел например строка:
+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]))
Означает число 43. По крайней мере в браузере это так, можете проверить в консоли. Путём экспериментов понял, что числа формируются из групп в круглых скобках как десятичные. Левая группа старший разряд и т.д. Сами числа находятся как число квадратных скобок [] перед которыми стоят восклицательные знаки. Однако я не уверен, что всё знаю об этом способе. Вполне мог и пропустить какие-то особенности. Если кто в курсе, подскажите, где можно узнать об этом подробнее. Мне нужно уметь парсить на питоне подобные записи.

Как возникла задача. Мне в скрипте (python) нужно получать список бесплатных прокси-серверов. Причем их нужно МНОГО. Поэтому сервисы с API не годятся, там слишком мал суточный бесплатный лимит. Из платных сервисов с защитой от автоматического сканирования, мне больше всех понравился hideme. Но там применяют проверку на "человечность" веб-агента, где используется как раз такая форма записи чисел. Если кому любопытно, вот скрипт на питоне, получающий защитную страничку:
Код:

import requests
headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0",
            "Accept":"text/html,application/xhtml+xml,application/xml; q=0.9,image/webp,*/*;q=0.8"
            }
rsp=requests.get("https://hidemy.name/ru/proxy-list/", headers=headers)
s=str(rsp.content.decode(rsp.encoding))
file=open("hideme.html", "wt")
file.write(s)
file.close()
print("Готово !")

Можете поковырять её сами и убедиться.

P.S. Предложения типа заплатить денюшку отвергаются. Не потому что жаба душит, а потому что скрипт делается для бесплатного публичного использования всеми желающими (будет выложен на гитхаб), в ОЧЕНЬ важной задаче.

j0hnik 26.01.2018 00:59

да тут все просто, в 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);

j0hnik 26.01.2018 01:11

советую еще почитать про математические и логические операторы в JS
! - логическое НЕ
скобки как и математике означают приоритет выполнения

eugenk 26.01.2018 01:14

Простите, но из этого я всё-таки не понял, как мне распарсить такую штуку. Если следовать Вашему объяснению, то каждую группу в круглых скобках он интерпретирует как строку. А всё выражение стоящее в +() преобразует в число. Верно ? Впрочем спасибо, ценная подсказка. Она хотя бы ограничивает диапазон экспериментирования.

eugenk 26.01.2018 01:18

Цитата:

Сообщение от j0hnik (Сообщение 476252)
советую еще почитать про математические и логические операторы в JS
! - логическое НЕ
скобки как и математике означают приоритет выполнения

Да, спасибо. Это я уже понял. Сейчас пишу на питоне скрипт, парсящий эту хрень. А потом буду просто многократно читать страничку и собирать отказы моего скрипта, постепенно добавляя в него случаи таких отказов. Часа за три наверно сделаю.

j0hnik 26.01.2018 01:50

+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]))

давайте разберем с божией помощью
литерал массива [] пустой с + это 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

вот примерно так

eugenk 26.01.2018 02:06

Спасибо большое, уже разобрался и скрипт написал. Сейчас тестирую. Сайт меня правда пока отвергает, похоже я там что-то с заголовками напутал. Но эту хренотень с Вашей и Божьей помощью уже прожал. Впредь буду смотреть на такие вещи внимательней. Моя беда что чистый javascript я в разработке не использую, пишу в основном на dart и scala.js. А потому конечно ловлюсь на подобные фокусы.

laimas 26.01.2018 05:16

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


и что за этим скрыто.

eugenk 26.01.2018 06:32

Цитата:

Сообщение от laimas (Сообщение 476258)
<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>


и что за этим скрыто.

Жуть ! Руки отпиливать таким кодерам ! Причём тупой, ржавой ножовкой :lol:

laimas 26.01.2018 06:54

alert('b' + 'a' + + 'a' + 'a')


https://habrahabr.ru/company/mailru/blog/335292/


Часовой пояс GMT +3, время: 15:57.