C # Войдите на thetvdb.com, затем установите рейтинг эпизода - PullRequest
1 голос
/ 23 сентября 2010

Я хочу, чтобы моя программа на c # автоматически публиковала оценки эпизода при входе в мою учетную запись tvdb.Я делал нечто подобное много раз, используя какой-то код, полученный с . Войдите на сайт и используйте cookie, чтобы получить исходный код для другой страницы в качестве руководства.Вот моя версия:

    public class WebClientEx : WebClient
    {
        public CookieContainer CookieContainer { get; private set; }

        public WebClientEx()
        {
            CookieContainer = new CookieContainer();
        }

        protected override WebRequest GetWebRequest(Uri address)
        {
            var request = base.GetWebRequest(address);
            if (request is HttpWebRequest)
            {
                (request as HttpWebRequest).CookieContainer = CookieContainer;
            }
            return request;
        }
    }


        public static string GetWebDataLoginRequired(string url, string loginUrl, NameValueCollection login_data_values)
    {
        try
        {
            using (var client = new WebClientEx())
            {
                // Authenticate
                client.UploadValues(loginUrl, login_data_values);
                // Download desired page
                return client.DownloadString(url);
            }
        }
        catch
        {
            return null;
        }
    }

    public static readonly NameValueCollection TVDB_LOGIN_DATA = new NameValueCollection
    {
        { "username","username" },
        { "password","password" },
        { "setcookie", "on" }
    };
    public const string TVDB_LOGIN_URL = "http://thetvdb.com/index.php?tab=login&function=Log+In&submit=Log+In";

        string url = String.Format("http://www.thetvdb.com/?function=UserRating&type=episode&itemid={0}&rating={1}&seriesid={2}&seasonid={3}", ep.id, rating, ep.seriesid, ep.seasonid);
        string data = HtmlLib.GetWebDataLoginRequired(url, HtmlLib.TVDB_LOGIN_URL, HtmlLib.TVDB_LOGIN_DATA);

Прежде всего, я просто хочу сказать, что этот код прекрасно работает для других веб-сайтов, изменив коллекцию namevalue, однако этот код не хочет работать.

Когда я делаю это вручную, подключая прямой результат string.format к веб-браузеру, он работает просто отлично, однако с этим кодом он не работает.Я проверил, используя трассировку пакетов и Fiddler, и я на 100% уверен, что он входит в систему правильно, он просто теряет информацию для входа для второго запроса.

1 Ответ

0 голосов
/ 23 сентября 2010

Проблема заключается в том, что в исходном запросе данных для входа использовался http://thetvdb.com,, тогда как в запросе на оценку эпизода использовался http://www.thetvdb.com (обратите внимание на добавленный www.). Потратил несколько часов на отладку, только чтобы понять, что это так же просто, как http vs http://www.

...