Я пытаюсь использовать класс BrowserSession Rohit Agarwal вместе с HtmlAgilityPack, чтобы войти в и впоследствии перейти вокруг Facebook.
Я ранее справился с выполнением того же путем записи моего собственного HttpWebRequest. Однако это затем только работает, когда я вручную выбираю cookie от своего браузера и вставляю новую строку cookie в запрос каждый раз, когда я делаю новую "сессию". Теперь я пытаюсь использовать BrowserSession для получения более умной навигации.
Вот текущий код:
BrowserSession b = new BrowserSession();
b.Get(@"http://www.facebook.com/login.php");
b.FormElements["email"] = "some@email.com";
b.FormElements["pass"] = "xxxxxxxx";
b.FormElements["lsd"] = "qDhIH";
b.FormElements["trynum"] = "1";
b.FormElements["persistent_inputcheckbox"] = "1";
var response = b.Post(@"https://login.facebook.com/login.php?login_attempt=1");
Вышеупомянутое хорошо работает. Проблема прибывает, когда я пытаюсь использовать этот BrowserSession снова для выборки другой страницы. Я делаю его этот путь, так как BrowserSession сохраняет cookie от последнего ответа и вставляет их в следующий запрос, таким образом я не должен иметь вручную страховщику cookiedata выбранный от моего браузера больше.
Однако, когда я пытаюсь сделать что-то вроде этого:
var profilePage = b.Get(@"https://m.facebook.com/profile.php?id=1111111111");
документ, который я возвращаю, пуст. Я ценил бы любой вход на том, что я делаю неправильно.
Извините, я мало знаю о пакете гибкости HTML или классе BrowserSession, о котором вы упомянули. Но я попробовал тот же сценарий с HtmlUnit , и он работал нормально. Я использую .NET-оболочку (исходный код которой можно найти здесь и поясняется немного подробнее здесь ), а вот код, который я использовал (некоторые подробности удалено, чтобы защитить невиновных):
var driver = new HtmlUnitDriver(true);
driver.Url = @"http://www.facebook.com/login.php";
var email = driver.FindElement(By.Name("email"));
email.SendKeys("some@email.com");
var pass = driver.FindElement(By.Name("pass"));
pass.SendKeys("xxxxxxxx");
var inputs = driver.FindElements(By.TagName("input"));
var loginButton = (from input in inputs
where input.GetAttribute("value").ToLower() == "login"
&& input.GetAttribute("type").ToLower() == "submit"
select input).First();
loginButton.Click();
driver.Url = @"https://m.facebook.com/profile.php?id=1111111111";
Assert.That(driver.Title, Is.StringContaining("Title of page goes here"));
Надеюсь, это поможет.
Вы проверили их новый API? http://developers.facebook.com/docs/authentication/
Вы можете вызвать простой URL-адрес, чтобы получить токен доступа oauth2.0 и прикрепить его к остальным запросам ...
https://graph.facebook.com/oauth/authorize?
client_id=...&
redirect_uri=http://www.example.com/oauth_redirect
Изменить redirect_uri на любой URL-адрес, который вы хотите, и он будет вызван с параметром "access_token" на нем. Получите это и делайте любые автоматические вызовы SDK, которые захотите.
Вы можете использовать WatiN (Тестирование веб-приложений в .Net) или Selenium для управления вашим браузером. Это поможет убедиться, что вам не нужно возиться с файлами cookie и выполнять какие-либо индивидуальные действия, чтобы последующие запросы работали, поскольку вы имитируете реального пользователя.