package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"sort"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/dghubble/go-twitter/twitter"
|
|
)
|
|
|
|
type DateRT struct {
|
|
Retweets []twitter.Tweet
|
|
Date string
|
|
}
|
|
|
|
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("\x1b[0m") //defaultColor
|
|
fmt.Print(" (ID: ")
|
|
fmt.Print("\x1b[31;1m" + retweet.User.IDStr + "\x1b[0m)")
|
|
if source == "TweetDeck" {
|
|
fmt.Print(", source: \x1b[33;1m" + source + "\x1b[0m")
|
|
} else {
|
|
fmt.Print(", source: " + source)
|
|
}
|
|
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("")
|
|
|
|
}
|
|
|
|
func optionAnalyzeTweet(client *twitter.Client) {
|
|
newcommand := bufio.NewReader(os.Stdin)
|
|
fmt.Print("enter link of the tweet: ")
|
|
link, _ := newcommand.ReadString('\n')
|
|
link = strings.TrimSpace(link)
|
|
fmt.Print("link selected: ")
|
|
c.Cyan(link)
|
|
fmt.Println("-----------------------")
|
|
linkParam := strings.Split(link, "/")
|
|
tweetIdStr := linkParam[len(linkParam)-1]
|
|
c.Cyan(tweetIdStr)
|
|
tweetId, err := strconv.ParseInt(tweetIdStr, 10, 64)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
|
|
tweet, _, err := client.Statuses.Show(tweetId, nil)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
fmt.Print("tweet text: ")
|
|
c.Yellow(tweet.Text)
|
|
fmt.Print("tweet date: ")
|
|
c.Green(tweet.CreatedAt)
|
|
|
|
retweets := getRetweets(client, tweetId)
|
|
|
|
var dates = make(map[string]DateRT)
|
|
for _, retweet := range retweets {
|
|
createdat, err := retweet.CreatedAtTime()
|
|
check(err)
|
|
createdatRounded := time.Date(createdat.Year(), createdat.Month(), createdat.Day(), createdat.Hour(), createdat.Minute(), 0, 0, createdat.Location())
|
|
|
|
retws := dates[createdatRounded.String()].Retweets
|
|
retws = append(retws, retweet)
|
|
var currDate DateRT
|
|
currDate.Retweets = retws
|
|
currDate.Date = createdatRounded.String()
|
|
dates[createdatRounded.String()] = currDate
|
|
}
|
|
fmt.Println("total of " + strconv.Itoa(len(retweets)) + " retweets")
|
|
|
|
//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")
|
|
}
|