Flickr Automation для действий, недоступных в Flickr API (например, добавление контактов) - PullRequest
3 голосов
/ 20 января 2010

РЕДАКТИРОВАТЬ: Я добавил награду, если кто-то может помочь мне выяснить, что я делаю неправильно, все ваше.

Кроме того, мне все равнокак это делаетсяЕсли есть библиотека, которая может помочь, или что-то в этом роде, было бы замечательно.

Поскольку здесь нет никакой капчи, я теоретически должен иметь возможность войти в Flickr и добавить контакт черезкод, подобный следующему ... правильный?

Когда я запускаю этот код и много его вариантов, когда добираюсь до места, где я должен отправить форму, чтобы убедиться, что я добавляю контакт,он просит меня войти в систему. Единственная вещь, которая может быть моей неудачей - собрать правильный cookie?

У меня есть IEHTTPHeader для IE, чтобы посмотреть, что на самом деле происходит, и я стараюсь изо всех сил подражать ему.Я просто не могу найти, где я иду не так, если я просто не понимаю что-то.

Flickr API не может этого сделать

Все, что я хочу сделать, - это войти в систему и добавить предопределенный контакт.

        //This Kicks off the process
        private void button2_Click(object sender, EventArgs e)
        {
            string user = "adampeditto"; //Some Random Guy
            CookieContainer cookies = new CookieContainer();
            cookies = LoginYahoo(cookies, user);
            cookies = GetCookies(cookies, user);
            cookies = ClickFlickrButton(cookies, user);
        }

        private CookieContainer ClickFlickrButton(CookieContainer cookies, string user)
        {
            try
            {
                string appURL = "http://www.flickr.com/people/" + user + "/relationship";
                string strPostData = "magic_cookie=a9dd9cd9fd23081f35b8bad2c0ba1878&done=1";

                // Setup the http request.
                HttpWebRequest wrWebRequest = WebRequest.Create(appURL) as HttpWebRequest;
                wrWebRequest.Method = "POST";
                wrWebRequest.Timeout = 10000;
                wrWebRequest.ContentLength = strPostData.Length;
                wrWebRequest.ContentType = "application/x-www-form-urlencoded";
                CookieContainer cookieContainer = cookies;
                wrWebRequest.CookieContainer = cookieContainer;

                // Post to the login form.
                StreamWriter swRequestWriter = new
                StreamWriter(wrWebRequest.GetRequestStream());
                swRequestWriter.Write(strPostData);
                swRequestWriter.Close();

                // Get the response.
                HttpWebResponse hwrWebResponse = (HttpWebResponse)wrWebRequest.GetResponse();

                // Read the response
                StreamReader srResponseReader = new StreamReader(hwrWebResponse.GetResponseStream());
                string strResponseData = srResponseReader.ReadToEnd();
                srResponseReader.Close();

                return cookieContainer;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private CookieContainer LoginYahoo(CookieContainer cookies, string user)
        {
            string loginName = "YourLoginName";
            string password = "YourPassword";
            string appURL = "https://login.yahoo.com/config/login?.src=flickr&.pc=5134&.scrumb=0&.pd=c%3DE0.GahOp2e4MjkX.5l2HgAoLkpmyPvccpVM-&.intl=us&.done=https%3A%2F%2Flogin.yahoo.com%2Fconfig%2Fvalidate%3F.src%3Dflickr%26.pc%3D5134%26.scrumb%3D0%26.pd%3Dc%253DE0.GahOp2e4MjkX.5l2HgAoLkpmyPvccpVM-%26.intl%3Dus%26.done%3Dhttp%253A%252F%252Fwww.flickr.com%252Fsignin%252Fyahoo%252F%253Fredir%253D%25252Fpeople%25252F" + user + "%25252Frelationship%25252F&rl=1";
            string strPostData = ".tries=1&.src=flickr&.md5=&.hash=&.js=&.last=&promo=&.intl=us&.bypass=&.partner=&.u=0delt5h5l4df0&.v=0&.challenge=3DZF0DFFqdE0m.9MWnCq6LjUZ9gV&.yplus=&.emailCode=&pkg=&stepid=&.ev=&hasMsgr=1&.chkP=Y&.done=https%3A%2F%2Flogin.yahoo.com%2Fconfig%2Fvalidate%3F.src%3Dflickr%26.pc%3D5134%26.scrumb%3D0%26.pd%3Dc%253DE0.GahOp2e4MjkX.5l2HgAoLkpmyPvccpVM-%26.intl%3Dus%26.done%3Dhttp%253A%252F%252Fwww.flickr.com%252Fsignin%252Fyahoo%252F%253Fredir%253D%25252Fpeople%25252F" + user + "%25252Frelationship%25252F&.pd=flickr_ver%3D0%26c%3DE0.GahOp2e4MjkX.5l2HgAoLkpmyPvccpVM-%26ivt%3D%26sg%3D&login=" + loginName + "&passwd=" + password + "&.persistent=y&.save=Sign+In";

            // Setup the http request.
            HttpWebRequest wrWebRequest = WebRequest.Create(appURL) as

            HttpWebRequest;
            wrWebRequest.AllowAutoRedirect = true;
            wrWebRequest.Method = "POST";
            wrWebRequest.ContentLength = strPostData.Length;
            wrWebRequest.ContentType = "application/x-www-form-urlencoded";
            CookieContainer cookieContainer = cookies;
            wrWebRequest.CookieContainer = cookieContainer;

            // Post to the login form.
            StreamWriter swRequestWriter = new
            StreamWriter(wrWebRequest.GetRequestStream());
            swRequestWriter.Write(strPostData);
            swRequestWriter.Close();

            // Get the response.
            HttpWebResponse hwrWebResponse = (HttpWebResponse)wrWebRequest.GetResponse();

            // Read the response
            StreamReader srResponseReader = new
            StreamReader(hwrWebResponse.GetResponseStream());
            string strResponseData = srResponseReader.ReadToEnd();
            srResponseReader.Close();

            //YOU ARE NOW LOGGED IN TO YAHOO!
            ShowInBrowser(strResponseData);
            return cookieContainer;
        }

        //These are the places it sends you upon autoredirect after your run LoginYahoo(), if you set AutoRedirect to true there should be no need for this...
        private CookieContainer GetCookies(CookieContainer cookies, string user)
        {
            CookieContainer cookieContainer = cookies;

            string appURL = "http://login.yahoo.com/config/validate?.src=flickr&.pc=5134&.scrumb=6l14Ni2Pz3j&.pd=c%3DE0.GahOp2e4MjkX.5l2HgAoLkpmyPvccpVM-&.intl=us&.done=http%3A%2F%2Fwww.flickr.com%2Fsignin%2Fyahoo%2F%3Fredir%3D%252Fpeople%252F" + user + "%252Frelationship%252F";
            HttpWebRequest wrWebRequest = WebRequest.Create(appURL) as HttpWebRequest;
            wrWebRequest.CookieContainer = cookieContainer;
            wrWebRequest.AllowAutoRedirect = false;
            HttpWebResponse hwrWebResponse = (HttpWebResponse)wrWebRequest.GetResponse();

            appURL = "http://flickr.com/signin/yahoo/?redir=%2Fpeople%2F" + user + "%2Frelationship%";
            HttpWebRequest wrWebRequest2 = WebRequest.Create(appURL) as HttpWebRequest;
            wrWebRequest2.CookieContainer = cookieContainer;
            wrWebRequest2.AllowAutoRedirect = false;
            HttpWebResponse hwrWebResponse2 = (HttpWebResponse)wrWebRequest2.GetResponse();

            appURL = "http://flickr.com/cookie_check.gne?pass=%2Fpeople%2F" + user + "%2Frelationship%2F&fail=register_cookies.gne";
            HttpWebRequest wrWebRequest3 = WebRequest.Create(appURL) as HttpWebRequest;
            wrWebRequest3.CookieContainer = cookieContainer;
            wrWebRequest3.AllowAutoRedirect = true;
            HttpWebResponse hwrWebResponse3 = (HttpWebResponse)wrWebRequest3.GetResponse();

            return cookieContainer;
        }

Ответы [ 2 ]

2 голосов
/ 25 января 2010

Я сделал нечто похожее с библиотекой Perl WWW: Mechanize, посмотрите на это.

2 голосов
/ 20 января 2010

Вместо того, чтобы скрести экран и усложнить жизнь программиста, вы можете использовать Flickr API .Вы также можете найти этот пост в блоге полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...