ソースコード
前回と同じくソースコードを公開します.
ツッコミなどをコメントに書いていただけたら感激ですd(・・
/*! * \file main.cpp */ #include <iostream> using namespace std; #include "./twitterStreaming.hpp" #define CR 13 #define LF 10 void *myrealloc(void *ptr, size_t size) { /* There might be a realloc() out there that doesn't like reallocing NULL pointers, so we take care of it here */ if(ptr) return realloc(ptr, size); else return malloc(size); } size_t curlCallback(void *ptr, size_t size, size_t nmemb, TwttrStrm::twitter &twitter) { size_t realsize = size * nmemb; twitter.mp_responseBuffer = (char *)myrealloc(twitter.mp_responseBuffer, twitter.m_responseSize+realsize+1); if (twitter.mp_responseBuffer) { memcpy(&(twitter.mp_responseBuffer[twitter.m_responseSize]), ptr, realsize); twitter.m_responseSize += realsize; twitter.mp_responseBuffer[twitter.m_responseSize] = '\0'; } if (CR == twitter.mp_responseBuffer[twitter.m_responseSize-2] && LF == twitter.mp_responseBuffer[twitter.m_responseSize-1]) // Tweet を一つ受け取りきったら入る { if (!twitter.loadJson()) { exit(0); } } return realsize; } int main(int argc, char **argv) { using namespace TwttrStrm; twitter twttr; // cURL CURL *curl_handle; CURLcode res; curl_handle = curl_easy_init(); // Twitter ログイン curl_easy_setopt(curl_handle, CURLOPT_PROXY, "192.168.0.1:8080"); curl_easy_setopt(curl_handle, CURLOPT_PROXYUSERPWD, "PROXY_USER_NAME:PROXY_PASSWORD"); curl_easy_setopt(curl_handle, CURLOPT_PROXYAUTH, (long)CURLAUTH_ANY); curl_easy_setopt(curl_handle, CURLOPT_USERPWD, "TWITTER_ID:TWITTER_PASSWORD"); // babel babel::init_babel(); if(curl_handle) { //curl_easy_setopt(curl_handle, CURLOPT_URL, "http://stream.twitter.com/1/statuses/filter.json?follow=5835402"); // ID が「5835402」の人を追いかける //curl_easy_setopt(curl_handle, CURLOPT_URL, "http://stream.twitter.com/1/statuses/filter.json?track=%23ppfun"); // 「#ppfun」というキーワードを追いかける curl_easy_setopt(curl_handle, CURLOPT_URL, "http://stream.twitter.com/1/statuses/sample.json"); // サンプル /* send all data to this function */ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, curlCallback); /* we pass our 'chunk' struct to the callback function */ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &twttr); res = curl_easy_perform(curl_handle); /* always cleanup */ curl_easy_cleanup(curl_handle); } return 0; }
/*! * \file twitter.hpp */ #ifndef _TWITTER_STREAMING_HPP_ #define _TWITTER_STREAMING_HPP_ #include <map> #include <string> using namespace std; #include "./curl/curl.h" #include "./babel/babel.h" #include "./picojson.h" namespace TwttrStrm { class twitter { public: twitter(); //!< コンストラクタ ~twitter(); //!< デストラクタ bool loadJson(); //!< json から Tweet の情報を受け取る public: // cURL char *mp_responseBuffer; //!< Twiter の StreamingAPI から流れ込んでくる Tweet size_t m_responseSize; //!< mp_reponseBuffer のサイズ private: // Twitter string m_twitterUsrName; //!< Twitter のユーザ名 string m_twitterUsrPasswd; //!< Twitter のパスワード map<string, string> m_statuses; //!< Tweet の情報 <reply, mention> }; } // namespace TwttrStrm #endif // _TWITTER_STREAMING_HPP_
/*! * \file twitter.cpp */ #include "twitterStreaming.hpp" #include "json.hpp" #include "./babel/babel.h" namespace TwttrStrm { twitter::twitter(): mp_responseBuffer(NULL), m_responseSize(0), m_twitterUsrName(""), m_twitterUsrPasswd("") { } twitter::~twitter() { } bool twitter::loadJson() { using namespace picojson; string err; // エラーメッセージを受け取る value v; parse(v, mp_responseBuffer, mp_responseBuffer + m_responseSize, &err); if (err.empty()) // 正常に受け取れた { object2map(v.get<object>(), m_statuses); // 要素を全て抜き出す for (map<string, string>::iterator it = m_statuses.begin(); it != m_statuses.end(); it++) { cout << it->first << ": " << it->second << endl; } cout << endl; m_statuses.clear(); mp_responseBuffer = NULL; m_responseSize = 0; } return true; } } // namespace TwttrStrm
/*! * \file json.hpp */ #ifndef _JSON_HPP_ #define _JSON_HPP_ #include <map> #include <string> using namespace std; #include "./babel/babel.h" #include "./picojson.h" void object2map(picojson::object &obj, map<string, string> &mp); #endif // _JSON_HPP_
/*! * \file json.cpp */ #include "json.hpp" void object2map(picojson::object &obj, map<string, string> &mp) { for (picojson::object::iterator it = obj.begin(); it != obj.end(); it++) { string s = babel::utf8_to_sjis(it->second.to_str()); if (s == "object") { object2map(it->second.get<picojson::object>(), mp); } else { mp.insert(map<string, string>::value_type(it->first, s)); } } }
いい加減ソースコードも長くなったし見にくいですね.
行番号とスクロールバーが欲しいです.
WordPress あたりに移ろうかな(・・;