メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

LINE Messaging APIのためにBotアカウントを追加した

経緯

ryoichi0102.hatenablog.com

アカウント追加の失敗編はこちら

ryoichi0102.hatenablog.com

手順

ログイン

ログインはこっちの方なんですよね。

f:id:ryoichi0102:20180913182146p:plain
https://developers.line.me/

ID・パスワード入力

f:id:ryoichi0102:20180913182401p:plain

場合によってはスマホのLINEアプリでパスコードを入力したりする必要があります。

プロバイダー名の部分クリック (作成ではない)

f:id:ryoichi0102:20180913092836p:plain

新規チャネル作成をクリック

f:id:ryoichi0102:20180913093143p:plain

チャネル選択ではMessaging APIをクリック

f:id:ryoichi0102:20180913093430p:plain

新規チャネル作成で必要事項を入力

アプリ名・アプリ説明・プラン・大業種・小業種・メールアドレスを入力します。
業種は今回はテスト用だったので、個人(その他)を選択。

f:id:ryoichi0102:20180913183003p:plain

同意

f:id:ryoichi0102:20180913183301p:plain

規約に同意して"作成"

f:id:ryoichi0102:20180913183534p:plain

作成されました

f:id:ryoichi0102:20180913183746p:plain

失敗編のLINE@アカウントの時と違って、LINEアプリ上では自動的に友達にはなってないので、詳細画面に飛んでQRコードから友達登録する必要があります。

Webhookの設定を行う 

"Webhook送信" を "利用する" に変更します。
"利用可能な機能" 欄にちゃんとPUSH_MESSAGEが入っていますね!
そしてWebhook URLを設定します。
ここで設定するURLでLINE Botに話しかけらたりしたデータやLINE Botアカウントが検知したBeaconのデータだったりを受け取ります。
なお、"自動応答メッセージ" は "利用しない" に設定します。

f:id:ryoichi0102:20180913185218p:plain

接続確認ボタンをクリック

下記のようなデータが送られてきます。

{
  "events": [
    {
      "replyToken": "00000000000000000000000000000000",
      "type": "message",
      "timestamp": 1536832520978,
      "source": {
        "type": "user",
        "userId": "Udeadbeefdeadbeefdeadbeefdeadbeef"
      },
      "message": {
        "id": "100001",
        "type": "text",
        "text": "Hello, world"
      }
    },
    {
      "replyToken": "ffffffffffffffffffffffffffffffff",
      "type": "message",
      "timestamp": 1536832520978,
      "source": {
        "type": "user",
        "userId": "Udeadbeefdeadbeefdeadbeefdeadbeef"
      },
      "message": {
        "id": "100002",
        "type": "sticker",
        "packageId": "1",
        "stickerId": "1"
      }
    }
  ]
}

たとえばAWSAPI Gateway + Lambdaの構成で下記のようなコードを書いておけば簡単にログが確認できます。

exports.handler = async (event) => {
  console.log(JSON.stringify(JSON.parse(event.body)));

  const response = {
      statusCode: 200,
      body: JSON.stringify('Hello from Lambda!')
  };
  return response;
};

LINE@MANAGERからもPUSH_MESSAGEが有効になっているのが確認できます。

f:id:ryoichi0102:20180913191922p:plain

各種設定

Beaconの設定はコチラ

ryoichi0102.hatenablog.com

LINE Messaging APIのためにBotアカウントを追加で登録しようと思ったら失敗した

経緯はコチラ

ryoichi0102.hatenablog.com

久しぶりにLINEにログイン…

知らないと迷うのですが、LINE@MANAGERと、Line Developersと画面が2つあります。ログインしてこの画面でアカウント一覧を表示させても、追加ボタンがなく困りました。

f:id:ryoichi0102:20180912145923p:plain
https://admin-official.line.me

アカウントがあろうがログイン済だろうが、トップ画面から登録しないといけないのですね。。。

f:id:ryoichi0102:20180912150808p:plain
https://at.line.me/jp/

ここから登録するとうまくいかない

ここ注意です!ここで紹介しているのは間違えた手順です。
正しくは↓コチラ↓

ryoichi0102.hatenablog.com

"一般アカウントを作成する" をクリック。設定したのは"表示アカウント名"の方で、"LINE@ID"はランダムなんですね。

f:id:ryoichi0102:20180912181759p:plain

必要な情報を入力します

アカウント名、業種を入力します。
業種は今回はテスト用だったので、個人(その他)を選択。
"確認する"ボタンをクリックしたら、確認画面が出ますので、"完了"ボタンをクリックすればLINE@アカウントの作成は完了です。

f:id:ryoichi0102:20180912182207p:plain

これで完了です。"LINE@MANAGERへログイン"ボタンをクリック

さきほど入力したアカウント名はLINE IDではない所も少し紛らわしいですね。LINE IDは"LINE@ID"の部分に表示されています。ただ、このIDでLINEアプリから検索しても候補に出ませんね。。(後に表示されるQRコードで追加します)

f:id:ryoichi0102:20180912184214p:plain

同意

f:id:ryoichi0102:20180912184626p:plain

作ったアカウントは自動的に友達になっています

f:id:ryoichi0102:20180912185012p:plain

LINE@MANAGERへログインするとこんな感じになっています

ここで左側サイドメニュー下に、"アカウント設定" ⇒ "Messaging API設定" がありますのでクリックします。

f:id:ryoichi0102:20180912185614p:plain

プロバイダーを選択して"APIを利用する"をクリック

f:id:ryoichi0102:20180912205613p:plain

ちょっと脅されますが、そのまま"確認"をクリック

f:id:ryoichi0102:20180912205629p:plain

成功しました

f:id:ryoichi0102:20180912210040p:plain

Messaging API設定が表示されます。

ここです。。ここで、REPLY_MESSAGEしか表示されておらず、POST_MESSAGEが無いのです。そして、Webhook送信 "利用する" が選択できない。。

f:id:ryoichi0102:20180912210322p:plain

"LINE Developers で設定する" をクリックして、LINE Developersで設定してみるも

LINE@MANAGERではLINE Developersで設定とあるのですが、ここでWebhookの設定をしても、POST_MESSAGEが設定されません。。

f:id:ryoichi0102:20180913015713p:plain

 

と、いうことでアカウントを削除して作り直しました。。。

 

Windows cmdでsc.exeのstopとstartを組み合わせてサービスのrestart

サービスを操作するには net か sc コマンド

Windowsサービスの開始・終了をコマンドで行う場合にはnetコマンドかscコマンドを使います。これらの違いとしてそれぞれ下記のような違いあります。

・netコマンドは同期的
・scコマンドは非同期的

つまり、netコマンドは実行終了まで待つが、scコマンドは待たない。

・netコマンドはリモートのサービスは操作できない
・scコマンドはリモートOK

scでリモートのサービスを再起動(restart)したい

Jenkinsなど、別マシンからWindowsサービスを操作したいことがあると思います。
前述のとおり、リモートのサービスの場合scコマンドを使います。

ただ、scコマンドにはstartとstopしかなく
sc stop ServiceName
sc start ServiceName
と実行しても、scが非同期なので、stop処理が完全に終了する前に次のコマンド実行に流れてしまい、sc startコマンドの実行時点ではサービスが終了しきっていないというエラーになります。

sc stopを同期的に同期的に使用するためには、下記のように do-while ループを回し、その中で query の結果が STOPPED になるのを待ちます。

sc \\【IPアドレス stop 【サービス名】

:DoWhile
	sc sc \\【IPアドレス query 【サービス名】 | findstr STATE | findstr STOPPED
	if %ERRORLEVEL% EQU 0 goto DoWhileExit
goto DoWhile
:DoWhileExit

sc \\【IPアドレス start 【サービス名】

cmd不便です。。
これでとりあえずしのぎました。

参考

7. バッチ処理とフローチャート
http://mapplio.info/flo/flo_lecture2/bat_charpter.html#do-while

neos21.hatenablog.com

tipstour.net