18
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

タイトルの通り。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);

と実行すると、下図のように検索された記事が自動でツイートされる
Screenshot_2018-08-04 Twitter.png

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

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

  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

18
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?