twitter.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // get a bunch of twitter streams
  2. var stuff_to_search_for =
  3. [ 'nodejs', 'nodejitsu', 'hadoop', 'couchdb', 'nosql', 'birds', 'dinosaurs'
  4. , 'fun', 'dscape', 'clown', 'joyent', 'nyc', 'usa', 'portugal'];
  5. // npm install request fast-list clarinet
  6. var request = require('request');
  7. var fs = require('fs');
  8. var clarinet = require('../clarinet');
  9. var p = 1;
  10. var buffer = [];
  11. var tweets = ['['];
  12. var parse_stream = clarinet.createStream();
  13. var stacklevel = 0;
  14. var objlevel = 0;
  15. var found_results = false;
  16. var notfirst = false;
  17. var stop_searching = false;
  18. var previous = '';
  19. var i = 0;
  20. var on_array = false;
  21. var array_vals = [];
  22. function uri (pop) {
  23. var term;
  24. if(pop) i++;
  25. if(stuff_to_search_for[i]) {
  26. term = stuff_to_search_for[i];
  27. return 'http://search.twitter.com/search.json?q=' + term +
  28. '&rpp=100&page=';
  29. }
  30. else
  31. return null;
  32. }
  33. parse_stream.on('openarray', function() {
  34. previous = '[';
  35. if(found_results) {
  36. if(stacklevel !== 0) { buffer.push('['); on_array = true; }
  37. stacklevel++;
  38. }
  39. });
  40. parse_stream.on('closearray', function() {
  41. if(found_results) {
  42. stacklevel--;
  43. if(stacklevel === 0) {
  44. tweets.push(buffer.join(''));
  45. buffer = [];
  46. found_results = false;
  47. if(previous === '[') // [] means no more results
  48. stop_searching = true;
  49. } else {
  50. buffer.push(array_vals.join(','));
  51. array_vals = [];
  52. on_array = false;
  53. buffer.push(']');
  54. }
  55. }
  56. previous = ']';
  57. });
  58. parse_stream.on('openobject', function(name) {
  59. previous = '{';
  60. if(found_results) {
  61. if(objlevel === 0 && notfirst) { buffer.push(','); }
  62. if(name!=='result_type') { buffer.push('\n'); }
  63. buffer.push('{"' + name + '": ');
  64. notfirst = true;
  65. objlevel++;
  66. }
  67. });
  68. parse_stream.on('key', function(name) {
  69. previous = ':';
  70. if(found_results) {
  71. buffer.push(', "' + name + '": ');
  72. }
  73. if(name==='results' && !found_results) {
  74. found_results = true;
  75. }
  76. });
  77. parse_stream.on('closeobject', function() {
  78. previous = '}';
  79. if(found_results) {
  80. objlevel--;
  81. buffer.push('}');
  82. }
  83. });
  84. parse_stream.on('end', function() {
  85. previous = '!';
  86. if(tweets.length === 0) stop_searching = true;
  87. console.log(tweets.join(''));
  88. });
  89. parse_stream.on('ready', function () {
  90. var r_uri;
  91. if(stop_searching) {
  92. r_uri = uri(true);
  93. if(r_uri === null) {
  94. console.log(']');
  95. return;
  96. } else {
  97. p = 1;
  98. stop_searching = false;
  99. }
  100. }
  101. r_uri = r_uri || uri();
  102. tweets = [];
  103. if(r_uri!==null) {
  104. request.get(r_uri+p)
  105. .pipe(parse_stream);
  106. p++;
  107. }
  108. });
  109. parse_stream.on('value', function(value) {
  110. if(found_results) {
  111. var bla;
  112. if(typeof value === 'string' || value === null)
  113. bla = JSON.stringify(value);
  114. else bla = value;
  115. if (on_array) array_vals.push(bla);
  116. else { buffer.push(bla); }
  117. }
  118. });
  119. var s_uri = uri();
  120. if(s_uri!==null)
  121. request.get(uri()+p)
  122. .pipe(parse_stream);
  123. p++;