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.

108 lines
2.9 KiB

7 years ago
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "math/rand"
  6. "strconv"
  7. "strings"
  8. "time"
  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 isFromOwnBot(flock Botnet, 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 getRandomReplyFromReplies(replies []string) string {
  29. rand.Seed(time.Now().UnixNano())
  30. random := rand.Intn(len(replies))
  31. return replies[random]
  32. }
  33. func replyTweet(client *twitter.Client, text string, inReplyToStatusID int64) {
  34. tweet, httpResp, err := client.Statuses.Update(text, &twitter.StatusUpdateParams{
  35. InReplyToStatusID: inReplyToStatusID,
  36. })
  37. if err != nil {
  38. fmt.Println(err)
  39. }
  40. if httpResp.Status != "200 OK" {
  41. c.Red("error: " + httpResp.Status)
  42. c.Purple("maybe twitter has blocked the account, CTRL+C, wait 15 minutes and try again")
  43. }
  44. fmt.Print("tweet posted: ")
  45. c.Green(tweet.Text)
  46. }
  47. func startStreaming(botnet Botnet, bot *twitter.Client, botScreenName string, keywords []string, replies []string) {
  48. // Convenience Demux demultiplexed stream messages
  49. demux := twitter.NewSwitchDemux()
  50. demux.Tweet = func(tweet *twitter.Tweet) {
  51. if isRT(tweet) == false && isFromOwnBot(botnet, tweet) == false {
  52. //processTweet(botnetUser, botScreenName, keywords, tweet)
  53. fmt.Println("[bot @" + botScreenName + "] - New tweet detected:")
  54. c.Yellow(tweet.Text)
  55. reply := getRandomReplyFromReplies(replies)
  56. fmt.Print("reply: ")
  57. c.Green(reply)
  58. fmt.Println(tweet.User.ScreenName)
  59. fmt.Println(tweet.ID)
  60. replyTweet(bot, "@"+tweet.User.ScreenName+" "+reply, tweet.ID)
  61. waitMinutes(1)
  62. }
  63. }
  64. demux.DM = func(dm *twitter.DirectMessage) {
  65. fmt.Println(dm.SenderID)
  66. }
  67. demux.Event = func(event *twitter.Event) {
  68. fmt.Printf("%#v\n", event)
  69. }
  70. fmt.Println("Starting Stream...")
  71. // FILTER
  72. filterParams := &twitter.StreamFilterParams{
  73. Track: keywords,
  74. StallWarnings: twitter.Bool(true),
  75. }
  76. stream, err := bot.Streams.Filter(filterParams)
  77. if err != nil {
  78. log.Fatal(err)
  79. }
  80. // Receive messages until stopped or stream quits
  81. demux.HandleChan(stream.Messages)
  82. // Wait for SIGINT and SIGTERM (HIT CTRL-C)
  83. /*ch := make(chan os.Signal)
  84. signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
  85. log.Println(<-ch)
  86. fmt.Println("Stopping Stream...")
  87. stream.Stop()*/
  88. }
  89. func streamTweets(botnet Botnet, keywords []string, replies []string) {
  90. fmt.Println("total keywords: " + strconv.Itoa(len(keywords)))
  91. c.Purple("keywords to follow: ")
  92. fmt.Println(keywords)
  93. c.Green("Starting to stream tweets")
  94. for i := 0; i < len(botnet.Clients); i++ {
  95. go startStreaming(botnet, botnet.Clients[i], botnet.ScreenNames[i], keywords, replies)
  96. //wait 35 seconds to start the next bot
  97. waitSeconds(35)
  98. }
  99. }