Тестовые пользователи Facebook не могут делать посты на стене - PullRequest
2 голосов
/ 01 сентября 2011

Для нашего сайта мы проводим множество автоматических тестов. Итак, недавно я только что написал метод, использующий Facebook Graph API, который создает запись в фиде. Этот метод работает, когда я тестирую его в реальном времени с использованием реальных учетных записей Facebook . Однако, когда я использую тестовых пользователей Facebook (с разрешением, установленным на "publish_stream"), тогда я получаю 403 запрещенных.

Разрешено "тестовым пользователям" делать посты на стене? или есть что-то, что я не правильно делаю?

Это мой тестовый код, написанный на Groovy

void testPostMessageOnWall() {
    def appAccessToken = facebookService.getAppAccessToken()
    assertNotNull appAccessToken

    def testUser1 = facebookService.createTestAccount("Ryoko UserOne", appAccessToken)
    assertNotNull testUser1
    def testUser2 = facebookService.createTestAccount("Ryoko UserTwo", appAccessToken)
    assertNotNull testUser2

    def response = facebookService.connectTwoTestAccount(testUser1.id, testUser1.access_token, testUser2.id, testUser2.access_token)
    assertTrue response

    println testUser1
    println testUser2

    def postResponse = facebookService.postMessageOnWall([accessToken:testUser1.access_token,
                                                          from:testUser1.id,
                                                          to:testUser2.id,
                                                          message:"Join ryoko.it. It's nice there!",
                                                          link:"http://ryoko.it",
                                                          name:"name of website",
                                                          caption:"ryoko.it",
                                                          description:"description",
                                                          picture:"http://ryoko.it/images/ryoko.png"
                                                          ])

    println postResponse
    assertNotNull postResponse

    facebookService.deleteTestAccount(testUser1.id, testUser1.access_token)
    facebookService.deleteTestAccount(testUser2.id, testUser2.access_token)
}

Этот тест создает двух тестовых пользователей / учетных записей и делает их друзьями друг друга, затем testUser1 публикует что-то в стене testUser2. Ошибка в строке: assertNotNull postResponse.

Это заголовок ответа:

Date: Thu, 01 Sep 2011 18:39:10 GMT
WWW-Authenticate: OAuth "Facebook Platform" "insufficient_scope" "(#200) The user hasn't    authorized the application to perform this action"
P3P: CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"
X-Cnection: close
X-FB-Rev: 433230
Content-Length: 146
Pragma: no-cache
X-FB-Server: 10.64.212.43
Content-Type: text/javascript; charset=UTF-8
Cache-Control: no-store
Expires: Sat, 01 Jan 2000 00:00:00 GMT

data:
{
  "error": {
    "type": "OAuthException",
    "message": "(#200) The user hasn't authorized the application to perform this action"
   }
}

Пользователь создан так:

def createTestAccount(fullname, appAccessToken) {
    def accessToken = appAccessToken
    def urlString = "${GRAPH_API_URL}/${APP_ID}/accounts/test-users?installed=true"
    def encodedFullname = URLEncoder.encode(fullname, "UTF-8")
    urlString += "&name=${encodedFullname}"
    urlString += "&permission=create_note,email,offline_access,photo_upload,publish_stream,read_friendlists,share_item,status_update,video_upload"
    urlString += "&method=post"
    urlString += "&access_token=${accessToken}"
    def url = new URL(urlString)
    def connection = url.openConnection()
    def userDetails

    if (connection.responseCode == 200) {
        userDetails = JSON.parse(connection.content.text)
    }
    else {
        println "[FACEBOOK]\tResponse code ${connection.responseCode}: ${connection.responseMessage} [${urlString}]"
    }

    userDetails
}

и сообщение отправляется так:

def postMessageOnWall(params) {
    assert params.accessToken
    assert params.from
    assert params.to

    def content = "access_token=${postEncode(params.accessToken)}"
    if (params.message)     content += "&message=${postEncode(params.message)}"
    if (params.link)        content += "&link=${postEncode(params.link)}"
    if (params.name)        content += "&name=${postEncode(params.name)}"
    if (params.caption)     content += "&caption=${postEncode(params.caption)}"
    if (params.description) content += "&description=${postEncode(params.description)}"
    if (params.picture)     content += "&picture=${postEncode(params.picture)}"
    if (params.from)        content += "&from=${postEncode(params.from)}"
    if (params.to)          content += "&to=${postEncode(params.to)}"

    def urlString = "${GRAPH_API_URL}/${params.to}/feed"
    def url = new URL(urlString)
    def connection = url.openConnection()
    connection.doOutput = true
    connection.setRequestMethod("POST")
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
    connection.setRequestProperty("Content-Length", "${content.size()}")

    println content

    def writer = new OutputStreamWriter(connection.outputStream)
    writer.write(content)
    writer.flush()
    writer.close()
    connection.connect()

    def response

    if (connection.responseCode == 200) {
        response = JSON.parse(connection.content.text)
    }
    else {
        println "[FACEBOOK]\tResponse code ${connection.responseCode}: ${connection.responseMessage} [${urlString}]"
    }

    println "response: ${response}"

    response
}

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

1 Ответ

0 голосов
/ 31 декабря 2012

В вашем createTestAccount () параметр запроса'missionmission 'должен быть' permissions '(во множественном числе).

...