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.

96 lines
2.4 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "math/rand"
  6. "strings"
  7. "time"
  8. "github.com/dghubble/go-twitter/twitter"
  9. "github.com/fatih/color"
  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 isFromBotnet(tweet *twitter.Tweet) bool {
  21. for i := 0; i < len(botnet); i++ {
  22. if botnet[i].Title == 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. log.Println(err)
  39. }
  40. if httpResp.Status != "200 OK" {
  41. color.Red("error: " + httpResp.Status)
  42. log.Println("error" + httpResp.Status)
  43. color.Cyan("maybe twitter has blocked the account, CTRL+C, wait 15 minutes and try again")
  44. log.Println("maybe twitter has blocked the account, CTRL+C, wait 15 minutes and try again")
  45. }
  46. log.Println("tweet posted: " + tweet.Text)
  47. }
  48. func startStreaming(bot *Bot) {
  49. // Convenience Demux demultiplexed stream messages
  50. demux := twitter.NewSwitchDemux()
  51. fmt.Println("Starting Stream...")
  52. // FILTER
  53. filterParams := &twitter.StreamFilterParams{
  54. Track: keywords,
  55. StallWarnings: twitter.Bool(true),
  56. }
  57. stream, err := bot.Client.Streams.Filter(filterParams)
  58. check(err)
  59. // Receive messages until stopped or stream quits
  60. for message := range stream.Messages {
  61. demux.All(message)
  62. switch msg := message.(type) {
  63. case *twitter.Tweet:
  64. r := handleTweet(msg, bot)
  65. if r {
  66. log.Println("stopping stream")
  67. stream.Stop()
  68. }
  69. default:
  70. }
  71. }
  72. }
  73. func handleTweet(tweet *twitter.Tweet, bot *Bot) bool {
  74. r := false
  75. if isRT(tweet) == false && isFromBotnet(tweet) == false {
  76. //processTweet(botnetUser, botScreenName, keywords, tweet)
  77. log.Println("[bot @" + bot.Title + "] - New tweet detected:")
  78. log.Println(tweet.Text)
  79. reply := getRandomReplyFromReplies(replies)
  80. log.Println("reply: " + reply + ", to: @" + tweet.User.ScreenName /* + ". tweet ID: " + tweet.ID*/)
  81. //replyTweet(bot, "@"+tweet.User.ScreenName+" "+reply, tweet.ID)
  82. color.Green("@" + bot.Title + " replying tweet!")
  83. bot.SinceTweeted = time.Now().Unix()
  84. r = true
  85. }
  86. return r
  87. }