如何使用Haskell上传照片到Facebook?

3
我正在使用Happstack,并尝试使用Facebook Graph API上传照片到Facebook。
我成功地向Facebook发布了一条消息。我可以使用url,但是我正在尝试使用source参数来实现这一点。
我有一个PNG数据的ByteString,但似乎无法将其传递给Facebook。
我正在使用fb Haskell库
我创建的用于此目的的函数为:
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 表示 source 参数应该是表单数据类型,但我一直无法成功将其转换为此类型。
谢谢!
2个回答

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

享受吧!


0

谢谢你的回答,Tobi。我已经尝试了很多不同的方式将数据编码为“multipart/form”,但每次仍然收到与上面相同的错误。你有什么建议如何对PNG数据进行编码吗? - Citronen
我不是Haskell专家,但你是否看过https://hackage.haskell.org/package/happstack-server-7.3.9/docs/Happstack-Server-Internal-Multipart.html,特别是multipartBody属性? - Tobi
我已经尝试过了,但是我可能在错误的方向上解决问题。我一直在尝试将数据编码为 multipart/form-data 并将其作为 ByteString 参数发送。我是否应该尝试将多部分附加到请求本身? - Citronen
就像我说的那样,我不是Haskell专家。我会尝试直接将多部分附加到POST请求中,我想这就是它的作用。 - Tobi
我已经找到了解决方案,但是我选择了您的答案作为正确答案。 - Citronen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接