タイトルの通り。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件が上限らしいです。
// ---------------------------------------------------------------
// グーグルニュース検索・データ取得関数 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。
//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つの関数を書いて
$news_list = get_news("長友",10);
tweet($news_list);
と実行すると、下図のように検索された記事が自動でツイートされる
-
GoogleニュースをJSONで得る http://tomehachi.sakura.ne.jp/blog/archives/486 ↩
-
【更新】グーグルニュース取得PHPの例 https://afri.mitimon.net/WebAPI/google_news.html ↩ ↩2
-
SimpleXMLElement Objectの参照 http://yut.hatenablog.com/entry/20101215/1292427841 ↩
-
PHPからTwitterツイート(2015年2月版)https://qiita.com/tsunet111/items/9309801cd3e3bcf6e32a ↩
-
PHPからTwitterに投稿する https://qiita.com/kumasun/items/ae3ff60acab4b1227d61 ↩