Welkom terug bij onze berichtgeving over de Twitter API. Als u Twitter gebruikt, bent u mogelijk een vriend tegengekomen die tweets deelt via de bot @infinite_scream (hierboven weergegeven). Ik weet dat het meestal een bot is, omdat het tweets met een interval van tien minuten tweets. Maar het varieert de tekenreekslengte van zijn virtuele screams om te voorkomen dat het wordt geblokkeerd door de beruchte Twitter-API's ongedocumenteerde beperkingen. Tweemaal te vaak herhalen of dezelfde inhoud herhalen en je zult zien dat je bots hopeloos worden geblokkeerd.
Onlangs vroeg een online vriend me om hen te helpen bij het schrijven van code voor een bot die zou kunnen worden herhaald, maar die een aantal intelligente inhoudsvariaties biedt. In de tutorial van vandaag zal ik schrijven over hoe dit te doen met de Twitter API.
In de tutorial van vandaag zal ik beschrijven hoe je een bot bouwt die de basis vormt:
Als u echter een Twitter API-bot wilt gebruiken om uw product of service effectief voor uw eigen account te promoten zonder uw volgers te irriteren, moet u code schrijven die het onderwerp, de inhoud en de frequentie van uw tweets op een georganiseerde manier op een intelligente manier varieert. Ik zal schrijven over hoe ik dat in toekomstige afleveringen moet doen.
Als u vragen of ideeën heeft, kunt u deze in de onderstaande opmerkingen plaatsen. Als je enkele van mijn andere Envato Tuts + tutorials wilt zien, ga dan naar mijn instructeurspagina, vooral mijn opstartreeks. Laten we beginnen.
Voor de bot in aflevering één, probeer ik regelmatig leuke tweets te genereren zonder te voorkomen dat je de goede verstoort Twitter God van beperkte toegang in de lucht.
De inhoud van de tweet is heel eenvoudig en kan willekeurig worden gemaakt door eerder geschreven statustekst, hashtags en URL's te combineren.
De bot draait in Yii, een populair op PHP gebaseerd platform. Ik zal de onderstaande handleiding redelijk eenvoudig houden voor directe PHP-ontwikkelaars. Ik moedig u echter aan om kaders te gebruiken. Je kunt meer leren in mijn Yii-serie.
Kort gezegd, het eerste wat ik deed was een app registreren om mijn Twitter-sleutels te krijgen:
Als u niet bekend bent met het maken van een app en het autoriseren van API-toegang met Twitter, bekijk dan enkele van onze eerdere zelfstudies:
Ik wilde een systeem maken waarin mijn vriend (of een goedgekeurde auteur) variaties van tweets kon schrijven en deze in een database kon plaatsen voor doorlopend gebruik. Eerst heb ik een databasemigratie gemaakt om de tabel voor hen te bouwen.
Al mijn tabellen voor dit project hebben het voorvoegsel norm_
. Dit is de Tweet-tabel of norm_tweet
:
db-> driverName === 'mysql') $ tableOptions = 'KARAKTER 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); public function down () $ this-> dropTable ('% norm_tweet');
Vervolgens gebruikte ik Yii's Gii steigersysteem om een model en CRUD-bestanden voor mij te maken. Dit is het model:
En hier is de CRUD-generatie:
Dus al deze code biedt automatisch de onderstaande rasterweergave en bewerkingsmogelijkheden.
Voorlopig gebruik ik de Media ID niet, dit is voor afbeeldingen die worden geüpload om te worden gebruikt in tweets. Ik zal dit waarschijnlijk in de volgende aflevering aanpakken.
Vrij eenvoudig tot nu toe, toch??
Vervolgens herhaal ik dit proces voor de andere modellen. Hier is de norm_hash
migratie voor hashtags:
db-> driverName === 'mysql') $ tableOptions = 'KARAKTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'; $ this-> createTable ('% norm_hash', ['id' => Schema :: TYPE_PK, 'tag' => Schema :: TYPE_STRING. 'NOT NULL',], $ tableOptions); public function down () $ this-> dropTable ('% norm_hash');
Het idee is om willekeurig een geselecteerde hashtag (of twee) in de tweets op te nemen om het te laten lijken dat de bot menselijk is, zijn tweets varieert.
Hier is de Hashtag UX:
Ik zal de Yii Gii niet van bovenaf herhalen, maar ik herhaal ze voor norm_hash
en norm_url
ook.
Dit is de databasemigratie voor het toevoegen van URL's:
db-> driverName === 'mysql') $ tableOptions = 'KARAKTER 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); public function down () $ this-> dropTable ('% norm_url');
De botmaster kan op verschillende tijdstippen URL's toevoegen. Het is waarschijnlijk het beste voor deze bot om geen oude URL's te gebruiken of deze te herhalen. De laatst gebruikt
en gemaakt bij
Met Unix-tijdstempels kan het onderstaande tweeting-algoritme bepalen wanneer URL's moeten worden gebruikt.
Dit is de URL UX-pagina:
Laten we nu kijken naar het leuke algoritme om al deze tabellen te combineren in interessante tweets die niet irritant zijn Twitter's meester Overlord of Restrictions.
Het is leuk om een bot te hebben die een verscheidenheid aan inhoud tweet, maar de variëteit is ook nuttig om te voorkomen dat deze door Twitter wordt geblokkeerd.
Je kunt de Twitter Rate Limits hier zien, maar sommige regels voor het herhalen van content lijken niet te zijn gedocumenteerd:
Ik nam aanwijzingen van mijn vriend over hoe zij wilden dat het algoritme tweets bouwt uit de database van tweets, hashtags en URL's.
Hier is het build-algoritme dat we voor nu besloten; het is gemakkelijk in te stellen. Ik zal het in delen beschrijven.
Naar mijn mening is het onderstaande algoritme te laag in het gebruik van hashtags en URL's en als je een meer robuuste verscheidenheid aan inhoud wilt, kun je deze naar wens aanpassen.
Eerst, wij gebruik yii \ db \ Expression;
om op de juiste manier een willekeurige enkele tweettekst uit de tabel te selecteren:
orderBy (nieuwe expressie ('rand ()')) -> one ();
Vervolgens beslissen we of we een hashtag willen gebruiken (momenteel 1 op de 5 of 20% van de tijd) en hoeveel we moeten gebruiken (momenteel slechts één):
// beslis of u een hashtag wilt gebruiken // kies een willekeurig # tussen 0 en 4 $ useHash = rand (0,4); // als rand # niet 0 is maar in plaats van 1,2,3 of 4, hashtag (s) // bevatten voor minder freq-gebruik van hash-tags, kunnen we dit> 2 of> 3 if ($ useHash> 3) // dus we gaan nu beslissen welke en hoeveel hash-tags aan // Creator hebben besloten om slechts één hashtag te gebruiken voor $ numHash = 1; // rand (1,3); // selecteer deze rand # $ numHash willekeurig uit onze lijst $ hash = NormHash :: find () -> orderBy (nieuwe Expression ('rand ()')) -> one (); else // gebruik geen hashtags $ hash = false;
Vervolgens bepalen we of er een URL beschikbaar is om te gebruiken. URL's moeten minder dan een week oud zijn en mogen slechts eenmaal per 72 uur (3 dagen) worden gebruikt. Dus elke nieuwe URL is mogelijk slechts één, twee of drie keer beschikbaar voordat deze verloopt.
// gebruik alleen een URL als deze minder dan een week oud is $ url_weekago = time () - 7 * 24 * 3600; $ url_3daysago = tijd () - 3 * 24 * 3600; // gebruik alleen een URL als deze niet in de laatste 72 uur is gepost $ url = NormUrl :: find () -> where ('created_at>'. $ url_weekago) -> andWhere ('last_used<'.$url_3daysago) // handles unused zero case ->orderBy (['id' => SORT_DESC]) -> one ();
Ten slotte bouwen we de tweet op basis van de geselecteerde gegevens (beschikbare URL's worden slechts één keer in vier keer toegevoegd of 25% kans):
$ content = $ txt-> tweet; if ($ hash! == false) $ content. = '#'. $ hash-> tag; // voeg alleen URL 1/4 van de tijd toe als (! is_null ($ url) && rand (1,4) == 1) $ content. = ". $ url-> url; $ url-> last_used = time (); $ url-> update (); retourneert $ inhoud;
Met Yii kun je console-controllers vanaf cron aanroepen. Dus ik voeg een oproep toe aan mijn / console/DaemonController.php in crontab.
$ sudo crontab -l
Dit is hoe mijn taken zijn gepland:
# mh dom mon dow commando * / 3 * * * * / var / www / bot / yii daemon / frequent * / 15 * * * * / var / www / bot / yii daemon / kwartaal 0 * * * * / var / www / bot / yii daemon / hourly 15 1 * * * / var / www / bot / yii daemon / overnight 15 3 * * 5 / var / www / bot / yii daemon / wekelijks
Elk uur, daemon / uur
in /console/DaemonController.php is aangevraagd. Onze bot-app beslist pas om de vier uur of hij wil tweeten of niet.
Eerst zul je zien dat ik een NormLog
tabel die ik hierboven niet heb beschreven, maar die alle uitvoer volgt en wanneer tweets zijn gemaakt. Dus mijn vriend wilde niet meer dan één keer per dag tweeten.
public function actionHourly () // every hour $ current_hour = date ('G'); if ($ current_hour% 4) // om de vier uur echo "Review tweeting plan ..."; $ dayAgo = time () - 24 * 3600; $ nl = \ frontend \ models \ NormLog :: find () -> orderBy (['id' => SORT_DESC]) -> one (); echo 'created_at:'. $ nl-> id. ". $ nl-> created_at. '...'; echo 'dayago:'. $ dayAgo. '...'; if ($ nl-> created_at<$dayAgo) // okay to maybe tweet…
We wilden niet dat volgers van onze bot geïrriteerd raken door hoogfrequente tweeten.
Vervolgens kiezen we een nummer, eigenlijk de zes keer per dag (elke vier uur), en tweet als het nummer 6 is (of een kans van een op 12).
// elke vier uur, als 6 wordt gekozen van 1-12, tweeten we // 1 op 12 kans 12x in twee dagen $ r = rand (1,12); if ($ r == 6) \ frontend \ models \ NormTweet :: deliver (); echo 'tweet, 6 werd gekozen ...'; else echo "niet tweet, 1 op 12 # niet geplukt ..."; else // tweet nooit twee keer in 24 uur echo 'niet tweeten, nog geen 24 uur ...'; echo '... heeft het tot een einde gebracht ...!'; if ($ current_hour% 6) // elke zes uur
Hier is de NormTweet :: leveren ()
methode genaamd door de Daemon om de tweet te plaatsen:
public static function deliver () // plaats een update // construct $ content = NormTweet :: build (); // tweet het met params voor norm acct $ connection = new 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 ("statussen / update", ["status" => $ inhoud]); // sla het op in het log $ nl = new NormLog (); $ nl-> tweet = $ inhoud; $ NL-> save ();
De Twitter-applicatiesleutels van het account worden opgeslagen in /bot/frontend/config/params-local.php, geconfigureerd vanuit het bestand bot.ini dat ik gebruik:
$ meer 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 zijn niet eenvoudig, maar dat zijn ze wel pret!
Dit zijn de resultaten van onze bot:
Grapje! Dat is een van de redactionele godinnen, Tom McFarlin. AI-scripts zijn nog niet in staat om zijn 'inzichten' te vervangen, maar Envato Tuts + heeft mij ingehuurd om hieraan te werken.
Dit is de echte bot, bedoeld om mijn vriend en zijn volgelingen eraan te herinneren dat Amerika's nieuwe politiek niet bepaald normaal is. Ik stel me voor wat je standpunten waren dat je daarmee zou beamen.
Ik hoop dat je deze aflevering leuk vond.
Vervolgens ga ik een meer op marketing gebaseerd platform maken om u te helpen de Twitter API te gebruiken om uw startup, services en bedrijf te promoten zonder als bot te worden bestempeld en geblokkeerd.
Als je vragen of suggesties hebt over deze tutorial, plaats deze dan in de comments. Als je graag mijn toekomstige Envato Tuts + tutorials en andere series wilt volgen, ga dan naar mijn instructeurspagina of volg @reifman.