arnaucube
arnaucube/flock-botnetPublic Self-hosted repository
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}