2

私はasp.net mvcに取り組んでいます。Twitter の作成ツイート メカニズム テキストと画像を実装し、Twitter でツイートとして送信しようとしています。twitter API 1.1が提供するドキュメントに従いました。これを達成するために Twitterizer ライブラリをたどりましたが、API バージョン 1 が廃止されたようにエラーがスローされますが、最新のものを使用しており、これ以外の残りのエンドポイントで動作しています。だから私は自分でhttpリクエストをすることにしました

私の場合、フォームにテキストエリアとファイルアップロードコントロールがあります。

<form method="post" action="/Home/Upload" enctype="multipart/form-data">
<textarea id="message" name="message"></textarea>
<input type="file" name="file"/>
<input type="submit" value="submit"/>
</form>

その後、私のアクションでは、ユーザーが選択した画像と彼がアクションに入力したテキストを取得しました。HttpPostedPostedFileBase を byte[] のように変換しました。

[HttpPost]
        public ActionResult Upload(FormCollection coll, HttpPostedFileBase upfile)
        {

            byte[] data;
            using (Stream inputStream = upfile.InputStream)
            {
                MemoryStream memoryStream = inputStream as MemoryStream;
                if (memoryStream == null)
                {
                    memoryStream = new MemoryStream();
                    inputStream.CopyTo(memoryStream);
                }
                data = memoryStream.ToArray();
            }

            HttpWebRequest webRequest = WebRequest.Create("https://api.twitter.com/1.1/statuses/update_with_media.json") as HttpWebRequest;
            OAuthBase oauth = new OAuthBase();
            string nonce = oauth.GenerateNonce();
            string timeStamp = oauth.GenerateTimeStamp();
            string normalizedUrl;
            string normalizedRequestParameters;
            string sig = oauth.GenerateSignature
            (new System.Uri("https://api.twitter.com/1.1/statuses/update_with_media.json"), consumerKey, consumerSecret, userinfo.AuthToken,
            userinfo.PayUserId, "POST", timeStamp, nonce,
            OAuthBase.SignatureTypes.HMACSHA1, out normalizedUrl,
            out normalizedRequestParameters);
            string header = string.Format(@"OAuth oauth_consumer_key=""{0}"",oauth_signature_method=""{1}"",oauth_timestamp=""{2}"",oauth_nonce=""{3}"",oauth_version=""{4}"",oauth_token=""{5}"",oauth_signature=""{6}""",
            HttpUtility.UrlEncode(consumerKey), HttpUtility.UrlEncode("HMAC-SHA1"), HttpUtility.UrlEncode(timeStamp), HttpUtility.UrlEncode(nonce), HttpUtility.UrlEncode("1.0"), HttpUtility.UrlEncode(userinfo.AuthToken), HttpUtility.UrlEncode(sig));
            webRequest.Headers.Add("Authorization", header);
            webRequest.Method = "POST";
            webRequest.Credentials = CredentialCache.DefaultCredentials;
            ((HttpWebRequest)webRequest).UserAgent = ".NET Framework Example Client";
            Dictionary<string, object> fieldsToInclude = new Dictionary<string, object>();
            fieldsToInclude.Add("status", coll["new_message"]);
            fieldsToInclude.Add("media[]", data);
            string boundary = Guid.NewGuid().ToString().Replace("-", "");
            string dataBoundary = "--------------------r4nd0m";
            string contentType = "multipart/form-data; boundary=" + dataBoundary;
            byte[] mydata = GetMultipartFormData(fieldsToInclude, contentType);
            webRequest.ContentLength = mydata.Length;
            webRequest.ContentType = contentType;
            using (Stream requestStream = webRequest.GetRequestStream())
            {
                if (mydata != null)
                {
                    requestStream.Write(mydata, 0, mydata.Length);
                }
            }
            using (HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse)
            {
                StreamReader reader = new StreamReader(webResponse.GetResponseStream());
                string retVal = reader.ReadToEnd();
            }        

            return View();
        }

ここでは、次のような画像データとテキスト データの両方のマルチパート フォームデータ構造を準備する方法を記述しました。

private byte[] GetMultipartFormData(Dictionary<string, object> fieldsToInclude, string boundary)
        {
            Stream formDataStream = new MemoryStream();
            Encoding encoding = Encoding.UTF8;          

            foreach (KeyValuePair<string, object> kvp in fieldsToInclude)
            {
                if (kvp.Value.GetType() == typeof(byte[]))
                {   //assume this to be a byte stream
                    byte[] data = (byte[])kvp.Value;

                    string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: application/octet-stream\r\n\r\n",
                        boundary,
                        kvp.Key,
                        kvp.Key);

                    byte[] headerBytes = encoding.GetBytes(header);

                    formDataStream.Write(headerBytes, 0, headerBytes.Length);
                    formDataStream.Write(data, 0, data.Length);


                }
                else
                {   //this is normal text data
                    string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n",
                        boundary,
                        kvp.Key,
                        kvp.Value);

                    byte[] headerBytes = encoding.GetBytes(header);

                    formDataStream.Write(headerBytes, 0, headerBytes.Length);
                }
            }

            string footer = string.Format("\r\n--{0}--\r\n", boundary);
            formDataStream.Write(encoding.GetBytes(footer), 0, footer.Length);
            formDataStream.Position = 0;
            byte[] returndata = new byte[formDataStream.Length];

            formDataStream.Read(returndata, 0, returndata.Length);
            formDataStream.Close();

            return returndata;
        }

これは、画像をtwitterにアップロードするためのhttpリクエストを作成するために私がフォローしている方法です(メディアでのアップロードとも呼ばれます)。しかし、エラー500 Internal server error が発生しています。手順を間違えた場合は、ご指導ください。

4

4 に答える 4

1

Tweetinvi の開発者です。アップロードは次のように簡単です。

var imageBinary = File.ReadAllBytes("path");
var media = Upload.UploadImage(imageBinary);

var tweet = Tweet.PublishTweet("hello", new PublishTweetOptionalParameters
{
    Medias = { media }
});

これにより、多くの時間を節約できると思います。

アップロードに関する Tweetinvi ドキュメント : https://github.com/linvi/tweetinvi/wiki/Upload

于 2016-05-24T11:29:50.497 に答える
0

画像をストリームとして渡すことで、 SendTweetWithMedia() メソッドで画像を共有できます。画像をストリームとして送信するには、画像を変換する必要があります。

private void sharetwitter ()
{
          var oauth_consumer_key = "your API key";
          var oauth_consumer_secret = "Your API secret key";
          string token = "access token";
          string tokenSecret = "access token secret ";
          var post = db.Posts.Where(p => p.PostId ==id).FirstOrDefault();
          StringBuilder str = new StringBuilder();
          str.AppendLine(post.Title.Trim());
          str.AppendLine("learn .net a lot of helpful programming stuffs.");
          var service = new TweetSharp.TwitterService(oauth_consumer_key,oauth_consumer_secret);
          service.AuthenticateWith(token, tokenSecret);
          string url = "http://www.infinetsoft.com/Images/logoinfi.png";
          service.SendTweetWithMedia(new SendTweetWithMediaOptions
          {
               Status = str.ToString(),
               Images = new Dictionary<string, Stream> { { "infinetsoft", urltostream(url) } }
           });
         TempData["SuccessMessage"] = "tweeted success";
}

ここで、詳細の解決策を見つけましたhttp://www.infinetsoft.com/Post/How-to-share-image-to-twitter-post-using-asp-net-MVC/1236#.V0Lj1DV97cs

于 2016-05-23T11:08:36.323 に答える