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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Q&A

解決済

2回答

1148閲覧

LaravelでFacebook・Instagram記事が自動取得できなくなった

pond

総合スコア350

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

0グッド

0クリップ

投稿2023/03/15 08:29

編集2023/03/16 07:21

概要

LaravelでYoutube・Twitter・Facebook・Instagramなどの各SNSの記事を自動取得して
スマホアプリに表示させるシステムを運用しています。
1年ほど前から下記エラーがLaravelのログに出始め、Facebook・Instgram記事の自動取得ができなくなりました。
(PHP5.6から8.1へバージョンアップする前からこのエラーが出ています)

エラーメッセージ

LaravelのログでFacebook・Instgramの記事が取得できない旨のエラーを確認。

***Facebook:Error:Feedが取得できません 15:01:13***Instagram:Error:Feedが取得できません

該当のソースコード

PHP(HomeController.php)

1 public function facebook(Request $request) 2 { 3 $target = 12; 4 5 # (確認用)登録状況取得 6 $cntDB = new Contents; 7 $dblist = $cntDB->getList($target); 8 9 return view('result', ['target'=>$target, 'list'=>$dblist, 'title'=>'Facebook']); 10 } 11 12 public function postFacebook(Request $request) 13 { 14 $target = 12; 15 16 # 取込処理本体 17 $this->importFaceBook($target); 18 19 # (確認用)登録状況取得 20 $cntDB = new Contents; 21 $dblist = $cntDB->getList($target); 22 23 return view('result', ['target'=>$target, 'list'=>$dblist, 'title'=>'Facebook']); 24 } 25 26 /** 27 * Facebook API 28 * 取込処理 29 * 30 */ 31 public function importFaceBook($target, $lmt=null) 32 { 33 $token = config('services.facebook.access_token'); 34 $page_id = config('services.facebook.page_id'); 35 $url = "https://graph.facebook.com/v3.2/".$page_id."/feed?fields=message,created_time,permalink_url,full_picture&limit=75&access_token=".$token; 36 37 # 取り込む件数 38 $limit = $lmt ? $lmt : 75; 39 40 $data = $this->getContentsViaCurl('json', $url); 41 42 43 # エラー時の処理 44 if ($data === false) { 45 # ログ出力 46 $this->logger->err('@importFaceBook:'.$this->errMsg); 47 return 'Error'; 48 } 49 50 $feeds = json_decode($data, true); 51 52 if (!isset($feeds['data'])) { 53 return 'Error:Feedが取得できません'; 54 } 55 56 # INSERTデータ格納用 57 $contents = []; 58 # feedループ 59 foreach ($feeds['data'] as $feed) { 60 $content = []; 61 $content['target'] = $target; 62 63 # 記事ID 64 $content['content_id_str'] = $feed['id']; 65 # URL 66 $content['link'] = $feed['permalink_url']; 67 # title 68 $content['title'] = ''; 69 # 本文 70 $content['body'] = isset($feed['message']) ? $feed['message'] : null; 71 #$content['body'] = isset($feed['description']) ? $feed['description'] : null; 72 73 # 表示ページ(category) 74 $content['category'] = null; 75 # Recommend 76 $content['area'] = 0; 77 78 if (isset($feed['message'])) { 79 # ハッシュタグが全角で入ってたことがあったので一応変換 80 $message = str_replace('#', '#', $feed['message']); 81 82 # 「キャンペーン」は取込対象外 83 if (strpos($message, '#キャンペーン') !== false) { 84 continue; 85 } 86 # 本文内に「#オーストのおすすめ」があればRecommend扱い 87 if (strpos($message, '#オーストのおすすめ') !== false) { 88 $content['area'] = 1; 89 } 90 91 # ハッシュタグでカテゴリ判定 92 # 「オリジナル」は最初に判定(=オリジナルが最優先) 93 if (strpos($message, '#original') !== false) { 94 $content['category'] = 1; 95 } else if (strpos($message, '#food') !== false) { 96 $content['category'] = 2; 97 } else if (strpos($message, '#cosmetics') !== false) { 98 $content['category'] = 3; 99 } else if (strpos($message, '#goods') !== false) { 100 $content['category'] = 4; 101 } 102 } 103 104 # 画像 105 $content['url_image'] = isset($feed['full_picture']) ? $feed['full_picture'] : null; 106 # 掲載日 107 $dt = new Carbon($feed['created_time']); 108 $content['posted_at'] = $dt->format('Y-m-d H:i:s'); 109 110 $contents[] = $content; 111 112 # 処理数上限設定 113 if (count($contents) > $limit) { 114 break; 115 } 116 } 117 118 # INSERT 119 $cntDB = new Contents; 120 $res = $cntDB->insertContents($contents); 121 122 # ログ出力 123 $str = 'INSERT:'.$res[0].'件 UPDATE:'.$res[1].'件'; 124 if ($res[2]) { 125 $this->logger->err('@importFaceBook:'.$str.' '.$res[2]); 126 } 127 128 # ログ出力用文言を返す 129 return $str; 130 }

PHP(composer.json)

1 "name": "laravel/laravel", 2 "type": "project", 3 "description": "The Laravel Framework.", 4 "keywords": [ 5 "framework", 6 "laravel" 7 ], 8 "license": "MIT", 9 "require": { 10 "php": "^8.1.10", 11 "abraham/twitteroauth": "^3.1", 12 "facebook/php-sdk": "^3.2", 13 "guzzlehttp/guzzle": "^7.0.1", 14 "laravel/framework": "^9.0", 15 "laravel/tinker": "^2.5", 16 "laravelcollective/html": "^6.2", 17 "socialiteproviders/facebook": "^4.1" 18 }, 19 "require-dev": { 20 "beyondcode/laravel-dump-server": "^1.0", 21 "filp/whoops": "^2.0", 22 "fzaninotto/faker": "^1.9.1", 23 "mockery/mockery": "^1.4.2", 24 "nunomaduro/collision": "^6.0", 25 "phpunit/phpunit": "^9.3.3", 26 "spatie/laravel-ignition": "^1.0", 27 "laravel/ui": "^3.3" 28 }, 29 "config": { 30 "optimize-autoloader": true, 31 "preferred-install": "dist", 32 "sort-packages": true 33{ 34 "name": "laravel/laravel", 35 "type": "project", 36 "description": "The Laravel Framework.", 37 "keywords": [ 38 "framework", 39 "laravel" 40 ], 41 "license": "MIT", 42 "require": { 43 "php": "^8.1.10", 44 "abraham/twitteroauth": "^3.1", 45 "facebook/php-sdk": "^3.2", 46 "guzzlehttp/guzzle": "^7.0.1", 47 "laravel/framework": "^9.0", 48 "laravel/tinker": "^2.5", 49 "laravelcollective/html": "^6.2", 50 "socialiteproviders/facebook": "^4.1" 51 }, 52 "require-dev": { 53 "beyondcode/laravel-dump-server": "^1.0", 54 "filp/whoops": "^2.0", 55 "fzaninotto/faker": "^1.9.1", 56 "mockery/mockery": "^1.4.2", 57 "nunomaduro/collision": "^6.0", 58 "phpunit/phpunit": "^9.3.3", 59 "spatie/laravel-ignition": "^1.0", 60 "laravel/ui": "^3.3" 61 }, 62 "config": { 63 "optimize-autoloader": true, 64 "preferred-install": "dist", 65 "sort-packages": true 66 }, 67 "extra": { 68 "laravel": { 69 "dont-discover": [] 70 } 71 }, 72 "autoload": { 73 "psr-4": { 74 "App\\": "app/" 75 }, 76 "classmap": [ 77 "database/seeds", 78 "database/factories" 79 ] 80 }, 81 "autoload-dev": { 82 "psr-4": { 83 "Tests\\": "tests/" 84 } 85 }, 86 "minimum-stability": "dev", 87 "prefer-stable": true, 88 "scripts": { 89 "post-autoload-dump": [ 90 "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 91 "@php artisan package:discover --ansi" 92 ], 93 "post-root-package-install": [ 94 "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 95 ], 96 "post-create-project-cmd": [ 97 "@php artisan key:generate --ansi" 98 ] 99 } 100}

確認したこと

・Facebookのアクセストークンが有効期限内であること。
イメージ説明
・Facebookアプリのタイプがビジネスであること。
・ページIDが設定してあること。
・前述のHomeController.phpの$dataでloggerでデバッグしたところ以下のエラーが出ていた。
logger($data)で確認したところ、local.DEBUG: {"error":{"message":"Invalid OAuth 2.0 Access Token","type":"OAuthException","code":190,"error_subcode":2069032,"is_transient":false,"error_user_title":"\u30e6\u30fc\u30b6\u30fc\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093","error_user_msg":"\u65b0\u30c7\u30b6\u30a4\u30f3\u306e\u30da\u30fc\u30b8\u3067\u3053\u306e\u901a\u8a71\u3092\u5b9f\u884c\u3059\u308b\u306b\u306f\u3001\u30da\u30fc\u30b8\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u304c\u5fc5\u8981\u3067\u3059\u3002","fbtrace_id":"AjXw8mfY3"}} とアクセストークンの関連のエラーが出て、アクセストークンの期限が有効なこと、ページIDが間違っていないまでは確認できました

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

・CentOS 7.9.2009
・Apache 2.4.6
・PHP 8.1.12
・Laravel Framework 9.40.1

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

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

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

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

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

AbeTakashi

2023/03/15 08:50

実際に$dataや$feedsの値にどういうデータが入ってきてるか?などのデバッグはされたでしょうか? 52〜54行目でエラーを返してるのはほぼ明確ですので、まずはその辺から徐々に追っていくしかないと思います。getContentsViaCurlメソッドの先でこけてる可能性もあるかと思います。
pond

2023/03/15 21:03

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

2023/03/16 05:30

logger($data)で確認したところ、local.DEBUG: {"error":{"message":"Invalid OAuth 2.0 Access Token","type":"OAuthException","code":190,"error_subcode":2069032,"is_transient":false,"error_user_title":"\u30e6\u30fc\u30b6\u30fc\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093","error_user_msg":"\u65b0\u30c7\u30b6\u30a4\u30f3\u306e\u30da\u30fc\u30b8\u3067\u3053\u306e\u901a\u8a71\u3092\u5b9f\u884c\u3059\u308b\u306b\u306f\u3001\u30da\u30fc\u30b8\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u304c\u5fc5\u8981\u3067\u3059\u3002","fbtrace_id":"AjXw8mfY3"}} とアクセストークンの関連のエラーが出て、アクセストークンの期限が有効なこと、ページIDが間違っていないまでは確認できました。
pond

2023/03/16 07:11

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

2023/03/16 10:23 編集

> アクセストークンの関連のエラーが出て、アクセストークンの期限が有効なこと、ページIDが間違っていないまでは確認できました UTF-8 の部分を文字に直すと下記になります。 > ユーザーアクセストークンはサポートされていません 新デザインのページでこの通話を実行するには、ページアクセストークンが必要です。 トークンページのキャプチャー画像は、ユーザートークンのようですが、アクセスには、ページアクセストークン を使われているのでしょうか? https://developers.facebook.com/docs/pages/access-tokens?locale=ja_JP 参照
pond

2023/03/20 01:05

以前からページアクセストークンを使っているようです。 アクセストークンデバッガーでトークンを確認したところ、タイプがUserになっていました。
guest

回答2

0

自己解決

アクセストークンの問題ぽいので一旦、クローズします。

投稿2023/03/22 00:35

pond

総合スコア350

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

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

0

"https://graph.facebook.com/v3.2/"

3.2はすでに終了してるからでは。

Released October 23, 2018 | Available until May 4, 2021

https://developers.facebook.com/docs/graph-api/changelog/version3.2

2年で終了するので常にバージョンアップについていくしかない。
https://developers.facebook.com/docs/graph-api/guides/versioning

投稿2023/03/15 09:11

kawax

総合スコア10377

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

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

pond

2023/03/16 02:43 編集

ありがとうございます。 Meta for Developersで設定しているAPIバージョンが10.0でしたので、 HomeController.php、fbapi.blade.phpでhttps://graph.facebook.com/v10.0/ と指定しましたが 状況変わらず記事の自動取得ができませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問