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

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

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

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

API

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

Q&A

解決済

2回答

2711閲覧

php-telegram-botでbotに送ったメッセージを取得したい。

joh30

総合スコア3

PHP

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

API

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

0グッド

0クリップ

投稿2020/06/29 07:47

編集2020/07/05 03:46

php-telegram-botパッケージを使ってtelegramでbotに送ったメッセージをプログラムで取得したいです。
最終的な目標はbotにメッセージを送るとそれを複数のチャンネルに転送するプログラムです。

(https://github.com/php-telegram-bot/core)のInstractionsに従いcomposer.jsonと set.php, hook.php を書きました。

https://github.com/php-telegram-bot/core/issues/514)を参考に、
まずはbotに送ったメッセージをgetMessage()で取得し、結果をファイルに出力するようにしましたが、途中でfinallyに飛んでしまいます。

どのようにすればgetMessage()を取得できるのでしょうか?

該当のソースコード

hook.phpの内容です。

PHP

1<?php 2// Load composer 3require __DIR__ . '/vendor/autoload.php'; 4 5$bot_api_key = '****'; 6$bot_username = '****'; 7 8/* ログを出力 */ 9//ファイルを指定 10$log = './error.log'; 11// 時刻を指定 12$log_time = date('Y-m-d H:i:s'); 13 14try { 15 16 // Create Telegram API object 17 $telegram = new Longman\TelegramBot\Telegram($bot_api_key, $bot_username); 18 19 error_log('['.$log_time.']'."メッセージ取得前".PHP_EOL, 3, $log); 20 21 //エラーが起きる部分 22 $message = $this->getMessage(); 23 $chat_id = $message->getChat()->getId(); 24 $data = []; 25 $data['chat_id'] = $chat_id; 26 $data['text'] = 'This is just a Test...'; 27 // Longman\TelegramBot\Request::sendMessage($data); 28 29 error_log('['.$log_time.']'."メッセージ内容:".$message.PHP_EOL, 3, $log); 30 31 error_log('['.$log_time.']'."メッセージ取得".PHP_EOL, 3, $log); 32 33 // Handle telegram webhook request 34 $telegram->handle(); 35 36}catch (Exception $e){ 37 error_log('['.$log_time.']'."Exception".PHP_EOL, 3, $log); 38}finally{ 39 error_log('['.$log_time.']'."finally".PHP_EOL, 3, $log); 40}

出力結果

このように、tryの途中でExceptionにもいかずになぜかfinallyに飛んでいます。

[2020-06-29 16:41:09]メッセージ取得前 [2020-06-29 16:41:09]finally

試したこと

set.phpは何も変更せず、そのままコピーしています。

PHP

1<?php 2/** 3 * README 4 * This file is intended to set the webhook. 5 * Uncommented parameters must be filled 6 */ 7 8// Load composer 9require_once __DIR__ . '/vendor/autoload.php'; 10 11// Add you bot's API key and name 12$bot_api_key = '****'; 13$bot_username = '****'; 14 15// Define the URL to your hook.php file 16$hook_url = 'https://*********.ssl-lolipop.jp/telegrambot/hook.php'; 17 18try { 19 // Create Telegram API object 20 $telegram = new Longman\TelegramBot\Telegram($bot_api_key, $bot_username); 21 22 // Set webhook 23 $result = $telegram->setWebhook($hook_url); 24 25 // To use a self-signed certificate, use this line instead 26 //$result = $telegram->setWebhook($hook_url, ['certificate' => $certificate_path]); 27 28 if ($result->isOk()) { 29 echo $result->getDescription(); 30 } 31} catch (Longman\TelegramBot\Exception\TelegramException $e) { 32 echo $e->getMessage(); 33}

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

PHP5.5, ロリポップ(スタンダードプラン)を使用しています。
$this->getMessage()でエラーが起きているが、それをcatchできていないことは理解しています。
(catchできないのは別問題として)issuesの議論から、この$thisを何に置き換えれば良いかを理解することができませんでした。

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

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

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

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

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

guest

回答2

0

自己解決

下記のようにしたところ、getMessage()を得られることができました。

PHP

1 // Handle telegram webhook request 2 $telegram->handle(); 3 4 $telegram->useGetUpdatesWithoutDatabase(); 5 $server_response = $telegram->handleGetUpdates(); 6 7 $message = $server_response->getMessage(); 8 9 // error_log('['.$log_time.']'."メッセージ内容:".$message.PHP_EOL, 3, $log); 10 11 // error_log('['.$log_time.']'."メッセージ取得".PHP_EOL, 3, $log); 12

投稿2020/07/06 17:59

joh30

総合スコア3

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

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

0

私も以前ハマったことがあるのですが、
これかもしれません。

投稿2020/06/29 08:43

hayato7

総合スコア1135

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

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

joh30

2020/07/05 03:05

catch(Exception $e) -> catch(\Exception $e)としましたが、出力結果は同じでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問