flock-botnet/optionMarkovFlockBotnet.go
optionMarkovFlockBotnet.goRaw
1package main
2
3import (
4 "bufio"
5 "fmt"
6 "log"
7 "os"
8 "strconv"
9 "strings"
10
11 "github.com/dghubble/go-twitter/twitter"
12)
13
14func isRT(tweet *twitter.Tweet) bool {
15 tweetWords := strings.Split(tweet.Text, " ")
16 for i := 0; i < len(tweetWords); i++ {
17 if tweetWords[i] == "RT" {
18 return true
19 }
20 }
21 return false
22}
23func isFromBot(flock Flock, tweet *twitter.Tweet) bool {
24 for i := 0; i < len(flock.ScreenNames); i++ {
25 if flock.ScreenNames[i] == tweet.User.ScreenName {
26 return true
27 }
28 }
29 return false
30}
31func generateMarkovResponse(states []State, word string) string {
32 generatedText := markov.generateText(states, word, 15)
33 return generatedText
34}
35func processTweet(states []State, flockUser *twitter.Client, botScreenName string, keywords []string, tweet *twitter.Tweet) {
36 c.Yellow("bot @" + botScreenName + " - New tweet detected:")
37 fmt.Println(tweet.Text)
38
39 tweetWords := strings.Split(tweet.Text, " ")
40 generatedText := "word no exist on the memory"
41 for i := 0; i < len(tweetWords) && generatedText == "word no exist on the memory"; i++ {
42 fmt.Println(strconv.Itoa(i) + " - " + tweetWords[i])
43 generatedText = generateMarkovResponse(states, tweetWords[i])
44 }
45 c.Yellow("bot @" + botScreenName + " posting response")
46 fmt.Println(tweet.ID)
47 replyTweet(flockUser, "@"+tweet.User.ScreenName+" "+generatedText, tweet.ID)
48 waitTime(1)
49}
50func startStreaming(states []State, flock Flock, flockUser *twitter.Client, botScreenName string, keywords []string) {
51 // Convenience Demux demultiplexed stream messages
52 demux := twitter.NewSwitchDemux()
53 demux.Tweet = func(tweet *twitter.Tweet) {
54 if isRT(tweet) == false && isFromBot(flock, tweet) == false {
55 processTweet(states, flockUser, botScreenName, keywords, tweet)
56 }
57 }
58 demux.DM = func(dm *twitter.DirectMessage) {
59 fmt.Println(dm.SenderID)
60 }
61 demux.Event = func(event *twitter.Event) {
62 fmt.Printf("%#v\n", event)
63 }
64
65 fmt.Println("Starting Stream...")
66 // FILTER
67 filterParams := &twitter.StreamFilterParams{
68 Track: keywords,
69 StallWarnings: twitter.Bool(true),
70 }
71 stream, err := flockUser.Streams.Filter(filterParams)
72 if err != nil {
73 log.Fatal(err)
74 }
75 // Receive messages until stopped or stream quits
76 demux.HandleChan(stream.Messages)
77
78 // Wait for SIGINT and SIGTERM (HIT CTRL-C)
79 /*ch := make(chan os.Signal)
80 signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
81 log.Println(<-ch)
82
83 fmt.Println("Stopping Stream...")
84 stream.Stop()*/
85}
86func optionMarkovFlockBotnet(flock Flock) {
87 c.Green("Starting Markov's Flock botnet")
88 fmt.Println("generating Markov chains")
89 inputText, _ := readTxt("text.txt")
90 states := markov.train(inputText)
91
92 //getting the keywords
93 c.Purple("entry words to stream tweets (separated by comma): ")
94 newcommand := bufio.NewReader(os.Stdin)
95 text, _ := newcommand.ReadString('\n')
96 text = strings.TrimSpace(text)
97 text = strings.Replace(text, " ", "", -1)
98 keywords := strings.Split(text, ",")
99 c.Purple("total keywords: " + strconv.Itoa(len(keywords)))
100 fmt.Print("keywords to follow: ")
101 fmt.Println(keywords)
102
103 c.Red("Are you sure? [y/n]")
104 newcommand = bufio.NewReader(os.Stdin)
105 answer, _ := newcommand.ReadString('\n')
106 answer = strings.TrimSpace(answer)
107 switch answer {
108 case "y":
109 fmt.Println("ok, you are sure")
110 for i := 0; i < len(flock.Clients); i++ {
111 go startStreaming(states, flock, flock.Clients[i], flock.ScreenNames[i], keywords)
112 waitSeconds(35)
113 }
114 break
115 default:
116 fmt.Println("Operation cancelled")
117 break
118 }
119}