Python - глюки с pycurl

Discussion in 'PHP' started by Girerro, 30 Apr 2011.

  1. Girerro

    Girerro New Member

    Joined:
    29 Apr 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Всем привет, очень нужна помощь по pycurl'у.

    Есть простой код на пайкурле, который посылает пост запрос. На страницу, которая выводит этот пост запрос ( Денвер на локальном компе).

    Код php страницы, которая выводит пост запрос

    test_curl.php
    Code:
    <?
    print_r($_POST);
    ?>
    И есть код на питоне, который отсылает на нее пост запрос

    main.py
    Code:
    import StringIO
    import pycurl
    
    
    def GetPage( curl, url ):
    	resp = StringIO.StringIO()
    	curl.setopt(pycurl.WRITEFUNCTION, resp.write)
    	curl.setopt(pycurl.URL, url )
    	curl.perform()
    	the_page = resp.getvalue()
    	resp.close()
    	return the_page
    	
    def Test():
    	curl = pycurl.Curl()
    	aaa = 'SomeParam'
    
    	# NOT WORK
    	curl.setopt(pycurl.POSTFIELDS, r'params%5BsloganText%5D=...because+open+source+matters&params%5Bja_screen_width%5D=97&params%5Btheme_header%5D=green&params%5Btheme_background%5D=lighter&params%5Btheme_elements%5D=black&params%5BrightCollapsible%5D=1&params%5BrightCollapseDefault%5D=show&params%5BexcludeModules%5D=38&'+aaa+r'=1')
    	
    	with open('pycurl_not_work.html','w') as f: 
    		f.write( GetPage( curl, r'http://localhost/test_curl.php' ) )
    
    	# WORK
    	ddd = 'params%5BsloganText%5D=...because+open+source+matters&params%5Bja_screen_width%5D=97&params%5Btheme_header%5D=green&params%5Btheme_background%5D=lighter&params%5Btheme_elements%5D=black&params%5BrightCollapsible%5D=1&params%5BrightCollapseDefault%5D=show&params%5BexcludeModules%5D=38&'+aaa+'=1'
    	curl.setopt(pycurl.POSTFIELDS, ddd)
    
    	with open('pycurl_work.html','w') as f: 
    		f.write( GetPage( curl, r'http://localhost/test_curl.php' ) )
    	
    if __name__=='__main__':
    	Test()
    То есть отличие лишь в передаче параметра pycurl.POSTFIELDS

    В итоге в
    pycurl_work.html
    Code:
    Array
    (
        [params] => Array
            (
                [sloganText] => ...because open source matters
                [ja_screen_width] => 97
                [theme_header] => green
                [theme_background] => lighter
                [theme_elements] => black
                [rightCollapsible] => 1
                [rightCollapseDefault] => show
                [excludeModules] => 38
            )
    
        [SomeParam] => 1
    )
    а в pycurl_not_work.html информация каждый раз разная, иногда попадает из заголовка, иногда просто портится кодировка, вообщем мистика какая-то.
    Один из вариантов pycurl_not_work.html
    Code:
    Array
    (
        [l_php] => ...because open source matters
        [params] => Array
            (
                [ja_screen_width] => 97
                [theme_header] => green
                [theme_background] => lighter
                [theme_elements] => black
                [rightCollapsible] => 1
            )
    
        [params_rightCollapseDefauДVцЧю] => 38
        [SomeParam] => 1
    )
    Подскажите с чем это может быть связано???

    P.S. скорее всего дело в параметрах в виде массива
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Girerro к сожалению, не могу воспроизвести вашу проблему данным скриптом. Python 2.6.5, pycurl.version = 'libcurl/7.21.0 OpenSSL/1.0.0a zlib/1.2.5'

    Попробуйте разнести скрипты по разным хостам и посмотреть с помощью WireShark что передается. Это позволит вам определить источник проблемы - скрипт ли это, или кривая настройка денвера
     
    _________________________
  3. Girerro

    Girerro New Member

    Joined:
    29 Apr 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Gifts спасибо за совет
    библиотека libcurl/7.20.1 OpenSSL/0.9.8o zlib/1.2.5
    на всякий случай попробую обновить

    Перенес пхп скрипт на хостинг, результат тот же. Установил WireShark
    Нашел нужные пакеты, отличаются только у TCP части порт источник
    а в секции
    Line-based text data: application/x-www-form-urlencoded
    где идет непосредственно пост запрос

    у неисправного (первого запроса) строка
    Code:
    [truncated] url.php\000BsloganText%5D=...because&params%5Btheme_header%5D=green&params%5Btheme_background%5D=lighter&params%5Btheme_elements%5D=black&params%5BrightCollapsible%5D=1&params%5BrightCollapseDefault%5D=show&params%5BexcludeModu
    
    HEX
    Code:
    ..L...l.I.u@..E...N.@.........`....|.P....K..VP.......POST /test_curl.php HTTP/1.1..User-Agent: PycURL/7.19.7..Host: HOSTNAME..Accept: */*..Content-Length: 245..Content-Type: application/x-www-form-urlencoded....url.php.BsloganText%5D=...because&params%5Btheme_header%5D=green&params%5Btheme_background%5D=lighter&params%5Btheme_elements%5D=black&params%5BrightCollapsible%5D=1&params%5BrightCollapseDefault%5D=show&params%5BexcludeModules%5D=38&SomeParam=.
    
    у исправного
    Code:
    [truncated] params%5BsloganText%5D=...because&params%5Btheme_header%5D=green&params%5Btheme_background%5D=lighter&params%5Btheme_elements%5D=black&params%5BrightCollapsible%5D=1&params%5BrightCollapseDefault%5D=show&params%5BexcludeModules
    
    HEX
    Code:
    ..L...l.I.u@..E...N.@.........`....~.P.f..LY..P.......POST /test_curl.php HTTP/1.1..User-Agent: PycURL/7.19.7..Host: HOSTNAME..Accept: */*..Content-Length: 245..Content-Type: application/x-www-form-urlencoded....params%5BsloganText%5D=...because&params%5Btheme_header%5D=green&params%5Btheme_background%5D=lighter&params%5Btheme_elements%5D=black&params%5BrightCollapsible%5D=1&params%5BrightCollapseDefault%5D=show&params%5BexcludeModules%5D=38&SomeParam=1
    
    То есть по всей видимости на стороне питона что-то не так происходит.

    Так что я по прежнему в тупике, в скрипте то все нормально вроде

    P.S. на офицальной странице pycurl
    http://pycurl.sourceforge.net/
    версия 7.19, где можно найти 7.21 в виде бинарника ?
     
    #3 Girerro, 30 Apr 2011
    Last edited: 30 Apr 2011
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Girerro качал вроде отсюда: http://code.google.com/p/urllib4/downloads/list

    Проверьте исходник на опечатки (например вместо плюса что-то другое), проверьте исходный код в другом редакторе (был случай, когда один редактор вместо перезаписи всего файла обновлял только его начало)
     
    _________________________
  5. Girerro

    Girerro New Member

    Joined:
    29 Apr 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    ничего не помогло, мне кажется это проблемы именно pycurl.

    на твоей библиотеки pycurl ошибка так же сохраняется.
     
    #5 Girerro, 1 May 2011
    Last edited: 1 May 2011
  6. Girerro

    Girerro New Member

    Joined:
    29 Apr 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Еще одно дополнение, данная проблема обнаружена на Windows 7 64bit
    На WinXP 32 все работает нормально