Browse Source

improved visualization of tweet analysis, better Bot detection

master
arnaucode 7 years ago
parent
commit
d20608add2
5 changed files with 39 additions and 10 deletions
  1. BIN
      argos
  2. BIN
      build/argos
  3. +1
    -1
      main.go
  4. +34
    -8
      optionAnalyzeTweet.go
  5. +4
    -1
      optionAnalyzeUserTweets.go

BIN
argos


BIN
build/argos


+ 1
- 1
main.go

@ -7,7 +7,7 @@ import (
"strings"
)
const version = "0.4-beta"
const version = "0.5-beta"
const minNumWords = 10
const minNumHashtag = 2
const minNumUserInteractions = 2

+ 34
- 8
optionAnalyzeTweet.go

@ -4,6 +4,7 @@ import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
@ -12,6 +13,7 @@ import (
type DateRT struct {
Retweets []twitter.Tweet
Date string
}
func optionAnalyzeTweet(client *twitter.Client) {
@ -45,28 +47,52 @@ func optionAnalyzeTweet(client *twitter.Client) {
retws = append(retws, retweet)
var currDate DateRT
currDate.Retweets = retws
currDate.Date = retweet.CreatedAt
dates[retweet.CreatedAt] = currDate
}
fmt.Print("total of: ")
fmt.Println(len(retweets))
fmt.Println("total of " + strconv.Itoa(len(retweets)) + " retweets")
for k, v := range dates {
printDateRT(k, v)
//puts the map into a slice, to easy sort
var arrayDates []DateRT
for _, v := range dates {
arrayDates = append(arrayDates, v)
}
fmt.Println("")
c.Cyan("Showing accounts that retweeted at the same exact time (they are possible Bots) and the source the RT were made:")
//sort the slice
sort.Slice(arrayDates, func(i, j int) bool {
return len(arrayDates[i].Retweets) < len(arrayDates[j].Retweets)
})
//print the sorted slice
for _, v := range arrayDates {
if len(v.Retweets) > 1 {
printDateRT(v)
}
}
fmt.Println("")
c.Purple("Warning: Twitter API only gives the last 100 Retweets")
}
func printDateRT(k string, v DateRT) {
fmt.Print("\x1b[32;1m" + k + "\x1b[0m")
func printDateRT(v DateRT) {
fmt.Print("\x1b[32;1m" + v.Date + "\x1b[0m")
fmt.Println(" " + strconv.Itoa(len(v.Retweets)) + " Retweets at this date:")
for _, retweet := range v.Retweets {
source := strings.Split(strings.Split(retweet.Source, ">")[1], "<")[0]
if len(v.Retweets) > 1 {
fmt.Print("\x1b[31;1m") //red
}
fmt.Print(" @" + retweet.User.ScreenName)
fmt.Print(" @" + retweet.User.ScreenName)
fmt.Print("\x1b[0m") //defaultColor
fmt.Println(", source: " + source)
fmt.Print(" (ID: ")
fmt.Print("\x1b[31;1m" + retweet.User.IDStr + "\x1b[0m)")
fmt.Print(", source: \x1b[33;1m" + source + "\x1b[0m")
fmt.Print(", user created at: \x1b[32;1m" + retweet.User.CreatedAt + "\x1b[0m,")
fmt.Print(" \x1b[34;1m" + strconv.Itoa(retweet.User.FollowersCount) + "\x1b[0m followers")
fmt.Print(", \x1b[34;1m" + strconv.Itoa(retweet.User.FriendsCount) + "\x1b[0m following")
fmt.Println("")
}
fmt.Println("")
}

+ 4
- 1
optionAnalyzeUserTweets.go

@ -26,6 +26,9 @@ func optionAnalyzeUserTweets(client *twitter.Client) {
fmt.Println("User @" + username + " does not have tweets")
return
}
analyzeUserAccount(client, username)
//now analyze words and dates
fmt.Println("Word frequency (more than " + strconv.Itoa(minNumWords) + " times):")
words := analyzeWords(tweets)
@ -62,6 +65,6 @@ func optionAnalyzeUserTweets(client *twitter.Client) {
fmt.Println(" ")
fmt.Print("User @")
c.Cyan(username)
analyzeUserAccount(client, username)
//analyzeUserAccount(client, username)
fmt.Println(" analysis finished")
}

Loading…
Cancel
Save