2009-09-17 56 views

回答

0

爲什麼不使用Python的urllib2模塊來創建POST請求,就像它們在PHP的示例中所示的那樣。這將是這樣的:

import urrlib, urllib2 
data = (
     ('name', 'torrent'), 
     ('type', 'application/x-bittorrent'), 
     ('file', '/path/to/your/file.torrent'), 
) 
request = urllib2.urlopen('http://torrage.com/autoupload.php', urllib.urlencode(data)) 
+0

有在App Engine中沒有文件,我需要用我在內存送了一個文件。 – medecau 2009-09-17 13:39:36

+0

由於PHP示例使用了構建多部分/表單數據請求的某些PHP功能,因此_not_表示您的示例構造的表單編碼請求。 – 2009-09-17 19:31:47

2

我找到POST接口上torrage的API文檔(而不是在SOAP之一)相當混亂和衝突的與樣品C代碼也供應。在我看來,在他們的PHP發佈的在線示例中,他們不會發送文件的內容(就像@ kender的上面的答案不會發送它),而是在SOAP示例和示例C代碼中發送它的內容。

C採樣(他們是如何計算你會被傳遞給urlfetch.fetch頭)的相關部分是:

snprintf(formdata_header, sizeof(formdata_header) - 1, 
    "Content-Disposition: form-data; name=\"torrent\"; filename=\"%s\"\n" 
    "Content-Type: " HTTP_UPLOAD_CONTENT_TYPE "\n" 
    "\n", 
    torrent_file); 
    http_content_len = 2 + strlen(content_boundary) + 1 + strlen(formdata_header) + st.st_size + 1 + 2 + strlen(content_boundary) + 3; 
    LTdebug("http content len %u\n", http_content_len); 
    snprintf(http_req, sizeof(http_req) - 1, 
    "POST /%s HTTP/1.1\n" 
    "Host: %s\n" 
    "User-Agent: libtorrage/" LTVERSION "\n" 
    "Connection: close\n" 
    "Content-Type: multipart/form-data; boundary=%s\n" 
    "Content-Length: %u\n" 
    "\n", 
    cache_uri, cache_host, content_boundary, http_content_len); 

「應用程序/ x-BitTorrent的」 是HTTP_UPLOAD_CONTENT_TYPEst.st_size是包含所有文件數據的內存緩衝區中的字節數(C樣本從文件讀取數據,但只要知道其大小,無論如何將其存入內存都無關緊要)。 content_boundary是一個不存在於文件內容中的字符串,它們將其構建爲"---------------------------%u%uLT",每個%u被一個隨機數替換(重複,直到該字符串命中兩個隨機數,使其不在文件中)。最後,帖子正文(打開HTTP套接字和發送其他頭後),他們寫如下:

if (write_error == 0) if (write(sock, "--", 2) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, content_boundary, strlen(content_boundary)) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, "\n", 1) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, formdata_header, strlen(formdata_header)) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, filebuf, st.st_size) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, "\n--", 3) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, content_boundary, strlen(content_boundary)) <= 0) write_error = 1; 
    if (write_error == 0) if (write(sock, "--\n", 3) <= 0) write_error = 1; 

其中filebuf是該文件的內容的緩衝區。

非常尖銳和簡單,但我希望有足夠的信息來找出方法來構建urlfetch.fetch的參數(將它們構建爲urllib.urlopen也同樣困難,因爲問題是關於確切的文檔稀缺性什麼標題,什麼內容和你需要的編碼方式 - 以及那些沒有很好記錄的信息需要從我在這裏介紹的內容進行反向設計,我認爲)。

或者,可能通過urlfetch破解SOAP請求;對於卡森長期以來的嘗試,困難和成功,請參閱here。還有祝你好運!