Статьи

Использование Twitter API для чирикания повторяющегося контента

Конечный продукт
Что вы будете создавать

Добро пожаловать в наш обзор Twitter API . Если вы пользуетесь Twitter, вы можете встретить друга, который делится твитами с бота @infinite_scream (как показано выше). Я знаю, что это в основном бот, потому что он чирикает с десятиминутными интервалами. Но он изменяет длину строки своих виртуальных криков, чтобы избежать блокировки печально известными недокументированными ограничениями API Twitter. Чирикать слишком часто или повторять тот же контент, и вы обнаружите, что ваши боты безнадежно заблокированы.

Недавно один онлайн-друг попросил меня помочь им написать код для бота, который мог бы повторяться, но предлагал некоторые интеллектуальные варианты контента. В сегодняшнем уроке я напишу, как это сделать с помощью API Twitter.

В сегодняшнем уроке я опишу, как создать бота, который делает основы:

  • случайный интервал твита
  • случайный выбор текста статуса
  • случайный выбор хэштегов
  • случайное включение URL
  • не быть заблокированным Twitter

Однако, если вы хотите использовать бота Twitter API для эффективного продвижения вашего продукта или услуги в своей учетной записи, не раздражая своих подписчиков, вам нужно написать код, который разумно меняет тему, содержание и частоту ваших твитов организованным образом. Я буду писать о том, как это сделать в следующих эпизодах.

Если у вас есть какие-либо вопросы или идеи, пожалуйста, оставьте их в комментариях ниже. Если вы хотите посмотреть другие мои учебники по Envato Tuts +, пожалуйста, посетите мою страницу инструктора , особенно мою серию стартапов . Давайте начнем.

Для бота в первом эпизоде ​​я пытаюсь генерировать веселые твиты на регулярной основе, избегая при этом расстраивать великого Бога ограниченного доступа Twitter в небесах .

Содержимое твита очень простое и может быть создано случайным образом путем комбинирования ранее написанного текста статуса, хэштегов и URL-адресов.

Бот работает в Yii, популярной платформе на основе PHP. Я оставлю руководство ниже довольно простым для простых разработчиков PHP. Тем не менее, я призываю вас использовать фреймворки. Вы можете узнать больше в моей серии Yii .

По сути, первым делом я зарегистрировал приложение, чтобы получить ключи от Twitter:

Повторяя API Twitter - Настройка вашего приложения Twitter

Если вы не знакомы с созданием приложения и авторизацией доступа к API через Twitter, просмотрите некоторые из наших предыдущих руководств:

  • Сборка с помощью API Twitter: начало работы

  • Создание с помощью API Twitter: Tweet Storms

  • Создание вашего стартапа с помощью PHP: упрощение Onramp с помощью OAuth

Я хотел создать систему, в которой мой друг (или любой другой утвержденный автор) мог бы писать варианты твитов и помещать их в базу данных для дальнейшего использования. Сначала я создал миграцию базы данных, чтобы создать для них таблицу.

Все мои таблицы для этого проекта имеют префикс norm_ . Вот таблица Tweet или norm_tweet :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
 use yii\db\Schema;
 use yii\db\Migration;
 class m170120_211944_create_table_norm_tweet extends Migration
 {
   public function up()
   {
       $tableOptions = null;
       if ($this->db->driverName === ‘mysql’) {
           $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB’;
       }
 
       $this->createTable(‘{{%norm_tweet}}’, [
           ‘id’ => Schema::TYPE_PK,
           ‘tweet’ => Schema::TYPE_TEXT.’
           ‘media_id’ => Schema::TYPE_STRING.’
       ], $tableOptions);
 
   }
 
   public function down()
   {
 
     $this->dropTable(‘{{%norm_tweet}}’);
   }
 }

Затем я использовал систему лесов Yii для создания модели и файлов CRUD. Вот модель:

Повторяя API Twitter - Yiis Gii Scaffolding Model Generator

А вот поколение CRUD:

Повторяя API Twitter - Yiis Gii Scaffolding CRUD Generator

Таким образом, весь этот код автоматически обеспечивает вид сетки ниже и возможности редактирования.

Повторяя API Twitter - Авторские твиты UX

На данный момент я не использую Media ID, который предназначен для изображений, загружаемых для использования в твитах. Я, вероятно, расскажу об этом в следующем эпизоде.

Пока довольно просто, верно?

Затем я повторяю этот процесс для других моделей. Вот миграция norm_hash для хэштегов:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 use yii\db\Schema;
 use yii\db\Migration;
 class m170120_212009_create_table_norm_hash extends Migration
 {
   public function up()
   {
       $tableOptions = null;
       if ($this->db->driverName === ‘mysql’) {
           $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB’;
       }
 
       $this->createTable(‘{{%norm_hash}}’, [
           ‘id’ => Schema::TYPE_PK,
           ‘tag’ => Schema::TYPE_STRING.’
       ], $tableOptions);
 
   }
 
   public function down()
   {
 
     $this->dropTable(‘{{%norm_hash}}’);
   }
 }

Идея состоит в том, чтобы случайным образом включить выбранный хэштег (или два) в твиты, чтобы создать впечатление, что бот — человек, изменяющий свои твиты.

Вот хэштег UX:

Повторяя API Twitter - Авторские хэштеги UX

Я не буду повторять шаги Yii Gii сверху, но я повторю их и для norm_hash и norm_url .

Вот миграция базы данных для добавления URL:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
 use yii\db\Schema;
 use yii\db\Migration;
 class m170120_211955_create_table_norm_url extends Migration
 {
   public function up()
   {
       $tableOptions = null;
       if ($this->db->driverName === ‘mysql’) {
           $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB’;
       }
 
       $this->createTable(‘{{%norm_url}}’, [
           ‘id’ => Schema::TYPE_PK,
           ‘url’ => Schema::TYPE_STRING.’
           ‘last_used’ => Schema::TYPE_INTEGER .
           ‘created_at’ => Schema::TYPE_INTEGER .
           ‘updated_at’ => Schema::TYPE_INTEGER .
       ], $tableOptions);
 
   }
 
   public function down()
   {
 
     $this->dropTable(‘{{%norm_url}}’);
   }
 }

Мастер бота может добавлять URL в разное время. Вероятно, для этого бота лучше не использовать старые URL-адреса или повторять их. last_used created_at Unix last_used и last_used позволяют описанному ниже алгоритму твита решать, когда использовать URL-адреса.

Вот страница URL UX:

Повторяя API Twitter - Добавление URL UX

Теперь давайте рассмотрим забавный алгоритм объединения всех этих таблиц в интересные твиты, которые не раздражают главного повелителя ограничений Twitter .

Забавно иметь бота, который пишет в Твиттере различный контент, но он также помогает предотвратить его блокировку в Твиттере.

Вы можете увидеть ограничения скорости Twitter здесь , но некоторые правила для повторения контента не документированы:

Повторение Twitter API - График ограничения скорости

Я получил указания от моего друга о том, как они хотели, чтобы алгоритм создавал твиты из базы данных твитов, хэштегов и URL-адресов.

Вот алгоритм сборки, который мы определили на данный момент; это легко настроить. Я опишу это по частям.

По моему мнению, алгоритм ниже использует хэштеги и URL-адреса, и если вы хотите более разнообразный контент, измените его по своему вкусу.

Сначала мы use yii\db\Expression; чтобы правильно выбрать случайный одиночный текст твита из таблицы:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
 
namespace frontend\models;
 
use Yii;
use yii\db\Expression;
 
 
public static function build() {
  // pick a random tweet message (any one of them)
  $txt = NormTweet::find()
  ->orderBy(new Expression(‘rand()’))
  ->one();

Затем мы решаем, использовать ли хэштег (в настоящее время 1 из 5 или 20% времени) и сколько использовать (в настоящее время установлен только один):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
// decide whether to use a hashtag
// pick a random # between 0 and 4
$useHash = rand(0,4);
// if rand# is not 0 but instead 1,2,3 or 4, include hashtag(s)
// for less freq use of hash tags, we can change this > 2 or >3
if ($useHash>3) {
  // so we’re now going to decide which and how many hash tags to
  // Creator decided to only use one hashtag for right now
    $numHash = 1;
    // select this rand# $numHash randomly from our list
    $hash = NormHash::find()
    ->orderBy(new Expression(‘rand()’))
    ->one();
} else {
  // don’t use any hashtags
  $hash=false;
}

Затем мы решаем, есть ли доступный для использования URL. URL-адреса должны быть не старше недели, и их можно использовать только один раз каждые 72 часа (3 дня). Таким образом, любой новый URL может быть доступен для использования только один, два или, возможно, три раза до истечения срока действия.

1
2
3
4
5
6
7
8
// only use a url if it’s less than a week old
 $url_weekago = time()-7*24*3600;
 $url_3daysago = time()-3*24*3600;
 // only use a url if it’s not been posted in the last 72 hrs
 $url= NormUrl::find()
   ->where(‘created_at>’.$url_weekago)
   ->andWhere(‘last_used<‘.$url_3daysago) // handles unused zero case
   ->orderBy([‘id’ => SORT_DESC])->one();

Наконец, мы создаем твит на основе выбранных данных (доступные URL добавляются только один раз в четыре раза или с вероятностью 25%):

01
02
03
04
05
06
07
08
09
10
11
$content = $txt->tweet;
 if ($hash!==false) {
   $content.=’ #’.$hash->tag;
 }
 // only add URL 1/4 of the time
 if (!is_null($url) && rand(1,4) ==1) {
   $content.=’ ‘.$url->url;
   $url->last_used = time();
   $url->update();
 }
 return $content;

Yii позволяет вам вызывать консольные контроллеры из cron. Поэтому я добавляю вызов в мой /console/DaemonController.php в crontab.

$ sudo crontab -l

Вот как планируются мои задачи:

1
2
3
4
5
6
# mh dom mon dow command
*/3 * * * * /var/www/bot/yii daemon/frequent
*/15 * * * * /var/www/bot/yii daemon/quarter
0 * * * * /var/www/bot/yii daemon/hourly
15 1 * * * /var/www/bot/yii daemon/overnight
15 3 * * 5 /var/www/bot/yii daemon/weekly

Каждый час запрашивается daemon/hourly hourly в /console/DaemonController.php. Наше приложение для ботов решает, чирикать или нет, каждые четыре часа.

Во-первых, вы увидите, что у меня есть таблица NormLog которую я не описывал выше, но она отслеживает весь вывод и когда были сделаны твиты. Так что мой друг не хотел чирикать чаще, чем раз в день.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public function actionHourly() {
 // every hour
 $current_hour = date(‘G’);
 if ($current_hour%4) {
   // every four hours
   echo «Review tweeting plan…»;
   $dayAgo = time()-24*3600;
   $nl= \frontend\models\NormLog::find()
     ->orderBy([‘id’ => SORT_DESC])
     ->one();
   echo ‘created_at: ‘.$nl->id.’
   echo ‘dayago: ‘.$dayAgo.’…’;
   if ($nl->created_at<$dayAgo) {
     // okay to maybe tweet
   …

Мы не хотели, чтобы последователи нашего бота были раздражены высокочастотными твитами.

Затем мы выбираем число, в основном шесть раз в день (каждые четыре часа), и пишем в Твиттере, если число равно 6 (или шанс один на 12).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
// every four hours, if 6 is picked from 1-12, we tweet
     // 1 in 12 chance 12x in two days
     $r = rand(1,12);
     if ($r==6) {
       \frontend\models\NormTweet::deliver();
       echo ‘tweet, 6 was picked…’;
     } else {
       echo «do not tweet, 1 in 12 # not picked…»;
     }
   } else {
     // never tweet twice in 24 hrs
     echo ‘do not tweet, not yet 24 hrs…’;
   }
   echo ‘..made it to end…!’;
 }
     if ($current_hour%6) {
     // every six hours
   }
   }

Вот метод NormTweet::deliver() вызываемый демоном для публикации твита:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
public static function deliver()
{
    // post an update
    // construct
    $content = NormTweet::build();
    // tweet it using params for 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(«statuses/update»,
        [«status» => $content]);
    // save it in the log
    $nl = new NormLog();
    $nl->tweet = $content;
    $nl->save();
  }
}

Ключи приложения учетной записи Twitter хранятся в /bot/frontend/config/params-local.php, настроенном из файла bot.ini, который я использую:

01
02
03
04
05
06
07
08
09
10
11
12
$ more params-local.php
<?php
return [
‘norm’ => [
     ‘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’],
   ],
 
];

Боты не простые, но они веселые !

Вот результаты нашего бота:

Повторяя API Twitter - Том Макфарлин, главный редактор журнала Goddess

Шучу ! Это одна из редакторских богинь, Том Макфарлин . Сценарии ИИ пока не способны заменить его «идеи», но Envato Tuts + нанял меня для работы над этим.

Вот настоящий бот, призванный напомнить моему другу и его последователям, что новая политика Америки не совсем нормальная. Я представляю, что бы вы ни согласились с этим

Повторение Twitter API - Bot Tweet Stream из учебника

Я надеюсь, вам понравился этот эпизод.

Далее я собираюсь создать платформу, более ориентированную на маркетинг, чтобы помочь вам использовать API Twitter для продвижения вашего стартапа, услуг и бизнеса, не будучи помеченным как бот и заблокированным.

Если у вас есть какие-либо вопросы или предложения по поводу этого урока, пожалуйста, оставьте их в комментариях. Если вы хотите быть в курсе моих будущих уроков Envato Tuts + и других серий, пожалуйста, посетите мою страницу инструктора или следуйте @reifman .