Googleニュースから記事を検索して、記事タイトルとURLをツイートする


タイトルの通り。Google News API、Twitter APIを使って記事を検索・ツイートするPHPプログラムを作成する。

開発環境

  • Windows 10
  • XAMPP で Apache起動
  • PHPを使用

Googleニュースを検索して取得

Google News API にアクセスして記事情報を取得する。
使い方については、こちらのサイト1を参考にしました。

・トピック="スポーツ" の記事情報を取得したいときには
http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=atom&topic=s
・"長友" というキーワードで絞った記事の情報を取得したいときには
http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=atom&q=長友

にそれぞれアクセス。すると結果がATOM形式で返ってくる。
この結果から記事タイトルとURLを取り出しPHP配列に格納する。

コードは、こちらのサイト2のものをほぼそのままコピペさせてもらってます。
ニュースのキーワード検索について説明。トピックス検索したいときにはURLを適宜読み替える。
※現在このコードで一度に取り出せる記事は10件が上限らしいです。

tweet_gnews.php
// ---------------------------------------------------------------
// グーグルニュース検索・データ取得関数 atom
//
//
/* ---------------- 以下、設定部分 ------------------------------ */

//$keyword:ニュース検索のキーワード
//$max_num:取得記事数の上限

function get_news($keywords, $max_num)
{
    set_time_limit(90);

    //---- キーワード検索したいときのベースURL 
    $API_BASE_URL = "https://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=atom&q=";

    //---- キーワードの文字コード変更
    $query = urlencode(mb_convert_encoding($keywords,"UTF-8", "auto"));

    //---- APIへのリクエストURL生成
    $api_url = $API_BASE_URL.$query;

    //---- APIにアクセス、結果をsimplexmlに格納
    $contents = file_get_contents($api_url);
    $xml = simplexml_load_string($contents);

    //print_r($xml);

    //記事エントリを取り出す
    $data = $xml->entry;

    //記事のタイトルとURLを取り出して配列に格納
    for ($i = 0; $i < count($data); $i++) {

        $list[$i]['title'] = mb_convert_encoding($data[$i]->title ,"UTF-8", "auto");
        $url_split =  explode("=", (string)$data[$i]->link->attributes()->href);
        $list[$i]['url'] = end($url_split);

    }

    //$max_num以上の記事数の場合は切り捨て
    if(count($list)>$max_num){
        for ($i = 0; $i < $max_num; $i++){
            $list_gn[$i] = $list{$i};
            $i++;
        }
    }else{
        $list_gn = $list;
    }

    //配列を出力
    return $list_gn;
}

※以下補足
記事のURL取り出しに関して、参考サイト2のように

$list[$i]['url'] = $data[$i]->link->attributes()->href;

とすると、結果が

[url] => SimpleXMLElement Object
    (
        [0] => http://news.google.com/news/url?sa=t&fd=R&ct2=us&usg=AFQjCNExjy_3EjxKvUdoB57vOHC_vBflUQ&clid=c3a7d30bb8a4878e06b80cf16b898331&ei=Dl1lW7CWHZno4wKH9aiQAg&url=http://news.livedoor.com/article/detail/15112210/
    )

のように配列ではなく、SimpleXMLElement Objectの形で返ってくる。またURLも、ソース元の記事URLをGoogleニュースが引っ張って来たものになりわかりづらい。これらを解決するために、

  • SimpleXMLElement Objectをstringにcastすることで、URLを文字列として格納3
  • ソース元URLを得るために、取り出したURLをさらにexplode("=",...)で分解し、endで最後尾の要素を参照

といったことをしている。
※補足終わり

記事タイトルとURLをツイート

ゲットしたニュース情報をツイートする。
まずはこちらのサイト4等を参考にツイートの準備

  • Twitterアカウントの作成
  • Consumer Key等の取得
  • twitteroauthフォルダの配置

を行う。あとはツイート投稿プログラムを書くだけ。
コードはこちらのサイト5を参考にしました。
ツイート文字数制限があるため、記事タイトルは140字を超えないようにトリミングを行う。URLは文字数カウントの対象外のため、タイトルのあとにそのまま載せてもOK。

tweet_gnews.php
//Oathライブラリの読み込み
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

function tweet(array $news_list)
{
    //認証情報
    $$consumerKey = "your consumer key";
    $consumerSecret = "your consumer secret";
    $accessToken = "your access token";
    $accessTokenSecret = "your access token secret";

    //接続
    $twitter = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

    //ニュースツイート
    for($i = 0; $i < count($news_list); $i++){
        $result = $twitter->post(
                "statuses/update",
            //タイトルのトリミング、URL記載
                array("status" => mb_substr($news_list[$i]['title'],0,138)." ".$news_list[$i]['url'])
        );

        if($twitter->getLastHttpCode() == 200) {
            // ツイート成功
            print "tweeted\n";
        } else {
            // ツイート失敗
            print "tweet failed\n";
        }
    }

}

上記2つの関数を書いて

tweet_gnews
$news_list = get_news("長友",10);
tweet($news_list);

と実行すると、下図のように検索された記事が自動でツイートされる


  1. GoogleニュースをJSONで得る http://tomehachi.sakura.ne.jp/blog/archives/486 

  2. 【更新】グーグルニュース取得PHPの例 https://afri.mitimon.net/WebAPI/google_news.html 

  3. SimpleXMLElement Objectの参照 http://yut.hatenablog.com/entry/20101215/1292427841 

  4. PHPからTwitterツイート(2015年2月版)https://qiita.com/tsunet111/items/9309801cd3e3bcf6e32a 

  5. PHPからTwitterに投稿する https://qiita.com/kumasun/items/ae3ff60acab4b1227d61