Kesalahan 404 saat mencoba menggunakan pengguna uji Facebook login_url

Jika saya secara terprogram membuat pengguna uji Facebook, login_url untuk pengguna baru tidak berfungsi. Mengambil login_url mengembalikan kesalahan 404.

Contoh sederhana (dengan Python). Dua baris terakhir adalah tempat munculnya masalah:

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

Orang lain telah mencatat bahwa Anda harus pertama-tama ambil beranda Facebook sebelum login_url pengguna uji akan berfungsi. Kami mengalami masalah yang sama, dan saya telah menyertakan solusi di atas tanpa hasil. [Edit: menambahkan parameter kueri _fb_noscript=1, diperlukan mulai pertengahan tahun 2015 untuk klien pengujian non-JavaScript.] [Edit 8/2017: sekarang dihapus _fb_noscript=1; tidak lagi diperlukan, dan menyetel cookie noscript yang membuat beberapa permintaan autentikasi FB selanjutnya menghasilkan 500.]

Saya juga mencoba membuka login_url langsung di browser:

  • Jika saya belum masuk ke Facebook, saya mendapatkan halaman Facebook 404 yang umum.
  • Jika saya sudah masuk ke akun pengembang saya, Facebook memperingatkan bahwa saya akan masuk sebagai pengguna uji platform, dan kemudian mengizinkan saya masuk ke akun pengguna uji.

Poin terakhir itu sepertinya mengonfirmasi bahwa pengguna uji dibuat dengan benar dan saya memiliki login_url yang benar. Namun tentu saja, hal itu tidak membantu pengujian otomatis. (Kami tidak ingin menjalankan pengujian dengan masuk ke akun pengembang saya.)

Apakah ada cara lain login_url pengguna uji dimaksudkan untuk digunakan untuk pengujian otomatis?


person medmunds    schedule 22.03.2014    source sumber
comment
Saya tidak memiliki pengetahuan mendalam, tapi saya bertanya-tanya apakah mungkin ada yang salah dengan sistem pengguna uji Facebook saat ini. Hari ini saya melihat masalah serupa dengan URL login, dan saya juga mengalami masalah intermiten. Telah terjadi kesalahan yang tidak diketahui. OAuthExceptions saat membuat pengguna uji. Awal bulan ini Facebook mengonfirmasi adanya masalah dengan pengguna uji coba yang memposting ke halaman: developers.facebook.com/bugs/521644354623048   -  person David Sickmiller    schedule 27.03.2014
comment
Terima kasih atas petunjuknya. Berdasarkan teori, ada masalah dalam sistem pengguna uji Facebook, saya telah melaporkan ini sebagai bug: developer .facebook.com/bugs/276245435872240. Akan memperbarui dengan tanggapan apa pun dari Facebook.   -  person medmunds    schedule 27.03.2014
comment
Benar saja, ini adalah perubahan mendadak dari FB, dan perilaku baru ini memang disengaja. Pendekatan alternatif dalam jawaban saya di bawah ini.   -  person medmunds    schedule 31.03.2014


Jawaban (1)


Insinyur dukungan pengembang Facebook telah mengonfirmasi bahwa pengguna uji login_url tidak dapat lagi digunakan untuk login otomatis pengguna uji , karena perubahan keamanan. Rupanya itu dimaksudkan untuk pengujian manual.

Namun, saya saya dapat mencapai login otomatis dari pengguna uji Facebook yang dibuat secara terprogram dengan memposting ke formulir login normal Facebook. Sepertinya yang Anda perlukan hanyalah email dan kata sandi yang dikembalikan dari API create-test-user. (Tampaknya tidak ada kolom formulir login lain yang diperlukan, meskipun Anda masih harus mengambil cookie terlebih dahulu.)

Kode di bawah ini berfungsi untuk saya sekarang (mengganti dua baris kode "gagal" terakhir dari pertanyaan awal):

# 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

Saya belum menemukan dokumentasi ini di mana pun, dan Facebook mungkin akan mengubah formulir loginnya di masa mendatang, jadi YMMV.

person medmunds    schedule 30.03.2014
comment
Hal ini terjadi sekitar pertengahan tahun 2015, tampaknya karena Facebook sekarang menggunakan JavaScript untuk menyetel cookie yang diperlukan. Jika Anda menjalankan lingkungan skrip yang tidak memproses JS, solusinya adalah dengan menyertakan _fb_noscript=1 dalam pengambilan awal www.facebook.com (untuk mendapatkan cookie tanpa JS). Saya akan memperbarui skrip di pertanyaan awal. - person medmunds; 20.08.2015
comment
Pembaruan 8/2017: _fb_noscript=1 tidak lagi diperlukan dalam pengambilan asli, tetapi menyetel cookie noscript=1 yang sekarang menyebabkan beberapa permintaan autentikasi FB selanjutnya gagal dengan status 500. - person medmunds; 26.08.2017