Skip to content

Instantly share code, notes, and snippets.

@roscopecoltran
Created February 13, 2020 14:29
Show Gist options
  • Save roscopecoltran/8e737b20202beb0edcfb5d2ed38e4ab2 to your computer and use it in GitHub Desktop.
Save roscopecoltran/8e737b20202beb0edcfb5d2ed38e4ab2 to your computer and use it in GitHub Desktop.
twitter bot in golang and selenium/chrome
package main
import (
"os"
"time"
log "github.com/sirupsen/logrus"
"github.com/tebeka/selenium"
"github.com/tebeka/selenium/chrome"
)
/*
brew install selenium-server-standalone
brew install chromedriver
brew services restart selenium-server-standalone
brew services restart chromedriver
*/
var (
debugMode = false
addMedia = false
wd selenium.WebDriver
)
func main() {
caps := selenium.Capabilities{"browserName": "chrome"}
chromeCaps := chrome.Capabilities{
Args: []string{
// "--headless",
"--no-sandbox",
"--start-maximized",
"--window-size=1920,1080",
"--disable-crash-reporter",
"--hide-scrollbars",
"--disable-gpu",
"--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7",
},
}
caps.AddChrome(chromeCaps)
wd, err := selenium.NewRemote(caps, "")
if err != nil {
panic(err)
}
defer wd.Quit()
wd.Get("https://twitter.com/login")
wd.SetImplicitWaitTimeout(2 * time.Second)
// write email
emailInput, err := wd.FindElement(selenium.ByXPATH, "//input[@name=\"session[username_or_email]\"]")
if err != nil {
log.Warnln(err)
}
if err := emailInput.SendKeys("x0rzkov"); err != nil {
log.Warnln(err)
}
// write password
passwordInput, err := wd.FindElement(selenium.ByName, `session[password]`)
if err != nil {
log.Warnln(err)
}
if err := passwordInput.SendKeys("ada33ve79T!"); err != nil {
log.Warnln(err)
}
// submit the login form
form, err := wd.FindElement(selenium.ByXPATH, "//div[@data-testid='LoginForm_Login_Button']")
if err != nil {
panic(err)
}
if err := form.Click(); err != nil {
panic(err)
}
// go to the twitter compose page
wd.Get("https://twitter.com/compose/tweet")
wd.SetImplicitWaitTimeout(2 * time.Second)
// click on the draft editor
tweetInput, err := wd.FindElement(selenium.ByClassName, "DraftEditor-root")
if err != nil {
log.Warnln(err)
}
if err := tweetInput.Click(); err != nil {
panic(err)
}
// wd.SetImplicitWaitTimeout(1 * time.Second)
// write the text
textTweet, err := wd.FindElement(selenium.ByCSSSelector, "br[data-text=\"true\"]")
if err != nil {
panic(err)
}
if err := textTweet.SendKeys("hello world from #x0rzkov let's rock"); err != nil {
log.Warnln(err)
}
// add media (not working for now)
if addMedia {
tweetMediaInput, err := wd.FindElement(selenium.ByCSSSelector, "input[type=\"file\"]")
if err != nil {
log.Warnln(err)
}
tweetMediaInput.SendKeys("/Users/xxxxxxx/Downloads/57980167-ef242900-7a44-11e9-8425-73560b1d1e0a.gif")
}
// submit the tweet
formTweet, err := wd.FindElement(selenium.ByCSSSelector, "div[data-testid = 'tweetButton'][role = 'button']")
if err != nil {
panic(err)
}
// os.Exit(1)
if err := formTweet.Click(); err != nil {
panic(err)
}
wd.Close()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment