Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет schegloff ([info]schegloff)
@ 2007-03-24 12:47:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Только для знакомых с Python - история моих бедствий и просьба о помощи
Сначала просьба:

Помогите решить проблему авторизации на livejournal.com! (нужно для бэкапа подзамочных записей в [info]shrewd_club@lj, где я имею несчастье состоять смотрителем). Но только примите к сведению:

1) совет "посмотри, как в LJSM, и сделай так же" не проходит - Perl я почти не знаю, смотрю на исходник, как баран на новые ворота; нужна по крайней мере возможность задавать вопросы, что там как, и получить ответы;

2) совет "так это же через cookie решается, как два байта" тоже ничего не дает - стандартная библиотека cookielib с эксплореровскими куками не работает, только с перловскими, рекомендуемое ее расширение ClientCookie у меня просто не запускается; как конвертировать эксплореровские куки в перловские, я тоже не знаю...

Словом, реально need help, уперся рогом.

Ну а теперь история бедствий:
- тестировал я питоновский генератор случайных чисел, и назвал свою програмку-тест random.py;
- после этого появился странный глюк - мой lj_archiver и другие программки стали вылетать при одиночном запуске, а вот из интегрированной среды питона - по-прежнему работали;
- методом копирования в другой каталог я установил, что виной всему random.py, имеющий одинаковое название с библиотекой random - и перегружающая эту библиотеку при запуске других программ из каталога, где находится.

Бедствовал я так больше недели, будучи уверенным, что urllib никак не может быть связана с random, и проблема где-то у провайдера. Ага, щас!

Мораль: не называйте Ваши программки в питоне именами библиотек, бо-бо будет!

Я в ужасе. Сколько же всякого разного я про Python не знаю, и сколько, скорее всего, никогда не узнаю!


(Добавить комментарий)


[info]do__
2007-03-25 08:33 (ссылка)
..а Вам каким образом нужно авторизоваться? Возможны три варианта: по клиентскому протоколу(у которого есть две версии -- plain и xmlrpc) и непосредственно через веб. Куки необходимы только в случае веб, по клиентскому протоколу можно все plain-текстом посылать..

(Ответить) (Ветвь дискуссии)

Да хочется через веб -
[info]schegloff
2007-03-25 10:01 (ссылка)
у меня все программки через urllib (urllib2) работают.

Клиентский протокол для меня темный лес - описания нет, понимания, как работает, тоже.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Да хочется через веб -
[info]do_
2007-03-25 20:36 (ссылка)
Как это нету описания? А это что?

Реально, если требуется забэкапить свой журнал, или сообщество, в которое есть доступ на запись -- через клиентский протокол самый простой и правильный путь.

Залогиниться в веб -- тоже просто, вот моя функция на Перле(питона, увы. не знаю, но по-моему тут всё очевидно), которая это делает:

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Да хочется через веб -
[info]do_
2007-03-25 20:37 (ссылка)
   sub Login                                                                    
      {                                                                         
              my ($self, $username, $password, $server) = @_;                   
              $self->{server} = $server || 'www.livejournal.com';               
              my $response = $self->head("http://$self->{server}");             
              $self->{cookies} = HTTP::Cookies->new();                          
              $self->{cookies}->extract_cookies($response);                     
              $self->cookie_jar($self->{cookies});                              
              $response = $self->request(POST "http://$self->{server}/login.bml?
   ret=1", Content => {mode=>'login', user => $username, password => $password})
   ;                                                                            
      }                                                                         
                                                                                


(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Да хочется через веб -
[info]do_
2007-03-25 20:44 (ссылка)
Это метод класса, который наследуется от LWP::UserAgent, поэтому все методы, относящиеся к взаимодействию по HTTP, вызываются для объекта $self.

Т.е.
1. Сначала делается запрос HEAD по адресу www.livejournal.com
2. Сохраняются все куки
3. Делается запрос POST по адресу http://www.livejournal.com/login.bml?ret=1 с query
mode=login&user=username&password=password

+хотя из этой функции этого не видно, надо по пути обрабатывать все редиректы и тоже сохранять все куки

(Ответить) (Уровень выше) (Ветвь дискуссии)

Кажется, понял -
[info]schegloff
2007-03-26 05:55 (ссылка)
сформировать куки методом регистрации через POST на login.bml, а потом пользовать при работе с остальными адресами?

Вечером попробую, правда, не знаю, как это - "обрабатывать все редиректы".

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Кажется, понял -
[info]do_
2007-03-26 06:03 (ссылка)
В питоне -- и сам не знаю. Но суть в том, что LJ вместо того, чтобы сразу присылать документ, любит от души поперенаправлять на другой адрес, т.е., в HTTP response вместо 200 с документом присылает 302 с новым адресом. Ну, скорее всего одно из двух: либо Вам придётся последовательно обрабатывать все ответы, и в случае если придёт 302, делать ещё один запрос, либо питон всё это будет делать автоматически, а для редиректов определяет callback(как, собственно, делает Perl).

(Ответить) (Уровень выше) (Ветвь дискуссии)

Э, да я с этим сталкивался!
[info]schegloff
2007-03-26 17:38 (ссылка)
Когда тупо копировал куки из сниффера в хеадеры, и получал этот самый 302 с новым адресом! То есть это нормальное поведение LJ, а не посылание на?! Но тогда у меня совсем другая проблема, не авторизация, а ловля редиректов - cookilib эти редиректы не раскручивает, значит, нужно вручную.

То есть это борьба уже не столько с питоном, сколько с движком LJ. Вы сами раскручивали эти редиректы, сколько раз он так с адреса на адрес перекидывает? Или есть стандартный способ - кстати, что есть callback?

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Э, да я с этим сталкивался!
[info]do_
2007-03-26 18:12 (ссылка)
>То есть это нормальное поведение LJ, а не посылание на?!
Ну да, это, в принципе, нормальное взаимодействие по HTTP, многие сайты так делают, google в частности.
P.S. Хотя, кажется, есть некая комбинация хидеров, при которой перенаправления идут до бесконечности.

>cookilib эти редиректы не раскручивает, значит, нужно вручную.
Значит, надо вручную. С другой сторoны -- ну что такого сложного, просто повторяем запрос с присланным адресом, не забывая попутно сохранить куки

>Вы сами раскручивали эти редиректы, сколько раз он так с адреса на адрес перекидывает?
Если честно, не считал.

>кстати, что есть callback?
В общем случае -- функция, вызываемая по какому-то событию. В данном случае, при получении статуса 302. В Перле нужно унаследовать класс от LWP::UserAgent и определить в нём метод redirect_ok(). Потом, когда будет сделан запрос и вернётся 302, этод метод будет вызван, если вернёт true -- редирект будет обработан автоматически, если false -- не будет. Но самое главное, что в этот метод передаётся параметр HTTP::Response, из которого можно выделить и сохранить необходимые куки...

(Ответить) (Уровень выше)


[info]do_
2007-03-25 20:51 (ссылка)
>стандартная библиотека cookielib с эксплореровскими куками не работает, только с перловскими

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

(Ответить) (Ветвь дискуссии)

Чтобы использовать куки IE,
[info]schegloff
2007-03-26 05:50 (ссылка)
их нужно прочитать из файла. А при этом формат существенен.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Чтобы использовать куки IE,
[info]do_
2007-03-26 05:55 (ссылка)
...да зачем их читать из файла, если требуется залогиниться в LJ? Вы хотите уже существующие куки в Вашем эксплорере использовать, что ли? Можно ведь просто запостить форму в LJ и получить куки с сервера..

(Ответить) (Уровень выше) (Ветвь дискуссии)

Вот как раз "просто запостить"
[info]schegloff
2007-03-26 05:57 (ссылка)
мне в голову и не пришло. Спасибо, что подсказали.

(Ответить) (Уровень выше)