Pokazywanie postów oznaczonych etykietą http. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą http. Pokaż wszystkie posty

24 lipca 2015

[python] HTTP POST requests - PycURL

Kolejne podejście do wykonania HTTP POST requesta (poprzednie opisałem tutaj). Przydatne linki:
Biblioteka znacznie bardziej popularna i posiadająca wiele portów do różnych języków, co wiąże się z tym, że łatwiej jest odnaleźć przykłady i rozwiązać potencjalne problemy. W rozdziale Quick Start, znajduje się kilka interesujących, z omówieniem ich mechanizmów. Ciekawy wydał mi się pycrul.WRITEDATA. Z tego co udało mi się rozumieć, biblioteka nie posiada bufora na odpowiedź od serwera i to zadaniem aplikacji jest ustawienie go, dzięki tej opcji.
#! /usr/bin/env python3

import pycurl
import urllib.parse
from io import BytesIO

def post3():
    buffer = BytesIO()
    c = pycurl.Curl()

    c.setopt(pycurl.URL, 'http://requestb.in/kcco1337')
    c.setopt(pycurl.WRITEDATA, buffer)

    post_data = {'login': 'user1', 'password': 'hasło 1'}
    post_fields = urllib.parse.urlencode(post_data)
    c.setopt(pycurl.POST, 1)
    c.setopt(pycurl.POSTFIELDS, post_fields)

    c.perform()
    c.close()

    print(buffer.getvalue().decode('iso-8859-1'))
Raw body:
password=has%C5%82o+1&login=user1

18 lutego 2015

wget - utworzenie sesji i archiwizacja strony

Rozwiązanie problemu archiwizacji strony, do której konieczne jest logowanie. Po zalogowaniu tworzona jest sesja, którą można wykorzystać do ściągnięcia zawartości strony:
wget --save-cookies cookies.txt \    # zapisuje ciasteczko
     --keep-session-cookies \        # ciasteczka sesji normalnie nie są zapisywane, ta opcja to wymusza
     --post-data 'user=Alice&pass=123' \ # logowanie na stronie (metoda POST)
     http://example.com

wget --recursive \                   # przeszukaj stronę rekursywnie
     --cookies=on \                  # man nie opisuje, wget nie odrzuca, niektóre przykłady podają (?)
     --load-cookies cookies.txt \    # ładuje wcześniej zapisane cookie
     --keep-session-cookies \        # nadal utrzymuje cookie sesji 
     --no-clobber \                  # nie nadpisuj już istniejących plików
     --page-requisites \             # ściągnij wszystkie pliki (pliki dźwiękowe, css, itd.)
     --html-extension \              # zapisz pliki z rozszerzeniem html
     --restrict-file-names=windows \ # eskejpuje znaki by Windows (są też inne tryby) sobie poradził
     --domains example.com \         # nie śledź linków poza domenom
     http://example.com
Podzieliłem problem na dwie części, ale pewnie da się to zamknąć do jednego polecenia.

1 września 2014

[python] HTTP POST requests

Zadanie: jak wykonać zapytanie POST do strony. Dla testów skorzystałem z fajnej stronki http://requestb.in/, bo nie chciało mi się stawiać własnego serwera. Trzeba sobie za jej pomocą wygenerować link, który będzie służył nam do testów.
Najpierw standardowa biblioteka urllib2. W python-ie 3, została podzielona na dwie, urllib.request oraz urllib.error. W pierwszej kolejności przerabiamy parametry, które wstawimy do zapytania za pomocą urlencode() do "url-encoded" string (spacja na %20 itp.). Następnie tworzymy zapytanie url - request.Request(). Jeżeli zostanie dostarczony parametr data (jak w tym przypadku), to zapytanie będzie typu POST.
#! /usr/bin/env python3

import urllib.parse
import urllib.request

def post1():
    url = 'http://requestb.in/kcco1337'
    post_data = urllib.parse.urlencode({'login': 'user1', 'password': 'hasło 1'})

    binary_data = post_data.encode('utf-8')
    req = urllib.request.Request(url, data=binary_data)
    u = urllib.request.urlopen(req)
    print(u.read())
Raw body odebrane przez requestb.in:
login=user1&password=has%C5%82o+1
Urllib zbiera sporo krytyki, jako nieodpowiadający naszym czasom i trudny w obsłudze (muszę się z tym troszkę zgodzić). Alternatywę, którą znalazłem jest biblioteka requests, której działania nie muszę nawet opisywać.
#! /usr/bin/env python3

import requests

def post2():
    url = 'http://requestb.in/kcco1337'
    r = requests.post(url, data={'login': 'user1', 'password': 'hasło 2'})
    print(r.status_code)
    print(r.content)
Jedyną rzeczą, której nie jestem pewny jest kodowanie, najwyraźniej jednak w tym przykładzie wszystko poszło ok. Odebrane raw body:
password=has%C5%82o+2&login=user1