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

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

新規登録して質問してみよう
ただいま回答率
85.48%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

PHP

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

Q&A

解決済

1回答

2453閲覧

phpでlineのbotを作成

aieuo

総合スコア7

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

PHP

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

1グッド

1クリップ

投稿2017/12/21 08:27

編集2017/12/23 01:28

###前提・実現したいこと
phpのline-bot-sdkをつかいLineのbotを作っているのですがメッセージを送ってもClass LINE\LINEBot\HTTPClient\CurlHTTPClient not found と出てうまくできません
どのようにすればいいですか?

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

Stack trace: #0{main} thrown in /app/index.php on line 5 PHP Fatal error: Uncaught Error: Class 'Class LINE\LINEBot\HTTPClient\CurlHTTPClient' not found in /app/index.php:5

###試したこと
ファイルを置く場所やLINE\LINEBot~~~の書き方が間違えているのかと思いいろいろと変えてみたのですがうまくできません
LINEという名前のフォルダがないのですがそれが関係しているのでしょうか?

###補足情報(言語/FW/ツール等のバージョンなど)
このサイトを参考にして作っています

DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

実際に試してみましたので、その時の手順を載せておきます。

LINEプロバイダ作成

https://developers.line.me/console/register/messaging-api/provider/
※メールアドレスでアカウントの認証が必要です。

  1. 下記からLINE Developerアカウントを作成します。
  2. プロバイダ作成します。
  3. アプリ作成します。
  4. LINEで作成したチャンネルQRコードを読み取って友達になっておきます。

Herokuアカウント作成

https://signup.heroku.com/login
※メールアドレスでアカウントの認証が必要です。

  1. Herokuアカウント作成します。
  2. New > アプリ作成します。
  3. PHPを選択します。

LINE Messaging API 設定

https://developers.line.me/console/channel/プロバイダID/basic/

  1. アクセストークン(ロングターム)を設定します。(適当に24時間で作成)
  2. Webhook URLにHerokuのApp URLを登録します。(https://Herokuのアプリ名.herokuapp.com/)

URLはhttps://dashboard.heroku.com/apps/アプリ名/settingsDomainにあります

Heroku設定にトークン設定

https://dashboard.heroku.com/apps/アプリ名/settings

Herokuアプリ画面>SettigsからReveal Config Varsボタンクリックして、LINEのアクセストークン、チャンネル鍵を登録します。

  • CHANNEL_ACCESS_TOKEN:LINE Developer プロバイダで設定したアクセストークン(ロングターム)のトークン文字列をコピペ
  • CHANNEL_SECRET:LINE Developer プロバイダのChannel Secretの文字列をコピペ

Herokuコマンドインストール(Windows)

下記からherokuアプリをダウンロード、インストールします。
https://devcenter.heroku.com/articles/getting-started-with-php#set-up

Herokuコマンドインストール(Linux)

bash

1cd /tmp 2curl -LO https://cli-assets.heroku.com/heroku-cli/channels/stable/heroku-cli-linux-x64.tar.gz 3tar zxf heroku-cli-linux-x64.tar.gz 4 5#解説に書いてある通りです。 6sudo mkdir -p /usr/local/lib /usr/local/bin 7sudo mv ./heroku-cli-v6.14.43-なんかのID-linux-x64 /usr/local/lib/ 8sudo ln -s /usr/local/lib/heroku-cli-v6.14.43-なんかのID-linux-x64/bin/heroku /usr/loca/bin/ 9rm -f heroku-cli-linux-x64.tar.gz

Github, Dropbox

プロジェクトディレクトリ作成して、composerlinecorp/line-bot-sdkをインストールします。

bash

1cd プロジェクトディレクトリ 2composer require linecorp/line-bot-sdk

上記と同じプロジェクトディレクトリにindex.phpを下記のように新規作成します。
文字コードはUTF-8、改行コードはLFで作成してください。(たぶんShift_JISCR+LFだとうまく動きません)

php

1<?php 2require_once __DIR__.'/vendor/autoload.php'; 3 4$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(getenv('CHANNEL_ACCESS_TOKEN')); 5$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => getenv('CHANNEL_SECRET')]); 6 7$signature = $_SERVER["HTTP_" . \LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE]; 8 9try { 10 $events = $bot->parseEventRequest(file_get_contents('php://input'), $signature); 11} 12catch(\LINE\LINEBot\Exception\InvalidSignatureException $e) { 13 error_log("parseEventRequest failed. InvalidSignatureException => ".var_export($e, true)); 14} 15catch(\LINE\LINEBot\Exception\UnknownEventTypeException $e) { 16 error_log("parseEventRequest failed. UnknownEventTypeException => ".var_export($e, true)); 17} 18catch(\LINE\LINEBot\Exception\UnknownMessageTypeException $e) { 19 error_log("parseEventRequest failed. UnknownMessageTypeException => ".var_export($e, true)); 20} 21catch(\LINE\LINEBot\Exception\InvalidEventRequestException $e) { 22 error_log("parseEventRequest failed. InvalidEventRequestException => ".var_export($e, true)); 23} 24 25 26foreach ($events as $event) { 27 if (!($event instanceof \LINE\LINEBot\Event\MessageEvent)) { 28 error_log('Non message event has come'); 29 continue; 30 } 31 32 if (!($event instanceof \LINE\LINEBot\Event\MessageEvent\TextMessage)) { 33 error_log('Non text message has come'); 34 continue; 35 } 36 37 $bot->replyText($event->getReplyToken(), $event->getText()); 38} 39 40?>

同じくプロジェクトディレクトリにProcfileを下記のように新規作成します。
文字コードはUTF-8、改行コードはLFで作成してください。(たぶんShift_JISCR+LFだとうまく動きません)

web: vendor/bin/heroku-php-nginx
  1. Githubにレポジトリを作成して、ローカルのソースをプッシュします。(Dropboxの場合はDeploy設定をしてDeployするのみです)
  2. https://dashboard.heroku.com/apps/Deployから、Githubの設定を行います。
  3. Deploy BranchボタンクリックしてHerokuにGithubからデプロイします。

※ ソースに問題がある場合はデプロイに失敗します。

Herokuコマンドでログ確認

CMDやターミナルなどを開いて、下記コマンドを入力する。メールアドレスとパスワードを確認されるので、それぞれ入力しておきます。

bash

1heroku logs --app Herokuアプリ名 --tail -s app

LINEで友達になったチャンネルに、メッセージを送信すると、下記のように画面にオウム返しにメッセージが表示されます。

> テストです。 < テストです。

LINEメッセージを友達になったチャンネルに送ると、同じメッセージが表示されます。その時のログです。
エラーがあると、デバッグメッセージが表示されます。

log

1xxx app[api]: Build started by user メールアドレス 2xxx app[api]: Build succeeded 3xxx app[web.1]: Going down, terminating child processes... 4xxx app[api]: Release v14 created by user メールアドレス 5xxx app[web.1]: Optimizing defaults for 1X dyno... 6xxx app[web.1]: 4 processes at 128MB memory limit. 7xxx app[web.1]: Starting php-fpm... 8xxx app[api]: Deploy デプロイID by user メールアドレス 9xxx app[web.1]: Starting nginx... 10xxx app[web.1]: [xxx] "POST / HTTP/1.1" 200 5 "-" "LineBotWebhook/1.0 11xxx app[web.1]: [xxx] "POST / HTTP/1.1" 200 5 "-" "LineBotWebhook/1.0

ブラウザでアクセスしたりすると、下記のようなエラーメッセージが表示されます。

log

1xxx app[web.1]: [xxx] parseEventRequest failed. InvalidSignatureException => , LINE\LINEBot\Exception\InvalidSignatureException::__set_state(array( 2xxx app[web.1]: 'message' => 'Request does not contain signature', 3xxx app[web.1]: 'code' => 0, 4xxx app[web.1]: 'string' => '', 5xxx app[web.1]: 'file' => '/app/vendor/linecorp/line-bot-sdk/src/LINEBot/Event/Parser/EventRequestParser.php', 6xxx app[web.1]: 'line' => 61, 7xxx app[web.1]: 'trace' => 8xxx app[web.1]: array ( 9xxx app[web.1]: 0 => 10xxx app[web.1]: array ( 11xxx app[web.1]: 'file' => '/app/vendor/linecorp/line-bot-sdk/src/LINEBot.php', 12xxx app[web.1]: 'function' => 'parseEventRequest', 13xxx app[web.1]: 'line' => 193, 14xxx app[web.1]: 'class' => 'LINE\LINEBot\Event\Parser\EventRequestParser', 15xxx app[web.1]: 'type' => '::', 16xxx app[web.1]: 'args' => 17xxx app[web.1]: array ( 18xxx app[web.1]: 0 => '', 19xxx app[web.1]: 1 => 'チャンネル鍵', 20xxx app[web.1]: 2 => NULL, 21xxx app[web.1]: ), 22xxx app[web.1]: ), 23xxx app[web.1]: 1 => 24xxx app[web.1]: array ( 25xxx app[web.1]: 'file' => '/app/index.php', 26xxx app[web.1]: 'line' => 12, 27xxx app[web.1]: 'function' => 'parseEventRequest', 28xxx app[web.1]: 'type' => '->', 29xxx app[web.1]: 'class' => 'LINE\LINEBot', 30xxx app[web.1]: 'args' => 31xxx app[web.1]: array ( 32xxx app[web.1]: 0 => '', 33xxx app[web.1]: 1 => NULL, 34xxx app[web.1]: ), 35xxx app[web.1]: ), 36xxx app[web.1]: ), 37xxx app[web.1]: 'previous' => NULL, 38xxx app[web.1]: ))

投稿2017/12/23 07:46

編集2017/12/24 12:33
Tomak

総合スコア1652

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

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

aieuo

2017/12/23 12:37 編集

回答ありがとうございます。 教えていただいた通りにrequire_once()の部分を書き換えると違うエラーが出ます 多分僕もindex.phpはvenderと同じフォルダに置いていると思います コマンドでcomposerのインストールができているか調べたら、それはできていました インターネットで調べても情報が古いのや、あまり詳しく書いているのがないので https://www.dropbox.com/sh/hsmfpwzjhlzd0dq/AACWx-gMFDQEo7auY_5Di-ENa?dl=0 ここにあげているので何か間違えているところがあったら教えていただきたいです
Tomak

2017/12/23 13:34

頂いたソースは、私の環境だと問題なく動いています。PHPのバージョンやサーバー設定は問題ないでしょうか? 私の環境は、Apache-2.2+PHP-5.6と、Apache-2.4+PHP-7.1で動作確認しました。
Tomak

2017/12/24 06:48 編集

すみません、リンクの解説を全部読んでませんでした。Heroku サービスと繋げてということなのですね。。。Dropboxは使ってないので、Git Hubと連携して試してみました。Dropboxでもソースを作成したら「Heroku上で、Deploy」はしなけれなりません。 ■Messaging API ---- https://developers.line.me/ja/ https://developers.line.me/console/channel/開発者ID/basic/ ・アクセストークン(ロングターム)を設定 ・作成したチャンネルと友達になっておく。 ・Webhook URLにHerokuのApp URLを登録(https://Herokuアプリ名.herokuapp.com/)  ※URLは「https://dashboard.heroku.com/apps/アプリ名/settings」の「Domain」にある ■Heroku設定にトークン設定 ---- https://dashboard.heroku.com/apps/アプリ名/settings ※Reveal Config Vars でLINEのアクセストークン、チャンネル鍵を登録 CHANNEL_ACCESS_TOKEN CHANNEL_SECRET ■HerokuコマンドをLinuxにインストール ---- cd /tmp curl -LO https://cli-assets.heroku.com/heroku-cli/channels/stable/heroku-cli-linux-x64.tar.gz tar zxf heroku-cli-linux-x64.tar.gz ↓解説に書いてある通りです。 sudo mkdir -p /usr/local/lib /usr/local/bin sudo mv ./heroku-cli-v6.14.43-なんかのID-linux-x64 /usr/local/lib/ sudo ln -s /usr/local/lib/heroku-cli-v6.14.43-なんかのID-linux-x64/bin/heroku /usr/loca/bin/ rm -f heroku-cli-linux-x64.tar.gz ■Herokuコマンドでログ確認 ---- heroku logs --app Herokuアプリ名 --tail -s app Build succeeded [24/Dec/2017:05:56:42 +0000] "POST / HTTP/1.1" 200 5 "-" "LineBotWebhook/1.0 [24/Dec/2017:05:56:52 +0000] "POST / HTTP/1.1" 200 5 "-" "LineBotWebhook/1.0 ↑LINEメッセージを友達になったチャンネルに送ると、同じメッセージが表示されます。その時のログです。  エラーがあると、デバッグメッセージが表示されます。
aieuo

2017/12/24 11:08

早速試していただいてありがとうございます gothubでやってうまく動いたということなので、githubでやってみるとLINE¥LINEBot... の場所は行けたのですが、その後の1つ目のcatchで止まってしまいます。 僕はwindowsにphpの環境をインストールしてやっていたのですが、それがうまくできていなかったのかな? リンク先のページ最後まで読むには登録しないといけないですよね。すみません dropboxでのやり方の説明ありがとうございます
Tomak

2017/12/24 12:46

ひとつ目の「catche()」はメッセージシグネチャーが不正だというメッセージです。LINEアプリからメッセージ送ってるのではなくて、ブラウザなどでアクセスするとそのようなエラーが表示されます。 APIとして勝手に他人にメッセージをバンバン遅れたら、セキュリティ問題になってしまいます。ですので、POST送信した時のチャンネルトークンキーを読んで、正しいチャンネルかどうかの整合性確認をしてから返信しなければなりません。 最近のPHPフレームワークでは、よくフォームページで「クロスサイト・リクエスト・フォージュリ(Cross Site Request Forgery)csrf_token()」のような機能があるのですが、これと似ています。勝手に外部サイトやクライアントからPOSTできないようにする仕組みです。
aieuo

2017/12/25 11:06

なるほど... lineから送ってもなぜかそのエラーが出ます... 他の方が書いているコードに変えたらうまく動きました! 本当に色々とありがとうございます
Tomak

2017/12/25 11:51

とりあえずできたということでよかったです。 どのようにコードを変えたのでしょう? 動いたコードを質問や回答に追記しておいて頂けると、私も他の閲覧している方々も参考になると思います。(面倒かもしれませんが…)
aieuo

2017/12/25 12:47 編集

変えたコードをよく見てみると書き方が違うだけで内容はほとんど同じでした。 違うところはアクセストークンをherokuで登録?してそこから取ってくるか、直接入れるかだけで、作り直した時に僕がherokuに登録するのを忘れていたのでそれが原因でエラーが出ていたのだと思います。 すみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問