#ifndef _TWITCURL_H_ #define _TWITCURL_H_ #include #include #include #include #include #include "oauthlib.h" #include "curl/curl.h" namespace twitCurlTypes { typedef enum _eTwitCurlApiFormatType { eTwitCurlApiFormatXml = 0, eTwitCurlApiFormatJson, eTwitCurlApiFormatMax } eTwitCurlApiFormatType; }; /* Default values used in twitcurl */ namespace twitCurlDefaults { /* Constants */ const int TWITCURL_DEFAULT_BUFFSIZE = 1024; const std::string TWITCURL_COLON = ":"; const char TWITCURL_EOS = '\0'; const unsigned int MAX_TIMELINE_TWEET_COUNT = 200; /* Miscellaneous data used to build twitter URLs*/ const std::string TWITCURL_STATUSSTRING = "status="; const std::string TWITCURL_TEXTSTRING = "text="; const std::string TWITCURL_QUERYSTRING = "query="; const std::string TWITCURL_SEARCHQUERYSTRING = "q="; const std::string TWITCURL_SCREENNAME = "screen_name="; const std::string TWITCURL_USERID = "user_id="; const std::string TWITCURL_EXTENSIONFORMATS[2] = { ".xml", ".json" }; const std::string TWITCURL_TARGETSCREENNAME = "target_screen_name="; const std::string TWITCURL_TARGETUSERID = "target_id="; const std::string TWITCURL_SINCEID = "since_id="; const std::string TWITCURL_TRIMUSER = "trim_user=1"; const std::string TWITCURL_INCRETWEETS = "include_rts=1"; const std::string TWITCURL_COUNT = "count="; /* URL separators */ const std::string TWITCURL_URL_SEP_AMP = "&"; const std::string TWITCURL_URL_SEP_QUES = "?"; }; /* Default twitter URLs */ namespace twitterDefaults { /* Search URLs */ const std::string TWITCURL_SEARCH_URL = "http://search.twitter.com/search"; /* Status URLs */ const std::string TWITCURL_STATUSUPDATE_URL = "http://api.twitter.com/1/statuses/update"; const std::string TWITCURL_STATUSSHOW_URL = "http://api.twitter.com/1/statuses/show/"; const std::string TWITCURL_STATUDESTROY_URL = "http://api.twitter.com/1/statuses/destroy/"; /* Timeline URLs */ const std::string TWITCURL_HOME_TIMELINE_URL = "http://api.twitter.com/1/statuses/home_timeline"; const std::string TWITCURL_PUBLIC_TIMELINE_URL = "http://api.twitter.com/1/statuses/public_timeline"; const std::string TWITCURL_FEATURED_USERS_URL = "http://api.twitter.com/1/statuses/featured"; const std::string TWITCURL_FRIENDS_TIMELINE_URL = "http://api.twitter.com/1/statuses/friends_timeline"; const std::string TWITCURL_MENTIONS_URL = "http://api.twitter.com/1/statuses/mentions"; const std::string TWITCURL_USERTIMELINE_URL = "http://api.twitter.com/1/statuses/user_timeline"; /* Users URLs */ const std::string TWITCURL_LOOKUPUSERS_URL = "http://api.twitter.com/1/users/lookup"; const std::string TWITCURL_SHOWUSERS_URL = "http://api.twitter.com/1/users/show"; const std::string TWITCURL_SHOWFRIENDS_URL = "http://api.twitter.com/1/statuses/friends"; const std::string TWITCURL_SHOWFOLLOWERS_URL = "http://api.twitter.com/1/statuses/followers"; /* Direct messages URLs */ const std::string TWITCURL_DIRECTMESSAGES_URL = "http://api.twitter.com/1/direct_messages"; const std::string TWITCURL_DIRECTMESSAGENEW_URL = "http://api.twitter.com/1/direct_messages/new"; const std::string TWITCURL_DIRECTMESSAGESSENT_URL = "http://api.twitter.com/1/direct_messages/sent"; const std::string TWITCURL_DIRECTMESSAGEDESTROY_URL = "http://api.twitter.com/1/direct_messages/destroy/"; /* Friendships URLs */ const std::string TWITCURL_FRIENDSHIPSCREATE_URL = "http://api.twitter.com/1/friendships/create"; const std::string TWITCURL_FRIENDSHIPSDESTROY_URL = "http://api.twitter.com/1/friendships/destroy"; const std::string TWITCURL_FRIENDSHIPSSHOW_URL = "http://api.twitter.com/1/friendships/show"; /* Social graphs URLs */ const std::string TWITCURL_FRIENDSIDS_URL = "http://api.twitter.com/1/friends/ids"; const std::string TWITCURL_FOLLOWERSIDS_URL = "http://api.twitter.com/1/followers/ids"; /* Account URLs */ const std::string TWITCURL_ACCOUNTRATELIMIT_URL = "http://api.twitter.com/1/account/rate_limit_status"; /* Favorites URLs */ const std::string TWITCURL_FAVORITESGET_URL = "http://api.twitter.com/1/favorites"; const std::string TWITCURL_FAVORITECREATE_URL = "http://api.twitter.com/1/favorites/create/"; const std::string TWITCURL_FAVORITEDESTROY_URL = "http://api.twitter.com/1/favorites/destroy/"; /* Block URLs */ const std::string TWITCURL_BLOCKSCREATE_URL = "http://api.twitter.com/1/blocks/create/"; const std::string TWITCURL_BLOCKSDESTROY_URL = "http://api.twitter.com/1/blocks/destroy/"; /* Saved Search URLs */ const std::string TWITCURL_SAVEDSEARCHGET_URL = "http://api.twitter.com/1/saved_searches"; const std::string TWITCURL_SAVEDSEARCHSHOW_URL = "http://api.twitter.com/1/saved_searches/show/"; const std::string TWITCURL_SAVEDSEARCHCREATE_URL = "http://api.twitter.com/1/saved_searches/create"; const std::string TWITCURL_SAVEDSEARCHDESTROY_URL = "http://api.twitter.com/1/saved_searches/destroy/"; /* Trends URLs */ const std::string TWITCURL_TRENDS_URL = "http://api.twitter.com/1/trends"; const std::string TWITCURL_TRENDSDAILY_URL = "http://api.twitter.com/1/trends/daily"; const std::string TWITCURL_TRENDSCURRENT_URL = "http://api.twitter.com/1/trends/current"; const std::string TWITCURL_TRENDSWEEKLY_URL = "http://api.twitter.com/1/trends/weekly"; const std::string TWITCURL_TRENDSAVAILABLE_URL = "http://api.twitter.com/1/trends/available"; }; /* twitCurl class */ class twitCurl { public: twitCurl(); ~twitCurl(); /* Twitter OAuth authorization methods */ oAuth& getOAuth(); bool oAuthRequestToken( std::string& authorizeUrl /* out */ ); bool oAuthAccessToken(); bool oAuthHandlePIN( const std::string& authorizeUrl /* in */ ); /* Twitter login APIs, set once and forget */ std::string& getTwitterUsername(); std::string& getTwitterPassword(); void setTwitterUsername( std::string& userName /* in */ ); void setTwitterPassword( std::string& passWord /* in */ ); /* Twitter API type */ void setTwitterApiType( twitCurlTypes::eTwitCurlApiFormatType eType ); /* Twitter search APIs */ bool search( std::string& searchQuery /* in */ ); /* Twitter status APIs */ bool statusUpdate( std::string& newStatus /* in */ ); bool statusShowById( std::string& statusId /* in */ ); bool statusDestroyById( std::string& statusId /* in */ ); /* Twitter timeline APIs */ bool timelineHomeGet(); bool timelinePublicGet(); bool timelineFriendsGet(); bool timelineUserGet( bool trimUser /* in */, bool includeRetweets /* in */, unsigned int tweetCount /* in */, std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); bool featuredUsersGet(); bool mentionsGet( std::string sinceId = "" /* in */ ); /* Twitter user APIs */ bool userLookup( std::vector &userInfo /* in */, bool isUserId = false /* in */); bool userGet( std::string& userInfo /* in */, bool isUserId = false /* in */ ); bool friendsGet( std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); bool followersGet( std::string userInfo = "" /* in */, bool isUserId = false /* in */ ); /* Twitter direct message APIs */ bool directMessageGet(); bool directMessageSend( std::string& userInfo /* in */, std::string& dMsg /* in */, bool isUserId = false /* in */ ); bool directMessageGetSent(); bool directMessageDestroyById( std::string& dMsgId /* in */ ); /* Twitter friendships APIs */ bool friendshipCreate( std::string& userInfo /* in */, bool isUserId = false /* in */ ); bool friendshipDestroy( std::string& userInfo /* in */, bool isUserId = false /* in */ ); bool friendshipShow( std::string& userInfo /* in */, bool isUserId = false /* in */ ); /* Twitter social graphs APIs */ bool friendsIdsGet( std::string& userInfo /* in */, bool isUserId = false /* in */ ); bool followersIdsGet( std::string& userInfo /* in */, bool isUserId = false /* in */ ); /* Twitter account APIs */ bool accountRateLimitGet(); /* Twitter favorites APIs */ bool favoriteGet(); bool favoriteCreate( std::string& statusId /* in */ ); bool favoriteDestroy( std::string& statusId /* in */ ); /* Twitter block APIs */ bool blockCreate( std::string& userInfo /* in */ ); bool blockDestroy( std::string& userInfo /* in */ ); /* Twitter search APIs */ bool savedSearchGet(); bool savedSearchCreate( std::string& query /* in */ ); bool savedSearchShow( std::string& searchId /* in */ ); bool savedSearchDestroy( std::string& searchId /* in */ ); /* Twitter trends APIs (JSON) */ bool trendsGet(); bool trendsDailyGet(); bool trendsWeeklyGet(); bool trendsCurrentGet(); bool trendsAvailableGet(); /* cURL APIs */ bool isCurlInit(); void getLastWebResponse( std::string& outWebResp /* out */ ); void getLastCurlError( std::string& outErrResp /* out */); /* Internal cURL related methods */ int saveLastWebResponse( char*& data, size_t size ); /* cURL proxy APIs */ std::string& getProxyServerIp(); std::string& getProxyServerPort(); std::string& getProxyUserName(); std::string& getProxyPassword(); void setProxyServerIp( std::string& proxyServerIp /* in */ ); void setProxyServerPort( std::string& proxyServerPort /* in */ ); void setProxyUserName( std::string& proxyUserName /* in */ ); void setProxyPassword( std::string& proxyPassword /* in */ ); twitCurl* clone() { twitCurl *cloneObj = new twitCurl(); /* cURL flags */ cloneObj->m_curlProxyParamsSet = m_curlProxyParamsSet; cloneObj->m_curlLoginParamsSet = m_curlLoginParamsSet; cloneObj->m_curlCallbackParamsSet = m_curlCallbackParamsSet; /* cURL proxy data */ cloneObj->m_proxyServerIp = m_proxyServerIp; cloneObj->m_proxyServerPort = m_proxyServerPort; cloneObj->m_proxyUserName = m_proxyUserName; /* Twitter data */ cloneObj->m_twitterUsername = m_twitterUsername; cloneObj->m_twitterPassword = m_twitterPassword; /* Twitter API type */ cloneObj->m_eApiFormatType = m_eApiFormatType; /* OAuth data */ cloneObj->m_oAuth = m_oAuth.clone(); return cloneObj; } private: /* cURL data */ CURL* m_curlHandle; char m_errorBuffer[twitCurlDefaults::TWITCURL_DEFAULT_BUFFSIZE]; std::string m_callbackData; /* cURL flags */ bool m_curlProxyParamsSet; bool m_curlLoginParamsSet; bool m_curlCallbackParamsSet; /* cURL proxy data */ std::string m_proxyServerIp; std::string m_proxyServerPort; std::string m_proxyUserName; std::string m_proxyPassword; /* Twitter data */ std::string m_twitterUsername; std::string m_twitterPassword; /* Twitter API type */ twitCurlTypes::eTwitCurlApiFormatType m_eApiFormatType; /* OAuth data */ oAuth m_oAuth; /* Private methods */ void clearCurlCallbackBuffers(); void prepareCurlProxy(); void prepareCurlCallback(); void prepareCurlUserPass(); void prepareStandardParams(); bool performGet( const std::string& getUrl ); bool performGet( const std::string& getUrl, const std::string& oAuthHttpHeader ); bool performDelete( const std::string& deleteUrl ); bool performPost( const std::string& postUrl, std::string dataStr = "" ); /* Internal cURL related methods */ static int curlCallback( char* data, size_t size, size_t nmemb, twitCurl* pTwitCurlObj ); }; /* Private functions */ void utilMakeCurlParams( std::string& outStr, std::string& inParam1, std::string& inParam2 ); void utilMakeUrlForUser( std::string& outUrl, const std::string& baseUrl, std::string& userInfo, bool isUserId ); #endif // _TWITCURL_H_