使用Twitter API进行构建:管理列表

最终产品图片
您将要创造的

这是我们更广泛的Twitter API系列 文章中的Twitter List API教程的第二部分。 在本教程中,我们将逐步介绍如何使用API​​构建列表功能。 Github存储库中提供了代码示例。 此处详细描述安装说明(请确保使用本教程提供的存储库,而不要使用该页面上列出的初始Birdcage存储库)。

Twitter List API概述

同样, Twitter列表大约有19种API ,分为三个主要区域:

让我们从整合List API开发的一些基本功能开始。

建立清单

加载Birdcage时,您会看到“ 管理列表”页面。 单击右侧栏菜单中的创建列表选项。

Twitter List API管理列表为空

将显示“ 创建列表”表单。 我将创建一个在Twitter上跟踪西雅图记者的列表:

Twitter List API创建列表

这是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 API创建后管理Twittert列表

将成员导入列表

Twitter List用户界面最令人沮丧的限制之一是添加成员有多么困难。 您必须访问每个成员并将其分别添加到列表中-该过程非常复杂且缓慢。

我们将实现一项功能,以订阅以逗号分隔的Twitter帐户列表。

在列表视图中,如果单击Seattle Journalists右边的Manage List图标,您将看到View List页面:

Twitter List API查看列表成员为空

单击右侧栏菜单中的导入成员 。 然后,输入要添加到该列表的Twitter帐户列表:

Twitter List API将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();
    	}
  	}

提交成员后,您将看到以下内容:

Twitter List API查看列表成员

tbd代表我们数据库中还没有的用户; 稍后将在后台获取(水合)配置文件信息。

在Twitter上,您将看到以下内容:

Twitter上的Twitter List API列表成员视图

同步清单

现在,我们已经创建了一个列表,让我们获取帐户中已经存在的列表,以便我们可以从控制台对其进行管理。 同样,从“ 管理列表”菜单中,单击“ 同步列表”

Twitter List API管理列表

同步操作编码在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管理列表

后台任务完成后,您将看到每个列表的成员,如下所示:

Twitter List API查看列表成员

下一步是什么?

希望您到目前为止喜欢这个Twitter List API系列。 我想听听您对喜欢的API场景和功能要求的建议; 请在评论中发布它们。

如果您有任何问题或建议,请在评论中发布。 如果您想了解我将来的Tuts +教程和其他系列,请访问我的讲师页面关注@reifman

相关链接

翻译自: https://code.tutsplus.com/tutorials/building-with-the-twitter-api-managing-lists--cms-22955

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值