/
index.js
executable file
·106 lines (90 loc) · 3.33 KB
/
index.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
require('dotenv').config()
var Twitter = require('twitter');
var fs = require('fs');
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var request = require('request');
app.get('/', function(req, res){
res.sendFile( __dirname + '/index.html');
});
app.use(express.static('public'))
io.on('connection', function(socket){
console.log('a user connected');
socket.on('timeline', function (timeline) {
// request media from timeline
getMediaFromTimeline(timeline,
function (progress) {
socket.emit('fetchProgress', progress);
},
function (didSucceed, error, mediaList) {
socket.emit('mediaReceived', didSucceed, error, mediaList);
});
});
});
let port = process.env.PORT;
if (port == null || port == "") {
port = 3000;
}
http.listen(port, function(){
console.log('listening on ' + port );
});
var client = new Twitter({
consumer_key: process.env.CONSUMER_KEY,
consumer_secret: process.env.CONSUMER_SECRET,
access_token_key: process.env.ACCESS_TOKEN_KEY,
access_token_secret: process.env.ACCESS_TOKEN_SECRET
});
function getMediaFromTimeline(timelineToFetch, onProgressFunction, onComplete) {
var params = { screen_name: timelineToFetch, trim_user: true, count: '200' };
var allTweets = [];
client.get('users/show', { screen_name: timelineToFetch, include_entities: false }, function (error, user, response) {
if (error) {
onComplete(false, error, allTweets);
}
else {
var numTweets = user.statuses_count;
var processedTweets = 0;
getNextUpdates(params, allTweets, function (tweetsInBatch) {
processedTweets += tweetsInBatch;
var processedPercent = Math.round(processedTweets / numTweets * 100);
onProgressFunction(processedPercent);
},
onComplete);
}
});
}
function getNextUpdates(params, tweetList, onProgressMade, onMediaReceived) {
client.get('statuses/user_timeline', params, function (error, tweets, response) {
if (!error) {
tweets.forEach(tweet => {
if (tweet.extended_entities == null || tweet.extended_entities.media.length == 0) {
// not a media tweet
return;
}
for (let index = 0; index < tweet.extended_entities.media.length; index++) {
var mediaToShow = tweet.extended_entities.media[index];
if (mediaToShow.type == "video" || mediaToShow.type == "animated_gif") {
tweetList.push(tweet);
return;
}
}
});
var oldestId = tweets[tweets.length - 1].id_str;
onProgressMade(tweets.length);
if (oldestId != params["max_id"]) {
// still might be more tweets
params["max_id"] = oldestId;
getNextUpdates(params, tweetList, onProgressMade, onMediaReceived);
}
else {
onMediaReceived(true, "", tweetList);
}
}
else {
onMediaReceived(false, error, tweetList);
}
});
}
//getNextUpdates();