【问题标题】:Upload image directly to twitter直接上传图片到推特
【发布时间】:2012-07-06 12:32:53
【问题描述】:

我需要帮助才能在 Windows Phone 7 中将图像直接上传到 twitter。

我已经完成了 twitter 的 oauth 流程,也可以更新推文,但我无法使用 wp7 将图像上传到 twitter?

【问题讨论】:

  • ...如果您使用的是客户端库,那是哪一个,因为您已经用多个标记此问题
  • 我尝试了 windows phone 的 tweetsharp。以及用于 oauth 流程的 twitterizer 并发布推文。感谢您的回复:)
  • 你尝试过什么代码?
  • 通过 tweetsharp 我只能上传图片 2 twitpic.com 但无法在 Twitter 上发布。 twitterizer 没有规定将图像直接上传到 twitter。
  • @RowlandShaw 我都试过了,Gokoulane 是对的。除了 TweetSharp 中的 twitpic 支持外,这两个库都不支持将图像上传到 twitter。当然,与 IOS 和 Android 相比,WP7 开发人员通常在这些 API 的支持或示例方面排在最后也无济于事。

标签: c# windows-phone-7 twitter


【解决方案1】:

我已经通过使用 Hammock.WindowsPhone.Mango 库为此制定了解决方案。 (TweetSharp 在内部使用 Hammock 库来实现 oAuth 和其他功能,但我从未使用过 TweetSharp 或 Twitterizer)

我已经从Nuget安装了最新版的Hammock

然后使用以下代码将照片上传到 Twitter:

public void uploadPhoto(Stream photoStream, string photoName)
{
var credentials = new OAuthCredentials
        {
            Type = OAuthType.ProtectedResource,
            SignatureMethod = OAuthSignatureMethod.HmacSha1,
            ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
            ConsumerKey = TwitterSettings.consumerKey,
            ConsumerSecret = TwitterSettings.consumerKeySecret,
            Token = TwitterSettings.accessToken,
            TokenSecret = TwitterSettings.accessTokenSecret,
            Version = "1.0a"
        };


        RestClient restClient = new RestClient
        {
            Authority = "https://upload.twitter.com",
            HasElevatedPermissions = true,
            Credentials = credentials,
            Method = WebMethod.Post
         };
         RestRequest restRequest = new RestRequest
         {
            Path = "1/statuses/update_with_media.json"
         };

         restRequest.AddParameter("status", tbxNewTweet.Text);
         restRequest.AddFile("media[]", photoName, photoStream, "image/jpg");

}

    restClient.BeginRequest(restRequest, new RestCallback(PostTweetRequestCallback));
}


private void PostTweetRequestCallback(RestRequest request, Hammock.RestResponse response, object obj)
{
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
        //Success code
        }
}

这里, photoName 是所选图像的名称(“e.OriginalFileName”) photoStream 是 PhotoChooserTask 中的“e.ChosenPhoto”

应该注意 .AddFile() 的第四个参数(我在做这个示例时没有考虑其他格式,你必须注意你的应用程序)

希望对你有帮助!!

【讨论】:

  • MediaUpdateUrl 是否应该是“upload.twitter.com/1/statuses/update_with_media.json”?
  • 好的,我改变了它,一切似乎都很顺利,但是当我收到回复时,我收到了“未经授权”的消息。知道为什么我会得到这个吗?我正在传递一个有效的令牌和令牌秘密。
  • 代码对我来说工作正常,所以我的第一个猜测是,你是否传递了有效的令牌?正如您确定的那样,我的下一个想法是您是否使用最新版本的 Hammock 库?
  • 我确实使用吊床来获取令牌。虽然我正在经历它,但我没有看到任何问题。我将不得不检查我是否有最新版本的吊床。顺便说一句,在请求 apI 密钥时,我的应用程序的读/写权限是否足够?我注意到当我登录推特时,它并没有说明代表我上传媒体。
  • 读/写权限就足够了。如果您能够发布正常状态,那么您也可以上传图像。另外,尝试在 AddFile() 中将“form-data”字符串作为第 5 个参数传递。
【解决方案2】:

LINQ to Twitter 支持 WP7 并有一个 TweetWithMedia 方法,其工作方式如下:

    private void PostButton_Click(object sender, RoutedEventArgs e)
    {
        if (string.IsNullOrWhiteSpace(TweetTextBox.Text))
            MessageBox.Show("Please enter text to tweet.");

        ITwitterAuthorizer auth = SharedState.Authorizer;
        if (auth == null || !auth.IsAuthorized)
        {
            NavigationService.Navigate(new Uri("/OAuth.xaml", UriKind.Relative));
        }
        else
        {
            var twitterCtx = new TwitterContext(auth);

            var media = GetMedia();

            twitterCtx.TweetWithMedia(
                TweetTextBox.Text, false, StatusExtensions.NoCoordinate, StatusExtensions.NoCoordinate, null, false,
                media,
                updateResp => Dispatcher.BeginInvoke(() =>
                {
                    HandleResponse(updateResp);
                }));
        }
    }

【讨论】:

  • 如何在应用程序运行之间保留 SharedState.Authorizer,这样每次应用程序运行时都无需授权?
  • @IgorKulman,您可以保存凭据而不是授权人。更多信息在这里:linqtotwitter.codeplex.com/discussions/362342.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2015-01-25
  • 2017-08-26
  • 1970-01-01
  • 2014-08-02
  • 2012-01-16
相关资源
最近更新 更多