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

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

ただいまの
回答率

90.51%

  • PHP

    23036questions

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

  • API

    1746questions

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

  • JSON

    1390questions

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

  • Twitter

    753questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 756

chieeeeno

score 194

前提・実現したいこと

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

発生している問題・エラーメッセージ

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

エラーメッセージ

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

該当のソースコード

<?php
// 設定
$bearer_token = "*************************" ;    // ベアラートークン
$request_url = 'https://api.twitter.com/1.1/search/tweets.json' ;    // リクエストURL

$search_key = '#ハッシュタグ -RT';    //検索キーワード, -RTはリツイートを除く
// パラメータ
$params = array(
    'q' => $search_key,
    'filter' => 'images',
    'count' => 100 
);

// パラメータがある場合
if ( $params ) {
    $request_url .= '?' . http_build_query( $params ) ;
}

// リクエスト用のコンテキスト
$context = array(
    'http' => array(
        'method' => 'GET' , // リクエストメソッド
        'header' => array(              // ヘッダー
            'Authorization: Bearer ' . $bearer_token ,
        ) ,
    ) ,
) ;

// cURLを使ってリクエスト
$curl = curl_init() ;
curl_setopt( $curl, CURLOPT_URL, $request_url ) ;    // リクエストURL
curl_setopt( $curl, CURLOPT_HEADER, true ) ;    // ヘッダーを取得する
curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, $context['http']['method'] ) ;    // メソッド
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false ) ;    // 証明書の検証を行わない
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ) ;    // curl_execの結果を文字列で返す
curl_setopt( $curl, CURLOPT_HTTPHEADER, $context['http']['header'] ) ;    // ヘッダー
curl_setopt( $curl, CURLOPT_TIMEOUT, 5 ) ;    // タイムアウトの秒数

// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

$res1 = curl_exec( $curl ) ;
$res2 = curl_getinfo( $curl ) ;
curl_close( $curl ) ;

// 取得したデータ
$json = substr( $res1, $res2['header_size'] ) ;    // 取得したデータ(JSONなど)
$header = substr( $res1, 0, $res2['header_size'] ) ;    // レスポンスヘッダー (検証に利用したい場合にどうぞ)


// JSONを変換
$obj = json_decode( $json ) ;    // オブジェクトに変換
// $arr = json_decode( $json, true ) ;    // 配列に変換

$_statuses = $obj->statuses;
$img_array = array();

var_dump($res1,$res2);

foreach($_statuses as $status){
    $url = $status->entities->media[0]->media_url;
    if(!is_null($url)){
        array_push($img_array,$url);
    }
}
echo json_encode($img_array) ;

?>

試したこと

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を叩いて値を取得しにいこうとしているのがまずいのかな?
と思っているのですが、原因はどういったことが考えられるのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/17 10:12

    yahoo.co.jpでも試してみましたが、やはり同じ反応が返ってきました。
    ※ローカルではYahoo!が表示されてます。

    サーバーの設定で外部アクセスを弾かれているのであれば、
    やはりこの環境下での検証は難しいでしょうか?
    何か一時的に設定を外したりすることは可能なのでしょうか?

    当方、PHPに関しては全く素人なもので、設定ファイルなどでアクセス可能になる方法があるのであれば、
    ご教授いただけると幸いです。

    よろしくお願いいたします。

    キャンセル

  • 2017/03/17 11:34

    確認ありがとうございます

    現象見る限り、サーバーのファイアーウォールが有効になっているようで
    その設定を変えなければ外部への接続はできないと思います。

    またそれはサーバーの設定ですので、PHP側ではむりなのかなと。

    検証用サーバーはSSH等でログインしコンソール操作できるのでしょうか?
    もしできるのであればコンソールで
    Centos6系
    sudo service iptables stop

    Centos7系
    sudo systemctl stop firewalld

    を行った後、スクリプトを試してみるとうまくいくかもしれないです。
    テストが出来ましたら 上記コマンドの stop -> start に変えて再度有効化しておいて下さい。

    というのを勝手にやって良いのかどうかわからないですがもし試せるのであればという所です(^^;)

    キャンセル

  • 2017/03/19 18:55

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

    ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • PHP

    23036questions

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

  • API

    1746questions

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

  • JSON

    1390questions

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

  • Twitter

    753questions

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