Välkommen tillbaka till vår täckning av Twitter API. Om du använder Twitter kan du ha stött på en vän som delar tweets från @infinite_scream boten (visas ovan). Jag vet att det är mestadels en bot eftersom det tweets med tio minuters mellanrum. Men det varierar stränglängden av sina virtuella skrik för att undvika att bli blockerad av Twitters APIs berömda odokumenterad restriktioner. Tweet för ofta eller upprepa samma innehåll och du hittar dina bots hopplöst blockerad.
Nyligen bad en online-vän mig att hjälpa dem att skriva kod för en bot som kan upprepa men ge lite intelligent innehållsvariation. I dagens handledning skriver jag om hur man gör det med Twitter API.
I dagens handledning beskriver jag hur man bygger en bot som gör grunderna:
Om du vill använda en Twitter API-bot för att effektivt marknadsföra din produkt eller tjänst på ditt eget konto utan att irritera dina anhängare, måste du skriva kod som varierar intelligent ämne, innehåll och frekvens på dina tweets på ett organiserat sätt. Jag ska skriva om hur man gör det i framtida episoder.
Om du har några frågor eller idéer, vänligen skicka in dem i kommentarerna nedan. Om du vill se några av mina andra Envato Tuts + handledning, besök min instruktörssida, särskilt min startserie. Låt oss börja.
För bot i episod 1 försöker jag generera roliga tweets med jämna mellanrum och undvika att störa den stora Twitter Gud av begränsad tillgång i himlen.
Tweet-innehållet är mycket enkelt och kan skapas slumpmässigt genom att kombinera tidigare skrivet statustext, hashtags och webbadresser.
Boten körs i Yii, en populär PHP-baserad plattform. Jag håller guiden nedan ganska enkel för raka PHP-utvecklare. Jag uppmanar dock dig att använda ramar. Du kan lära dig mer i min Yii-serie.
I grund och botten var det första jag gjorde att registrera en app för att få min Twitter-nycklar:
Om du inte är bekant med att skapa en app och godkänna API-åtkomst med Twitter, kolla in några av våra tidigare handledning:
Jag ville skapa ett system där min vän (eller någon godkänd författare) kunde skriva variationer av tweets och placera dem i en databas för fortsatt användning. Först skapade jag en databasmigration för att bygga bordet för dem.
Alla mina tabeller för detta projekt har prefixet norm_
. Här är Tweet-tabellen eller norm_tweet
:
db-> drivrutinName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'; $ this-> createTable ('% norm_tweet', ['id' => Schema :: TYPE_PK, 'tweet' => Schema :: TYPE_TEXT. 'NOT NULL', 'media_id' => Schema TYPE_STRING. 'NOT NULL',], $ tableOptions); offentlig funktion ner () $ this-> dropTable ('norm norm_tweet');
Därefter använde jag Yiis Gii-ställningssystem för att skapa en modell och CRUD-filer för mig. Här är modellen:
Och här är CRUD-generationen:
Så all denna kod ger automatiskt gridvyn nedan och redigeringsfunktioner.
För närvarande använder jag inte Media ID, vilket är för bilder som laddas upp för att användas inom tweets. Jag kommer troligen att adressera det här i nästa avsnitt.
Ganska enkelt så långt, rätt?
Sedan upprepar jag den här processen för de andra modellerna. Här är norm_hash
migration för hashtags:
db-> drivrutinName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'; $ this-> createTable ('% norm_hash', ['id' => Schema :: TYPE_PK, 'tag' => Schema :: TYPE_STRING. 'NOT NULL',], $ tableOptions); offentlig funktion ner () $ this-> dropTable ('norm norm_hash');
Tanken är att slumpmässigt inkludera en vald hashtag (eller två) i tweetsna för att få fram att boten är mänsklig, varierar dess tweets.
Här är Hashtag UX:
Jag kommer inte att upprepa Yii Gii-stegen ovanifrån, men jag upprepar dem för norm_hash
och norm_url
också.
Här är databasmigreringen för att lägga till webbadresser:
db-> drivrutinName === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'; $ this-> createTable ('% norm_url', ['id' => Schema :: TYPE_PK, 'url' => Schema :: TYPE_STRING. 'NOT NULL', 'last_used' => Schema :: TYPE_INTEGER. 'NOT NULL', 'created_at' => Schema :: TYPE_INTEGER. 'NOT NULL', 'updated_at' => Schema :: TYPE_INTEGER. 'NOT NULL',], $ tableOptions); allmän funktion ner () $ this-> dropTable ('norm norm_url');
Botmästaren kan lägga till webbadresser vid olika tidpunkter. Det är nog bäst för den här boten att inte använda gamla webbadresser eller att upprepa dem. De senast använd
och skapad vid
Unix tidsstämplar tillåter tweetingalgoritmen som beskrivs nedan för att bestämma när du ska använda webbadresser.
Här är URL-UX-sidan:
Låt oss nu titta på den roliga algoritmen för att kombinera alla dessa tabeller till intressanta tweets som inte är irriterande för Twitter: s överordnade överordnade begränsningar.
Det är roligt att få en bot som tweets en mängd olika innehåll, men sorten är också till hjälp för att förhindra att den blir blockerad av Twitter.
Du kan se Twitter Rate Limits här, men vissa regler för innehållsrepetition verkar inte dokumenteras:
Jag tog anvisningar från min vän om hur de ville att algoritmen skulle bygga tweets från databasen med tweets, hashtags och webbadresser.
Här är bygg algoritmen vi bestämde oss för för nu; det är lätt att tweak. Jag beskriver det i delar.
Enligt min mening är algoritmen nedan låg på användningen av hashtags och webbadresser, och om du vill ha en mer robust mängd innehåll, ändra det till din smak.
Först Vi använd yii \ db \ uttryck;
att korrekt välja en slumpmässig enkel tweettext från tabellen:
orderBy (new Expression ('rand ()')) -> ett ();
Då bestämmer vi oss för att använda en hashtag (för närvarande 1 till 5 eller 20% av tiden) och hur många som ska användas (för tillfället fixad till bara en):
// bestämmer om en hashtag ska användas // välj en slumpmässig # mellan 0 och 4 $ useHash = rand (0,4); // om rand # inte är 0 men istället 1,2,3 eller 4, inkludera hashtag (s) // för mindre freq användning av hash-taggar, kan vi ändra detta> 2 eller> 3 om ($ useHash> 3) // så vi ska nu bestämma vilka och hur många hash-taggar till // Creator bestämde sig för att bara använda en hashtag för just nu $ numHash = 1; // rand (1,3); // välj denna rand # $ numHash slumpmässigt från vår lista $ hash = NormHash :: find () -> orderBy (new Expression ('rand ()')) -> one (); annat // använd inte några hashtags $ hash = false;
Därefter bestämmer vi om det finns en webbadress tillgänglig för användning. Webbadresser måste vara mindre än en vecka gammal och de kan bara användas en gång var 72: e timme (3 dagar). Så en ny webbadress kan bara vara tillgänglig för användning en gång, två gånger eller möjligen tre gånger innan den upphör.
// Använd bara en URL om den är mindre än en vecka gammal $ url_weekago = time () - 7 * 24 * 3600; $ url_3daysago = tid () - 3 * 24 * 3600; // använd bara en URL om den inte har publicerats under de senaste 72 timmarna $ url = NormUrl :: find () -> where ('created_at>'. $ url_weekago) -> ochWhere ('last_used<'.$url_3daysago) // handles unused zero case ->orderBy (['id' => SORT_DESC]) -> ett ();
Slutligen bygger vi tweet baserat på vald data (tillgängliga webbadresser läggs till endast en i fyra gånger eller 25% chans):
$ content = $ txt-> tweet; om ($ hash! == false) $ content. = '#'. $ hash-> tagg; // lägg bara till URL 1/4 av tiden om (! is_null ($ url) && rand (1,4) == 1) $ content. = ". $ url-> url; $ url-> last_used = tid (); $ url-> uppdatering (); returnera $ content;
Yii tillåter dig att ringa konsolkontrollanter från cron. Så lägger jag till ett samtal till min /console/DaemonController.php i crontab.
$ sudo crontab -l
Så här är mina uppgifter planerade:
# mh dom mon dow command * / 3 * * * * / var / www / bot / yii demon / frekvent * / 15 * * * * / var / www / bot / yii daemon / quarter 0 * * * * / var / www / bot / yii daemon / hourly 15 1 * * * / var / www / bot / yii daemon / över natten 15 3 * * 5 / var / www / bot / yii demon / veckovis
Varje timme, daemon / timme
i /console/DaemonController.php begärs. Vår botapp bestämmer bara huruvida du ska tweet eller inte en gång var fjärde timme.
Först ser du att jag har en NormLog
bord som jag inte beskrev ovan, men som spårar alla utgångar och när tweets gjordes. Så min vän ville inte tweet mer än en gång om dagen.
allmän funktion actionHourly () // varje timme $ current_hour = date ('G'); om ($ current_hour% 4) // varje fyra timmar echo "Review tweeting plan ..."; $ dayAgo = tid () - 24 * 3600; $ nl = \ frontend \ models \ NormLog :: find () -> orderBy (['id' => SORT_DESC]) -> ett (); echo 'created_at:'. $ nl-> id. ". $ nl-> created_at. '...'; echo 'dayago:'. $ dayAgo. '...'; om ($ nl-> created_at<$dayAgo) // okay to maybe tweet…
Vi ville inte ha efterföljare av vår bot att bli irriterad av högfrekvent tweeting.
Sedan väljer vi ett nummer, i princip sex gånger om dagen (var fjärde timme), och tweet om numret är 6 (eller en i 12 chans).
// var fjärde timme, om 6 plockas från 1-12, tweetar vi / 1 i 12 chans 12x i två dagar $ r = rand (1,12); om ($ r == 6) \ frontend \ models \ NormTweet :: leverera (); echo 'tweet, 6 plockades ...'; annars echo "tweet inte, 1 i 12 # inte valts ..."; else // aldrig tweet två gånger i 24 timmar echo 'tweet inte, ännu inte 24 timmar ...'; eko "... gjorde det till slut ...! '; om ($ current_hour% 6) // var sjätte timme
Här är NormTweet :: leverera ()
metod som kallas av Daemon för att skicka tweet:
offentlig statisk funktion leverera () // posta en uppdatering // konstruera $ content = NormTweet :: build (); // tweet det med parametrar för norm acct $ connection = ny TwitterOAuth (Yii :: $ app-> params ['norm'] ['consumer_key'], Yii :: $ app-> params ['norm'] ['consumer_secret '], Yii :: $ app-> parametrar [' norm '] [' access_token '], Yii :: $ app-> parametrar [' norm '] [' access_token_secret ']); $ postit = $ connection-> post ("statuses / update", ["status" => $ innehåll)); // spara det i loggen $ nl = new NormLog (); $ nl-> tweet = $ content; $ NL> Spara ();
Kontots Twitter-nyckeltangenter lagras i /bot/frontend/config/params-local.php, konfigurerad från bot.ini-filen som jag använder:
$ mer params-local.php ['consumer_key' => $ config ['norm_consumer_key'], 'consumer_secret' => $ config ['norm_consumer_secret'], 'access_token' => $ config ['norm_access_token'], 'access_token_secret' => $ config ['norm_access_token_secret '],' user_id '=> $ config [' norm_user_id '],],];
Bots är inte enkla, men de är roligt!
Här är resultatet av vår bot:
Skojar bara! Det är en av de redaktionella gudinnorna, Tom McFarlin. AI-skript kan inte ersätta hans "insikter", men Envato Tuts + har anställt mig för att arbeta på detta.
Här är den faktiska boten, avsedd att påminna min vän och dess anhängare att Amerikas nya politik inte är exakt normal. Jag föreställer mig vad dina åsikter du håller med.
Jag hoppas att du har haft det här avsnittet.
Därefter kommer jag att skapa en mer marknadsföringsplattform som hjälper dig att använda Twitter API för att marknadsföra din start, tjänster och verksamhet utan att bli märkt som en bot och blockerad.
Om du har några frågor eller förslag om denna handledning, vänligen skicka in dem i kommentarerna. Om du vill hålla koll på mina framtida Envato Tuts + handledning och andra serier, besök min instruktörssida eller följ @reifman.