diff --git a/backends/twitter/main.cpp b/backends/twitter/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6fd3b889ae65df341ddbb0bf3f055a3dae20fa94 --- /dev/null +++ b/backends/twitter/main.cpp @@ -0,0 +1,427 @@ +#include "twitcurl.h" +#include +#include +#include + +void printUsage() +{ + printf( "\nUsage:\ntwitterClient -u username -p password\n" ); +} + +int main( int argc, char* argv[] ) +{ + std::string userName( "" ); + std::string passWord( "" ); + if( argc > 4 ) + { + for( int i = 1; i < argc; i += 2 ) + { + if( 0 == strncmp( argv[i], "-u", strlen("-u") ) ) + { + userName = argv[i+1]; + } + else if( 0 == strncmp( argv[i], "-p", strlen("-p") ) ) + { + passWord = argv[i+1]; + } + } + if( ( 0 == userName.length() ) || ( 0 == passWord.length() ) ) + { + printUsage(); + return 0; + } + } + else + { + printUsage(); + return 0; + } + + twitCurl twitterObj; + std::string tmpStr; + std::string replyMsg; + char tmpBuf[1024]; + + /* Set twitter username and password */ + twitterObj.setTwitterUsername( userName ); + twitterObj.setTwitterPassword( passWord ); + + /* Set proxy server usename, password, IP and port (if present) */ + memset( tmpBuf, 0, 1024 ); + printf( "\nDo you have a proxy server configured (0 for no; 1 for yes): " ); + gets( tmpBuf ); + tmpStr = tmpBuf; + + if( std::string::npos != tmpStr.find( "1" ) ) + { + char proxyIp[1024]; + char proxyPort[1024]; + char proxyUsername[1024]; + char proxyPassword[1024]; + + memset( proxyIp, 0, 1024 ); + memset( proxyPort, 0, 1024 ); + memset( proxyUsername, 0, 1024 ); + memset( proxyPassword, 0, 1024 ); + + printf( "\nEnter proxy server IP: " ); + gets( proxyIp ); + printf( "\nEnter proxy server port: " ); + gets( proxyPort ); + printf( "\nEnter proxy server username: " ); + gets( proxyUsername ); + printf( "\nEnter proxy server password: " ); + gets( proxyPassword ); + + tmpStr = proxyIp; + twitterObj.setProxyServerIp( tmpStr ); + tmpStr = proxyPort; + twitterObj.setProxyServerPort( tmpStr ); + tmpStr = proxyUsername; + twitterObj.setProxyUserName( tmpStr ); + tmpStr = proxyPassword; + twitterObj.setProxyPassword( tmpStr ); + } + + /* OAuth flow begins */ + /* Step 0: Set OAuth related params. These are got by registering your app at twitter.com */ + twitterObj.getOAuth().setConsumerKey( std::string( "qxfSCX7WN7SZl7dshqGZA" ) ); + twitterObj.getOAuth().setConsumerSecret( std::string( "ypWapSj87lswvnksZ46hMAoAZvST4ePGPxAQw6S2o" ) ); + +// twitterObj.getOAuth().setConsumerKey( std::string( "vlC5S1NCMHHg8mD1ghPRkA" ) ); +// twitterObj.getOAuth().setConsumerSecret( std::string( "3w4cIrHyI3IYUZW5O2ppcFXmsACDaENzFdLIKmEU84" ) ); + + /* Step 1: Check if we alredy have OAuth access token from a previous run */ + std::string myOAuthAccessTokenKey(""); + std::string myOAuthAccessTokenSecret(""); + std::ifstream oAuthTokenKeyIn; + std::ifstream oAuthTokenSecretIn; + + oAuthTokenKeyIn.open( "twitterClient_token_key.txt" ); + oAuthTokenSecretIn.open( "twitterClient_token_secret.txt" ); + + memset( tmpBuf, 0, 1024 ); + oAuthTokenKeyIn >> tmpBuf; + myOAuthAccessTokenKey = tmpBuf; + + memset( tmpBuf, 0, 1024 ); + oAuthTokenSecretIn >> tmpBuf; + myOAuthAccessTokenSecret = tmpBuf; + + oAuthTokenKeyIn.close(); + oAuthTokenSecretIn.close(); + + if( myOAuthAccessTokenKey.size() && myOAuthAccessTokenSecret.size() ) + { + /* If we already have these keys, then no need to go through auth again */ + printf( "\nUsing:\nKey: %s\nSecret: %s\n\n", myOAuthAccessTokenKey.c_str(), myOAuthAccessTokenSecret.c_str() ); + + twitterObj.getOAuth().setOAuthTokenKey( myOAuthAccessTokenKey ); + twitterObj.getOAuth().setOAuthTokenSecret( myOAuthAccessTokenSecret ); + } + else + { + /* Step 2: Get request token key and secret */ + std::string authUrl; + twitterObj.oAuthRequestToken( authUrl ); + + /* Step 3: Get PIN */ + memset( tmpBuf, 0, 1024 ); + printf( "\nDo you want to visit twitter.com for PIN (0 for no; 1 for yes): " ); + gets( tmpBuf ); + tmpStr = tmpBuf; + if( std::string::npos != tmpStr.find( "1" ) ) + { + /* Ask user to visit twitter.com auth page and get PIN */ + memset( tmpBuf, 0, 1024 ); + printf( "\nPlease visit this link in web browser and authorize this application:\n%s", authUrl.c_str() ); + printf( "\nEnter the PIN provided by twitter: " ); + gets( tmpBuf ); + tmpStr = tmpBuf; + twitterObj.getOAuth().setOAuthPin( tmpStr ); + } + else + { + /* Else, pass auth url to twitCurl and get it via twitCurl PIN handling */ + twitterObj.oAuthHandlePIN( authUrl ); + } + + /* Step 4: Exchange request token with access token */ + twitterObj.oAuthAccessToken(); + + /* Step 5: Now, save this access token key and secret for future use without PIN */ + twitterObj.getOAuth().getOAuthTokenKey( myOAuthAccessTokenKey ); + twitterObj.getOAuth().getOAuthTokenSecret( myOAuthAccessTokenSecret ); + + /* Step 6: Save these keys in a file or wherever */ + std::ofstream oAuthTokenKeyOut; + std::ofstream oAuthTokenSecretOut; + + oAuthTokenKeyOut.open( "twitterClient_token_key.txt" ); + oAuthTokenSecretOut.open( "twitterClient_token_secret.txt" ); + + oAuthTokenKeyOut.clear(); + oAuthTokenSecretOut.clear(); + + oAuthTokenKeyOut << myOAuthAccessTokenKey.c_str(); + oAuthTokenSecretOut << myOAuthAccessTokenSecret.c_str(); + + oAuthTokenKeyOut.close(); + oAuthTokenSecretOut.close(); + } + /* OAuth flow ends */ + + /* Post a new status message */ + memset( tmpBuf, 0, 1024 ); + printf( "\nEnter a new status message: " ); + gets( tmpBuf ); + tmpStr = tmpBuf; + replyMsg = ""; + if( twitterObj.statusUpdate( tmpStr ) ) + { + twitterObj.getLastWebResponse( replyMsg ); + printf( "\ntwitterClient:: twitCurl::statusUpdate web response:\n%s\n", replyMsg.c_str() ); + } + else + { + twitterObj.getLastCurlError( replyMsg ); + printf( "\ntwitterClient:: twitCurl::statusUpdate error:\n%s\n", replyMsg.c_str() ); + } + +// /* Search a string */ +// twitterObj.setTwitterApiType( twitCurlTypes::eTwitCurlApiFormatJson ); +// printf( "\nEnter string to search: " ); +// memset( tmpBuf, 0, 1024 ); +// gets( tmpBuf ); +// tmpStr = tmpBuf; +// replyMsg = ""; +// if( twitterObj.search( tmpStr ) ) +// { +// twitterObj.getLastWebResponse( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::search web response:\n%s\n", replyMsg.c_str() ); +// } +// else +// { +// twitterObj.getLastCurlError( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::search error:\n%s\n", replyMsg.c_str() ); +// } +// +// /* Get user timeline */ +// replyMsg = ""; +// printf( "\nGetting user timeline\n" ); +// if( twitterObj.timelineUserGet( false, false, 0 ) ) +// { +// twitterObj.getLastWebResponse( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::timelineUserGet web response:\n%s\n", replyMsg.c_str() ); +// } +// else +// { +// twitterObj.getLastCurlError( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::timelineUserGet error:\n%s\n", replyMsg.c_str() ); +// } + +#ifdef _TWITCURL_TEST_ +// /* Destroy a status message */ +// memset( statusMsg, 0, 1024 ); +// printf( "\nEnter status message id to delete: " ); +// gets( statusMsg ); +// tmpStr = statusMsg; +// replyMsg = ""; +// if( twitterObj.statusDestroyById( tmpStr ) ) +// { +// twitterObj.getLastWebResponse( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::statusDestroyById web response:\n%s\n", replyMsg.c_str() ); +// } +// else +// { +// twitterObj.getLastCurlError( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::statusDestroyById error:\n%s\n", replyMsg.c_str() ); +// } +// +// /* Get public timeline */ +// replyMsg = ""; +// printf( "\nGetting public timeline\n" ); +// if( twitterObj.timelinePublicGet() ) +// { +// twitterObj.getLastWebResponse( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::timelinePublicGet web response:\n%s\n", replyMsg.c_str() ); +// } +// else +// { +// twitterObj.getLastCurlError( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::timelinePublicGet error:\n%s\n", replyMsg.c_str() ); +// } +// +// /* Get friend ids */ +// replyMsg = ""; +// printf( "\nGetting friend ids\n" ); +// tmpStr = "techcrunch"; +// if( twitterObj.friendsIdsGet( tmpStr, false ) ) +// { +// twitterObj.getLastWebResponse( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::friendsIdsGet web response:\n%s\n", replyMsg.c_str() ); +// } +// else +// { +// twitterObj.getLastCurlError( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::friendsIdsGet error:\n%s\n", replyMsg.c_str() ); +// } +// +// /* Get trends */ +// if( twitterObj.trendsDailyGet() ) +// { +// twitterObj.getLastWebResponse( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::trendsDailyGet web response:\n%s\n", replyMsg.c_str() ); +// } +// else +// { +// twitterObj.getLastCurlError( replyMsg ); +// printf( "\ntwitterClient:: twitCurl::trendsDailyGet error:\n%s\n", replyMsg.c_str() ); + } +#endif // _TWITCURL_TEST_ + + return 0; +} +//#include "transport/config.h" +//#include "transport/networkplugin.h" +//#include "transport/logging.h" +//#include "Swiften/Swiften.h" +//#include "unistd.h" +//#include "signal.h" +//#include "sys/wait.h" +//#include "sys/signal.h" +//#include +//#include "twitcurl.h" +// +//using namespace boost::filesystem; +//using namespace boost::program_options; +//using namespace Transport; +// +//DEFINE_LOGGER(logger, "Twitter Backend"); +//Swift::SimpleEventLoop *loop_; // Event Loop +//class TwitterPlugin; // The plugin +//TwitterPlugin * np = NULL; +// +//class TwitterPlugin : public NetworkPlugin { +// public: +// Swift::BoostNetworkFactories *m_factories; +// Swift::BoostIOServiceThread m_boostIOServiceThread; +// boost::shared_ptr m_conn; +// +// TwitterPlugin(Config *config, Swift::SimpleEventLoop *loop, const std::string &host, int port) : NetworkPlugin() { +// this->config = config; +// m_factories = new Swift::BoostNetworkFactories(loop); +// m_conn = m_factories->getConnectionFactory()->createConnection(); +// m_conn->onDataRead.connect(boost::bind(&TwitterPlugin::_handleDataRead, this, _1)); +// m_conn->connect(Swift::HostAddressPort(Swift::HostAddress(host), port)); +// +// LOG4CXX_INFO(logger, "Starting the plugin."); +// } +// +// // Send data to NetworkPlugin server +// void sendData(const std::string &string) { +// m_conn->write(Swift::createSafeByteArray(string)); +// } +// +// // Receive date from the NetworkPlugin server and invoke the appropirate payload handler (implement in the NetworkPlugin class) +// void _handleDataRead(boost::shared_ptr data) { +// std::string d(data->begin(), data->end()); +// handleDataRead(d); +// } +// +// // User trying to login into his twitter account +// void handleLoginRequest(const std::string &user, const std::string &legacyName, const std::string &password) { +// handleConnected(user); +// } +// +// // User logging out +// void handleLogoutRequest(const std::string &user, const std::string &legacyName) { +// } +// +// +// void handleMessageSendRequest(const std::string &user, const std::string &legacyName, const std::string &message, const std::string &xhtml = "") { +// LOG4CXX_INFO(logger, "Sending message from " << user << " to " << legacyName << "."); +// } +// +// void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::vector &groups) { +// LOG4CXX_INFO(logger, user << ": Added buddy " << buddyName << "."); +// handleBuddyChanged(user, buddyName, alias, groups, pbnetwork::STATUS_ONLINE); +// } +// +// void handleBuddyRemovedRequest(const std::string &user, const std::string &buddyName, const std::vector &groups) { +// +// } +// +// private: +// Config *config; +// map< std::string, twitCurl > sessions; +//}; +// +//static void spectrum_sigchld_handler(int sig) +//{ +// int status; +// pid_t pid; +// +// do { +// pid = waitpid(-1, &status, WNOHANG); +// } while (pid != 0 && pid != (pid_t)-1); +// +// if ((pid == (pid_t) - 1) && (errno != ECHILD)) { +// char errmsg[BUFSIZ]; +// snprintf(errmsg, BUFSIZ, "Warning: waitpid() returned %d", pid); +// perror(errmsg); +// } +//} +// +// +//int main (int argc, char* argv[]) { +// std::string host; +// int port; +// +// if (signal(SIGCHLD, spectrum_sigchld_handler) == SIG_ERR) { +// std::cout << "SIGCHLD handler can't be set\n"; +// return -1; +// } +// +// boost::program_options::options_description desc("Usage: spectrum [OPTIONS] \nAllowed options"); +// desc.add_options() +// ("host,h", value(&host), "host") +// ("port,p", value(&port), "port") +// ; +// try +// { +// boost::program_options::variables_map vm; +// boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm); +// boost::program_options::notify(vm); +// } +// catch (std::runtime_error& e) +// { +// std::cout << desc << "\n"; +// exit(1); +// } +// catch (...) +// { +// std::cout << desc << "\n"; +// exit(1); +// } +// +// +// if (argc < 5) { +// return 1; +// } +// +// Config config; +// if (!config.load(argv[5])) { +// std::cerr << "Can't open " << argv[1] << " configuration file.\n"; +// return 1; +// } +// +// Logging::initBackendLogging(&config); +// +// Swift::SimpleEventLoop eventLoop; +// loop_ = &eventLoop; +// np = new TwitterPlugin(&config, &eventLoop, host, port); +// loop_->run(); +// +// return 0; +//}