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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1075閲覧

phpが別のファイルを参照する

Tomotomo_

総合スコア1

PHP

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/28 07:56

前提・実現したいこと

初めて質問させて頂きます。
webサイトにtwitterやyoutubeのapiを使って特定のキーワードを含むツイートや動画を掲載できないかと試みております。
twitterの埋め込み10個を掲載し、その下にyoutubeの埋め込みを10個掲載したいと考えております。
日が浅いため拙いコードですが、
ご教授頂けましたら幸いです。

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

htmlの中でphpを使おうとhogehoge.htmlからhogehoge.phpに変換、そのphpから2種類のpyファイルをを呼び出そうとしたところ、後者のexecで呼び出したいpyファイルとは別の前者で呼び出したpyファイルが呼び出される。 前者のtwitterはツイートが足りず、10個掲載するうち6個しか掲載できず、 Warning: Undefined array key 6 in C:\Users\<username>...\hogehoge.php on line 93 と表示されるが今回は問題ではない。 twitterの下に表示されるyoutubeだが、youtubeの埋め込みが表示されるはずが前者のexecで呼び出したツイートの埋め込みが再び掲載された。 足りてないツイートの部分だが、今度は本来掲載されるはずのyoutubeの埋め込みが正常に掲載されていた。

該当のソースコード

PHP

1<?php 2 $command="python twitter.py "; 3 exec($command,$output); 4 print "$output[0]\n";#ツイートが表示される 5 print "$output[1]\n";#ツイートが表示される 6 print "$output[2]\n";#ツイートが表示される 7 print "$output[3]\n";#ツイートが表示される 8 print "$output[4]\n";#ツイートが表示される 9 print "$output[5]\n";#ツイートが表示される 10 print "$output[6]\n";#Warning: Undefined array key 6 in C:\Users\<username>...\hogehoge.php on line 93 11 print "$output[7]\n";#Warning: Undefined array key 6 in C:\Users\<username>...\hogehoge.php on line 94 12 print "$output[8]\n";#Warning: Undefined array key 6 in C:\Users\<username>...\hogehoge.php on line 95 13 print "$output[9]\n";#Warning: Undefined array key 6 in C:\Users\<username>...\hogehoge.php on line 96 14 ?> 15 <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 16 <?php 17 $command="python youtube.py "; 18 exec($command,$output); 19 print "$output[0]\n";#ツイートが表示される 20 print "$output[1]\n";#ツイートが表示される 21 print "$output[2]\n";#ツイートが表示される 22 print "$output[3]\n";#ツイートが表示される 23 print "$output[4]\n";#ツイートが表示される 24 print "$output[5]\n";#ツイートが表示される 25 print "$output[6]\n";#youtubeが表示される 26 print "$output[7]\n";#youtubeが表示される 27 print "$output[8]\n";#youtubeが表示される 28 print "$output[9]\n";#youtubeが表示される 29 ?>

twitter.py

Python

1import tweepy 2 3api_key = "hoge" 4 5api_secret_key = "hogehoge" 6 7access_token = "hogehogehoge" 8 9access_token_secret = "hogehogehogehoge" 10 11auth = tweepy.OAuthHandler(api_key, api_secret_key) 12 13auth.set_access_token(access_token, access_token_secret) 14 15api = tweepy.API(auth, wait_on_rate_limit=True) 16 17for tweet in tweepy.Cursor(api.search, q='#hogehoge' + '-filter:retweets').items(10): 18 19 print(f'https://twitter.com/user/status/{tweet.id}')

youtube.py

Python

1import re 2from apiclient.discovery import build 3 4API_KEY = 'hogehogehogehogehoge' 5 6youtube = build("youtube", "v3", developerKey = API_KEY) 7 8youtube_query = youtube.search().list( 9part="id", 10q="hogehogehogehogehogehoge", 11order="viewCount", 12type="video", 13maxResults=10 14).execute() 15 16s = youtube_query 17 18a = '<iframe width="560" height="315" src="https://www.youtube.com/embed/' 19b = '" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>' 20 21print(a+str(str(s)[-16:-1])[0:11]+b) 22print(a+str(str(s)[-132*1+-16:-1])[0:11]+b) 23print(a+str(str(s)[-132*2+-16:-1])[0:11]+b) 24print(a+str(str(s)[-132*3+-16:-1])[0:11]+b) 25print(a+str(str(s)[-132*4+-16:-1])[0:11]+b) 26print(a+str(str(s)[-132*5+-16:-1])[0:11]+b) 27print(a+str(str(s)[-132*6+-16:-1])[0:11]+b) 28print(a+str(str(s)[-132*7+-16:-1])[0:11]+b) 29print(a+str(str(s)[-132*8+-16:-1])[0:11]+b) 30print(a+str(str(s)[-132*9+-16:-1])[0:11]+b)

試したこと

各pyファイルのコマンドラインでの確認

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

twitter.pyとyoutube.py、hogehoge.phpは同ディレクトリ下にあります。
phpで開放したローカルサーバーでサイトの確認をしています。

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

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

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

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

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

m.ts10806

2021/04/28 08:04

$outputをvar_dumpした結果はどうなるのでしょうか。 直指定ではなくforeachなどで「持ってる情報だけ」出すように組まれたほうが良いかとは思いますが
guest

回答2

0

ベストアンサー

https://www.php.net/manual/ja/function.exec.php
を読むと

output 引数 output が存在する場合、指定した配列は、 コマンドからの出力の各行で埋められます。 \n のような後に続く空白は、この配列には含まれません。 配列に既に何らかの要素が 含まれる場合は、exec() は配列の最後に追加される ことに注意してください。関数が要素を追加することを望まないのなら、 それが exec() に渡される前に、配列の unset() を呼び出してください。

となっているので、その挙動が正しいのだと思います。2回目の呼び出しの際に

unset($output); $command="python youtube.py "; exec($command,$output);

としたらどうでしょう。


あと、蛇足ではありますがyambejpさんと同意見で、python使うならpythonで完結、もしくはその逆でPHPで完結とした方が良いと思います。どちらのソースコードを見てもそれがpythonでなければならない、PHPでなければならないという処理には見えません。勉強ということであればいいですが、exec()はよっぽどのことがない限りは使わない方が良いと思いますよ。

投稿2021/04/28 08:18

編集2021/04/28 08:20
AbeTakashi

総合スコア4853

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

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

Tomotomo_

2021/04/28 08:29

回答者様のコードを用いたところ、理想した挙動をしました。 大変助かりました。有難うございます。 プログラムの混在についてですが、もう少し勉強して一つの言語で完結できるようにしたいと考えています。
guest

0

サーバーサイドのプログラムを混在させるのはあまり好ましくはありません
phpからpythonを呼び出したいならcurlなどでhttp経由の取得がよいかもしれません

投稿2021/04/28 08:08

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問