ArMaN
ArMaN

Reputation: 2407

POST an image to Twitter by statuses/update_with_media in C#

How post an image to twitter by POST statuses/update_with_media in C#

https://dev.twitter.com/docs/api/1/post/statuses/update_with_media

Upvotes: 0

Views: 3005

Answers (2)

Sheo Narayan
Sheo Narayan

Reputation: 1206

Here is an API called TweeterSharp that can be used to send message along with image to the twitter, below is the code sample.

using (var stream = new FileStream(imagePath, FileMode.Open))
            {
                var result = service.SendTweetWithMedia(new SendTweetWithMediaOptions
                {
                    Status = message,
                    Images = new Dictionary<string, Stream> { { "john", stream } }
                });
                lblResult.Text = result.Text.ToString();
            }

Complete description is at - Copied from Post message with image on twitter using C#

Upvotes: 2

wakurth
wakurth

Reputation: 1644

Ok. I will answer this under the assumption you know how to simply "Tweet" text using their REST api. If you don't, please let me know, and I can help there as well.

The following two methods, obviously, have a lot more to them, but they do show in detail what needs to be additionally done in the REST request. It's important to note that you don't use any query strings in this part of the request https://upload.twitter.com/1/statuses/update_with_media.json

These are methods from an OAuth library I wrote that handles api calls to various REST API's like Twitter and LinkedIn.

The key is how you add the tweet and photo information in the request stream. I must give credit to the individual at this link for his example... it certainly influenced my PrepareTwitterDataRequest() Method. I also realize this example is in VB.NET and you asked for C#... If you can't translate try this.

Friend Function ApiWebRequest(ByVal method As String, ByVal url As String, ByVal fileRequest As OAuthFileRequest) As String

        Dim request As HttpWebRequest = Me.GenerateCoreWebRequest(url, method)

        request.Headers.Add("Authorization", Me.GetAuthHeaderValue(New Uri(url), method))

        Select Case Me.ApiType

            Case OAuthApiType.Twitter
                Me.PrepareTwitterDataRequest(request, fileRequest)

            Case OAuthApiType.LinkedIn
                Me.PrepareLinkedInDataRequest(request, fileRequest)

            Case OAuthApiType.Other
                Me.PrepareDataRequest(request, fileRequest)

        End Select

        Return Me.ProcessWebRequest(request)

    End Function

    Private Sub PrepareTwitterDataRequest(ByRef request As HttpWebRequest, ByVal fileRequest As OAuthFileRequest)

        Dim shortFileName As String = fileRequest.FileShortName

        Dim fileContentType As String = Me.GetMimeType(shortFileName)

        Dim message As String = fileRequest.Message

        Dim encoding As Text.Encoding = Text.Encoding.GetEncoding("iso-8859-1")

        Dim fileHeader As String = String.Format("Content-Disposition: file; " & "name=""media""; filename=""{0}""", shortFileName)

        Dim boundary As String = DateTime.Now.Ticks.ToString("x")

        Dim separator As String = String.Format("--{0}", boundary)

        Dim footer As String = String.Format("\r\n{0}--\r\n", separator)

        Dim contents As New Text.StringBuilder()

        contents.AppendLine(separator)
        contents.AppendLine("Content-Disposition: form-data; name=""status""")
        contents.AppendLine()
        contents.AppendLine(message)
        contents.AppendLine(separator)
        contents.AppendLine(fileHeader)
        contents.AppendLine(String.Format("Content-Type: {0}", fileContentType))
        contents.AppendLine()

        Dim contentsBuffer As Byte() = encoding.GetBytes(contents.ToString())

        Dim footBuffer As Byte() = encoding.GetBytes(footer)

        'collect all byte() into one stream
        Dim byteCollector As New MemoryStream
        byteCollector.Write(contentsBuffer, 0, contentsBuffer.Length)
        byteCollector.Write(fileRequest.FileData, 0, fileRequest.FileData.Length)
        byteCollector.Write(footBuffer, 0, footBuffer.Length)

        'dump collector stream into byte()
        Dim requestBytes As Byte() = byteCollector.ToArray()

        'close/dispose the collector
        byteCollector.Close()
        byteCollector.Dispose()

        request.ContentType = (String.Format("multipart/form-data; boundary=""{0}""", boundary))
        request.ContentLength = requestBytes.Length

        Using reqStream As IO.Stream = request.GetRequestStream()

            reqStream.Write(requestBytes, 0, requestBytes.Length)

        End Using

    End Sub

Upvotes: 2

Related Questions