這是我在sf上的第一篇文章。寫基於swoole、Mixphp和CodeIgniter開發的失蹤兒童信息平臺。php
在2017年的時候,關注到有一個「團圓系統」,它是公安部專門爲了快速擴散失蹤兒童消息的平臺,可是網上並無找到這個平臺的地址。固然,偶然在淘寶平臺上找到一個接口,這個接口能夠取得失蹤兒童的數據,後來這個接口提示不能訪問了。那麼若是我想去作這樣的一個失蹤兒童信息平臺的話,就要從另外的地方獲取數據了。mysql
團圓系統的全稱應該是公安部兒童失蹤信息緊急發佈平臺,在新浪微博上有一個官方的微博帳號,經過這個微博帳號發佈兒童失蹤信息。所以在實現「失蹤兒童信息平臺」的第一步就是從微博上去獲取數據,而且這個獲取數據的程序最後能在後臺程序自動運行,這樣就不用人工干預了。sql
我對php語言要熟悉一些,所以在打算本身動手實現這個想法的時候,就選擇了php,另外以前也關注到swoole,swoole拓展了PHPer的能力範圍,再也不侷限於Web開發。進而找了一個比較容易上手的基於swoole的框架MixPHP,所以,在從微博上抓取數據的程序是基於Mixphp寫的,工程結構以下:數據庫
在apps/daemon/commands目錄下新建一個控制器IndexController.php,控制器部分代碼以下:api
<?php /** * Created by PhpStorm. * User: luoam * Date: 2018/4/20 * Time: 22:28 */ namespace apps\daemon\commands; use mix\client\Http; use mix\console\Controller; use mix\swoole\Process; use apps\daemon\commands\SaeTClientV2; use apps\daemon\commands\SaeTOAuthV2; use apps\daemon\commands\Sae; class IndexController extends Controller { // 啓動 public function actionStart() { // 重複啓動處理 if ($pid = Process::getMasterPid(self::PID_FILE)) { return "mix-daemon '{$this->processName}' is running, PID : {$pid}." . PHP_EOL; } // 啓動提示 echo "mix-daemon '{$this->processName}' start successed." . PHP_EOL; // 蛻變爲守護進程 if ($this->d) { Process::daemon(); } // 寫入 PID 文件 Process::writePid(self::PID_FILE); // 修改進程名稱 Process::setName("mix-daemon: {$this->processName}"); // 開始工做 $this->startWork(); } public function startWork() { try { while (true) { //實時採集一次 $sql = "select `itemid` from items where status=:status"; $rows = \mix::app()->rdb->createCommand($sql)->bindParams([ 'status' => '失蹤' ])->queryAll(); if (!empty($rows)) { foreach ($rows as $row) { //採集一次失蹤的, $this->actionDetail($row['itemid']); sleep(5); //再增量採集一次 $this->actionIncrementOnce(); } } } } catch (\Exception $e) { \Mix::app()->error->exception($e); sleep(10); // 休息一會,避免 cpu 出現 100% $this->startWork(); } } }
哦,須要提醒的是,Mixphp須要一些準備條件,在官方文檔中寫的很是詳細。安裝好Mixphp以後就能夠直接運行上面的後臺程序,命令如:swoole
./mix-daemon index/start -d
-d 表示這個進程將在後臺運行。
數據的抓取分爲幾個部分,app
前臺展現,至關於作一個網站,使用的是CodeIgniter框架,這個框架用來作網站,很方便,所以我也一直在用。
整個網站只顯示那些仍然處於失蹤狀態的兒童的信息。頁面的效果大體是這樣的:框架
我在微博開發平臺註冊了一個應用,能夠調用微博的api,所以在數據抓取的程序裏,在數據存到數據庫中的同時會發一條微博。調用的是share接口。使用微博的api的過程是這樣的,先使用oauth獲取到access_token,另外從微博開發平臺找到key和secret,部分代碼以下:codeigniter
$c = new SaeTClientV2(WB_AKEY, WB_SKEY, $access_token); $sus = \mix::app()->rdb->insert('items', $dataArray)->execute(); $insertId = \Mix::app()->rdb->getLastInsertId(); $affectedRowss = \Mix::app()->rdb->getRowCount(); if ($affectedRowss > 0) { $texts = "" . $dataArray['name'] . "," . $dataArray['agesex'] . "," . mb_substr($dataArray['detail'], 0, 110, 'utf-8') . '...' . "若有線索,請迅速與警方聯繫:" . $dataArray['policetel'] . "http://www.anman.org/index/baobei/" . $containerid; if ($weibopic) { $weibopic = $this->get_img($weibopic, \mix::app()->getRuntimePath()); } $weiboRep = $c->share($texts, $weibopic); if (isset($weiboRep['id'])){ $sinaweibos = array('itemid'=>$containerid,'weiboid'=>$weiboRep['id']); \mix::app()->rdb->insert('sinaweibos',$sinaweibos)->execute(); } if ($weibopic){ unlink($weibopic); } echo date("Y-m-d H:i:s") . ' ' . $containerid . '微博發送成功!' . PHP_EOL; echo date("Y-m-d H:i:s") . ' ' . $containerid . '插入數據操做成功' . PHP_EOL; \mix::app()->log->info(date("Y-m-d H:i:s") . ' ' . $containerid . '插入數據操做成功'); } else { \mix::app()->log->error(date("Y-m-d H:i:s") . ' ' . $containerid . '插入操做出錯'); }
微博的效果以下:網站
整個實現過程當中使用到了swoole,codeigniter框架,微博開發平臺,mysql。後臺程序從微博中抓取數據到本地,而後根據規則經過微博api在發送微博。有一個專門的網站去展現這些信息。後面我打算試着去對這些數據作一些分析。