-
Notifications
You must be signed in to change notification settings - Fork 48
/
simple.hs
69 lines (62 loc) · 2.12 KB
/
simple.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Web.Twitter.Conduit
import Web.Twitter.Types.Lens
import Control.Lens
import qualified Data.ByteString.Char8 as B8
import Data.Conduit
import qualified Data.Conduit.List as CL
import qualified Data.Text as T
import qualified Data.Text.IO as T
import System.IO (hFlush, stdout)
import qualified Web.Authenticate.OAuth as OA
tokens :: OAuth
tokens =
twitterOAuth
{ oauthConsumerKey = error "You MUST specify oauthConsumerKey parameter."
, oauthConsumerSecret = error "You MUST specify oauthConsumerSecret parameter."
}
authorize ::
-- | OAuth Consumer key and secret
OAuth ->
-- | PIN prompt
(String -> IO String) ->
Manager ->
IO Credential
authorize oauth getPIN mgr = do
cred <- OA.getTemporaryCredential oauth mgr
let url = OA.authorizeUrl oauth cred
pin <- getPIN url
OA.getAccessToken oauth (OA.insert "oauth_verifier" (B8.pack pin) cred) mgr
getTWInfo :: Manager -> IO TWInfo
getTWInfo mgr = do
Credential cred <- authorize tokens getPIN mgr
let cred' = filter (\(k, _) -> k == "oauth_token" || k == "oauth_token_secret") cred
return $ setCredential tokens (Credential cred') def
where
getPIN url = do
putStrLn $ "browse URL: " ++ url
putStr "> what was the PIN twitter provided you with? "
hFlush stdout
getLine
main :: IO ()
main = do
mgr <- newManager tlsManagerSettings
twInfo <- getTWInfo mgr
putStrLn $ "# your home timeline (up to 800 tweets):"
runConduit $
sourceWithMaxId twInfo mgr (statusesHomeTimeline & #count ?~ 200)
.| CL.isolate 800
.| CL.mapM_
( \status -> do
T.putStrLn $
T.concat
[ T.pack . show $ status ^. statusId
, ": "
, status ^. statusUser . userScreenName
, ": "
, status ^. statusText
]
)