Используя BrowserSession и HtmlAgilityPack для входа в систему в Facebook через.NET

Я пытаюсь использовать класс 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");

документ, который я возвращаю, пуст. Я ценил бы любой вход на том, что я делаю неправильно.

13
задан Karsa Olong 12 August 2010 в 20:48
поделиться

3 ответа

Извините, я мало знаю о пакете гибкости 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"));

Надеюсь, это поможет.

9
ответ дан 1 December 2019 в 21:23
поделиться

Вы проверили их новый 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, которые захотите.

0
ответ дан 1 December 2019 в 21:23
поделиться

Вы можете использовать WatiN (Тестирование веб-приложений в .Net) или Selenium для управления вашим браузером. Это поможет убедиться, что вам не нужно возиться с файлами cookie и выполнять какие-либо индивидуальные действия, чтобы последующие запросы работали, поскольку вы имитируете реального пользователя.

2
ответ дан 1 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: