swoole+Mixphp+CodeIgniter開發失蹤兒童信息平臺

這是我在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

  1. 批量抓取,在程序第一次運行時會給定一些url進行批量初始化抓取
  2. 增量抓取,會根據抓取回來的頁面內容分析新的url,再進行抓取新的url
  3. 補充抓取,意思是部分兒童的狀態爲失蹤,隔一段時間以後找回來了,那麼狀態也會發生變化,所以要對這些url進行補充抓取。

前臺展現頁面

前臺展現,至關於作一個網站,使用的是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在發送微博。有一個專門的網站去展現這些信息。後面我打算試着去對這些數據作一些分析。

相關文章
相關標籤/搜索