E_user 22.09.2010 19:25
Есть вопрос! — [Решено] Про curl
Задача - авторизоваться на сайте, затем скачать страничку и обработать её скриптом на bash.По началу я думал просто скачать страничку с помощью wget, но не тут-то было.
Мне подсказали, что curl умеет авторизоваться. man curl вывел кучу текста, и я хотя-бы убедился, что такое есть. Далее пошел искать в инет. Там полно примеров, но кажется, что все связано с php.
Тогда как связать скрипт php и bash? Это наводит на мысль, что возможно тот curl, который мне нужен не совсем php.
Ведь могу-ли я (как) использовать те примеры, если все это пройдет через консоль?
В общем прошу помочь навести ясность.
Итог:
1 |
#!/bin/bash
|
Всем большое спасибо.
E_user 22.09.2010 19:34 #
+ -1 -
Примеры тут и тут. Даже если так, как прицепить часть скрипта в bash?
Практически нулевое знание. И не надо подколок, что с башем у меня так-же. :D
Да и вообще - именно на баше хочется сделать.
Да и вообще - именно на баше хочется сделать.
„С“ разрабатывался для создания операционных систем, но не прикладного ПО, так что о предназначении можно говорить оч долго... просто здесь что bash, что php нормально подходят
Уточните конечную задачу. Что именно надо получит в итоге? Тогда проще будет подсказать инструмент. В одних случаях лучше bash, в других python или Qt/C++.
Скачать все песни находящиеся на vkont...ru/audio.php
Задумыва так:
*авторизация*
curl исходник -O - | grep -o 'http.*mp3' | wget -i -
Это импровизационный вариант, если что, не смейтесь )
Задумыва так:
*авторизация*
curl исходник -O - | grep -o 'http.*mp3' | wget -i -
Это импровизационный вариант, если что, не смейтесь )
http://yandex.ru/yandsearch?stype=first&clid=46511&text=curl+%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&lr=39
Это для начала.
Дело в том, что способов авторизации может быть много.
Вам необходимо понять, как именно происходит авторизация в ВКонтакте.
Что именно в момент отправки POST-запроса на сервер ВКонтакте туда отправляется, кроме логина и пароля. Далее вам не составит труда с помощь curl авторизоваться, принять "печеньки" с ВКонтакте и "стать на нём авторизованным".
Вторая часть Марлезонского балета состоит в том, чтобы пропарсить html-код страницы с музыкой и загрузить .mp3 файлы.
Давайте немного уточним-таки задачу?
1. Вам нужно загрузить n-ое количество музыкик себе на компьютер потом, что вам нужна эта музыка и то, откуда она будет загружена -- неважно?
2. Вы хотите научиться писать скрипты на bash/php?
Дело в том, что если вы укажите первый вариант, то есть масса иных, более лояльных способов получить музыку. prostopleer.com, music.yandex.ru и т. д.
Если же у вас стоит цель научиться писать скрипты и написать на их основе что-то полезное человечеству, то тут стоит начать несколько с более простых вещей, нежели авторизация, парсинг, даунлоуадинг.
p. s.: grep -o 'http.*mp3' у вас не сработает. Надо или указать, что вы будете в качестве шаблона использовать регулярное выражение ключиком -E, или же использовать для этого команду egrep (рекомендуется).
p. p. s.: Попробуйте приучить себя никогда не использовать короткий стиль аргументов команд в скриптах, форумах и т. д. Короткий стиль скрипта следует использовать только для одноразовых команд в вашей консоле.
Это для начала.
Дело в том, что способов авторизации может быть много.
Вам необходимо понять, как именно происходит авторизация в ВКонтакте.
Что именно в момент отправки POST-запроса на сервер ВКонтакте туда отправляется, кроме логина и пароля. Далее вам не составит труда с помощь curl авторизоваться, принять "печеньки" с ВКонтакте и "стать на нём авторизованным".
Вторая часть Марлезонского балета состоит в том, чтобы пропарсить html-код страницы с музыкой и загрузить .mp3 файлы.
Давайте немного уточним-таки задачу?
1. Вам нужно загрузить n-ое количество музыкик себе на компьютер потом, что вам нужна эта музыка и то, откуда она будет загружена -- неважно?
2. Вы хотите научиться писать скрипты на bash/php?
Дело в том, что если вы укажите первый вариант, то есть масса иных, более лояльных способов получить музыку. prostopleer.com, music.yandex.ru и т. д.
Если же у вас стоит цель научиться писать скрипты и написать на их основе что-то полезное человечеству, то тут стоит начать несколько с более простых вещей, нежели авторизация, парсинг, даунлоуадинг.
p. s.: grep -o 'http.*mp3' у вас не сработает. Надо или указать, что вы будете в качестве шаблона использовать регулярное выражение ключиком -E, или же использовать для этого команду egrep (рекомендуется).
p. p. s.: Попробуйте приучить себя никогда не использовать короткий стиль аргументов команд в скриптах, форумах и т. д. Короткий стиль скрипта следует использовать только для одноразовых команд в вашей консоле.
Я хочу научиться писать скрипты.
Но! Сейчас у меня загорелась именно эта идея, и согласен использовать скрипт, не зная полностью как он работает. Хотя я согласен изучить этот вопрос, и потом сам все сделать под свои нужды. Но хоть с чего начать? Имеено, что-бы быстрее решить именно эту задачу с curl и ВК.
Но! Сейчас у меня загорелась именно эта идея, и согласен использовать скрипт, не зная полностью как он работает. Хотя я согласен изучить этот вопрос, и потом сам все сделать под свои нужды. Но хоть с чего начать? Имеено, что-бы быстрее решить именно эту задачу с curl и ВК.
принять "печеньки" с ВКонтакте
вспомнилось:
Блин. Купил коммуникатор китайского производства. Руссификация тоже китайского производства... Только после поллитра мы с напарником наконец догадались, что "ясные печенья", это "очистить cookies".
©bash.org.ru
Сейчас я могу сохранить исходник к себе, и пропустить его через скрит
На хабре видел статьи про вконтакт и curl, авось удастся что-нибудь использовать.
wget http://associt.org/index.html -O - | grep '<img class="playimg" onclick="return operate' | grep -o 'http.*mp3' | wget -i -
На хабре видел статьи про вконтакт и curl, авось удастся что-нибудь использовать.
Зачем так сложно?
curl "http://associt.org/index.html" 2> /dev/null | egrep -o 'http:.*mp3' | wget -i -
curl "http://associt.org/index.html" 2> /dev/null | egrep -o 'http:.*mp3' | wget -i -
Это на случай, если там и другие mp3 будут. Вообще такwget http://associt.org/index.html -O - | grep -o 'http.*mp3' | wget -i -
Иначе яне умею не умел.
Иначе я
Вот этого достаточно для авторизации на ВКонтакте:
Таким образом вам необходимо передать методом POST поле email значением которого будет ваш логин и поле pass значением которого будет пароль скрипту расположенному по адресу http://login.vk.com/?act=login. Он ответит вам специально сформированной страничкой, которая будет содержать еще одну форму:
Вам нужно будет её отпарсить, дабы вычленить значение поля "s" (только оно здесь генерируются. Остальные не изменяются) и отправить методом POST скрипту http://vkontakte.ru/login.php. В ответ получите кукисы и страничку с вашим профилем.
Все вышеперечисленное следует делать один раз, только для того, чтобы получить кукисы, а потом куда угодно их подставлять, но можно этого и не делать, а тупо выдернуть их из браузера ;-)
<form method="post" action="http://login.vk.com/?act=login">
<input type="text" name="email">
<input type="password" name="pass">
<input type="submit" value=".">
</form>
Таким образом вам необходимо передать методом POST поле email значением которого будет ваш логин и поле pass значением которого будет пароль скрипту расположенному по адресу http://login.vk.com/?act=login. Он ответит вам специально сформированной страничкой, которая будет содержать еще одну форму:
<html>
<head>
<meta http-equiv='content-type' content='text/html; charset=windows-1251' />
</head>
<body onload="try { document.getElementById('l').submit(); } catch(e) { document.getElementsByTagName('form')<0>.submit(); }">
<form id='l' method='post' action='http://vkontakte.ru/login.php'>
<input type='hidden' name='s' value='44392dc17f3d7724016daa2ab156e72d0810cb417838ae1708757c17cb8' />
<input type='hidden' name='op' value='slogin' />
<input type='hidden' name='redirect' value='1' />
<input type='hidden' name='expire' value='0' />
<input type='hidden' name='to' value='' />
</form>
</body>
</html>
Вам нужно будет её отпарсить, дабы вычленить значение поля "s" (только оно здесь генерируются. Остальные не изменяются) и отправить методом POST скрипту http://vkontakte.ru/login.php. В ответ получите кукисы и страничку с вашим профилем.
Все вышеперечисленное следует делать один раз, только для того, чтобы получить кукисы, а потом куда угодно их подставлять, но можно этого и не делать, а тупо выдернуть их из браузера ;-)
а можно готовый скрипт на чем-нить, и буду век добрым словом вспоминать, мне кроме заглавной страницы, ничего и не надо
Всё, что выше написал @Zend верно и применимо к консольному $ curl.
После того, как у вас будет обычный текстовый файл с cookie-данными внтури, вы можете подставляю Контакту этот файл забирать содержимое html-страниц, парсить их и т. д.
После того, как у вас будет обычный текстовый файл с cookie-данными внтури, вы можете подставляю Контакту этот файл забирать содержимое html-страниц, парсить их и т. д.
спасибо, но в HTTP\POST\GET\CURl я совсем дурак, мне бы что бы по полочкам всё разложили, как-то никогда их не понимал =(
Если учесть все, что я собрал, получается:
-послать запрос
-отпарсить
-авторизоваться и получить куки
-использую куки, делать что хочется
Все правильно? И все это можно сделать в рамках скрипта на баше..
-послать запрос
-отпарсить
-авторизоваться и получить куки
-использую куки, делать что хочется
Все правильно? И все это можно сделать в рамках скрипта на баше..
Делаем то, что делает браузер только вручную:
В выводе находим поля "s", "op", "redirect", "expire", "to" и формируем из них свой запрос (/tmp/cookie-vk - путь до файла где мы будем хранить cookie):
Все теперь у нас есть cookie! Идем на страничку со своим профилем (на любую другую) парсим её как хотим:
curl -v --data "[email protected]&pass=my_password" http://login.vk.com/?act=login
В выводе находим поля "s", "op", "redirect", "expire", "to" и формируем из них свой запрос (/tmp/cookie-vk - путь до файла где мы будем хранить cookie):
curl -v --cookie-jar /tmp/cookie-vk --data "s=4c262466659b4a25c252112a39021d349a43e811bf2dd2899f15921c&op=slogin&redirect=1&expire=0&to=0" http://vkontakte.ru/login.php
Все теперь у нас есть cookie! Идем на страничку со своим профилем (на любую другую) парсим её как хотим:
curl -v --cookie /tmp/cookie-vk http://vkontakte.ru/id1233036
Для меня получилось так:
#!/bin/bash
gets=`curl -s --data "[email protected]&pass=пароль" http://login.vk.com/?act=login | egrep -o \(\|<0-9>\){20\,}`
curl -v --cookie-jar /tmp/vkcookie --data "s=$gets&op=slogin&redirect=1&expire=0&to=0" http://vkontakte.ru/login.php
curl -v --cookie /tmp/vkcookie http://vkontakte.ru/audio.php | grep -o 'http.*mp3' | wget -i -
А не могли бы вы обьяснить регулярное выражение?
а то у меня получилось так:
а то у меня получилось так:
curl -s --data "[email protected]&pass=pass" http://login.vk.com/?act=login | egrep -o "name='s' value='+" | sed -e "s/name='s' value='//" -e "s/'//"
выделяется слово длиннее 20 символов. ваш вариант более правильный, но и этот работает :)
маленькое добавление в скрипт
curl -s "login.vk.com/?act=login&pass=`echo пароль_на_русском_или_любом_другом_языке | iconv -f UTF8 -t CP1251`&[email protected]" -c 33 | egrep -o \(\|<0-9>\){20\,}
curl -s "login.vk.com/?act=login&pass=`echo пароль_на_русском_или_любом_другом_языке | iconv -f UTF8 -t CP1251`&[email protected]" -c 33 | egrep -o \(\|<0-9>\){20\,}
у меня только один вопрос. у меня пароль русскими ну не в какую не хочет логинится. с английскими всё нормально. что делать?
< CAPTAIN-MODE_ON >
использовать пароль с английскими символами
< CAPTAIN-MODE_OFF >
использовать пароль с английскими символами
< CAPTAIN-MODE_OFF >
locale покажите
я же написал с английским работает. не понимаю почему с русским не идёт
LANG=ru_RU.utf8
LANGUAGE=ru_RU:ru:en_GB:en
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC="ru_RU.utf8"
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES="ru_RU.utf8"
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=
LANG=ru_RU.utf8
LANGUAGE=ru_RU:ru:en_GB:en
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC="ru_RU.utf8"
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES="ru_RU.utf8"
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=
Либо сменить локаль, либо перекодировать пароль в CP-1251 перед тем как его отправить. (сейчас он отправляется в UTF-8. Придется брать на себя работу браузера...)
PS.
В UTF-8 все английские символы кодируются одним байтом, все прочие двумя. Вот поэтому английский вариант пароля работает а кириллический нет.
PS.
В UTF-8 все английские символы кодируются одним байтом, все прочие двумя. Вот поэтому английский вариант пароля работает а кириллический нет.
Отличное объяснение, спасибо.
Уходя немного в сторону других ресурсов, как получить аналогичные данные, допустим, с animereactor,ru ? там какая-то странная штука с логином.
Оперовский драгонфлай не видит когда устанавливаются куки, но видит - когда они удаляются (а там их дай бъг 9 штук)
(проблема вся в том, что Flexget не может оттуда утягивать файлы из-за того, что тупое подсовывание кукисов не срабатывает)
Уходя немного в сторону других ресурсов, как получить аналогичные данные, допустим, с animereactor,ru ? там какая-то странная штука с логином.
Оперовский драгонфлай не видит когда устанавливаются куки, но видит - когда они удаляются (а там их дай бъг 9 штук)
(проблема вся в том, что Flexget не может оттуда утягивать файлы из-за того, что тупое подсовывание кукисов не срабатывает)
могу предложить aria2c
работает также и с куками хрома
правда это частичное решение проблемы, но для того чтобы получить страничку вполне подходит ;)
Load cookies
Load Mozilla/Firefox(1.x/2.x) and Netscape format:
Load Firefox3 format:
Load Mozilla/Firefox(1.x/2.x) and Netscape format:
aria2c --load-cookies=cookies.txt http://host/file
Load Firefox3 format:
aria2c --load-cookies=cookies.sqlite http://host/file
работает также и с куками хрома
правда это частичное решение проблемы, но для того чтобы получить страничку вполне подходит ;)
PS C:\Users\Dagron\aria2-1.10.0-mingw32msvc-build1> .\aria2c.exe --load-cookies="C:\Users\Dagron\AppData\Local\Google\Chrome\User Data\Default\Cookies" http://vkontakte.ru/feed2.php
ну можно еще так)
http://vkontakte.ru/idxxxxxxx
ну можно еще так)
http://vkontakte.ru/idxxxxxxx
я так смотрю балан своего провайдера:
curl -s -c /tmp/onlime.cookies https://my.onlime.ru > /dev/null && curl -s -L -b /tmp/onlime.cookies -c /tmp/onlime.cookies -d "login_credentials=LOGIN&login_credentials=PASSWORD" https://my.onlime.ru/session/login | html2text | awk '/^Договор №:|^Лицевой счёт №:|^Баланс:/ {print}' && rm -rf /tmp/onlime.cookies
curl -s -c /tmp/onlime.cookies https://my.onlime.ru > /dev/null && curl -s -L -b /tmp/onlime.cookies -c /tmp/onlime.cookies -d "login_credentials=LOGIN&login_credentials=PASSWORD" https://my.onlime.ru/session/login | html2text | awk '/^Договор №:|^Лицевой счёт №:|^Баланс:/ {print}' && rm -rf /tmp/onlime.cookies
мечта идиота сбылась, пара строк на bash'е и у меня в треи есть количество новых сообщений контакта