びっくりするぐらい更新してませんでした。えっ、途中の非公開にした記事もあるけどそれも2016年9月…
お久しぶりです。相変わらず社畜をしていますが、最近はMeseMoa.(めせもあ。)というアイドルで日々ホクホクしています。改名前はむすめん。さんです。
MeseMoa.さんはイベントやライブの情報を 公式ブログ にまとめて掲載してくれるのですが、その公式ブログがLINEブログで運用されていて、PCからもスマホからもどうにも使いづらく、イベント情報やメディア情報が埋もれがちでした。なにかの手助けになればと思ってブログ記事検索サイトを作りました。
LINEブログから公式ちゃん投稿だけ引っこ抜き検討してます。糸口は見えたんでなんかやってみよ。
— のぢ (@n0tzy_428) November 14, 2018
結果、出来上がったもの → め。ブログ検索(非公式)
ここでは開発経緯や詰まったことをメモしていきます。
全然布教ブログとかじゃないので興味無い方は引き返してくださいね。
LINEブログの仕様調査
LINEブログから公式の情報を抽出できるかどうか、まずLINEブログの仕様を調べました。
- 記事の中に投稿者名は無い
- 記事の中に更新日時は表示されていない
- リンク表示はないが、RSS1.0は配信されている。
- RSSは直近の10件について配信されている。
- RSSの10件は更新日時の降順配信
- RSSの中には投稿者IDが出力されている
- 投稿者IDで複数のスタッフIDを確認
ということがわかりました。
公式ツイートの手動RTには限界がある
最初は、LINEブログの更新情報や後日の追加情報もTwitterの公式アカウントからツイートされるので、手動かIFTTT(イフト)というトリガーサイトを使って公式ちゃんだけ非公式まとめアカウントからツイートできればいいかなと思っていました。
ただ、
- IFTTTが検出するのに必須のguidという項目が出力されていない
- 投稿ツイートでは投稿者を識別できず公式情報以外もRTしてしまう
という問題があり、公式ツイートをただRTするだけになってしまったのでボツに。これについてはTwitterのAPIをお勉強していつか解決したいです。
LINEブログ→(RSSフィード取得→投稿者で公式ちゃん識別)→ツイート
— のぢ (@n0tzy_428) November 15, 2018
ってのを考えててIFTTTさんでトリガー設定してみたんだけどLINEブログのRSSに、guid出力されてないから動かないかも。
ところであおいくんと公式ちゃんがたまにアカウント混同しててウケる(端末共有してるんだろな)
自前でシステムを作ることにした
※ここから本当にただのプログラムメモになります
外部サービスを利用していても目的が達成できなさそうなので、自前で作ることにしました。以下は想定した要件定義です。
- 投稿者別URLリンク集として利用できること
- PCスマホから閲覧容易なこと
- SE作業により過去記事のリンクを作成し読み込めること
- 新規記事はRSS、公式ツイートをトリガとして自動で読み込めること
- ブログ記事から投稿タグを取得して絞り込みに利用できること
- 投稿者IDを修正できること
システムが動く環境はこんな感じで。レンタルサーバ環境で動くもので構成を考えました。
- レンタルサーバ環境
- CentOS(共用サーバー)
- Apache 2.4.x
- SSL利用
- .htaccess利用可
- PHP 7.1
- Smarty利用(3系)
- MySQLまたはSQLite利用可
- フロントエンド環境
- Bootstrap
MySQLはもうWordPressの動作で利用していてライセンス数が足りなかったことと、頻繁に更新処理が走るようなシステムでもないのでSQLiteを採用しました。ローカル環境でも扱いやすいので結果良かったと思っています。
/途中詰まったことメモ
PHPもSmatryも数年ぶりだしBootstrapは初だしバックエンドもフロントエンドも手こずりました…。理解してしまえばなんてことなかったのですが。
以下、今後のために自分用メモ。しっかりは書いていません。
- 複数のPHPに分割するときはファイルパスに注意
require_once
などで呼び出すと呼び出し元のフォルダ階層をカレントと判断して動いてしまう。ファイル参照とかしてるといきなり読めなくなって焦る。できるだけ固定パスで書くか、dirname(__FILE__)
を利用して記載する。
- Smartyのデバッグ
- 変数のアサイン内容を確認するときなどは、
$smarty->debugging = true;
を有効にしておくと便利。ページを表示したときに別窓で変数内容が表示される。
- 変数のアサイン内容を確認するときなどは、
- パラメータの取得はfilter_inputで取得する
- 配列で扱いたいパラメタも1つしか選択されていないと文字列で認識されるので、
(array)
キャストをつける。 - SQLite内部で日付はUTC日時の文字列として保持される。INSERT時はタイムゾーン設定によって時差が自動で反映される。DBから取り出す時は逆にタイムゾーンを指定して取り出す。
- INSERT時:
datetime(?)
- SELECT時:
strftime('%Y-%m-%d %H:%M:%S',postdt, 'localtime')
- INSERT時:
- プリペアードステートメントにバインドする時、LIKE文で以下のような書き方をしているとバインド項目数がオーバーしてるよ!か足りないよ!で怒られる。部分一致はバインドする値の方につけるらしい。これはバインドするときに型を判定してクォートつけるつけないを判定しているからで、その辺はお任せするんだって。
- エラーになる書き方:
LIKE '%?%'
バインドはaaa
- エラーにならない書き方:
LIKE ?
バインドは%aaa%
- エラーになる書き方:
- Smarty内でデバッグ出力させたい時は
{$hoge|@debug_print_var}
- Smartyですべての出力にフィルターを書けたい時は
$smarty->default_modifiers = array("escape:'html'");
- リンク作る時とかでフィルターを解除するときは
{$fuga nofilter}
- URLエスケープする時の文字コード指定は後ろにつなげる。
|escape:'url':'UTF-8'
コメント