forked from isaacs/sax-js
-
Notifications
You must be signed in to change notification settings - Fork 77
/
twitter.js
135 lines (123 loc) · 2.98 KB
/
twitter.js
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// get a bunch of twitter streams
var stuff_to_search_for =
[ 'nodejs', 'nodejitsu', 'hadoop', 'couchdb', 'nosql', 'birds', 'dinosaurs'
, 'fun', 'dscape', 'clown', 'joyent', 'nyc', 'usa', 'portugal'];
// npm install request fast-list clarinet
var request = require('request');
var fs = require('fs');
var clarinet = require('../clarinet');
var p = 1;
var buffer = [];
var tweets = ['['];
var parse_stream = clarinet.createStream();
var stacklevel = 0;
var objlevel = 0;
var found_results = false;
var notfirst = false;
var stop_searching = false;
var previous = '';
var i = 0;
var on_array = false;
var array_vals = [];
function uri (pop) {
var term;
if(pop) i++;
if(stuff_to_search_for[i]) {
term = stuff_to_search_for[i];
return 'http://search.twitter.com/search.json?q=' + term +
'&rpp=100&page=';
}
else
return null;
}
parse_stream.on('openarray', function() {
previous = '[';
if(found_results) {
if(stacklevel !== 0) { buffer.push('['); on_array = true; }
stacklevel++;
}
});
parse_stream.on('closearray', function() {
if(found_results) {
stacklevel--;
if(stacklevel === 0) {
tweets.push(buffer.join(''));
buffer = [];
found_results = false;
if(previous === '[') // [] means no more results
stop_searching = true;
} else {
buffer.push(array_vals.join(','));
array_vals = [];
on_array = false;
buffer.push(']');
}
}
previous = ']';
});
parse_stream.on('openobject', function(name) {
previous = '{';
if(found_results) {
if(objlevel === 0 && notfirst) { buffer.push(','); }
if(name!=='result_type') { buffer.push('\n'); }
buffer.push('{"' + name + '": ');
notfirst = true;
objlevel++;
}
});
parse_stream.on('key', function(name) {
previous = ':';
if(found_results) {
buffer.push(', "' + name + '": ');
}
if(name==='results' && !found_results) {
found_results = true;
}
});
parse_stream.on('closeobject', function() {
previous = '}';
if(found_results) {
objlevel--;
buffer.push('}');
}
});
parse_stream.on('end', function() {
previous = '!';
if(tweets.length === 0) stop_searching = true;
console.log(tweets.join(''));
});
parse_stream.on('ready', function () {
var r_uri;
if(stop_searching) {
r_uri = uri(true);
if(r_uri === null) {
console.log(']');
return;
} else {
p = 1;
stop_searching = false;
}
}
r_uri = r_uri || uri();
tweets = [];
if(r_uri!==null) {
request.get(r_uri+p)
.pipe(parse_stream);
p++;
}
});
parse_stream.on('value', function(value) {
if(found_results) {
var bla;
if(typeof value === 'string' || value === null)
bla = JSON.stringify(value);
else bla = value;
if (on_array) array_vals.push(bla);
else { buffer.push(bla); }
}
});
var s_uri = uri();
if(s_uri!==null)
request.get(uri()+p)
.pipe(parse_stream);
p++;