|
"use strict"; |
|
|
|
const Twitter = require('twitter'); |
|
|
|
let client = new Twitter({ |
|
consumer_key: process.env.TWITTER_CONSUMER_KEY, |
|
consumer_secret: process.env.TWITTER_CONSUMER_SECRET, |
|
access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY, |
|
access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET |
|
}); |
|
|
|
let blockList = new Set(); |
|
|
|
const getFollowersList = (cursor = -1) => new Promise((resolve, reject) => { |
|
client.get('followers/list', {count: 200, cursor: cursor}, (error, data, response) => { |
|
if (error) return reject(error) |
|
for (const user of data.users) { |
|
if (user.following || user.verified) { |
|
continue |
|
} |
|
if (user.statuses_count === 0) { |
|
blockList.add(user.screen_name) |
|
} else if ((Date.now() - new Date(user.created_at) < 60*60*24*31*1000) && (user.followers_count / user.friends_count) < 0.05) { |
|
blockList.add(user.screen_name) |
|
} |
|
} |
|
resolve(data.next_cursor_str) |
|
}) |
|
}); |
|
|
|
const reportSpam = (screen_name) => new Promise((resolve, reject) => { |
|
client.post('users/report_spam', {screen_name: screen_name}, (error, data, response) => { |
|
if (error) return reject(error) |
|
console.info(`User ${data.name} reported.`) |
|
resolve(data.screen_name) |
|
}) |
|
}); |
|
|
|
(async () => { |
|
let arg |
|
for (let i = 0; i < 10; i++) { |
|
arg = await getFollowersList(arg) |
|
} |
|
})() |
|
.then(() => Promise.all([...blockList].map(reportSpam))) |
|
.then((results) => console.info(`${results.length} accounts reported.`)) |
|
.catch(console.error) |