Bulgarian (Български) translation by Radoslav Ivanov (you can also view the original English article)



Добре дошли! Знам, че мина известно време от последния път когато добавих урок към нашата Twitter API поредица, но просто бях доста зает. Първо беше мозъчния тумор, след това роботизираната радиохирургия, после продължаващата Yii Programming Поредица и свързаните с нея поредици и накрая стартирането на Meeting Planner.
Реших да напиша днешния урок с помощта на Twitter API за добавяне на приятели (както Twitter нарича хората, които следвате).
Защо? Ами, странните Президентски Избори в САЩ от 2016-а, подчертаха, някои злоупотреби и тормоз, които текат всекидневно в Twitter, нещо за което компания е направила много малко, за да го филтрира — и като програмисти, ние знаем, че това не е толкова трудно. Те просто се страхуват да не изгубят аудиторията си от плачевни хейтъри, които носят значителен дял от приходите от реклама.
Много жени спряха да използват услугата, заради постояния тормоз — за което Twitter понякога се извинява, казвайки, че те се опитват да позволят възможност за свободна на словото. Честно казано няма свобода на словото, когато обидите и тормоза са безкрайно настояще.
Също така има статии, които подчертават, че последователите на много от хората са предимно мъже. И при все, че Twitter не изисква информация от потребителите за техния пол, компанията разполага с тази информация анализирайки акаунтите за нейните рекламодатели.
И вие може да надникнете в собствените демографски прогнози на Twitter в страниците им за анализ. Както може да видите по-долу, от Twitter са изчислили, че 69 % от моите последователи са мъже.



Изгубени в глъчката женските гласове може да са по-трудни за откриване в Twitter. Но те са там. Според репорти на Pew, 21% от жените в Интернет използват Twitter, докато този процент при мъжете е 25%.



Така че днес, ще ви покажа как да използвате Yii2 фреймуърк за PHP за да получите достъп до Twitter API и да автоматизирате добавянето на нови последователи в Twitter. (Ако искате да научите повече за Yii2, разгледайте и нашата паралелна поредица Програмиране с Yii2.)
И аз създадох уеб сайт, Twixxr.com, който ще ви демонстрира тази функционалност чрез, която може да добавите видни жени в Twitter към вашия акаунт, за да ги следвате.
Ако имате някакви въпроси или коментари, моля публикувайте ги по-долу в коментарите или ме намерете в Twitter @reifman.
Поглеждайки назад: Twitter API Уроци
Макар, че съм писал няколко Twitter API урока в миналото, всички те са базирани на версия Yii 1.x. Yii2 вече от дълго време се използва и докато Аз все пак съм писал за OAuth ауторизация, не съм писал за аспектите отностно тази част от API, които засягат вашия собствен акаунт и/или ауторизираните акаунти за ъпгрейднатата версия на фреймуърка. И това не беше лесно - там все още нямаше много Yii2 плъгини за Twitter.
Ето и някои от предишните ми уроци за да ги прегледате:
- Twitter APIСъздадено с Twitter API: Първи стъпкиJeff Reifman
- PHPСъздадено с Twitter API: OAuth, Четене и ПубликуванеJeff Reifman
- PHPСъздадено с Twitter API: Използване на Стриймове в реално време.Jeff Reifman
- PHPСъздадено с Twitter API: Повтаряне на Туйтове от ГрупаJeff Reifman
- Twitter APIСъздадено с Twitter API: Туйт БуриJeff Reifman
Днешният урок, не просто ще ви преведе през използването на OAuth за удостоверяване на потребителския профил, но също така ще ви покаже как да добавите приятели в профила си с помощта на достъпа, който са ви дали.
Използване на TwitterOAuth PHP Библиотека
За съжаление, не можах да намеря стабилно работеща добавка за Yii2, така че ще използвам общата Twitter OAuth PHP Библиотека за да създам, мой собствен Twitter модел.
Много от комплексните API интерфейси не предоставят добра документация, но в случая оценявам подробната стъпка по стъпка документация която TwitterOAuth предоставя. Това е невероятно полезно:



Продуктови Цели на Услугата
Twixxr услугата ще удостовери посетителите на сайта и след това автоматично ще добави нови приятели към техните акаунти. Приятелите ще бъдат избрани от над 600 влиятелни жени, които съм идентифицирал в Twitter:



Нека да започнем с разходката през кода.
Удостоверяване на Потребител
Моят TwitterController.php има два основни метода, Request и Return. Ето Request метода:
public function actionRequest() { if (Yii::$app->user->isGuest) { // user has not logged in to yii site $t = new Twitter(); $url = $t->getAuthorizeUrl(); $this->redirect($url); } else { // already verified with us, look up their access keys $t = new Twitter(); $t->refreshConnection(Yii::$app->user->getId()); $this->goHome(); } }
Twitter.php модела извикан в new Twitter();
получава уникален getAuthorizeURL()
за да пренасочите потребителя към Twitter страницата за удостоверяване, например: https://api.twitter.com/oauth/authorize?oauth_token=q-7ChxxxxxxxxnpXAAABzzzzzzz6E:



След като потребителя ауторизира вашето приложение в Twitter, той ще бъде пренасочен обратно към нашия Return метод:
public function actionReturn() { // returning from authentication /* If the oauth_token is old redirect to the connect page. */ if (isset($_REQUEST['oauth_token']) && Yii::$app->session['oauth_token'] !== $_REQUEST['oauth_token']) { Yii::$app->session['oauth_status'] = 'oldtoken'; return $this->goHome(); } $t = new Twitter(); $user_id = $t->getConnection($_REQUEST['oauth_verifier']); $person = new \common\models\User; $identity = $person->findIdentity($user_id); $u = User::findOne($user_id); if ($identity->validateAuthKey($u->auth_key)) { Yii::$app->user->login($identity); } $this->redirect(['twixxr/amplify']); }
Twitter модела използва вашият consumer key и consumer secret за вашето приложение, които сте получили при регистрация в услугата:
<?php namespace frontend\models; use Yii; use yii\base\Model; use common\models\User; use frontend\models\Auth; use Abraham\TwitterOAuth\TwitterOAuth; /** * This is the model class for table "payment". * * @property integer $id * @property integer $user_id * @property string $amount * @property integer $created_at * @property integer $updated_at * * @property User $user */ class Twitter extends Model { public $consumerKey; public $consumerSecret; public $connection; public function init() { $this->consumerKey = Yii::$app->components['authClientCollection']['clients']['twitter']['consumerKey']; $this->consumerSecret = Yii::$app->components['authClientCollection']['clients']['twitter']['consumerSecret']; }
Return метода показан по-горе след като потребителя е регистриран и е записал неговия ключ за достъп до акаунта - това ви позволява да правите API заявки от тяхно име за неопределен период от време:
public function getConnection($oauth_verifier='') { $connection = new TwitterOAuth($this->consumerKey, $this->consumerSecret,Yii::$app->session['oauth_token'],Yii::$app->session['oauth_token_secret']); /* Create TwitteroAuth object with app key/secret and token key/secret from default phase */ $access_token = $connection->oauth("oauth/access_token", ["oauth_verifier" => $oauth_verifier]); /* Save the access tokens. Normally these would be saved in a database for future use. */ $user_id=$this->register($access_token); //Yii::$app->session['access_token'] = $access_token; /* Remove no longer needed request tokens */ unset(Yii::$app->session['oauth_token']); unset(Yii::$app->session['oauth_token_secret']); $this->connection = new TwitterOAuth($this->consumerKey, $this->consumerSecret, $access_token['oauth_token'], $access_token['oauth_token_secret']); return $user_id; } public function register($access_token) { $screen_name = $access_token['screen_name']; $source_id = $access_token['user_id']; $user = User::find()->where(['username'=>$screen_name])->one(); if (is_null($user)) { // sign them up $user = new User(); $user->username = $screen_name; $user->email = $screen_name.'@twixxr.com'; $user->setPassword(Yii::$app->security->generateRandomString(12)); $user->generateAuthKey(); $user->save(); } $auth = Auth::find()->where(['source_id'=>$source_id])->one(); if (is_null($auth)) { // add an auth entry $auth = new Auth(); $auth->user_id = $user->id; $auth->source = 'twitter'; $auth->source_id = $source_id; $auth->screen_name = $user->username; $auth->oauth_token = $access_token['oauth_token']; $auth->oauth_token_secret = $access_token['oauth_token_secret']; $auth->x_auth_expires =0; $auth->save(); } else { $auth->oauth_token = $access_token['oauth_token']; $auth->oauth_token_secret = $access_token['oauth_token_secret']; $auth->update(); } return $user->id; }
За достъп за четене и запис в техните акаунти, аз съм удължил Auth таблицата от опростеното идентифициране описано в нашата Стартъп поредица Опростен Onramp с OAuth за да включа тези допълнителни ключове за верификация.
Аз също ви препоръчвам да преминете наживо стъпка по стъпка в TwitterOAuth. Това е един отличен пример, показващ всичко, което може да правите със собствения си профил в Twitter.
Импортиране на Имена, Профилна Биография и Снимки
След това създадох Twixxr.php модела, който ще осигури редица важни функции, специфични за услугата. Първо създадох Twixxr::loadProfiles()
който да синхронизира имената, биографиите и Twitter свързаните броячи, например профилните снимки, статус постовете, последователите, последваните от всяка идентифицирана жена в моята статична база данни от елементи.
public function loadProfiles() { // clean Item table $this->cleanup(); $t = new Twitter(); $t->refreshConnection(1); // for admin user = 1 $time_stale = time()-(24*3600); $people = Item::find() ->where('updated_at<'.$time_stale) ->orWhere('updated_at=created_at') ->orderBy('rand()')->all(); $cnt=0; foreach ($people as $i) { // to do - or if updated at is stale if ($i->detail=='') { $result = $t->getUsersShow($i->path); echo $i->path.', '; if (isset($result->errors)) { var_dump($result); continue; } if (isset($result->name)) { $i->title = Html::encode($this->removeEmoji($result->name)); if ($i->title=='') { $i->title='n/a'; } } if (isset($result->screen_name)) { $i->path = $result->screen_name; } if (isset($result->description)) { $i->detail=Html::encode($this->removeEmoji($result->description)); } if (isset($result->profile_image_url_https)) { $i->image_url = $result->profile_image_url_https; } $i->validate(); var_dump($i->getErrors()); $i->update(); SocialProfile::fill($i->id,$result); $cnt+=1; if ($cnt>25) exit; } } }
Това се нарича от конзолна cron задача, която ще опиша по-късно в Yii2 поредицата. Така че тези профили са синхронизирани постепенно и многократно през определени интервали през няколко дни.
Следва: Създаде на Приятелство
Не съм го отбелязъл в детайл тук, но като цяло съм създал Log таблица от индивдуални заявки за всеки потребител и акаунт на жена. С други думи, Samuel би имал 500 записа заявки да добави като приятел всяка жена от базата данни.
Първо, обаче, ще се уверя, че Samuel ( и всеки друг потребител на Twixxr ) следва Twixxr_com акаунта.
$result = $t->createFriend('twixxr_com'); $total_request+=1; if ($result !== false) { $action->status = Log::STATUS_COMPLETE; $action->save(); }
Преди cron задачата да обработи тези команди, тя рефрешва Twitter ауторизацията и конекцията за Samuel и за всеки индивидуален потребител на подходящия етап:
$t->refreshConnection($action->user_id);
След това, ето и Twitter::createFriend($screen_name)
метода:
public function createFriend($username) { $add = $this->connection ->post("friendships/create", ["screen_name" => $username]); if ($this->connection->getLastHttpCode() == 200) { // successful return $add; } else { // Handle error case return false; } }
След това, той прави това за всички заявки от жени поискани от Samuel както е детайлно описано в Log таблицата - и разбира се, много неща се случват по-долу, които ще опиша:
echo 'add '.$person->path.' to '.$action->user_id.'<br />'; if ($x>7) { $mode ='limited'; echo 'Limited to max requests per user<br />'; // skip this user and go to next one... continue; // on to next user } $followed_by = $t->getFriendshipsShow($u->username,$person->path); if ($followed_by == -10) { echo 'rate limit error<br />'; $mode ='limited'; // skip this user and go to next one... continue; // on to next user } else if ($followed_by==0) { $x+=1; echo 'request follow<br />'; $result = $t->createFriend($person->path); $total_request+=1; if ($result !== false) { $action->status = Log::STATUS_COMPLETE; $action->completion_at = time(); $action->save(); } else { echo 'skip due to error'; $action->status = Log::STATUS_SKIP_ERROR; $action->completion_at = time(); $action->save(); } } else { echo 'already followed<br /><br />'; $action->status = Log::STATUS_SKIPPED; $action->save(); } }
Twitter API имат много стриктни ограничения отностно броя на заявките, което прави използването на техните API, трудно от време на време. Cron задачата горе създава приятелство за седем целеви акаунта наведнъж, преди да превключи към друга потребителска заявка и да я извика отново по-късно.
Това тук е Twitter::getFriendshipsShow()
, който проверява дали този акаунт вече следва желания акаунт. В горния код, той прескача заявки, които са излишни, за да се вмести в ограничението на скоростта за изпълнение на заявки.
public function getFriendshipsShow($source_name,$target_name) { $result = $this->connection->get("friendships/show", ["source_screen_name" => $source_name,"target_screen_name" => $target_name]); if (isset($result->errors)) { if ($result->errors[0]->message=='Rate limit exceeded') { return -10; } } else { if (isset($result->relationship->target->followed_by)) { if ($result->relationship->target->followed_by) { return 1; } else { return 0; } } } return -1; }
В близко бъдеще ще приложа Twitter's bulk API за това, правейки само една заявка вместо стотици за всеки потребител използващ get/friendships/lookup. Обърнете внимание, че ще ви трябва акаунт на разработчик за достъп до тази страница.
Unfollow: Прекратяване на Приятелство
Вие също така можете да отмените тези приятелства чрез API:
$statuses = $connection->post("friendships/destroy", ["screen_name" => $u]);
Аз записвам в лог всяка конекция, която Twixxr прави, и ако Twitter API лимитите бяха по-малко обременяващи и отнемащи време, щях да позволя на потребителите да имат функция за отмяна в Twixxr, за да прекратят следването на жените, ако не харесват всичкит тези нови акаунти.
Производителност
Направих много в Twixxr за управление на производителността. Като цяло, направих log таблица, за да записвам бързо всички потребителски заявки за пирятелство. Но всички те се обработват във фонов режим.
За съжаление Twitter API не дава възможност за публикуване на списък на акаунти за следване в насипно състояние. Така просто няма начин, това да стане в реално време докато потребителя е на вашия сайт.
Така че потребителят отговор на Twixxr заявката е незабавна, но това може да отнеме няколко часа или повече за всички акаунти да бъдат последвани.
Тук е TwixxrController.php следвайки All метода:
public function actionAll() { // make request for authenticated user to follow all twitter profiles $x = new Twixxr(); $x->followTwixxr(Yii::$app->user->getId()); $x->followAll(Yii::$app->user->getId()); Yii::$app->getSession()->setFlash('success', Yii::t('frontend','Your request has been added to our queue.')); $this->redirect(['twixxr/complete',['task'=>'all']]); // redir home }
Тук са Twixxr::followAll
и followCount
методите, които също се използват от номерираните бутони по-горе, за следване на 100, 200, 300 жени и т.н.
public function followAll($user_id) { $allWomen = Item::find()->count(); $this->followCount($user_id,$allWomen); } public function followCount($user_id,$cnt=100) { $women = Item::find()->orderBy('rand()')->limit($cnt)->all(); foreach ($women as $w) { $l = Log::find() ->where(['user_id'=>$user_id,'item_id'=>$w->id]) ->one(); if (!is_null($l)) { $l->status = Log::STATUS_PENDING; $l->update(); } else { $l = new Log(); $l->user_id = $user_id; $l->item_id = $w->id; $l->event_id = Twixxr::EVENT_ADD; $l->status = Log::STATUS_PENDING; $l->save(); } } }
Те просто създават Log записи за всяка заявка за приятелство за да може cron задачата да ги обработи във фонов режим.
Какво следва?
Надявам се че сте доволни от наученото отностно използването на TwitterOAuth.php в Yii2 и как да удостоверите и приложите Twitter API от името на потребителите на сайта ви.
Следващото за което бих искал да използвам Twitter API е да анализирам моите собствени последователи. Имам съмнение, че огромна част от Twitter последователите ми са спам ботове и бих искал да използвам API за да докажа това. Останете на линия.
Ако имате някакви въпроси или предложения, моля публикувайте ги в коментарите. Ако искате да сте информирани за бъдещи мои Envato Tuts+ уроци и други серии от уроци, моля, посетете страницата ми като инструктор или ме последвайте на @reifman. Определено вижте и моите стартъп серии и Meeting Planner.