Bruk Twitter API til Tweet Repeterende innhold

Hva du skal skape

Velkommen tilbake til vår dekning av Twitter API. Hvis du bruker Twitter, har du kanskje kommet over en venn som deler tweets fra @infinite_scream botten (vist ovenfor). Jeg vet det er for det meste en bot fordi det tweets med ti minutters intervaller. Men det varierer strenglengden av sine virtuelle skrik for å unngå å bli blokkert av Twitters APIs beryktede udokumentert begrensninger. Tweet for ofte eller gjenta det samme innholdet, og du vil finne botsene dine håpløst blokkert.

Nylig spurte en online venn meg om å hjelpe dem å skrive kode for en bot som kan gjenta, men gi noe intelligent innholdsvariasjon. I dagens veiledning skriver jeg om hvordan du gjør dette med Twitter API.

I dagens veiledning beskriver jeg hvordan man bygger en bot som gjør det grunnleggende:

  • tilfeldig tweetintervall
  • tilfeldig utvalg av statustekst
  • tilfeldig utvalg av hashtags
  • tilfeldig inkludering av nettadresser
  • unngå å bli blokkert av Twitter

Men hvis du vil bruke en Twitter API-bot for effektivt å markedsføre produktet eller tjenesten din på egen hånd uten å irritere etterfølgerne dine, må du skrive kode som intelligent varierer emnet, innholdet og frekvensen til tweets på en organisert måte. Jeg skal skrive om hvordan du gjør det i fremtidige episoder. 

Hvis du har spørsmål eller ideer, vennligst legg inn dem i kommentarene nedenfor. Hvis du vil se noen av mine andre Envato Tuts + opplæringsprogrammer, vennligst besøk min instruktørside, spesielt min oppstartsserie. La oss komme i gang.

Starter

For bot i episode 1, prøver jeg å generere morsomme tweets med jevne mellomrom, samtidig som jeg unngår å forstyrre det store Twitter Gud av begrenset tilgang i himmelen.

Tweetinnholdet er veldig enkelt og kan tilfeldigvis opprettes ved å kombinere tidligere skrevet statustekst, hashtags og nettadresser.

Boten går i Yii, en populær PHP-basert plattform. Jeg vil holde veiledningen under ganske enkel for rett PHP-utviklere. Imidlertid oppfordrer jeg deg til å bruke rammer. Du kan lære mer i min Yii-serie.

Bygge botten

Registrere en Twitter App

I utgangspunktet var det første jeg gjorde å registrere en app for å få min Twitter-nøkkel:

Hvis du ikke er kjent med å opprette en app og godkjenne API-tilgang med Twitter, kan du gå gjennom noen av våre tidligere opplæringsprogrammer:

  • Bygg med Twitter API: Komme i gang

    Lær Twitter API med PHP ved hjelp av en frittstående, åpen kildekode Yii-applikasjon kalt Birdcage.
    Jeff Reifman
    Twitter API
  • Bygg med Twitter API: Tweet Storms

    Noen ideer er for store til 140 tegn. Legg inn dine tanker i nummererte sekvenser av tweets med Twitter API. I denne opplæringen vil vi jobbe gjennom ...
    Jeff Reifman
    Twitter API
  • Bygg oppstart med PHP: Forenkle Onramp med OAuth

    For å gjøre det enklere for nye brukere, tillater vi at de registrerer seg med sine Google-, Facebook- og Twitter-kontoer og lar eksisterende brukere koble disse tjenestene ...
    Jeff Reifman
    Yii

Forfatter innhold for et utvalg av tweets

Jeg ønsket å lage et system der min venn (eller en godkjent forfatter) kunne skrive variasjoner av tweets og plassere dem i en database for kontinuerlig bruk. Først opprettet jeg en databaseoverføring for å bygge bordet for dem.

Alle tabellene mine for dette prosjektet har prefikset norm_. Her er Tweet-tabellen eller norm_tweet:

db-> drivernavn === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('norm norm_tweet', ['id' => Skjema :: TYPE_PK, 'tweet' => Skjema :: TYPE_TEXT. 'NOT NULL', 'media_id' => Skjema :: TYPE_STRING. 'NOT NULL',], $ tableOptions);  offentlig funksjon ned () $ this-> dropTable ('norm norm_tweet');  

Deretter brukte jeg Yias Gii stillasystem til å lage en modell og CRUD-filer for meg. Her er modellen:

Og her er CRUD-generasjonen:

Så all denne koden gir automatisk gridvisningen under og redigeringsfunksjoner.

For tiden bruker jeg ikke medie-IDen, som er for bilder som lastes opp for å bli brukt i tweets. Jeg vil sannsynligvis adressere dette i neste episode.

Ganske enkelt så langt, rett? 

Legge til et utvalg av Hashtags

Deretter gjentar jeg denne prosessen for de andre modellene. Her er norm_hash migrasjon for hashtags:

db-> drivernavn === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('norm norm_hash', ['id' => Skjema :: TYPE_PK, 'tag' => Skjema :: TYPE_STRING. 'NOT NULL',], $ tableOptions);  offentlig funksjon ned () $ this-> dropTable ('norm norm_hash');  

Tanken er å tilfeldigvis inkludere en valgt hashtag (eller to) i tweets for å få det til å se at boten er menneskelig, varierer sine tweets. 

Her er Hashtag UX:

Jeg vil ikke gjenta Yii Gii-trinnene fra oven, men jeg gjentar dem for norm_hash og norm_url også.

Legge til en rekke nettadresser

Her er databaseoverføringen for å legge til nettadresser:

db-> drivernavn === 'mysql') $ tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';  $ this-> createTable ('norm norm_url', ['id' => Skjema :: TYPE_PK, 'url' => Skjema :: TYPE_STRING. 'NOT NULL', 'last_used' => Skjema :: TYPE_INTEGER. 'NOT NULL', 'created_at' => Skjema :: TYPE_INTEGER. 'NOT NULL', 'updated_at' => Skjema :: TYPE_INTEGER. 'NOT NULL',], $ tableOptions);  offentlig funksjon ned () $ this-> dropTable ('norm norm_url');  

Botmesteren kan legge til nettadresser på forskjellige tidspunkter. Det er trolig best for denne boten ikke å bruke gamle nettadresser eller å gjenta dem. De sist brukt og created_at Unix tidsstempler tillater tweetingalgoritmen beskrevet nedenfor for å bestemme når du skal bruke nettadresser.

Her er URL UX-siden:

Nå, la oss se på den morsomme algoritmen for å kombinere alle disse tabellene med interessante tweets som ikke er irriterende for Twitters Master Overlord of Restrictions.

Tilfeldiggjør innholdet i Bot Tweets

Det er morsomt å ha en bot som tweets en rekke innhold, men variasjonen er også nyttig for å forhindre at det blir blokkert av Twitter. 

Du kan se Twitter Rate Limits her, men noen av reglene for innholdsrepetisjon ser ikke ut til å være dokumentert:

Jeg tok anvisninger fra min venn om hvordan de ønsket at algoritmen skulle bygge tweets fra databasen med tweets, hashtags og nettadresser.

Her er byggalgoritmen vi har bestemt oss for nå; det er enkelt å justere. Jeg skal beskrive den i deler.

Etter min mening er algoritmen nedenfor lav på bruk av hashtags og nettadresser, og hvis du vil ha et mer robust utvalg av innhold, kan du endre det til din smak.

Først, vi bruk yii \ db \ uttrykk; å riktig velge en tilfeldig enkelt tweettekst fra tabellen:

orderBy (new Expression ('rand ()')) -> ett (); 

Da bestemmer vi om å bruke en hashtag (for øyeblikket 1 til 5 eller 20% av tiden) og hvor mange som skal brukes (for øyeblikket kun til en):

// bestemme om du skal bruke en hashtag // velg en tilfeldig # mellom 0 og 4 $ useHash = rand (0,4); // hvis rand # ikke er 0, men i stedet 1,2,3 eller 4, inkluderer hashtag (er) // for mindre freq bruk av hash-tagger, kan vi endre dette> 2 eller> 3 hvis ($ useHash> 3)  // så vi skal nå bestemme hvilke og hvor mange hash-tagger til // Creator besluttet å bare bruke en hashtag for akkurat nå $ numHash = 1; // rand (1,3); // velg denne randen # $ numHash tilfeldig fra listen vår $ hash = NormHash :: find () -> orderBy (new Expression ('rand ()')) -> en ();  ellers // ikke bruk noen hashtags $ hash = false; 

Deretter bestemmer vi om det er en URL tilgjengelig for bruk. Nettadresser må være mindre enn en uke gammel, og de kan bare brukes en gang hver 72 timer (3 dager). Så en ny nettadresse kan bare være tilgjengelig for bruk en gang, to ganger eller muligens tre ganger før utløpet.

// Bare bruk en URL hvis den er mindre enn en uke gammel $ url_weekago = time () - 7 * 24 * 3600; $ url_3daysago = tid () - 3 * 24 * 3600; // bare bruk en URL hvis den ikke er lagt ut de siste 72 timene $ url = NormUrl :: finn () -> hvor ('created_at>'. $ url_weekago) -> ogWhere ('last_used<'.$url_3daysago) // handles unused zero case ->orderBy (['id' => SORT_DESC]) -> ett ();

Til slutt bygger vi tweet basert på de valgte dataene (tilgjengelige nettadresser blir bare lagt til en i fire ganger eller 25% sjanse):

$ content = $ txt-> tweet; hvis ($ hash! == false) $ content. = '#'. $ hash-> tag;  // bare legg til URL 1/4 av tiden hvis (! is_null ($ url) && rand (1,4) == 1) $ content. = ". $ url-> url; $ url-> last_used = tid (); $ url-> oppdatering (); returner $ innhold;

Velge Når to Tweet

Yii lar deg ringe konsollkontrollere fra cron. Så jeg legger til et anrop til min /console/DaemonController.php i crontab.

$ sudo crontab -l

Her er hvordan oppgavene mine er planlagt:

# mh dom mon dow kommando * / 3 * * * * / var / www / bot / yii demon / hyppig * / 15 * * * * / var / www / bot / yii demon / kvartal 0 * * * * / var / www / bot / yii daemon / time 15 1 * * * / var / www / bot / yii daemon / over natten 15 3 * * 5 / var / www / bot / yii demon / ukentlig

Hver time, nissen / time i /console/DaemonController.php er forespurt. Vår bot app bestemmer bare om å tweet eller ikke en gang hver fjerde time.

Først vil du se at jeg har en NormLog bord som jeg ikke beskrev ovenfor, men som sporer all produksjon og når tweets ble laget. Så min venn ville ikke tweet mer enn en gang om dagen. 

offentlig funksjon actionHourly () // hver time $ current_hour = date ('G'); hvis ($ current_hour% 4) // hvert fjerde timers ekko "Review tweeting plan ..."; $ dayAgo = tid () - 24 * 3600; $ nl = \ frontend \ models \ NormLog :: find () -> orderBy (['id' => SORT_DESC]) -> en (); ekko 'created_at:'. $ nl-> id. ". $ nl-> created_at. '...'; ekko 'dayago:'. $ dayAgo. '...'; if ($ nl-> created_at<$dayAgo)  // okay to maybe tweet… 

Vi ville ikke ha tilhengere av vår bot for å bli irritert av høyfrekvent tweeting.

Deretter velger vi et nummer, i utgangspunktet seks ganger om dagen (hver fjerde time), og tweet hvis tallet er 6 (eller en i 12 sjanse).

 // hver fjerde time, hvis 6 blir plukket fra 1-12, tweet vi // 1 i 12 sjanse 12x i to dager $ r = rand (1,12); hvis ($ r == 6) \ frontend \ models \ NormTweet :: levere (); ekkos tweet, 6 ble plukket ... ';  annet echo "ikke tweet, 1 i 12 # ikke plukket ...";  ellers // aldri tweet to ganger i 24 timer ekko 'ikke tweet, ennå ikke 24 timer ...';  ekko "... gjorde det til slutt ...! ';  hvis ($ current_hour% 6) // hver seks timer 

Leverer Tweet til Twitter API

Her er NormTweet :: levere () Metode kalt av Daemon for å legge inn tweet:

offentlig statisk funksjon levere () // legge inn en oppdatering // konstruere $ content = NormTweet :: build (); // tweet det med params for norm acct $ connection = ny TwitterOAuth (Yii :: $ app-> params ['norm'] ['consumer_key'], Yii :: $ app-> params ['norm'] ['consumer_secret '], Yii :: $ app-> params [' norm '] [' access_token '], Yii :: $ app-> params [' norm '] [' access_token_secret ']); $ postit = $ connection-> post ("statuses / update", ["status" => $ innhold)); // lagre det i loggen $ nl = nytt NormLog (); $ nl-> tweet = $ content; $ N '> Lagre (); 

Kontoens Twitter-applikasjonstaster er lagret i /bot/frontend/config/params-local.php, konfigurert fra bot.ini-filen jeg bruker:

$ 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 er ikke enkle, men de er moro!

Undersøk resultatene

Her er resultatet av vår bot:

Bare tuller! Det er en av de redaksjonelle gudinnene, Tom McFarlin. AI-skript er ennå ikke i stand til å erstatte hans "innsikt", men Envato Tuts + har hyret meg til å jobbe med dette. 

Her er den faktiske botten, ment å minne min venn og dens følgere at amerikansk nye politik ikke er helt normal. Jeg forestiller meg hva dine synspunkter du vil være enig med.

Jeg håper du har hatt denne episoden.

Hva blir det neste?

Deretter skal jeg lage en mer markedsføringsdrevet plattform for å hjelpe deg med å bruke Twitter API for å fremme oppstart, tjenester og virksomheter uten å bli merket som en bot og blokkert.

Hvis du har spørsmål eller forslag til denne opplæringen, vennligst legg dem inn i kommentarene. Hvis du vil fortsette med fremtidige Envato Tuts + opplæringsprogrammer og andre serier, vennligst besøk min instruktørside eller følg @reifman. 

Relaterte linker

  • Slik programmerer du med Yii2-serien (Envato Tuts +)
  • Yii2 Developer Exchange
  • Twitter Developer Documentation
  • Twitter OAuth PHP Library