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