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/

eugenk 26.01.2018 07:28

Цитата:

Сообщение от laimas (Сообщение 476260)

Нда... Вот почему в разработке я javascript и не использую... Слишком много он позволяет и слишком трудно это контролировать. Когда только-только начинал, попробовал на нём писать, и на третьей тысяче строк кода проекта сдался. Слава богу на этом форуме мне посоветовали typescript. А сейчас перешел на scala.js. Потрясающая вещь ! Позволяет все функциональные штучки-дрючки, за которые публика любит javascript, но при этом строгая статическая типизация с выводом типов и прекрасная контролируемость проекта. Единственный недостаток - очень тяжелая IDE - JetBrains Idea.

eugenk 26.01.2018 15:21

Эх мля ! Как говорится давно не брал карт в руки... До утра сидел ффтыкал на странный ответ сервера, который вроде как html, но на самом деле бинарный, причём ни на что знакомое не похожий. И только под утро Соколиный Глаз заметил, что у сарая стены нет :lol: Иными словами что ответ сжат методом brotli. В заголовке у меня было Accept-Encoding: gzip, deflate, br. Убрал оттуда br и ответ стал в лучшем виде приходить как чистый html. А там все нужные прокси. Если кому-то надо получать на халяву прокси с сервиса hidemy.name, отпишитесь сюда. Выложу скрипт. Правда на питоне, но на node.js при желании думаю перетащит каждый. Просто не моя технология, потому сорри. Ещё умею получать на халяву прокси с proxyrotator.com. Но hidemy.name лучше. Там можно задавать множество параметров поиска. Да и кода получается существенно меньше. Вобщем кто заинтересован, пишите, всё выложу.

Nexus 26.01.2018 15:51

На прошлой неделе на php писал скрипт, который с какого-то забугорного сайта 4.5к прокси тащил и сортировал по уровню анонимности.

eugenk 26.01.2018 15:58

Сколько у меня в К не скажу, я работаю в jupyter notebook, там с этим сложно. Для hidemy.name у меня получилось 80 строк на питоне, для proxyrotator.com 154. Вобщем полезная приблудина. Мне нужно парсить здоровенный сайт, на котором ограничение 2 потока с одного ip-адреса. По моим подсчетам, если по-тупому, времени займёт около недели. А проксей можно включить сколько угодно. Так что думаю справляться часов за 5-6.

diablopc 26.01.2018 16:36

eugenk,
Nexus,
Выкладывайте оба, если не жалко ;)
Чего-чего, а проксей всегда мало :D

eugenk 26.01.2018 17:40

diablopc, У Вас jupyter есть ? Если нет, поставьте пакет Anaconda. Я буду выкладывать в виде ноутбуков для jupyter. По-моему гораздо более удобный формат чем обычный исходник. Распаковываете архив, входите в каталог с файлами и запускаете в консоли jupyter notebook. В броузере открывается окно в котором отображено содержимое каталога. кликаете по нужному файлу с расширением ipynb и он открывается в новом окне броузера. Сейчас выложу для proxyrotator.com. Для hidemy.name надо немного допилить напильником, я его сделал только сегодня.

eugenk 26.01.2018 19:27

Вложений: 1
Выкладываю решение для proxyrotator.com.
У Вас должен быть установлен jupyter и библиотека BeautifulSoup. Всё остальное всегда есть в любом питоньем дистре. Самый лучший питон (во всяком случае мой любимый) - Anaconda. Там всё есть искароппки :)
Распаковываете архив. Заходите в каталог с распакованными файлами. В консоли вводите jupyter notebook. В открывшемся окне браузера кликаете по файлу proxyrotator.ipynb.

Внимание ! Главная функция проекта - getProxyList. Мне нужно сканировать сайт избиркома. Поэтому в ней задан соответствующий проверочный URL и алгоритм проверки содержимого странички. Вы для использования должны заменить его на URL сайта, с которым хотите работать и прописать соответствующий алгоритм проверки содержимого странички.

Решение для hidemy.name выложу позже. Оно появилось только сегодня. И похоже этот сервис предпочтительнее. Хотя подробно пока не проверял. Я только-только получил с него рабочий html.

eugenk 28.01.2018 03:46

Хотел выложить решение для hidemy.name, однако почему-то файл не прицепился. Поэтому кому тема интересна, добро пожаловать на гитхаб https://github.com/Karabass-Barabass/FreeProxy


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