Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
================================================ Внимание! такой знак %NL% означает, что переноса строки нет. Сделанно из за форматирования Постараюсь в вкратце затронуть основные моменты данной темы. Очень часто вижу новые темы с вопросом о авторегистрации, авторизации и других подобных вещей. Небольшое отступление, т.к. мало кто знает, что все эти регистрации и авторизации основаны на одном простом методе - это отправка каких либо данных клиента серверу. Существует несколько HTTP методов отправки данных, но мы рассмотрим только два - это GET и POST. Методы запроса GET и POST имеют принципиально различное семантическое значение, потому не стоит заблуждаться по поводу их различия лишь в отправке. Метод GET. 1. Этот метод (также как и метод HEAD) называются безопасными, т.е. в спецификации HTTP/1.1 говорится, что эти методы лишены действий кроме, как получения запрашиваемой информации. Передает данные серверу используя URL адрес. 2. Этот запрос может кэшироваться. 3. Ограниченная длина отправка данных около 8 кб. или 1024 символами. Но сейчас браузеры могут обрезать под свои размеры. 4. Метод открытой передачи, т.е. можно увидеть переданные данные в адресной строке. Метод POST. 1. Метод, который может выполнять некоторые действия, поэтому POST (а также другие PUT, DELTE и т.д.) называют не безопасными. Передает данные в теле HTTP запроса. 2. Запрос не кэшируется. 3. Лимит ограничен сервером около 2мб. 4. Метод закрытой передачи, данные нельзя увидеть воочию. Более подробно читайте в инете…
---"Простая" передача данных--- ================================================ Метод POST в NeoBook-1 НБ может использовать оба метода, но прежде чем воспользоваться, надо точно знать какой метод применяется?! И так, чтоб организовать "авторегалку" надо хоть немного знать html. Обычно, для отправки данных используют форму Она предназначена для обмена данными между пользователем и сервером. Вот с помощью этой формы мы и узнаем каким методом передаются данные. Пример: имеем некий сайт (http://www.super_social_network.ru) Надо открыть исходный код страницы и найти тег form.
Начинается примерно так - <form (тут будут, какие то странные слова, это мтершиные слова web-программеров) > (наз-ся: открывающий тег), а заканчивается так - </form>. Все, что лежит между тегами считается телом формы. Теперь ищем в открывающем теге запись(атрибут) method и смотрим что написано в кавычках, после знака равно, ага, написано post. Вот мы и определили наш метод отправки. В НБ отправка методом пост выполняется командой InternetPost. Нам осталось определить, Куда и Что надо отправить серверу. Куда: опять смотрим в открывающем теге атрибут action, ага, там написано login.php ну вот, мы знаем, куда отправить данные. Т.к. адрес нам известен, то в поле "URL/ HTTP команда" пишем адрес: InternetPost "http://www.super_social_network.ru/login.php" "" "" "". Ищем Что: Искать теперь будем в теле формы. Нас интересует тег input со следующими значениями атрибута type (тип) это; "text, checkbox, radio, password, hidden,file, submit " также следует искать теги select, textarea и img, если присутствует каптча. У всех, из перечисленных, должен быть обязательный атрибут name(имя), если его нет, то на этот объект можно не обращать внимание. В примере выше я указал много объектов, это чисто пример, т.к. в реальной жизни их может быть мало или некоторых вообще не быть. И так в форме есть 6 input разных типов. В каждом инпуте ищем атрибут имя и записываем в переменную [data] SetVar "[data]" "login=LoginNick&pasword=PassUser&remember=yes&" SetVar "[data]" "[data]amount1=1&city=4&code=25685&sekret=sekret" Каждый элемент формы должен быть отделен символом & Обратите внимание, что я не включил данные двух объектов из формы - это textarea и input(тип -submit). У них нет имени, а значит, они бесполезны. Но если у submit(это кнопка отправки данных) будет имя, то возможно придется и ее включать, это бывает не всегда нужно, но бывает Еще один момент, если будет указан проверочный код (антибот), то надо найти тег img и в атрибуте src получить адрес картинки, адрес может быть вида _http://www.super_social_network.ru/code.jpg или _http://www.super_social_network.ru/code.php. После того, как получили адрес картинки, надо будет загрузить ее на комп и показать в проект. Все готово для отправки данных:
.Грузим каптчу DownloadFile "http://www.super_social_network.ru/code.jpg " "[PubDir]code.jpg" "HideProgress+Async" …Выводим ее в объект Picture, а в объект TextEntry1 с переменной [code] вводим код .формируем строку с данными SetVar "[data]" "login=LoginNick&pasword=PassUser&remember=yes&amount1=1&city=4&code=[code]&sekret=sekret" .отправляем данные InternetPost "http://www.super_social_network.ru/login.php" "[data]" "[resultat]" "Async" .полученый результат грузим в WebBrowser BrowserLoadFromStr "WebBrowser1" "[resultat]"
Это самый простой вид отравки, который встречается все реже и реже ================================================ Метод GET в NeoBook-2 Это, пожалуй, самый простой метод отправки, и он визуально виден. Например, откроем поисковик (_http://www.google.ru/) введите в поле слово (тест) и нажмите "Поиск". Теперь в адресной строке к основному адресу добавились еще данные
все, что идет после символа ? и есть данные GET запроса. Отправка GET может осуществляться: 1. Как часть адреса URL и можно оформить в ссылке например: <a href="http://www.test.ru/test.php? name=UserName&iduser=125698">link</a>. При нажатии на link мы отравим серверу две переменные – это "name" с значением "UserName" и "iduser" с значением "125698". Сервер получив эти данные обработает их согласно скрипту на странице. 2. Формой, точно так же, как и POST, только изменив соответственно атрибут method. Разберем пример с "google.ru". Откроем исходный код страницы и будем искать тег form.
На скриншоте я выделил ключевые места. Как видно, отправка Get от Post отличается только атрибутом method. Кстати, если этого атрибута нет, как в нашем примере, это значит, что отправка осуществляется GET – по умолчанию. В НБ отправку GET выполняет команда InternetGet. Если нам надо отправить переменные серверу методом GET, вомпользуемся этой командой. В поле "URL/ HTTP команда" запишем запрос в месте с адресом, точно также, как делали для ссылки:
Как видите, все просто. В переменную [resultat] придет ответ с сервера. ================================================ Способ в котором не важен метод -3 Мы рассмотрели варианты отправки командами InternetGetи InternetPost. Но есть еще вариант, как отправить данные с WebBrowser заполнив поля командой BrowserSetElement, правда работает такой вариант не везде. Все, что нам надо знать это имена полей, как их узнать, мы уже знаем. Допустим, в форме присутствуют два поля и кнопка, у полей имена login и pasword, вставляем в эти поля свои данные
осталось отправить. К сожаленью в арсенале НБ нет команды отправки форм из WebBrowser, но на помощь придет BrowserExecScript Если у формы (form) есть атрибут name (например: со значением vForm ), то к форме можно обратится по этому имени и сделать отправку так: vForm.submit(). Но если имени нет, то обратится можно к объекту по индексу: document.forms[0].submit(). Если на странице несколько форм, то в исходнике нужно определить индекс, отсчет начинается с нуля, первая форма = 0, вторая = 1 и т.д.. Ну вот с определением разобрались, пора отправить форму:
Как я написал выше, не на всех страницах работает BrowserSetElement, не знаю почему. Но и это можно обойти с помощью команды BrowserExecScript. Покажу на примере _http://vkontakte.ru/, как раз этот случай… Указываем WebBrowser урл-адрес, а на кнопке пишем следующий код. Прежде чем копипастить, не поленитесь и просмотрите исходный код страницы. Необходимо иметь смутное представление, что и откуда берется. И так, посмотрев исходник, можно увидеть, что форма имеет имя= login, тем лучше для нас Дальше нам надо запомнить имена еще двух полей – логина=email и пароля= pass. Код на JavaScript (а именно на нем мы все делали и будем делать дальше) будет выглядеть так:
3 строчки js кода и 1 строчка НБ кода и авторизация в "кармане" В процессе изучения хитросплетенья js этого ресурса нашел такую фичу: ge(xxx) это функция написана для получения и назначения данных элементам ресурса, и еще кое чего, о которых я не буду говорить, дабы остальные спали спокойно Так вот, можно заполнить данные применив эту функцию, пример: ge('quick_login_form').email.value='LOGIN';
По сути это тоже самое, что и простые, но только сделанные с извратом. Т.е. "ваятели страниц" стараются спрятать или усложнить любым способом механизм отправки. Как правило, в таких ситуациях трудно разобраться и приходится "ломать мозг", чтоб определить как, что и куда отправляется… Уловки к которым прибегают web-программеры: 1. Спрятать форму во фрейм
Была еще одна уловка, но сейчас не могу вспомнить… Но есть еще одна трудность – это когда на странице генерируется уникальный код страницы. ================================================ Метод POST в NeoBook-4
Возьмем пример с этого форума Сделаем автовход в почтовый сервис на yandex.ru. После исследования страницы видно, что на странице присутствует уникальный код (ID) страницы, который генерируется при каждом входе/обновлении. Обычно этот ID надо вытянуть, т.е. парсить. Но мы пойдем другим путем, ведь задача авторизоваться, что мы и сделаем. Загрузим страницу по этому адресу _http://mail.yandex.ru/pda/. Посмотрите внимательно форму отправки. Больше всего меня заинтересовал элемент с именем idkey, его значение, как оказалось и есть ID страницы! И так приступим. Запоминаем все элементы с именами, грузим страницу в WebBrowser. Получаем значения командой BrowserGetElement, кроме логина и пароля и формируем запрос:
SetVar "[url]" "http://pda-passport.yandex.ru/passport?mode=auth" SetVar "[login]" "user" SetVar "[passwd]" "12345" BrowserGetElement "wb" "retpath" "[retpath]" BrowserGetElement "wb" "idkey" "[idkey]" BrowserGetElement "wb" "timestamp" "[timestamp]" BrowserGetElement "wb" "twoweeks" "[twoweeks]" InternetPost "[url]" "retpath=[retpath]&idkey=[idkey]×tamp=[timestamp]&login=[login]&passwd=[passwd]&twoweeks=[twoweeks]" "[html]" "" .загружаем ответ в WebBrowser BrowserLoadFromStr "wb" "[html]" .Значение idkey можно сохранить в файл, а зачем узнаете ниже FileWrite "[TempDir]newidkey.dat.temp" "All" "[idkey]"
вот и все Поделюсь с вами одной фичей. Загрузите значение idkey, которую сохранили ранее и запустите следующий код
InternetGet "http://passport.yandex.ru/passport?mode=testloginjs&[idkey]" "[test]" "HideProgress+Async" .Обработаем ответ If "[test]" "<>" "" .Ищем в ответе слово null .Ответ будет получен в таком виде: Если юзер не авторизован - "window.pass_login = null;" (без кавычек) .Если авторизован - "window.pass_login = LOGIN;" (без кавычек) SearchStr "null" "[test]" "[find]" "" If "[find]" "=" "0" .Если слово не найдено, то авторизация не нужна и можно смело грузить страницу яндекса .Или другие действия, согласно вашей задумке Else .Слово найдено, значит надо авторизоваться EndIf Else .ответ пришел пустым! Либо нет инета, либо устарел idkey EndIf
Еще один бонус от меня, узнать сколько в ящике непрочитанных писем
================================================ Способ авторизации в uCoz-5
Сайты, сделанные на uCoz, я отнес тоже к "замороченным", тоже не все просто. Этим POSTом у меня так и не получилось отправить. Получив данные js и формы, я отправлял все элементы формы, но в ответ тишина. -------------------- Данные, которые я отправлял: (имя = значение) метод(post); адрес(http://neobooker.ru/index/sub/) user=user password=password rem=1 hidden=1 a=2 ajax=2 -------------------- Мне кажется все из-за jQuery. Почти весь сайт работает на нем. И самое смешное, что вроде все понятно в отправке кроме одной строки -
Я не большой знаток jquery, но погуглив, еще больше запутался Это строка означает следующее: Если элемент "subbutfrmLg555" не имеет класс 'myBtnDis', то отправить форму! И добавить этому элементу класс 'myBtnDis'. Может в этом причина?! не исключено, что на сервере идет обращение к элементу с этим классом и вытягивается доп. инфу. Это просто предположение. вот сама функция на jquery
В общем, я забросил попытки отправить постом. Пока, что есть только один способ отправить данные - использовать js либо присоседится к jquery
Поправка, оказывается отправить постом можно запрос. В ответ от сервера приходит функция js перенаправление в "куда-то" и плюс добавляется к адресу гет - данные ?lZ3W_XЯ как то спрашивал на форуме про эту непонятную вставку Короче получилось так:
В опере рега слетает, а в НБ логина не видно Пока остается использовать вариант с js, на форуме есть готовые примеры рабочего варианта авторизации. Не буду тут повторять тоже самое
Разное Много тем, которые затрагивают так или иначе парсинг, т.е. строковые функции. Это большая тема и развивать ее надо бы отдельно. Но я не могу из-за нехватки знаний в этой области. Одни только регулярные выражения чего стоят (:) Но небольшой урок по простому поиску средствами НБ напишу. И так, допустим, надо получить данные из url адреса, а именно id юзера в vkontakte.ru имеем такой адрес =_http://vkontakte.ru/id564655 (Внимание! цифры взяты от фонаря) Для поиска слова будем использовать команду SearchStr. Чтоб получить ид контакта, надо найти отправную точку для поиска, в примере это слово id
Команда вернет в переменную [Search] позицию этого слова (если 0, то слова нет). В [Search] значение 21, т.е. первая буква в слове (i) находится 21 по счету. Теперь нам надо получить весь ид. Хорошо когда нам надо программно получить известное количество символов (в примере 6 цифр), командой SubStr копируем искомое слово
SearchStr "id" "http://vkontakte.ru/id564655" "[Search]" "" .незабываем к известному числу символов прибавить .количество символов искомой строки SubStr "http://vkontakte.ru/id564655" "[Search]" "6+2" "[result]"
. В переменой [result] будет id564655. Но если нам неизвестно количество?! Тут только перебором
.Получаем длину строки StrLen "[url]" "[Len]" .Получаем начало поиска SearchStr "id" "[url]" "[Search]" "" .Используем цикл Loop "[Search]" "[Len]" "[j]" .Копируем очередной символ на проверку SubStr "[url]" "[j]" "1" "[SubStr]" IfEx "[SubStr]=[#13] OR [SubStr]=[#34][#34]" .Если строка кончилась, то останавливаем цикл ExitLoop EndIf .Добавляем каждый сивол в результат SetVar "[result]" "[result][SubStr]" EndLoop
Рассмотрим еще такой вариант, теперь такой адрес _http://vkontakte.ru/id956518?tvs=366j5463cgj Мы по-прежнему не знаем длину id юзера, но знаем какой адрес, т.е. типа так: _http://vkontakte.ru/<iduser>?tvs=366j5463cgj. Это удобный способ поиска, когда известно начало поиска и конец, всегда бы так…
.Получаем начало поиска SearchStr "id" "[url]" "[Start]" "" .Получаем конец поиска SearchStr "?" "[url]" "[End]" "" .Копируем слово в переменную SubStr "[url]" "[Start]" "[End]-[Start]" "[result]"
Напоследок еще пример: получаем url картинки. Допустим она одна на странице и имеет вид <img src="_http://neobooker.ru/Smiles/ag.gif" border="0" alt="угага"/> Нам значит надо скопировать эту часть _http://neobooker.ru/Smiles/ag.gif. Начнем-с, определяем старт поиска это кавычка, но кавычек в документе может быть много, а нам надо такое слово, которое не повторяется. Вот так <img и src=" с учетом того, что картинка одна. Это две отправные точки. Конец поиска значит будет первая кавычка после старта. Самое простое это найти позицию src=" и от него перебором дойти до кавычки, но атрибут src может присутствовать и в других местах (<script type="text/javascript" src="хxxxx">). Т.е. сначала будем искать <img. потом от этой позиции будем искать src=" дальше по плану
.Находим позицию начала картинки SearchStr "<img" "[str]" "[Start]" "" .Копируем символы SubStr "[str]" "[Start]+4" "1000" "[str]" .Получаем начало поиска SearchStr "src=[#34]" "[str]" "[Start]" "" .прибавляем к позиции 5 (<img ) Math "[Start]+5" "" "[j]" .Запускаем цикл While "1" "=" "1" .Копируем очередной символ на проверку кавычки SubStr "[str]" "[j]" "1" "[SubStr]" If "[SubStr]" "=" "[#34]" .Если кавычка - останавливаем цикл ExitWhile EndIf .Увеличиваем счетчик Math "[j]+1" "" "[j]" .Добавляем каждый символ в результат SetVar "[result]" "[result][SubStr]" EndWhile
Но еще проще сделать это с помощью регулярных выражений! Например получим адрес аватара с этой темы. В исходной страницы аватарка выглядит так : <img title="Сергей" class="userAvatar" border="0" src="http://neobooker.ru/avatar/10/191151.jpg" /> Я буду искать по такому плану 1-получить картинку с атрибутом title и значением Сергей 2-получить адрес 3-загрузить на комп 4-загрузить в проект Так, как в НБ нет регулярок, то воспользуемся js или vbs функцией, я буду делать на js.
BrowserExecScript "WebBrowser2" "var re = /<img.*?Сергей.*?>/gim;|var res = re.exec(document.body.innerHTML);| re = /<img.*?src=[#34](.*?)[#34].*?>/gim;| res = re.exec(res);|if(res[#91]1[#93]!=null){|window.external.nbSetVar( '[#91]img[#93]', res[#91]1[#93])|}" "JScript" StrReplace "[img]" "/" "\" "[tm_img]" "" ExtractFileName "[tm_img]" "[nm_img]" If "[img]" "<>" "" DownloadFile "[img]" "[PubDir][nm_img]" "HideProgress+Async" SetObjectFileName "Picture1" "[PubDir][nm_img]" EndIf
Я отразил во всех примерах только один из принципов, есть другие... Но, каждый необходимо подбирать под конкретную нужду. Это касается не только парсера. ================================================
Напишу еще одну особенность, разговор пойдет о квадратных скобках, как знаем, что квадратные скобки это спец символ. В необук в них заключенны имена переменных, но вдругих языках(html,javascript,vbs)с кем работает НБ, они воспринимаются согласно синтаксису того языка. Если у нас стоит задача передать переменные в объект, то мы используем их, как обычно:
SetVar "[test]" "Переменная из NeoBook!" BrowserLoadFromStr "WebBrowser1" "<html><body>|[test]|</body></html>"
Но если нам надо не только сохранить переменную для дальнейшей обработки, но и получить результат, то надо использовать код ASCII [=#91 ]=#93.
И так, если запрос должен возратить в НБ переменную, то надо использовать скобки в виде ASCII кода ([#91][#93]). Тоже самое относится и к другим символам ("|\n\t)
а че в чем проблемы то, на юкоз спокойно авторизовывается. Сначала пост (вытягиваешь 6-значный id) затем гет страницы (присоединяя к адресу в конце &id)
DEMBEL, ты наверное про статью?! Не идет по команде InternetPost, ему что то еще не хватает для входа. Я даже обработчик сделал для его JS ответа, но...
я паказал свои попытки авторизоватся с помощью прямого пост запроса, без всяких этих вытягиваний ид. Возможно, кто нибудь "докавыряет" начатое. А способ о котором ты говоришь, есть ниже. Вернее ссылка на них, я не стал дублировать...
Сообщение отредактировано Сергей - Ср, 08 Июня 2011, 12:52
Может всё-же подправить как-нить? А то везде влезает всё, работает на ура, ниразу ни одного глюка ниодного нарекания, а тут такое... не менять же браузер? И кстати вероятно знаю проблему - полоски эти, их укоротить надо. Мой сайт - http://фирмы.онлайн
я разбил длинные строки и убрал <hr>-ы Теперь копипастеры будут "кипишивать", т.к. Перенос произошел почти во всех примерах, но я отметитил не все пункты
Я уже его считаю за отличный браузер. Спор "у кого трава зеленее" можно вести, но моё мнение - Google Chrome the best! И на это есть свои причины...
Добавлено (08 Июнь 2011, 20:45) --------------------------------------------- Думаю надо затереть половину комментов (форматирование то исправили) и оставить только те, где про Ucoz
в статье все примеры BrowserExecScript взяты в [#91]/[#93], по другому просто не получится. Касается переменных, которые возращают результат, остальные не надо.
я тебя понимаю Но надо было тут примеры посмотреть, да и хелп почитать, тогда бы не пришлось огород городить.
Quote (Включение в код HTML-документа команд NeoBook)
Если Вы планируете редактировать HTML-документ вручную, код гиперссылки должен быть следующим: Нажмите <a href="neobook:GotoPage %22Main%22">link</a> Обратите внимание на спциальный код (%22). Его надо вставлять там, где должны стоять квадратные скобки, внутри которых расположена команда NeoBook. Поскольку квадратные скобки на языке HTML интерпретируются совершенно не так, как в NeoBook, использовать их открыто нельзя. Поэтому-то мы вместо них и ставим "%22". Когда же мы работаем в классическом HTML-редакторе, он автоматически заменяет вводимые нами с клавиатуры квадратные скобки на корректную последовательность символов. Если Вы хотите выполнить более одной команды в рамках одной гиперссылки, то их следует отделить друг от друга другим специальным кодом - %0D (%+zero+D). Этот код заменят "возврат каретки" (нажатие "Enter").