Почему .NET Post отличается от CURL? сломана? - PullRequest
2 голосов
/ 22 апреля 2010

ПРИМЕЧАНИЕ. Я исправил проблему с агентом пользователя и добавил дополнительный байт, соответствующий длине контента. Не повезло, однако.

Я не понимаю этого. Я запустил этот код ниже, и в результате в строке json истек срок действия ссылки (означает недопустимый).

Однако код curl делает то же самое и работает. Я либо получаю ожидаемую строку с URL, либо он говорит, что мне нужно подождать (от нескольких секунд до 1 минуты).

Почему? какая разница между двумя? Выглядит очень бодро, что ведет себя по-разному (это вызывает у меня ЧАСЫ проблем).

ПРИМЕЧАНИЕ. Единственный файл cookie, необходимый для сайта, - это SID (протестировано). Он содержит ваш идентификатор сессии. Первый пост активирует его, а вторая команда проверяет статус с помощью возвращаемой строки json. Не стесняйтесь настроить CookieContainer на использование только SID, если хотите.

ВНИМАНИЕ: вы можете изменить SID на другое значение, чтобы другие люди не активировали его. Возможно, вы захотите запустить 2-й URL-адрес, чтобы убедиться, что идентификатор сеанса не используется, и перед началом выдается сообщение об истечении / недействительности.

дополнительное примечание: с помощью curl или в вашем браузере, если вы выполните команду POST, вы можете вставить sid в контейнер cookie .NET, и вторая команда будет работать. Но выполнение первой команды (данные POST) не будет работать. Эту функцию записи я использовал для многих других сайтов, которые требуют публикации, и до сих пор она работала Очевидно, что проверка метода является большой проблемой, и я вижу, что это действительно POST при выполнении первой команды.

    static void Main(string[] args)
    {
        var cookie = new CookieContainer();
        PostData("http://uploading.com/files/get/37e36ed8/", "action=second_page&file_id=9134949&code=37e36ed8", cookie);
        Thread.Sleep(4000);
        var res = PostData("http://uploading.com/files/get/?JsHttpRequest=12719362769080-xml&action=get_link&file_id=9134949&code=37e36ed8&pass=undefined",
            null/*this makes it GET*/, cookie);

        Console.WriteLine(res);
        /*
        curl -b "SID=37468830" -A "DUMMY_User_Aggent" -d "action=second_page&file_id=9134949&code=37e36ed8" "http://uploading.com/files/get/37e36ed8/"
        curl -b "SID=37468830" -A "DUMMY_User_Aggent" "http://uploading.com/files/get/?JsHttpRequest=12719362769080-xml&action=get_link&file_id=9134949&code=37e36ed8&pass=undefined"
        */
    }

Мне надоели HttpWebRequest / .NET htto клиенты. Я сделал это с помощью curl (узнав, как настроить его на .NET и обновив себя). Я сделал это просто и быстро, и это работало. Никаких глупых проблем.

        Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
        var curl = new Easy();
        curl.SetOpt(CURLoption.CURLOPT_USERAGENT, "DUMMY_User_Aggent");
        curl.SetOpt(CURLoption.CURLOPT_COOKIE, "SID=4385743");


        curl.SetOpt(CURLoption.CURLOPT_POSTFIELDS, "action=second_page&file_id=9134949&code=37e36ed8");
        curl.SetOpt(CURLoption.CURLOPT_URL, "http://uploading.com/files/get/37e36ed8/");
        curl.Perform();


        curl.SetOpt(CURLoption.CURLOPT_POST, 0);
        Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData);
        curl.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf);
        curl.SetOpt(CURLoption.CURLOPT_URL, "http://uploading.com/files/get/?JsHttpRequest=12719362769080-xml&action=get_link&file_id=9134949&code=37e36ed8&pass=undefined");
        curl.Perform();

        curl.Cleanup();
        Curl.GlobalCleanup();

Ответы [ 2 ]

0 голосов
/ 22 апреля 2010

Видимо, вы пытаетесь загрузить что-то с uploading.com с помощью программы, которая вам не нужна.
Поскольку вы не отправляете UserAgent с помощью cUrl, они не могут знать, что вы его автоматизируете, однако .NET, вероятно, отправит UserAgent в черный список.

0 голосов
/ 22 апреля 2010

Попробуйте использовать класс WebClient.

Это также сделает ваш код НАМНОГО короче.

...