FacebookのJavascript APIを使用して画像をユーザーの壁に投稿する必要があるアプリケーションを開発しています。 画像のデータを「マルチパート/フォームデータ」として投稿する必要があるため、アプリのその部分は私が知る限りサーバー側にする必要があります。グラフAPIを使用して.NETからFacebookの壁に画像を投稿する
注:「投稿」を使用した単純なバージョンではなく、実際の「写真」方法です。
http://graph.facebook.com/me/photos
私は二つの問題、.NETおよびFacebookの問題直面していると思う:
Facebookの問題:私はすべてのパラメータが/マルチパートとして送信する必要がある場合はかなりよく分からないがフォームデータ(access_tokenとメッセージを含む)。唯一のコード例は、cUrlユーティリティ/アプリケーションを使用しています。
.NETの問題: .NETからmultipart/form-dataリクエストを発行したことはありません.Netが自動的にmime-partsを作成するかどうか、または一部でパラメータをエンコードする必要があるかどうかはわかりません特別な方法。
グラフAPIから得られる唯一のエラー応答は「400 - 悪い要求」なので、デバッグは少し難しいです。 以下は、私がこの質問を書くことにしたときのコードです(はい、少し冗長です:-)
究極の答えは、もちろん.NETから画像を投稿するサンプルスニペットです少ないために。
string username = null;
string password = null;
int timeout = 5000;
string requestCharset = "UTF-8";
string responseCharset = "UTF-8";
string parameters = "";
string responseContent = "";
string finishedUrl = "https://graph.facebook.com/me/photos";
parameters = "access_token=" + facebookAccessToken + "&message=This+is+an+image";
HttpWebRequest request = null;
request = (HttpWebRequest)WebRequest.Create(finishedUrl);
request.Method = "POST";
request.KeepAlive = false;
//application/x-www-form-urlencoded | multipart/form-data
request.ContentType = "multipart/form-data";
request.Timeout = timeout;
request.AllowAutoRedirect = false;
if (username != null && username != "" && password != null && password != "")
{
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(username, password).GetCredential(new Uri(finishedUrl), "Basic");
}
//write parameters to request body
Stream requestBodyStream = request.GetRequestStream();
Encoding requestParameterEncoding = Encoding.GetEncoding(requestCharset);
byte[] parametersForBody = requestParameterEncoding.GetBytes(parameters);
requestBodyStream.Write(parametersForBody, 0, parametersForBody.Length);
/*
This wont work
byte[] startParm = requestParameterEncoding.GetBytes("&source=");
requestBodyStream.Write(startParm, 0, startParm.Length);
byte[] fileBytes = File.ReadAllBytes(Server.MapPath("images/sample.jpg"));
requestBodyStream.Write(fileBytes, 0, fileBytes.Length);
*/
requestBodyStream.Close();
HttpWebResponse response = null;
Stream receiveStream = null;
StreamReader readStream = null;
Encoding responseEncoding = System.Text.Encoding.GetEncoding(responseCharset);
try
{
response = (HttpWebResponse) request.GetResponse();
receiveStream = response.GetResponseStream();
readStream = new StreamReader(receiveStream, responseEncoding);
responseContent = readStream.ReadToEnd();
}
finally
{
if (receiveStream != null)
{
receiveStream.Close();
}
if (readStream != null)
{
readStream.Close();
}
if (response != null)
{
response.Close();
}
}
ありがとう@fltz。あなたのサンプル(スニペットの範囲外で宣言されているヴァールのいくつか)を適用することによって、それが機能するように管理されています。 –
アプリケーションが壁に画像を投稿するのか、それともアプリケーションのアルバムにアップロードするだけですか?私のテストでは壁/餌にアップロードされた画像が見えませんでした。 – fltz
私はまだそれを知りませんでした。これまでは、アプリケーションの既定のアルバムが作成されたときに壁にしか表示されません。しかし、[この投稿]によると(http://www.raywenderlich.com/1626/how-to-post-to-a-users-wall-upload-photos-and-add-a-like-button-from-あなたのiPhoneアプリ)それは可能でなければなりません。 –