2010-07-02 13 views
6

urllib2. Ancak, her gönderdiğimde, Hata kodu 400'ü döndürür (Hatalı İstek). Ben POST göndermek için aşağıdaki piton kodunu kullanıyorumDoğrulanmış HTTP POST ben IronPython urllib2 kullanarak tamamen XML yük (Sanırım) ile POST mesaj göndermeye çalışıyorum

POST /action/add HTTP/1.1 
User-Agent: curl/7.16.3 (Windows build 7600; en-US; beta) boxee/0.9.21.11487 
Host: app.boxee.tv 
Accept: */* 
Accept-Encoding: deflate, gzip 
Cookie: boxee_ping_version=9; X-Mapping-oompknoc=76D730BC9E858725098BF13AEFE32EB5; boxee_app=e01e36e85d368d4112fe4d1b6587b1fd 
Connection: keep-alive 
Content-Type: text/xml 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Accept-Language: en-us,en;q=0.5 
Keep-Alive: 300 
Connection: keep-alive 
Content-Length: 53 

<message type="dequeue" referral="3102296"></message> 

: Aslında Boxee gerçek veri paketlerinin (WireShark'la itibaren) şöyle hangi sıra maddenin çağrısını kaldırmak taklit eden çalışıyorum

: Ben bu her çalıştırdığınızda

def PostProtectedPage(theurl, username, password, postdata): 

    req = urllib2.Request(theurl, data=postdata) 
    req.add_header('Content-Type', 'text/xml') 
    try: 
     handle = urllib2.urlopen(req) 
    except IOError, e:     # here we are assuming we fail 
     pass 
    else:        # If we don't fail then the page isn't protected 
     print "This page isn't protected by authentication." 
     sys.exit(1) 

    if not hasattr(e, 'code') or e.code != 401:     # we got an error - but not a 401 error 
     print "This page isn't protected by authentication." 
     print 'But we failed for another reason.' 
     sys.exit(1) 

    authline = e.headers.get('www-authenticate', '')    # this gets the www-authenticat line from the headers - which has the authentication scheme and realm in it 
    if not authline: 
     print 'A 401 error without an authentication response header - very weird.' 
     sys.exit(1) 

    authobj = re.compile(r'''(?:\s*www-authenticate\s*:)?\s*(\w*)\s+realm=['"](\w+)['"]''', re.IGNORECASE)   # this regular expression is used to extract scheme and realm 
    matchobj = authobj.match(authline) 
    if not matchobj:          # if the authline isn't matched by the regular expression then something is wrong 
     print 'The authentication line is badly formed.' 
     sys.exit(1) 
    scheme = matchobj.group(1) 
    realm = matchobj.group(2) 
    if scheme.lower() != 'basic': 
     print 'This example only works with BASIC authentication.' 
     sys.exit(1) 

    base64string = base64.encodestring('%s:%s' % (username, password))[:-1] 
    authheader = "Basic %s" % base64string 
    req.add_header("Authorization", authheader) 
    try: 
     handle = urllib2.urlopen(req) 
    except IOError, e:     # here we shouldn't fail if the username/password is right 
     print "It looks like the username or password is wrong." 
     print e 
     sys.exit(1) 
    thepage = handle.read() 
    return thepage 

Ancak,
ben (ve bunu hayal bile edemiyorum kuyruk getirmek için başka yerlerde kullanabilirsiniz çünkü kimlik doğrulama kullanılmadığı doğrudur biliyoruz hata 400 (Bad Request) döndürür aksi halde nasıl olmaz Hangi hesap w, ağ yakalama baktığımızda)

? değişikliklerin uygulanacağı Ben sadece isteğine bazı başlıkları ekleyerek eksik olabilir? Muhtemelen basit bir şey, ama ne olduğunu bilmek için python veya HTTP istekleri hakkında yeterli bilgi sahibi değilim.

Düzenleme şu şekildedir: BTW, kod arıyorum (aslında dinamik, ama bu temel fikir):

PostProtectedPage("http://app.boxee.tv/action/add", "user", "pass", "<message type=\"dequeue\" referral=\"3102296\"></message>") 
+1

Bir ipucu. Önce komut satırında curl kullanarak çalışmayı deneyin. Curl'in hata ayıklama seçeneklerini kullanarak bunu yakalayabilir ve size bazı ipuçları verebilir. Python'da, bazı programatik HTTP arabirimlerinin bilinmeyen kullanıcı aracılarını reddettiği maalesef, curl Kullanıcı-Aracı üstbilgisini oluşturmanız da mümkündür. Başka bir olasılık, boxee'nin çerezleri sunucuya geri gönderme şeklini taklit etmeniz gerekir. –

+0

Hmmm, iyi puanlar. Kullanıcı işlemi ve çerezleri göz ardı ettim, çünkü alma işlemi sorunsuz çalıştı. Bir atış vereceğim. Teşekkürler. –

+0

Kendimi bir hesap kurma ve bu test çalıştım, ama boxee.tv normalde bu isteği tetiklemek için bu yüzden Wireshark içinde görebileceği bir yere bilemiyorum. –

cevap

0

Bu benim için iyi çalıştı:

curl -v -A 'curl/7.16.3 (Windows build 7600; en-US; beta) boxee/0.9.21.11487' \ 
-H 'Content-Type: text/xml' -u "USER:PASS" \ 
--data '<message type="dequeue" referral="12573293"></message>' \ 
'http://app.boxee.tv/action/add' 

Şu anda kuyrukta olmayan bir başvuru kimliğini kaldırmaya çalışırsam 400 Bad Request alırım. Wireshark'tan saptadığınız aynı başvuru kimliğini kullanıyorsanız, bu sizin için de neler olup bittiği konusunda büyük olasılıkla. Kaldırmaya çalıştığınız şeyin kuyrukta olduğundan emin olmak için

kullanın.