user3425095
user3425095

Reputation: 1

tweet with picture not working

I trying to tweet with picture based on code example from msdn example but it's not working, any idea why? is it twitter changing api policy? here is my code

public void postToTwitter()
{
    try
    {
        var image = new WriteableBitmap(430, 400);
        image.Render(locationPict, null);
        image.Invalidate();
        MemoryStream ms = new MemoryStream();
        image.SaveJpeg(ms, 430, 400, 0, 100);

        const string filename = "/Shared/ShellContent/image.jpg";

        using (var isf = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (!isf.DirectoryExists("/post"))
            {
                isf.CreateDirectory("/post");
            }
            using (var stream = isf.OpenFile(filename, System.IO.FileMode.OpenOrCreate))
            {
                image.SaveJpeg(stream, 430, 400, 0, 100);
            }
        }

        var credentials = new OAuthCredentials
        {
            Type = OAuthType.ProtectedResource,
            SignatureMethod = OAuthSignatureMethod.HmacSha1,
            ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
            ConsumerKey = twitterAppSettings.consumerKey,
            ConsumerSecret = twitterAppSettings.consumerKeySecret,
            Token = MainUtil.GetKeyValue<string>("twitterAccessToken"),
            TokenSecret = MainUtil.GetKeyValue<string>("twitterAccessTokenSecret"),
            Version = "1.0"
        };

        var restClient = new RestClient
        {
            Authority = "https://api.twitter.com",
            HasElevatedPermissions = true 
        };

        var restRequest = new RestRequest
        {
            Credentials = credentials,
            Path = "1.1/statuses/update_with_media.json",
            Method = WebMethod.Post 
        };

        restRequest.AddField("status", textpost.Text);
        restRequest.AddFile("media[]", image.jpg, ms, "image/jpg");
        restClient.BeginRequest(restRequest, new RestCallback(PostTweetRequestCallback));
    }
    catch(Exception ex)
    {
        string message = "Tweet failed! Exception details: " + ex.ToString();
        MessageBox.Show(message);
    }
}

private void PostTweetRequestCallback(RestRequest request, RestResponse response, object obj)
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        if (response.StatusCode == HttpStatusCode.OK)
        {
            MessageBox.Show("TWEET_POSTED_SUCCESSFULLY");
        }
        else if (response.StatusCode == HttpStatusCode.Forbidden)
        {
            MessageBox.Show("TWEET_POST_ERR_UPDATE_LIMIT");
        }
        else
        {
            MessageBox.Show("TWEET_POST_ERR_FAILED");
        }
    });
} 

I have add a little tweak into the code so that instead taking picture from photochooser task like in msdn example, I'm taking it from writeablebitmap that saved into isolatedstorage, but I also already tried the exactly like the one in msdn and getting error TWEET_POST_ERR_FAILED

Upvotes: 0

Views: 180

Answers (1)

rod_torres
rod_torres

Reputation: 346

Try adding to the restRequest.AddFile the string "form-data" as the fifth parameter:

restRequest.AddFile("media[]", image.jpg, ms, "image/jpg","form-data");

Upvotes: 0

Related Questions