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

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

ただいまの
回答率

89.10%

linebotのプログラム(php)からhttpリクエストをしたい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 763

CandyBlossom

score 10

前提・実現したいこと

linebotからpythonのbottleサーバへのhttpリクエストを送信したいです。

linebotはphpで作成しており、herokuを使用しています。
この記事を参考にさせていただきました。https://qiita.com/skycat_me/items/9f27cbd9354515df744a

無事にlinebotは作成できましたが、httpリクエストをcurlで行ったところ、Request timeoutとエラーがでました。

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

2019-01-22T01:16:16.911584+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/" host=erekon.herokuapp.com request_id=37e586c2-c415-41c2-85b1-993c0934744a fwd="203.104.146.154" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https

2019-01-22T09:03:24.513663+00:00 app[web.1]: [Tue Jan 22 09:03:24.511192 2019] [proxy_fcgi:error] [pid 137:tid 140615585076992] (70007)The timeout specified has expired: [client 10.113.237.99:32593] AH01075: Error dispatching request to : (polling)

該当のソースコード

<?php
require_once __DIR__ . '/vendor/autoload.php';
error_log("start");

// POSTを受け取る
$postData = file_get_contents('php://input');
error_log($postData);

// jeson化
$json = json_decode($postData);
$event = $json->events[0];
error_log(var_export($event, true));

// ChannelAccessTokenとChannelSecret設定
$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(getenv('LineMessageAPIChannelAccessToken'));
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => getenv('LineMessageAPIChannelSecret')]);

// イベントタイプがmessage以外はスルー
if ($event->type != "message")
    return;
$replyMessage = null;

// メッセージタイプが文字列の場合
if ($event->message->text == "テレビ") {

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "http://192.168.33.10:8080/");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);

    $html = curl_exec($ch);

    $replyMessage = $html;

    curl_close($ch);

} else {
    $replyMessage = $event->message->text;
}

// メッセージ作成
$textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder($replyMessage);

// メッセージ送信
$response = $bot->replyMessage($event->replyToken, $textMessageBuilder);
error_log(var_export($response,true));

return;

試したこと

●exec関数を使い、curlを使ったリクエストの別プログラムを呼び出すことも考えましたが、bottleサーバの方にはアクセスしたログがありませんでした。
●curl_multiというものも使ってみたのですが、curlの時と同様の結果でした。
●file_get_contentsも同様でした。
●linebotのプログラムで動かす前に、いずれもローカルでプログラムを動かしましたが、そこでは期待する値が返ります。

●curlではもともと例文として載っていた http://example.com/ の方ではtrueが返ってきます。

補足情報(FW/ツールのバージョンなど)

php7.2

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる