Google App EngineでPHP
前回の投稿 BlowsingNow!ブックマークレット代替 でBookmarkletとPHPでそれっぽいものを作ったんですが、PHPが動く環境がないと使えませんでした。
そんな環境どっかにないかなーと探していたら、Google App EngineでPHPが使えることが判明。以前ちょろっと触っただけで完全放置状態だったのですが、今回の用途にはちょうど良さそうだったので、お勉強がてら設置してみることにしました。
参考にしたのはこちら。
Google App Engine for PHPプレビュー版でphpinfoを動かしてみた | Lancork
後は公式ドキュメント。
Introduction - Google App Engine — Google Developers
まずはGAE上でアプリケーションの作成を行い、次にローカルでテストしたりデプロイするための環境(SDK)をインストールして初期設定を済ませます。
Downloads - Google App Engine — Google Developers
これを動かすためにはPython2.7系が必要になりますが、SDKのインストーラーの頭でインストールを促されるので、別途ダウンロード&インストールを済ませてから続行します。
これで、SDK+Google App Engine Launcherがインストールされます。コマンドプロンプトからSDKを叩いて各種操作をしている情報が散見されましたが、Launcherから操作してもできることは変わらない印象でした。
インストールを済ませておいても、なぜかGoogle App Engine Launcherの初回起動時にPythonが見つからないと怒られるので、とりあえず無視して設定画面を開き、Pythonの実行ファイルを指定する必要がありました。
次に、Launcherにてアプリケーションの作成を行います(File - Create New Application)。Application NameにはGAEでアプリケーションを作った際に指定したApplication Identifierの内容を指定します。Parent Directoryはアプリケーション用のフォルダが作成されるパスを指定します。ここにアプリケーション名のフォルダが自動で作成されるため、事前に用意しておく必要はありませんのでご注意を。
作成されたフォルダの中を見ると、設定などを行う最低限のファイルが作られています。アクセス制限やスクリプトのランタイム種別の指定はapp.yamlファイルで行うのですが、PHP用のテンプレートのはずなのに、なぜかruntimeがPython27になっていたりランタイムにphpを指定した時は指定してはいけない(?)使用ライブラリの設定があったりして、もう一声欲しかった感があります。Preview状態なのでそんなものなのかもしれませんが。
このファイルはYAMLの文法で指定するのですが、よくわからないので各所からコピペして試行錯誤しながらとりあえずPHPが動くようにする必要があります。
最終的にはこうなりました。
application: kiri-bween
version: 1
runtime: php
api_version: 1
threadsafe: yes
handlers:
- url: /(.+\.php)$
script: \1
- url: /
static_files: htdocs/index.htm
upload: /
- url: /images/(.*)
static_files: images/\1
upload: images/(.*)
- url: /
static_dir: htdocs
- url: .*
script: main.app
htdocsというフォルダを作ってindex.htmを置いたり、画像用にimagesというフォルダを作ったりしたので、このような形になってます。間違っていたり不足してたりする箇所もあると思いますが、とりあえず動けばいいやってレベルです。
これで、前回作ったPHPファイルとライブラリのファイルを置き、Bookmarklet内のURLを修正してデプロイすれば動くはずだったのですが、GAEではcurlが使えないのでライブラリの修正が必要でした。
こちらを参考に。
【PHP】【GAE】PHPでtwitterBot & GAEにデプロイ - せかいや
話が前後しますが、Googleで2段階認証を設定していると、デプロイ時の認証で怒られます。Launcherが2段階認証に対応していないためです。これは先に紹介したLancorkさんの情報にも書いてあるのですが、ハマるポイントなのでお気をつけを。
こちらの手順でパスワードを発行して、それを指定する必要があります。
Sign in using application-specific passwords - Accounts Help
とりあえず、自分一人で使う分にはこれで完了。ですが、なんだかんだと手間がかかってしまったので、お試しで公開してみることにしました。現在のBookmarkletにはTwitterのアクセストークンなどが埋め込まれているので、公開するにあたってはこのアクセストークン等を埋め込んだBookmarkletを生成する機能が必要です。そもそも、アクセストークンを取得するためには各ユーザーがTwitter上でBweenの使用を許可しなければなりません。
ということで、まずはPHPでBookmarkletを生成する方法を調べました。ざっくり言うと、BookmarketのソースとなるJavaScriptをuri encodeした文字列を、リンクのソースとして指定して、echoで吐き出してやれば良いらしいです(HTMLの<a href="~">のこと)。つまり、Twitterの認証完了時に取得できるアクセストークン等をこのJavaScriptに埋め込んで吐き出してやればいいってことです。
次に、TwitterのOAuth認証です。いわゆる、Sign in with Twitter的なリンクを押すと、Twitterのサイトに飛んで認証完了したら、コールバック指定したURLに戻ってくる、というよく見るアレです。
Twitter連携するサービスを作るのは初めてだし、長らくTwitterのOAuth認証は触ってなかったので、どういう流れだったかも記憶の彼方。twitteroauthライブラリの説明とTwitterのドキュメント、ライブラリのソースを眺めならが流れを掴みつつ実装しました。
一番参考になったのはこちら。
twitteroauthでOAuth認証を行い、Twitterアプリケーション(Botとか)を作る – part2 « nia.note
セッション使わないとダメなのねーとか、参考になりました。(getAccessToken呼ぶときverifier指定してないのは?でした。ライブラリのバージョンの問題かしら・・・)
使ってみたい方はこちらからどうぞ。
使うのは自己責任で。使えなくなっても泣かないお約束ってことで一つ。
追記
ソースとか。使わせて頂いたライブラリも乗っけちゃってる上、手も入れちゃってるし出展元表記もソース中に無く、ライセンス表記もない。ものすごくお行儀悪いですね。すいません。
後から気づいたけど、config.phpを使うサンプルが本家にありました。こっちの方法にすれば良かった・・・
追記(2017年5月17日)
急にエラー吐きはじめてビビった。twitteroauth.phpでcURLが使えるか判断して処理切り替えしているところがあったんだけど、数日前にGAE側で環境変わったっぽい。元々使っていなかったので、常時file_get_contentsを使うように慌てて修正しました。それよか、Windowsのデプロイの環境が古くて使えなくなってたのでSDK入れ替えたりapp.yaml修正したりデプロイ手順調べたりする方が大変でした。