3

Я использую Happstack, и я пытаюсь загрузить фотографию в Facebook, используя API-интерфейс Facebook Graph.Как загрузить фотографию в Facebook с помощью Haskell?

Я могу успешно опубликовать сообщение в Facebook. Я могу использовать url, однако я пытаюсь сделать это с помощью параметра source.

У меня есть ByteString из PNG-данных, но я не могу передать его в Facebook.

Я использую fb Haskell library.

Функции, которые я создал, чтобы сделать это, являются:

performPost :: String -> IO Response 
performPost code = do 
    x <- BS.readFile "test.png" 
    performFBAction $ do 
     postToFB (BS.unpack x) code =<< getToken url2 code 
     return $ toResponse postFB 

postToFB :: (MonadResource m, MonadBaseControl IO m) => String -> String -> FB.UserAccessToken -> FB.FacebookT FB.Auth m FB.Id 
postToFB dataString code token = FB.postObject "me/photos" [args "message" "Test Post Pls Ignore", 
                  args "source" dataString] token 

Ошибка, я получаю это:

Ошибка была "StatusCodeException (Status {StatusCode = 400, StatusMessage =" Bad Request "}) [(" Content-Type "," text/html; charset = utf-8 "), (" Date "," Thu, 29 Jan 2015 05:06:00 GMT "), (" Connection " , «close»), («Content-Length», «3121»)] (CJ {expose = []})

Что я делаю неправильно? API-интерфейс Graph утверждает, что параметр source должен иметь данные типа формы, но до сих пор я не был успешным, чтобы преобразовать его в такой.

Спасибо!

ответ

0

Проверьте правильность кодировки содержимого фотографии. Он должен быть multipart/form-data как указано на

+0

Благодарим вас за ответ, Тоби. Я пытался кодировать данные как «multipart/form» разными способами, но все равно получаю ту же ошибку, что и выше каждый раз. Есть ли у вас какие-либо предложения относительно того, как кодировать данные PNG? – Citronen

+0

Я не эксперт Haskell, но вы взглянули на https://hackage.haskell.org/package/happstack-server-7.3.9/docs/Happstack-Server-Internal-Multipart.html, особенно на multipartBody имущество? – Tobi

+0

Я пробовал это, но я, возможно, неправильно подхожу к проблеме. Я пытаюсь кодировать данные как «multipart/form-data» и отправлять их в качестве параметра ByteString в качестве параметра. Должен ли я каким-то образом пытаться добавить multipart к самому запросу? – Citronen

0

Что Tobi сказал правильно. Код для правильной работы этой операции:

postPhoto :: FB.UserAccessToken -> IO Response 
postPhoto (FB.UserAccessToken _ b _) = withSocketsDo $ withManager $ \m -> do 
    fbpost <- parseUrl $ "https://graph.facebook.com/v2.2/me/photos?access_token=" ++ T.unpack b 
    flip httpLbs m =<< 
     (formDataBody [partBS "message" "Test Message", 
         partFileSource "graph" "graph.png"] 
         fbpost) 
    return $ toResponse postFB 

Наслаждайтесь!