Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.01.2018, 00:27
Аспирант
Отправить личное сообщение для eugenk Посмотреть профиль Найти все сообщения от eugenk
 
Регистрация: 14.05.2013
Сообщений: 47

Очень странная запись чисел
Приветствую многоуважаемый 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. Предложения типа заплатить денюшку отвергаются. Не потому что жаба душит, а потому что скрипт делается для бесплатного публичного использования всеми желающими (будет выложен на гитхаб), в ОЧЕНЬ важной задаче.

Последний раз редактировалось eugenk, 26.01.2018 в 00:32.
Ответить с цитированием
  #2 (permalink)  
Старый 26.01.2018, 00:59
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

да тут все просто, в 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);
Ответить с цитированием
  #3 (permalink)  
Старый 26.01.2018, 01:11
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

советую еще почитать про математические и логические операторы в JS
! - логическое НЕ
скобки как и математике означают приоритет выполнения
Ответить с цитированием
  #4 (permalink)  
Старый 26.01.2018, 01:14
Аспирант
Отправить личное сообщение для eugenk Посмотреть профиль Найти все сообщения от eugenk
 
Регистрация: 14.05.2013
Сообщений: 47

Простите, но из этого я всё-таки не понял, как мне распарсить такую штуку. Если следовать Вашему объяснению, то каждую группу в круглых скобках он интерпретирует как строку. А всё выражение стоящее в +() преобразует в число. Верно ? Впрочем спасибо, ценная подсказка. Она хотя бы ограничивает диапазон экспериментирования.
Ответить с цитированием
  #5 (permalink)  
Старый 26.01.2018, 01:18
Аспирант
Отправить личное сообщение для eugenk Посмотреть профиль Найти все сообщения от eugenk
 
Регистрация: 14.05.2013
Сообщений: 47

Сообщение от j0hnik Посмотреть сообщение
советую еще почитать про математические и логические операторы в JS
! - логическое НЕ
скобки как и математике означают приоритет выполнения
Да, спасибо. Это я уже понял. Сейчас пишу на питоне скрипт, парсящий эту хрень. А потом буду просто многократно читать страничку и собирать отказы моего скрипта, постепенно добавляя в него случаи таких отказов. Часа за три наверно сделаю.
Ответить с цитированием
  #6 (permalink)  
Старый 26.01.2018, 01:50
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

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

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

вот примерно так
Ответить с цитированием
  #7 (permalink)  
Старый 26.01.2018, 02:06
Аспирант
Отправить личное сообщение для eugenk Посмотреть профиль Найти все сообщения от eugenk
 
Регистрация: 14.05.2013
Сообщений: 47

Спасибо большое, уже разобрался и скрипт написал. Сейчас тестирую. Сайт меня правда пока отвергает, похоже я там что-то с заголовками напутал. Но эту хренотень с Вашей и Божьей помощью уже прожал. Впредь буду смотреть на такие вещи внимательней. Моя беда что чистый javascript я в разработке не использую, пишу в основном на dart и scala.js. А потому конечно ловлюсь на подобные фокусы.
Ответить с цитированием
  #8 (permalink)  
Старый 26.01.2018, 05:16
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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


и что за этим скрыто.
Ответить с цитированием
  #9 (permalink)  
Старый 26.01.2018, 06:32
Аспирант
Отправить личное сообщение для eugenk Посмотреть профиль Найти все сообщения от eugenk
 
Регистрация: 14.05.2013
Сообщений: 47

Сообщение от laimas Посмотреть сообщение
<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>


и что за этим скрыто.
Жуть ! Руки отпиливать таким кодерам ! Причём тупой, ржавой ножовкой
Ответить с цитированием
  #10 (permalink)  
Старый 26.01.2018, 06:54
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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


https://habrahabr.ru/company/mailru/blog/335292/
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор случайных чисел без повторений в последующих генерациях Samik Общие вопросы Javascript 14 12.03.2023 00:35
НОД более чем 2-х чисел Demath Общие вопросы Javascript 4 06.01.2013 05:27
Работа с последовательностью натуральных чисел Stillife Общие вопросы Javascript 1 18.05.2011 20:03
Очень странная крос браущзерность. socengel jQuery 4 02.03.2011 19:46
Сложение чисел очень важно исправьте ошибки плиз Хранитель Света Общие вопросы Javascript 9 24.10.2010 23:36