Xpoint
   [напомнить пароль]

Как выключить часть кода JS на загруженной странице Perlом?

Метки: [без меток]
2007-11-11 18:50:24 [обр] gal7[досье]
 Может кто-нибудь поможет-не могу найти как "выключить часть кода JS" со страницы , загруженной в браузер с помощью Perl. Порылся на CPAN- потратил кучу времени и не нашел ни чего подходящего. Есть только всякие автоматизаторы браузеров и т.д., а средств для влияния на выполнение кода javascript не нашел.
 Пришло в голову только переопределение методов JS на странице, т.е. заново определяю какую-либо функцию и "вставляю"(т.е. пока не вставляю:-)) в загруженную страницу. Вот не знаю как можно вставить код в загруженную страницу. Можно ли с помощью OLE? Самое главное как?
 Нашел там модуль, который создает объект, и его можно потом поместить в браузер, но как создать объект-функцию не нашел(например создать объект интернет эксплорер там так:my $agent = Win32::OLE->new( 'InternetExplorer.Application' );). Что можно вставить, чтобы создать функцию js-объект, видимо формат должен быть таким же (через точку).
Может кто-то подобное делал другими способами, напишите, пожалуйста!
спустя 4 минуты [обр] lavan(0/7)[досье]

gal7[досье],

по моему, у вас каша в голове, опишите суть задачи, не вдаваясь в методы её решения.

спустя 8 минут [обр] gal7[досье]
Надо чтобы часть кода(выбранная мной) на загруженной в браузер странице не выполнялась.
спустя 18 минут [обр] Marat Tanalin(0/78)[досье]
Возможно, вы слабо представляете себе фундаментальный механизм взаимодействия клиент-сервер. В частности, что сделать что-то с уже отданной браузеру страницей с серверной стороны невозможно физически.
спустя 23 минуты [обр] gal7[досье]
Я наверно плохо выразился, извиняюсь. Теперь поподробнее:
Я скачиваю с сайта(не моего) страницу, т.е. она открывается в браузере, и далее мне надо выключить(уже на своей стороне) часть кода JS. Потом я нажимаю кнопку на этой странице и выполняется уже не весь код на странице, который там был, а тот, что я "не выключил".
спустя 34 минуты [обр] AB...(10/233)[досье]
Так обрезайти функциональность самим Perl скриптом на стороне клиента. Создайте фильтр и потом полученный код обработайте. Теперь стороний код готов к отдаче навашему посетителю.
Если есть желание фильтровать при помощи JavaScript, то прежде всего вам необходим данный скрипт для фильтрации. Как отметил Marat Tanalin[досье], код уже на стороне браузера и вам надо предварительно включить в данный код ваш фильтр. И опять, вы можете это делать только на вашем сервере перед отдачей кода при помощи Perl-фильтра или вкоючать необходимый JavaScript-фильтр который будет отрабатываться в самом браузере.
Я так понимаю, что вы используете Perl для чтения страницы со стороннего сайта перед тем как отдаете своему посетителю. И предпологаю вы не используете фреймовую контсрукцию.
спустя 24 минуты [обр] gal7[досье]
 Не понял про посетителя:"...Я так понимаю, что вы используете Perl для чтения страницы со стороннего сайта перед тем как отдаете своему посетителю. И предпологаю вы не используете фреймовую контсрукцию. "... Perl я использую, потому что немного знаю его, и к удаленным серверам в сети он отношения не имеет.
 Да, поэмы сочинять это не мое, ни кто их не поймет... Я для себя загружаю страницу, ни куда ее не отправляю. Просто на ней ооочень большой код JS(но весь его не выключишь иначе ничего не будет работать там), он сильно грузит процессор, в то время как в эти ресурсы можно пустить на более полезную работу, например вместо 1 грузить 101 страницу.
 На счет фильтров может их как-то можно приспособить и в этом случае? Наверное это будет сложно сделать, придется делать что-то вроде прокси-сервера, при этом не факт, что все будет работать как надо , т.к. нужный мне сайт использует всякие навороты и это может сказаться. Все же OLE мне кажется будет проще, но как...?
спустя 3 часа 17 минут [обр] Alexander O(122/460)[досье]
gal7[досье] можете сказать что за сайт, и что конкретно с какими страничками хотите сделать? Без всяких обобщений.
спустя 10 часов [обр] gal7[досье]

Alexander O[досье]:gal7[досье] можете сказать что за сайт, и что конкретно с какими страничками хотите сделать? Без всяких обобщений.

 Какая разница, что за сайт? Сегодня этот сайт, завтра совсем другой. Просто мне надо взять и сделать, то, про что я написал.
 Может кто-то тогда мне подскажет как работать с модулем CPAN? Вот его адрес: http://search.cpan.org/~abeltje/Win32-IE-Mechanize-0.009/
 Там есть несколько модулей(все они у меня устанвлены):
Win32::IE::FormWin32::IE::Image
Win32::IE::Input
Win32::IE::Link
Win32::IE::Mechanize

И вот я думаю, что мне может подойти модуль Win32::IE::Input. Но никак не пойму как с ним работать. Например, инициализирую новый объект как там показано:
"Win32::IE::Input->new( $ie_input )
Initialize a new object (like Win32::IE::Form)."

 И вот не понятно, что это за новый объект, где он расположен, что надо указывать в $ie_input, как с ним работать-не ясно. С английским у меня мягко говоря не очень, вот и мучаюсь уже какой день.
 Думаю для профи понять там минутное дело, сам никак не пойму.

спустя 56 минут [обр] Роман Чемисов(56/327)[досье]

gal7[досье]
По-моему, Вам не Win32::IE::Mechanize, а банальный

$page =~ s{<script type="text/javascript">.+?</script>}{}g;

нужен.

спустя 39 минут [обр] gal7[досье]
Ну а как получить доступ к загруженной странице, чтобы что-то там заменить???Она же загружена в память и выдается браузером. Если, например, сначала создаю объект IE, потом пишу вместо $page, как у Вас в примере, ссылку на этот объект, то ничего не заменяет в этом объекте.
спустя 1 час 10 минут [обр] Алексей Севрюков(198/1280)[досье]
gal7[досье] Мух от котлет отделите. Вам говорят про то, что Ваш Perl скрипт будет сам забирать страницу по адресу, удалять не нужные скрипты и потом уже отфильтрованную отдавать Вам. Этакое подобие прокси с фильтром.
спустя 44 секунды [обр] Юрий(0/8)[досье]
Вы так и не поняли что вам толковали! Из Perl программы доступа к отданному содержимомму в IE нет!
Предыдущий атор по видимому имелл ввиду следующее:
Перл программа загружает интересующую вас страницу. Регулярными выражениями вырезает ненужный скрипт и отдает страницу вам! По сути этот тот же прокси сервер с фильтрами!
спустя 56 секунд [обр] Юрий(0/8)[досье]
Тоже самое написал что и Алексей Севрюков[досье] ;)))
спустя 57 минут [обр] Роман Чемисов(56/327)[досье]

Юрий[досье]

Из Perl программы доступа к отданному содержимомму в IE нет!

На самом деле, конечно, есть. Но скорее всего автору не нужен IE.

спустя 5 минут [обр] gal7[досье]

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

Юрий[досье]"Из Perl программы доступа к отданному содержимомму в IE нет!"

Ну как же нет доступа-я же привел пример модулей(автоматизация IE с помощью OLE), только проблема в том, что они позволяют ПОЛУЧАТЬ со страницы что угодно(названия элементов, id, имена, слова, ссылки и т.д.), а не ДОБАВЛЯТЬ на страницу(ну за исключением форм-там можно и добавлять запись этими модулем). Видимо авторы не подумали, что такое может кому-то понадобится. Хотя как я говорю может модуль Win32::IE::Input как раз для этого предназначен, но я в нем ни как не могу разобраться. А остальное все работает-извлекает, создает окно IE, переходит на сайты и т.д., т.е. автоматизирует Internet Explorer.

спустя 5 минут [обр] gal7[досье]
IE мне нужен, чтобы он обрабатывал JS, так как без него ничего там не будет работать.А так бы конечно, сделал бы на Perl web-клиента и все ОК, но...
спустя 31 минуту [обр] Юрий(0/8)[досье]
gal7[досье]
Вы сами не понимаете что вы пишите.
Была когда-то такая программа (была потому что автор умер ;( ) она называлась Proxomitron. Так вот эта программа служит для вырезания рекламы со страниц. Она работает как прокси сервер: закачивает страницу, обрабатывает, отдает вашему браузеру с тем же адресом никуда не сохраняя.
По сути оттуда повыбрасывать все правила удаления рекламы и вставить ваше правило (регулярные выражения) которые будут вырезать ваш скрипт JS и вы будете созерцать страницу уже в нужном вам виде. По-моему это как раз то, что вам нужно ;)
спустя 31 минуту [обр] gal7[досье]

Юрий[досье]
"Вы сами не понимаете что вы пишите."
Что конкретно я не понимаю, что пишу?

Насчет Proxomitron я знаю. Например, мне надо добавить на страницу дополнительный JS код, при том, на одном сайте это будет один код, на другом другой, на третьем третий, каждый раз все это устанавливать не удобно, с Perl же я смогу все это ПОЛНОСТЬЮ автоматизировать.
Выискивал сейчас как же сделать и нашел, что оказывается во всех этих модулях используется объектно-ориентированный подход Perl, я просто когда его изучал, пропустил все что с ним связано, подумав, что мне не понадобится писать программы с его использованием. Теперь буду аврально изучать ООП, может тогда пойму что там делать с Win32::IE::Input.

спустя 4 часа 13 минут [обр] gal7[досье]
Всем спасибо за помощь, кажется я нашел решение.
спустя 3 часа 33 минуты [обр] Юрий(0/8)[досье]
И какое же если не секрет? ;)
спустя 19 часов [обр] gal7[досье]

 Видимо пока не совсем решена проблема...
 Не могу понять почему если я сначала например смотрю так сколько элементов в хэше:
$op=%{$ie->{agent}->{document}};
print "$op\n";

, то показывает все элементы хэша(ключи и значения), а если потом обращаюсь так к элементу хэша по его ключу:
@op=%{$ie->{agent}->{document}->{defaultCharset}};
, то никакого элемента не показывает(должен быть скаляр-цифры и буквы).Там он ТОЧНО был при выполнении первого примера. Как такое получается? При этом если бы в этом элементе была ссылка на хэш, то она выводится на экран.

 И еще вопрос: набираю такой код @op=%$ie; (получаю элементы хэша-один ключ и соответственно значение хэша-ссылку на другой хэш), набираю такой код @op=%{$ie->{agent}} и ничего не выводится, а если набираю @op=%{$ie->{agent}->{document}}, то выводит значение данного хэша, состоящего из других хэшей, скаляров и т.д. Очень странно-почему в первом примере видно, что хэш есть , пытаюсь получить его элементы, его "нет" , потом если пытаюсь получить элементы хэшей в этом "странном" хэше, то он опять "есть".Здесь ситуация похожа на первый вопрос, то "есть" , то "нет".

спустя 9 минут [обр] Алексей Севрюков(198/1280)[досье]

gal7[досье] perldoc Data::Dumper

P.S. Вы видимо вообще не в теме. Пытаетесь скаляры превратить в хэш, потом присвоить массиву. Зачем?

спустя 46 минут [обр] gal7[досье]
Давайте, я опишу как понимаю, а Вы укажете в каком месте ошибка в моих рассуждениях, и почему ее нет в остальных указанных кодах. Если я начну разбираться в новых модулях, то боюсь это может плохо кончится...
 Итак, $ie-это ссылка на объект, созданный Perl, {agent},{document},{defaultCharset}-это ключи хэшей. Когда я пишу например:
@op=%{$ie->{agent}->{document}};
, то я понимаю это так: "переходим" по ссылке к объекту, затем по ссылке к элементу хэша с ключем agent, затем по ссылке к элементу хэша с ключем document. Затем получаем значение(там список) элемента хэша с ключем document и присваиваем список массиву @op. Что не верно, и как сделать, что бы было именно так как я сейчас написал? Голова уже раскалывается.
спустя 41 минуту [обр] Алексей Севрюков(198/1280)[досье]

М gal7[досье] Давайте вы не будете ничего описывать. Вы просто пройдете по ссылке которую я Вам дал, прочитаете, вникните, примените и посмотрите что получилось. Думаю что Вам все сразу станет понятно.

P.S.

Затем получаем значение(там список) элемента хэша с ключем document и присваиваем список массиву @op
my $doc=$ie->{agent}{document};
@op=@$doc;

Это если у Вас $ie->{agent}{document} суть есть ссылка на массив.

спустя 16 минут [обр] gal7[досье]
Алексей Севрюков[досье]
"Вы просто пройдете по ссылке которую я Вам дал, прочитаете, вникните, примените и посмотрите что получилось."
Хорошая шутка! Я в двух ангийских словах тех модулей блуждаю уже с неделю, а здесь сразу разберусь... Если бы я понимал английский, то мне вообще бы вопросы нигде не пришлось бы задавать. Ни да ладно
спустя 3 минуты [обр] Алексей Севрюков(198/1280)[досье]
gal7[досье] Хорошо, раз такое дело я Вам помогу, добавьте этот код после создания объекта $ie:
use Data::Dumper ();
print Data::Dumper->Dump($ie);
спустя 20 секунд [обр] Алексей Севрюков(198/1280)[досье]
М Перенесено из форума "Программирование::Perl::Разное"
спустя 25 минут [обр] gal7[досье]
Как этим пользоваться?
Выдает:
Usage: PACKAGE->new(ARRAYREF, [ARRAYREF]) at C:\data\automation.pl line 21
Что это дало?
спустя 30 минут [обр] gal7[досье]
Закрываем тему
спустя 6 часов [обр] Алексей Севрюков(198/1280)[досье]
Разобрались с проблемой?
спустя 5 часов [обр] gal7[досье]
Частично разобрался. Оказывается в этом примере
@op=%{$ie->{agent}->{document}};
не надо так получать "значение хэша", так как значение хэша с ключем document это не хэш. В упор не заметил. Т.е. надо просто $ie->{agent}->{document} и это будет значение хэша.
Но теперь появилась новая проблема:( Не могу менять значения всех этих хэшей, например пишу:
(изначально $ie->{agent}->{document}=Win32::OLE=HASH(0x18393c8))
print $ie->{agent}->{document}="1";
Так и выдает Win32::OLE=HASH(0x18393c8). Наверно это как-то связано с пространствами имен. Пока не нашел что надо сделать вообще можно ли что-то сделать из самой программы или можно менять только из этого модуля(Win32::OLE).
спустя 37 минут [обр] gal7[досье]
Я просто для чего это хочу сделать-этот объект Perl создается для управления Internet Explorer из Perl. Так вот не пойму если поменять значения в хэшах этого объекта, то будет это отражаться на IE или нет?
Может если не будет, то и менять как я спросил не надо. Интересно, как тогда менять?
спустя 1 час 3 минуты [обр] gal7[досье]
Странно, пока не задам вопрос ничего не получается, как задам-сам случайно находится ответ.
Оказывается поолуууууучаетсяяяяяяяяяяяяяя менять!!!!!!!!!!!
Просто почему-то не все значения.С чем же это может быть связано???
спустя 4 часа 40 минут [обр] gal7[досье]
Что, даже предположений ни у кого нет почему так получается?
спустя 12 минут [обр] Алексей Севрюков(198/1280)[досье]
gal7[досье]
use Data::Dumper ();
print Data::Dumper->Dump([$ie]);
спустя 1 час 14 минут [обр] gal7[досье]
Что называется, топающему кинули книгу "Как научиться плавать".
спустя 10 минут [обр] Алексей Севрюков(198/1280)[досье]
gal7[досье] А что Вы предлагаете? Бросить все свои дела, взять Ваш модуль и за Вас в нем ковыряться? Что ж Вы лезите программировать если основ даже не знаете. Покупайте учебник по Perl + сборник рецептов, изучайте сложные структуры данных, ссылки и так далее. А то вопрос изначально задается по достаточно сложному модулю, и через несколько постов оказывается что Вы даже не знаете что такое Data::Dumper.
спустя 38 минут [обр] gal7[досье]

Алексей Севрюков[досье]
"Бросить все свои дела, взять Ваш модуль и за Вас в нем ковыряться?"

Нет, я этого не предлагал. Я спросил у знающих людей ВОЗМОЖНЫЕ причины по которым нельзя присвоить новое значение элементу хэша.

Алексей Севрюков[досье]
"Покупайте учебник по Perl + сборник рецептов, изучайте сложные структуры данных, ссылки и так далее. А то вопрос изначально задается по достаточно сложному модулю, и через несколько постов оказывается что Вы даже не знаете что такое Data::Dumper."

Программировать пришлось, так как жизнь заставила. Книга у меня есть, про Data::Dumper в ней ни слова. Просто я начал только месяц назад и мало что знаю, поэтому и пишу на форум. А пока завяз с этим делаю остальную часть программы.

Алексей Севрюков[досье]
"...и через несколько постов оказывается что Вы даже не знаете что такое Data::Dumper."

 Интересно, а зачем знающий Data::Dumper человек, если он решает все проблемы, будет задавать вопросы, если он знает как на них ответить и что нужно делать?

спустя 42 минуты [обр] Алексей Севрюков(198/1280)[досье]
gal7[досье] Давайте без отходов от темы и обсуждения кто что умеет, а кто что нет. Вы запустили указанный код, получили результат?
спустя 47 минут [обр] gal7[досье]

Результат use Data::Dumper ();print Data::Dumper->Dump([$ie]); :

$VAR1 = bless( {
                 'agent' => bless( {}, 'Win32::OLE' )
               }, 'Win32::IEAutomation' );

спустя 2 часа 15 минут [обр] Alexander O(122/460)[досье]

gal7[досье] В Вашем случае одним Data::Dumper не обойтись. Вам нужно еще почитать про COM Automation, изучить интерфейс InternetExplorer.Application узнать каким образом работает Win32::OLE. Тогда вы поймете, почему некоторые элементы хэша можно изменить, а некоторые нет. И поймете, что поставленную Вами задачу - "выключть часть кода..." - Win32::IE::Mechanize решить не поможет.

Все что Вы можете, это получить HTML код до его обработки браузером, поменять его, если нужно. Потом получить HTML код после исполнения его браузером, после того как отработает javascript. И только после того, как страничка загружена в браузер и все скрипты исполнены, тогда уже Вы можете менять внутренности странички, и вызывать js-код.

спустя 10 минут [обр] Алексей Севрюков(198/1280)[досье]
gal7[досье] вообще скорее всего там все построено на объектах, скорее всего со своим интерфейсом (TIE*), поэтому некоторым ключам нельзя присвоить значение. Да и какой смысл присваивать значение 1 и затирать ссылку на объект, представляющий документ ($ie->{agent}{document}).
спустя 1 час 53 минуты [обр] gal7[досье]
Я просто для примера написал $ie->{agent}{document}как самое короткое не меняющееся-если бы его как-то поменяли, то и другие можно было бы также менять.
Спасибо, буду смотреть TIE* и все эти классы, может что-то и получится.
спустя 1 час 21 минуту [обр] Алексей Севрюков(198/1280)[досье]
gal7[досье] вообще на самом деле смотреть надо мануал, разбираться в некоторых модулях, читая исходники - не самая лучшая идея.
спустя 22 часа [обр] gal7[досье]
 На счет доступа к значениям хэша я думаю там идет все же изменение в объекте Perl, но потом почти мгновенно оно возвращается назад. Никакого использования TIE я не увидел.
 Видимо, это где-то в недрах IE в его свойствах (или как это называется) есть установки, отвечающие за такое(может даже в недрах всех этих хэшей).
спустя 2 дня 12 часов [обр] gal7[досье]
Да, все было так просто...:-(
спустя 4 месяца 9 дней [обр] gal7[досье]
Если кому все же понадобится решить подобную проблему, то я отыскал несколько вариантов. Пишу о них, т.к. "я вышел из игры"(здоровье подкачало) и конкурентов себе не напложу(всмысле, если это будут использовать так, как я хотел):) Вообщем можно использовать систему автоматизации autoit, а можно просто открывать во фрейме и менять там что угодно. Чтобы можно было менять во фрейме надо делать файл не .html(.htm), а .hta(например, просто переименовать расширение на .hta, но есть и др. способы, если надо-ищите), тогда блокировки для безопасности не срабатывают.
Удачи!
Powered by POEM™ Engine Copyright © 2002-2005