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

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

# 開発環境
- Windows 10
- XAMPP で Apache起動
- PHPを使用

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

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

・トピック="スポーツ" の記事情報を取得したいときには
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配列に格納する。

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


```php: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取り出しに関して、参考サイト[^second]のように

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

とすると、結果が

```php
[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を文字列として格納[^third]
- ソース元URLを得るために、取り出したURLをさらにexplode("=",...)で分解し、endで最後尾の要素を参照

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

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

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

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

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

```php: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";
		}
	}

}
```

上記２つの関数を書いて

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

と実行すると、下図のように検索された記事が自動でツイートされる
![Screenshot_2018-08-04 Twitter.png](https://qiita-image-store.s3.amazonaws.com/0/269289/72474bf1-1e26-51d7-749b-77be9fbd14d7.png)


[^first]: GoogleニュースをJSONで得る http://tomehachi.sakura.ne.jp/blog/archives/486
[^second]: 【更新】グーグルニュース取得PHPの例 https://afri.mitimon.net/WebAPI/google_news.html
[^third]: SimpleXMLElement Objectの参照 http://yut.hatenablog.com/entry/20101215/1292427841
[^fourth]: PHPからTwitterツイート（2015年2月版）https://qiita.com/tsunet111/items/9309801cd3e3bcf6e32a
[^fifth]: PHPからTwitterに投稿する https://qiita.com/kumasun/items/ae3ff60acab4b1227d61