質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2786閲覧

PHPでTwitterの画像付きツイートを取得したい

chieeeeno

総合スコア217

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/03/16 11:31

###前提・実現したいこと
PHPを使ってTwitterの画像付きツイートを取得し、
画像URLのみを配列に加工してjsonでレスポンスを返したいと思っています。

###発生している問題・エラーメッセージ
下記のコードを使って、localhostではツイートを取得し、
jsonを返すことが出来たのですが、検証用のサーバーにアップした時にTwitterから値を取得することが出来ず、
エラーが起こってしまいました。

エラーメッセージ

Warning: Invalid argument supplied for foreach() in ※※※※※※※※/※※※※※/get_tw_img.php on line 69

###該当のソースコード

PHP

1<?php 2// 設定 3$bearer_token = "*************************" ; // ベアラートークン 4$request_url = 'https://api.twitter.com/1.1/search/tweets.json' ; // リクエストURL 5 6$search_key = '#ハッシュタグ -RT'; //検索キーワード, -RTはリツイートを除く 7// パラメータ 8$params = array( 9 'q' => $search_key, 10 'filter' => 'images', 11 'count' => 100 12); 13 14// パラメータがある場合 15if ( $params ) { 16 $request_url .= '?' . http_build_query( $params ) ; 17} 18 19// リクエスト用のコンテキスト 20$context = array( 21 'http' => array( 22 'method' => 'GET' , // リクエストメソッド 23 'header' => array( // ヘッダー 24 'Authorization: Bearer ' . $bearer_token , 25 ) , 26 ) , 27) ; 28 29// cURLを使ってリクエスト 30$curl = curl_init() ; 31curl_setopt( $curl, CURLOPT_URL, $request_url ) ; // リクエストURL 32curl_setopt( $curl, CURLOPT_HEADER, true ) ; // ヘッダーを取得する 33curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, $context['http']['method'] ) ; // メソッド 34curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false ) ; // 証明書の検証を行わない 35curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ) ; // curl_execの結果を文字列で返す 36curl_setopt( $curl, CURLOPT_HTTPHEADER, $context['http']['header'] ) ; // ヘッダー 37curl_setopt( $curl, CURLOPT_TIMEOUT, 5 ) ; // タイムアウトの秒数 38 39// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 40// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 41 42$res1 = curl_exec( $curl ) ; 43$res2 = curl_getinfo( $curl ) ; 44curl_close( $curl ) ; 45 46// 取得したデータ 47$json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど) 48$header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ) 49 50 51// JSONを変換 52$obj = json_decode( $json ) ; // オブジェクトに変換 53// $arr = json_decode( $json, true ) ; // 配列に変換 54 55$_statuses = $obj->statuses; 56$img_array = array(); 57 58var_dump($res1,$res2); 59 60foreach($_statuses as $status){ 61 $url = $status->entities->media[0]->media_url; 62 if(!is_null($url)){ 63 array_push($img_array,$url); 64 } 65} 66echo json_encode($img_array) ; 67 68?> 69 70

###試したこと
var_dump()でレスポンスの値を確認してみたところ、

var_dump($res1); =>bool(false) var_dump($res2); => array(19) { ["url"]=> string(116) "https://api.twitter.com/1.1/search/tweets.json?q=※※※※※※※※※※-RT&filter=images&count=100" ["http_code"]=> int(0) ["header_size"]=> int(0) ["request_size"]=> int(0) ["filetime"]=> int(-1) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0) ["namelookup_time"]=> float(0.0307) ["connect_time"]=> float(0) ["pretransfer_time"]=> float(0) ["size_upload"]=> float(0) ["size_download"]=> float(0) ["speed_download"]=> float(0) ["speed_upload"]=> float(0) ["download_content_length"]=> float(0) ["upload_content_length"]=> float(0) ["starttransfer_time"]=> float(0) ["redirect_time"]=> float(0) }

とレスポンスが返ってきており、データが取得できていませんでした。

※localhostでは、$res1にAPIから正常な値が取得できました。

###補足情報(言語/FW/ツール等のバージョンなど)
PHPのバージョンはそれぞれ下記のバージョンです。

localhost => PHP Version 5.5.38
検証用サーバー => PHP Version 5.2.6

検証用サーバーは**【http】**で接続されております。
(SSL使用不可)


個人的には非SSL環境下でAPIを叩いて値を取得しにいこうとしているのがまずいのかな?
と思っているのですが、原因はどういったことが考えられるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

気になるのは検証用サーバーから外部へのアクセスは出来るか?という所です。
簡単なスクリプトで yahoo.co.jp のhtml が取得できるかなど試してみてもらっても良いですか?

そもそも外にでれていない気がします。

投稿2017/03/16 11:41

shingoatail

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chieeeeno

2017/03/17 01:12

yahoo.co.jpでも試してみましたが、やはり同じ反応が返ってきました。 ※ローカルではYahoo!が表示されてます。 サーバーの設定で外部アクセスを弾かれているのであれば、 やはりこの環境下での検証は難しいでしょうか? 何か一時的に設定を外したりすることは可能なのでしょうか? 当方、PHPに関しては全く素人なもので、設定ファイルなどでアクセス可能になる方法があるのであれば、 ご教授いただけると幸いです。 よろしくお願いいたします。
shingoatail

2017/03/17 02:34

確認ありがとうございます 現象見る限り、サーバーのファイアーウォールが有効になっているようで その設定を変えなければ外部への接続はできないと思います。 またそれはサーバーの設定ですので、PHP側ではむりなのかなと。 検証用サーバーはSSH等でログインしコンソール操作できるのでしょうか? もしできるのであればコンソールで Centos6系 sudo service iptables stop Centos7系 sudo systemctl stop firewalld を行った後、スクリプトを試してみるとうまくいくかもしれないです。 テストが出来ましたら 上記コマンドの stop -> start に変えて再度有効化しておいて下さい。 というのを勝手にやって良いのかどうかわからないですがもし試せるのであればという所です(^^;)
chieeeeno

2017/03/19 09:55

SSHでログインは出来ないので、ご提案いただいた方法は難しそうですね。。。 まぁ、PHPの部分は最悪別のサーバーか本番機で確認するような感じになりそうです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問