ラブサファリ

勉強したことや、新しいものなど。

PHP

Laravelでgmailを送信しようとしたらエラーが出て送信できなかったので
解決までの手順をメモしておく 続きを読む

フォームなどを長時間開いていると、csrf tokenの有効期限が切れて送信した時に"TokenMismatchException"エラーが出てしまうがLaravelデフォルトのエラー画面がユーザーに見えてしまうとまずいのでカスタマイズする。 続きを読む

PHPの中でユーザー定義変数を含んだMySQLのクエリーを実行する時に"You have an error in your SQL syntax. Check the manual..."になってしまったので解決策。続きを読む

34

続きを読む

・メッセージが送れない!
まず一番に悩んだところ。
当初いたるところで紹介されていた無料で作る方法
heroku+fixieでやろうとしたが、outbandIPを指定してもうんともすんともいわず・・・

結局ロリポップでも動くということで。
一番安いライトの共有SSLでIP指定したらたやすく動きました。
(解決になってない)

・遅れるようになったけど、作り方がわからない(´・ω・`)
PHPならなんとかなると思っていた時期が私にもありました。
ドキュメント読めば簡単?全部英語じゃねーかふざけんな!
( 乂∀ `)┌┛)`д);

以下のサイトさんが非常に参考になりました。(というかほぼ丸パクリしました)
すみません
すみません

初期設定: http://qiita.com/Coichiro/items/d796b13f275f341161c7
実際の作り方: http://www.takuro.info/archives/5573

上記のサイトを見ればアホでも作れるので、
多分これより下は読む必要ないです。

読んでくださいお願いします。


・BOTからスタンプを送りたい!

追記:
どうやら公式ドキュメントにしっかり送信可能リストがあったらしいです。よって以下のめんどい作業は完全に無意味・・でもどの番号がどのスタンプかはわからねーし・・意味あるし・・
https://developers.line.me/bot-api/api-reference#sending_message_sticker


STKIDやらを指定すればいいらしいが、どうやってそんな情報調べりゃいいねん
ググっても出てこないし。


→BOTに教えて貰えばいいか!

てな感じで以下のコードで初期スタンプの情報をBOTに喋らせる。

if($content_type == 8){
$content = <<< EOM
"contentType":1,
"text":"STKID:{$content->contentMetadata->STKID} PKGID:{$content->contentMetadata->STKPKGID} STKVER:{$content->contentMetadata->STKVER}"
EOM;
あとはこのコンテンツをPOSTすればOK


見た感じだと基本STKPKGIDは2
STKVERは100で固定ぽい
とりあえず160ー179あたりが良さそうだったのでランダムに指定してみる。

//ContentTypeが8の場合(スタンプが送られてきた場合)、STKID:160-179の中からランダムにスタンプを返す

if($content_type == 8){

$stkId = mt_rand(160,179);

$content = <<< EOM

        "contentType":8,

        "contentMetadata":{

          "STKID":"$stkId",

          "STKPKGID":"2",

          "STKVER":"100"

        }

EOM;




ただ、必ずしも連番でなかったりわけわかめ。
非常にめんどい。


・送信テキストと判定用テキストをJSONで管理したい!
ソースコードをできるだけシンプルにしたいので。外部化して読み込みました。(当たり前?)
以下のようなJSONファイルを作成
pettern.json

 
29

dictionary.json
37

あとはこれらを配列として読み込み

//返信用文字列

$url = 'json/dictionary.json';
$json = file_get_contents($url);
$arr = json_decode($json,true);

//マッチング用文字列
$mUrl = 'json/pettern.json';
$mJson = file_get_contents($mUrl);
$mArr = json_decode($mJson,true);

送られてきたメッセージが pettern.jsonの中にヒットしたらdictionary.jsonの同じキーの配列から
ランダムで選択して返信するという仕組み。

こんな感じの関数を作って判定して

function is_match($targetArray,$targetString){
  $length = count($targetArray);
  for($i=0;$i<$length;$i++){
    if(preg_match("/$targetArray[$i]/",$targetString)){
      return true;
    }
  }
  return false;
}


ヒットしたらarray_randでランダムに返信内容をセットする。
if(is_match($mArr["night"],$text)){/div>
  
$content = <<< EOM
        "contentType":1,
        "text":"{$arr["night"][array_rand($arr["night"],1)]}"
EOM;


for文で回すのは多分スマートではないのだろうけど。
こんなクソコードでもわりと一瞬で帰ってくるのでよしとする。

↑このページのトップヘ