Ошибка 404 при попытке использовать тестовый пользователь Facebook login_url

Если я программно создам тестового пользователя Facebook, login_url для нового пользователя не работает. Получение login_url возвращает ошибку 404.

Урезанный пример (на Python). В последних двух строках проявляется проблема:

import requests
from urlparse import parse_qs
APP_ID = "<Facebook App ID>"
APP_SECRET = "<Facebook Client Secret>"

# Get app access token - this works
response = requests.get('https://graph.facebook.com/oauth/access_token',
                        params={'grant_type': "client_credentials",
                                'client_id': APP_ID, 'client_secret': APP_SECRET})
app_access_token = parse_qs(response.content)['access_token'][0]

# Create test user - this works
response = requests.post('https://graph.facebook.com/%s/accounts/test-users' % APP_ID,
                         data={'access_token': app_access_token, 'installed': "true"})
test_user = response.json()
login_url = test_user['login_url']
print login_url  # http://developers.facebook.com/checkpoint/test-user-login/...

# Get cookied for login - see https://stackoverflow.com/a/5370869/647002
session = requests.Session()
session.get("https://www.facebook.com/", allow_redirects=True)

# Login test user - THIS FAILS
response = session.get(login_url)
print response.status_code  # 404

Другие отметили, что вы должны сначала выберите домашнюю страницу Facebook, прежде чем сработает login_url тестового пользователя. Мы столкнулись с той же проблемой, и я безуспешно включил этот обходной путь выше. [Редактировать: добавлен параметр запроса _fb_noscript=1, который требуется с середины 2015 г. для тестовых клиентов, не поддерживающих JavaScript.] [Редактировать 8/2017: теперь удален _fb_noscript=1; больше не требуется, и устанавливает файл cookie noscript, который заставляет некоторые более поздние запросы аутентификации FB возвращать 500.]

Я также попытался открыть login_url непосредственно в браузере:

  • Если я не еще не вошел в Facebook, я получаю стандартную страницу Facebook 404.
  • Если я уже вошел в свою учетную запись разработчика, Facebook предупредит, что я войду в систему как тестовый пользователь платформы, а затем разрешит мне войти в учетную запись тестового пользователя.

Этот последний пункт, кажется, подтверждает, что тестовый пользователь создается правильно и что у меня есть правильный login_url. Но, конечно, это не поможет автоматизированному тестированию. (Мы не хотим запускать тесты под моей учетной записью разработчика.)

Есть ли другой способ использовать login_url тестового пользователя для автоматического тестирования?


person medmunds    schedule 22.03.2014    source источник
comment
У меня нет внутренней информации, но мне интересно, может быть, что-то не так с тестовой пользовательской системой Facebook прямо сейчас. Сегодня я заметил аналогичные проблемы с URL-адресом для входа, и я также получаю прерывистый Произошла неизвестная ошибка. OAuthExceptions при создании тестовых пользователей. Ранее в этом месяце Facebook подтвердил проблему с отправкой тестовыми пользователями сообщений на страницы: developers.facebook.com/bugs/521644354623048.   -  person David Sickmiller    schedule 27.03.2014
comment
Спасибо за указатель. Придерживаясь теории, в тестовой пользовательской системе Facebook есть проблемы, я сообщил об этом как об ошибке: разработчики .facebook.com/bugs/276245435872240. Будет обновляться с любым ответом от Facebook.   -  person medmunds    schedule 27.03.2014
comment
Разумеется, это было необъявленное изменение по сравнению с FB, и новое поведение было задумано. Альтернативный подход в моем ответе ниже.   -  person medmunds    schedule 31.03.2014


Ответы (1)


Инженер службы поддержки разработчиков Facebook подтвердил, что тестовый пользователь login_url больше не может использоваться для автоматического входа в систему тестового пользователя. , в связи с изменениями безопасности. Судя по всему, он предназначен для ручного тестирования.

Однако я я могу добиться автоматического входа в систему программно созданного тестового пользователя Facebook, отправив сообщение в обычную форму входа в Facebook. Похоже, все, что вам нужно, это адрес электронной почты и пароль, возвращенные из API create-test-user. (Кажется, никакие другие поля формы входа не нужны, хотя сначала вам все равно нужно будет получить файлы cookie.)

Приведенный ниже код теперь работает для меня (заменяя последние две строки кода «это не удается» из исходного вопроса):

# Login test user - THIS WORKS
response = session.post("https://www.facebook.com/login.php",
                        data={'email': test_user["email"],
                              'pass': test_user["password"]})
print response.status_code  # 200

Я нигде не нашел это задокументировано, и Facebook может изменить свою форму входа в будущем, поэтому YMMV.

person medmunds    schedule 30.03.2014
comment
Это сломалось где-то в середине 2015 года, по-видимому, из-за того, что Facebook теперь использует JavaScript для установки необходимых файлов cookie. Если вы используете среду сценариев, которая не обрабатывает JS, обходной путь заключается в том, чтобы включить _fb_noscript=1 в ваш первоначальный выбор www.facebook.com (чтобы получить файлы cookie без JS). Я обновлю сценарий в исходном вопросе. - person medmunds; 20.08.2015
comment
Обновление 8/2017: _fb_noscript=1 больше не требуется в исходной выборке, но устанавливает файл cookie noscript=1, который теперь приводит к сбою некоторых более поздних запросов аутентификации FB со статусом 500. - person medmunds; 26.08.2017