这是我们更广泛的Twitter API系列 文章中的Twitter List API教程的第二部分。 在本教程中,我们将逐步介绍如何使用API构建列表功能。 Github存储库中提供了代码示例。 此处将详细描述安装说明(请确保使用本教程提供的存储库,而不要使用该页面上列出的初始Birdcage存储库)。
Twitter List API概述
同样, Twitter列表大约有19种API ,分为三个主要区域:
让我们从整合List API开发的一些基本功能开始。
建立清单
加载Birdcage时,您会看到“ 管理列表”页面。 单击右侧栏菜单中的创建列表选项。
将显示“ 创建列表”表单。 我将创建一个在Twitter上跟踪西雅图记者的列表:
这是TwitterlistController.php
的Create代码。 它处理用于显示表单的代码,并在表单发布后处理代码:
public function actionCreate()
{
$model=new TwitterList;
$this->performAjaxValidation($model);
if(!isset($_POST['TwitterList'])) {
// initial load
// load the current selected account as a default
$model->account_id = Yii::app()->session['account_id'];
// display form
$this->render('create',array(
'model'=>$model,
));
} else {
// POSTed - process form
$model->attributes=$_POST['TwitterList'];
// load the account selected
$account = Account::model()->findByPK($model->account_id);
// connect to twitter
$twitter = Yii::app()->twitter->getTwitterTokened($account['oauth_token'], $account['oauth_token_secret']);
// create remotely at Twitter
$new_list= $twitter->post("lists/create",array('name'=>$model->name,'description'=>$model->description,'mode'=>$model->getModeString($model->mode)));
if (TwitterList::model()->isError($new_list)) {
// to do - set flash error
var_dump($new_list);
yexit();
} else {
$model->owner_id =$account->twitter_id;
$model->list_id =$new_list->id_str;
$model->slug=$new_list->slug;
$model->full_name=$new_list->full_name;
$model->created_at = date( 'Y-m-d H:i:s', strtotime($new_list->created_at) );
$model->modified_at =new CDbExpression('NOW()');
if($model->save())
$this->redirect(array('admin'));
}
}
}
您可以在此处阅读有关Twitter Lists / Create API的文档。
提交表单后,您将看到类似以下内容:
将成员导入列表
Twitter List用户界面最令人沮丧的限制之一是添加成员有多么困难。 您必须访问每个成员并将其分别添加到列表中-该过程非常复杂且缓慢。
我们将实现一项功能,以订阅以逗号分隔的Twitter帐户列表。
在列表视图中,如果单击Seattle Journalists右边的Manage List图标,您将看到View List页面:
单击右侧栏菜单中的导入成员 。 然后,输入要添加到该列表的Twitter帐户列表:
让我们回顾一下将成员上传到Twitter的代码。 用于显示上述表单的代码从ListMemberController.php
开始:
/**
* Import members to a list
*/
public function actionImport($id)
{
$model = new Import();
$model->list_id = $id;
// Uncomment the following line if AJAX validation is needed
$this->performAjaxValidation($model);
if(isset($_POST['Import']))
{
if($model->save()) {
$result = ListMember::model()->import($id,$_POST['Import']['member_list']);
Yii::app()->user->setFlash('import_success','Thank you! Your members have been added.');
$this->redirect(array('/twitterlist/view','id'=>$id));
} // end if save
// end if post
} else {
$this->render('import',array(
'model'=>$model,'list_id'=>$id,
));
}
}
在ListMember.php
模型中,导入代码如下所示。 我们使用preg_split
将帐户列表转换为数组。 然后,对于每个帐户,我们在Users / Show上获取有关该帐户的信息,并将Twitter ID发布到Lists Member Create 。
public function import($id,$import_list) {
// retrieve account
$tl = TwitterList::model()->findByAttributes(array('id'=>$id));
$list_id = $tl['list_id'];
$account = Account::model()->findByPk($tl->account_id);
// retrieve members and add to list
$twitter = Yii::app()->twitter->getTwitterTokened($account['oauth_token'], $account['oauth_token_secret']);
// convert post rows to array
$add_list = preg_split ("(\r|\n|,)", $import_list, -1, PREG_SPLIT_NO_EMPTY);
$max_count = 0;
foreach ($add_list as $item) {
$item = trim($item);
$user_info= $twitter->get("users/show",array('screen_name'=>$item));
if (ErrorLog::model()->isError('getUserInfo', $account['id'], $user_info)) {
continue;
}
if (ErrorLog::model()->isRateLimited($user_info)) {
continue;
}
// add remotely to list
$people= $twitter->post("lists/members/create",array('list_id'=>$list_id,'screen_name'=>$item));
// add locally to db
$this->remote_add($list_id,$user_info->id_str,$item);
$max_count+=1;
if ($max_count>=99) break;
}
}
public function remote_add($list_id,$member_id,$screen_name = 'tbd') {
TwitterUser::model()->setPlaceholder($member_id,$screen_name);
$lm = ListMember::model()->findByAttributes(array('list_id'=>$list_id,'member_id'=>$member_id));
if (empty($lm)) {
$lm = new ListMember;
$lm->list_id=$list_id;
$lm->member_id=$member_id;
$lm->save();
}
}
提交成员后,您将看到以下内容:
tbd
代表我们数据库中还没有的用户; 稍后将在后台获取(水合)配置文件信息。
在Twitter上,您将看到以下内容:
同步清单
现在,我们已经创建了一个列表,让我们获取帐户中已经存在的列表,以便我们可以从控制台对其进行管理。 同样,从“ 管理列表”菜单中,单击“ 同步列表” 。
同步操作编码在TwitterlistController.php
:
public function actionSync()
{
TwitterList::model()->sync();
$this->redirect(array('admin'));
}
TwitterList.php
模型同步操作相对复杂,如下所示。 首先,同步模型循环遍历您配置的syncOne
帐户,并调用syncOne
帐户获取列表。
SyncOne在API中调用获取列表/所有权 ,以查找每个帐户拥有的所有列表。
public function sync() {
$users = User::model()->findAll();
foreach ($users as $user) {
$user_id = $user['id'];
$accounts = Account::model()->findAllByAttributes(array('user_id'=>$user_id));
// loop through Twitter accounts (may be multiple)
foreach ($accounts as $account) {
$this->syncOne($account['id']);
} // end account loop
} // end user loop
}
public function syncOne($account_id) {
$account=Account::model()->findByPk($account_id);
$twitter = Yii::app()->twitter->getTwitterTokened($account['oauth_token'], $account['oauth_token_secret']);
// fetch lists owned by this account
$twitter_lists= $twitter->get("lists/ownerships",array('count'=>100,'cursor'=>-1));
//print_r($twitter_lists);
if (count($twitter_lists->lists)==0) return;
foreach ($twitter_lists->lists as $tl) {
//echo $tl->id_str.' '.$tl->slug.' '.$tl->member_count;lb();
$this->remote_add($account_id,$tl);
// spawn action to get list members
$this->addMembershipAction($account_id,$tl->id_str);
} // end loop of lists
}
但是,与其尝试实时获取列表的成员(这可能会超时),不如创建一个后台操作以获取给定列表的成员。
public function addMembershipAction($account_id,$item_id) {
// adds a background task action to retrieve memberships for a list id
$check_dup = Action::model()->findByAttributes(array('account_id'=>$account_id,'action'=>Action::ACTION_MEMBERSHIPS,'status'=>Action::STATUS_ACTIVE,'item_id'=>$item_id));
if (empty($check_dup)) {
$a = new Action();
$a->account_id = $account_id;
$a->action = Action::ACTION_MEMBERSHIPS;
$a->item_id = $item_id;
$a->last_tweet_id = 0; // set cursor
$a->status = Action::STATUS_ACTIVE;
$a->created_at =new CDbExpression('NOW()');
$a->modified_at =new CDbExpression('NOW()');
$a->save();
}
}
后台cron任务调用Action.php
模型,该模型一次调用一个列表的getListMembership
。
public function getListMembership($action,$limit = 50) {
// collect next $limit members of list
$account = Account::model()->findByPk($action->account_id);
// last_tweet_id is the cursor
$cursor = $action->last_tweet_id;
if ($cursor ==0 ) $cursor =-1; // since last_tweet_id is unsigned, can't store -1 start
$result = TwitterList::model()->getMemberships($account, $action->item_id, $cursor , $limit);
$a = Action::model()->findByPk($action->id);
if ($result->rateLimit) {
return false;
} else if ($result->complete) {
$a->status=self::STATUS_COMPLETE;
$a->save();
} else {
// set lowest cursor
$a->last_tweet_id = $result->cursor;
$a->save();
}
}
任务运行时,它将调用TwitterList.php
模型的getMemberships
方法。 此方法使用游标来翻阅成员记录,而不会超时或未达到速率限制。 最后一个游标存储在“动作”表中,以便下一个后台调用可以继续添加成员,该成员先前位于其上。
public function getMemberships($account,$list_id, $cursor =-1,$limit = 200) {
echo 'entering getMemberships: account_id:'.$account['id'].' list_id:'.$list_id.' cursor: '.$cursor;lb();
$result = new StdClass;
$result->cursor = -1;
$result->count =0;
$result->error =false;
$result->complete = false;
$result->rateLimit = false;
$count_people = 0;
// retrieve members and add to list
$twitter = Yii::app()->twitter->getTwitterTokened($account['oauth_token'], $account['oauth_token_secret']);
echo 'here'.$cursor;lb();
while ($cursor <>0 ) {
echo 'inside';lb();
$people= $twitter->get("lists/members",array('list_id'=>$list_id,'cursor'=>$cursor,'skip_status'=>true,'include_entities'=>false));
if (ErrorLog::model()->isError('getMemberships', $account['id'], $people)) {
$result->error =false;
return $result;
}
if (ErrorLog::model()->isRateLimited($people)) {
$result->rateLimit = true;
return $result;
}
if (isset($people->next_cursor))
$cursor = $people->next_cursor;
else
$cursor = 0;
$result->cursor = $cursor;
$count_people+=count($people->users);
echo 'Count people: '.count($people->users);lb();
foreach ($people->users as $u) {
//var_dump($u);lb();
echo 'Member:'.$u->screen_name;lb();
if (isset($u->screen_name))
$screen_name = $u->screen_name;
else
$screen_name = 'tbd';
ListMember::model()->remote_add($list_id,$u->id_str,$screen_name);
}
if (count($people->users)==0 or $cursor==0) {
$result->complete = true;
return $result;
}
} // end while loop
echo 'exiting getMemberships';lb();
return $result;
}
操作完成后,您应该会看到以下内容:
后台任务完成后,您将看到每个列表的成员,如下所示:
下一步是什么?
希望您到目前为止喜欢这个Twitter List API系列。 我想听听您对喜欢的API场景和功能要求的建议; 请在评论中发布它们。
如果您有任何问题或建议,请在评论中发布。 如果您想了解我将来的Tuts +教程和其他系列,请访问我的讲师页面或关注@reifman 。
相关链接
翻译自: https://code.tutsplus.com/tutorials/building-with-the-twitter-api-managing-lists--cms-22955