LINUX.ORG.RU

[python]Отправка http-запроса на upload-файла на Yandex.narod2


0

1

Предыстория. Есть динамический IP адрес (на компе дома). Надо его(адрес) использовать в Javascript на Yandex.narod2. Решил использовать вариант с Ajax-ом, где айпишник будет считываться из файла. Комп будет периодически заливать свой айпишник. Задача - залить файл. Пишу на Питоне. Используя питоновский скрипт удалось зарегиться на яндексе, получить куки, распарсив ответ, а вот залить файл - никак, хотя ХТМЛ форма вроде простая. Последний запрос возвращает «200 ОК» (ну и ХТМЛ).

ХТМЛ форма (видимо после выбора файла запускается скрипт, который делает сабмит и видимо ещё что-то, но так скрипт и не нашёл):

<form id="b-far-upload" action="/filemanager/" method="POST" enctype="multipart/form-data">
<div class="b-upload-file">
<input type="file" id="b-far-upload-file" name="file" value=""/>
</div>
<input type="hidden" name="action" value="upload"/>
<input type="hidden" name="currentDir" value="/"/>
</form>

Питоновский код:

#отправка HTTP запроса на вход на яндекс.народ2
    conn = httplib.HTTPConnection("passport.yandex.ru")
    params = urllib.urlencode({'login': "xxxxxxxxxx", 'passwd': "yyyyyyyy"})
    headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/html"}
    conn.request("POST", "/passport?mode=login&retpath=http://хххххххх.narod2.yandex.ru/edit/", params, headers)
    r1 = conn.getresponse()
    print r1.status, r1.reason
    data1 = r1.read()
    #print data1
    conn.close()

    #парсим куки ответа
    cookp = data1.find('Set-Cookie: ')
    cookend = 0;
    cooks = "Cookie: "
    while cookp > 0 :
        cookp += 12
        cookend = data1.find(';',cookp)
        cooks += data1[cookp:cookend] 
        cookp = data1.find('Set-Cookie: ',cookend)
        if cookp > 0 :
            cooks += "; "
    print(str(cooks))

    #шлём файл
    print("\n\n")
    conn = httplib.HTTPConnection("xxxxxxxxxxx.narod2.yandex.ru")
    postbody = '''--bndr777
    Content-Disposition: form-data; name="action"

    upload
    --bndr777
    Content-Disposition: form-data; name="currentDir"

    /
    --bndr777
    Content-Disposition: form-data; name="files"; filename="ipaddr.txt"
    Content-Type: text/plain

    xx.xx.xx.xx
    --bndr777--'''
    
    headers = {"Content-type": "multipart/form-data; boundary=bndr777","Content-Length": str(len(postbody)),"Accept": "text/html","Cookie": cooks,}
    conn.request("POST", "/filemanager/", postbody, headers)
    r1 = conn.getresponse()
    print r1.status, r1.reason
    data1 = r1.read()
    print("\n\n")
    print data1
    conn.close()

Если есть другие варианты - выслушаю. Только не надо говорить про то , чтоб купить статический АйПишник))

Ответ на: комментарий от Cargo

поддерживаю предыдущего оратора! DynDNS как раз для этого и сделали.

anonymous ()

Попробуй сниффером, например вайршарком (wireshark), посмотреть, что там происходит между браузером и сервером, и воспроизвести. Аякс может использоваться или кукиса какая-нибудь незамеченная тобой оставляться.

certanista ()
Ответ на: комментарий от Cargo

Видимо это то что нужно, хоть прочитал бегло. Спасибо. А то уже хотел велосипед изобретать. Надо только ещё узнать какие минусы у того сервиса(ДинДНС)

rip86oz ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.