Posting to Twitter from F#
Jan 12, 2013Here’s some quick F# code which enables you to post updates (textual and/or with picture) to Twitter. This isn’t full-featured or robust, but it gets the job done.
module Twitter
open TweetSharp
type TwitterSettings =
{
ConsumerKey : string
ConsumerSecret : string
AccessToken : string
AccessTokenSecret : string
TwitPicApiKey : string option
}
/// Post text and/or pictures to Twitter using TweetSharp
let postToTwitter settings status (picture : string option) =
let service = TwitterService(settings.ConsumerKey, settings.ConsumerSecret)
service.AuthenticateWith(settings.AccessToken, settings.AccessTokenSecret)
match (picture, settings) with
| (None, _) -> // just a text tweet
service.SendTweet(status) |> ignore
| (Some(picPath), { TwitPicApiKey = Some(tpKey) }) -> // tweet with picture
let request = service.PrepareEchoRequest()
request.Path <- "uploadAndPost.xml"
request.AddField("key", tpKey)
request.AddField("consumer_token", settings.ConsumerKey)
request.AddField("consumer_secret", settings.ConsumerSecret)
request.AddField("oauth_token", settings.AccessToken)
request.AddField("oauth_secret", settings.AccessTokenSecret)
request.AddField("message", status)
request.AddFile("media", (sprintf "picpoast%d" System.Environment.TickCount), picPath, "image/jpeg")
let client = Hammock.RestClient(Authority = "http://api.twitpic.com/", VersionPath = "1")
client.Request(request) |> ignore
| _ ->
invalidArg "settings" "Bad parameters, must include TwitPic API key if tweeting a picture"
You’ll need to reference TweetSharp. Usage is pretty darn simple:
let settings =
{
ConsumerKey = "ck"
ConsumerSecret = "cs"
AccessToken = "at"
AccessTokenSecret = "ats"
TwitPicApiKey = Some("tpak")
}
Twitter.postToTwitter settings "I'm posting from #FSharp!" None
Twitter.postToTwitter settings "Here's a picture" Some("C:\\instagrammedfoodpics\\hamandcheese.jpg")
To fill in the various keys and tokens in the settings, you will need to register an app with Twitter. Similarly, to post photos you will need to register with TwitPic.
Code mostly cribbed from this Stack Overflow answer.