You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.4 KiB

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