欢迎回到我们对Twitter API的介绍 。 如果您使用Twitter,则可能遇到了一个朋友分享@infinite_scream机器人的推文(如上所示)。 我知道它主要是一个机器人,因为它每隔十分钟发一次推文。 但是,它会更改其虚拟尖叫的字符串长度,以避免被Twitter API臭名昭著的未记录限制所阻止。 太频繁地鸣叫或重复相同的内容,您将发现您的漫游器无可救药地被封锁。
最近,一个在线朋友要求我帮助他们为可能会重复但提供一些智能内容变化的机器人程序编写代码。 在今天的教程中,我将介绍如何使用Twitter API进行此操作。
在今天的教程中,我将描述如何构建具有基本功能的机器人:
- 随机鸣叫间隔
- 随机选择状态文本
- 随机选择主题标签
- 随机包含网址
- 避免被Twitter阻止
但是,如果您想使用Twitter API机器人以自己的帐户有效地推广您的产品或服务,而又不会惹恼您的追随者,则需要编写代码,以有组织的方式智能地改变推文的主题,内容和频率。 我将在以后的情节中讲述如何做到这一点。
如果您有任何疑问或想法,请在下面的评论中发布。 如果您想查看我的其他Envato Tuts +教程,请访问我的讲师页面 ,尤其是我的入门系列 。 让我们开始吧。
入门
对于第1集中的机器人,我试图定期生成有趣的推文,同时避免使伟大的Twitter God of Restricted Access in the Sky不安。
该推文内容非常简单,可以通过组合先前编写的状态文本,#标签和URL来随机创建。
该机器人运行在基于PHP的流行平台Yii中。 对于直接的PHP开发人员,我将使下面的指南相当简单。 但是,我鼓励您使用框架。 您可以在我的Yii系列中了解更多信息 。
建立机器人
注册Twitter应用
基本上,我要做的第一件事是注册一个应用程序以获取我的Twitter密钥:
创作一系列推文的内容
我想创建一个系统,让我的朋友(或任何认可的作者)可以编写各种推文,并将其放置在数据库中以供持续使用。 首先,我创建了一个数据库迁移来为他们构建表。
我针对该项目的所有表均具有前缀norm_
。 这是Tweet表或norm_tweet
:
<?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.' NOT NULL',
'media_id' => Schema::TYPE_STRING.' NOT NULL',
], $tableOptions);
}
public function down()
{
$this->dropTable('{{%norm_tweet}}');
}
}
接下来,我使用Yii的Gii脚手架系统为我创建模型和CRUD文件。 这是模型:
这是CRUD一代:
因此,所有这些代码都会自动提供下面的网格视图和编辑功能。
目前,我不使用媒体ID,该ID用于上传的图像在推文中使用。 我可能会在下一集中解决这个问题。
到目前为止非常简单,对吧?
添加一系列标签
然后,我对其他模型重复此过程。 这是标签的norm_hash
迁移:
<?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.' NOT NULL',
], $tableOptions);
}
public function down()
{
$this->dropTable('{{%norm_hash}}');
}
}
这个想法是在推文中随机包含一个选定的主题标签(或两个),以使该机器人看起来像是人,从而改变了其推文。
这是Hashtag UX:
我不会从上面重复Yii Gii步骤,但我norm_hash
对norm_hash
和norm_url
重复它们。
添加各种URL
这是用于添加URL的数据库迁移:
<?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.' 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}}');
}
}
僵尸主机可能会在不同时间添加URL。 对于这个机器人来说,最好不要使用旧的URL或重复使用它们。 Unix时间戳记last_used
和created_at
允许以下描述的推文算法决定何时使用URL。
这是URL UX页面:
现在,让我们看一下将所有这些表组合成有趣的tweets的有趣算法,这些消息不会对Twitter的Master of Restrictions造成困扰。
随机化Bot Tweets的内容
拥有一个可以发布多种内容的自动程序很有趣,但是多种功能也有助于防止Twitter阻止它。
您可以在此处看到Twitter的速率限制 ,但是内容重复的某些规则似乎没有记录在案:
我从我的朋友那里得到了有关他们如何希望该算法从推文,主题标签和URL的数据库中构建推文的指示。
这是我们现在决定的构建算法; 调整很容易。 我将分部分描述。
在我看来,以下算法在使用井号和URL时使用率较低,如果您想要更丰富的内容,请根据自己的喜好进行更改。
首先,我们use yii\db\Expression;
从表中正确选择一个随机的单个tweet文本:
<?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();
然后,我们决定是否使用#号标签(当前占5%或20%的时间中的1个)以及要使用多少个标签(目前仅固定为1个):
// 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; // rand(1,3);
// 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可能在过期前只能使用一次,两次或可能三次。
// 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%的机会):
$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调用控制台控制器。 因此,我在crontab中添加了对/console/DaemonController.php的调用。
$ sudo crontab -l
这是我的任务安排方式:
# m h 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
需要请求/console/DaemonController.php中的daemon/hourly
hour。 我们的机器人应用程序仅决定是否每四个小时发一次推文。
首先,您将看到我没有在上面描述的NormLog
表,但是该表跟踪所有输出以及发推的时间。 因此,我的朋友不想每天发送超过一次的推文。
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.' '.$nl->created_at.'...';
echo 'dayago: '.$dayAgo.'...';
if ($nl->created_at<$dayAgo) {
// okay to maybe tweet
...
我们不希望我们的机器人的追随者被高频推文惹恼。
然后,我们选择一个数字,基本上是每天六次(每四个小时一次),如果该数字是6(或每12个机会中的一个),则鸣叫。
// 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
}
}
将推文传递到Twitter API
这是守护进程调用以发布tweet的NormTweet::deliver()
方法:
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文件中配置的:
$ 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'],
],
];
机器人并不简单,但是很有趣 !
检查结果
这是我们的漫游器的结果:
开玩笑吧 ! 那是社论女神之一, 汤姆·麦克法林 ( Tom McFarlin) 。 AI脚本还不能替代他的“见解”,但是Envato Tuts +已聘请我来从事此工作。
这是实际的机器人,旨在提醒我的朋友及其追随者,美国的新政治并非完全正常。 我想您会同意您的任何观点。
希望您喜欢这个情节。
下一步是什么?
接下来,我将创建一个更受市场驱动的平台,以帮助您使用Twitter API来促进您的启动,服务和业务,而不会被标记为漫游器。
如果您对本教程有任何疑问或建议,请在评论中发布它们。 如果您想了解我将来的Envato Tuts +教程和其他系列,请访问我的讲师页面或关注@reifman 。
相关链接
翻译自: https://code.tutsplus.com/tutorials/using-the-twitter-api-to-tweet-repetitive-content--cms-28096