鶏口牛後な日々

心の赴くまま、やりたいことを仕事に。

さくらインターネットでLINE bot作った時につまづいたこと

再度同じことをする時のために、最短で進められるようにつまづいたことを書き留めておきます。

LINEコンソールでwebhookのURLを登録するときにSSL化が必要

すでにあるさくらインターネットのサーバ内で、なんでもいいので独自ドメインサブドメインでも、無料ドメインでもをフォルダに紐付けようとしたが、サブドメインの発行限度に引っかかってしまった。

仕方なく、テスト用で使っているフォルダに入れ子でフォルダを作ったのだが、SSL化されていないとwebhookに登録できない。

さくらインターネットでは、無料ドメインや初期ドメインSSL化できない。

無料ドメインは発行限度がこれまたある。

独自ドメインサブドメインSSL化する時は、コンソールのドメイン管理のところから「SSL」というボタンを押すとできるが、引っ掛けなのか有料のSSL化方法が目立つように表示されるので注意が必要。

無料の方法(Let's encrypt一択)もここから設定できる。

Composerのインストール

LINE bot開発に不可欠な、LINE社が提供しているSDK(linecorp/line-bot-sdk)をcomposerでインストールしようとするのだが、さくらインターネットにはデフォルトでComposerが入っていないので入れる必要がある。

これは検索すると一発で方法が出る。

curl -sS https://getcomposer.org/installer | php

これで完了。

php composer.phar

で、ComposerのAAが出てきたらOK。

Composerのコマンドが使えない

よし! composer require <package名> と思ったら、コマンドがないと怒られる。

こちらは、composer.pharの場所をルートからのパスで指定してやることで回避できる。

php /home/ユーザ名/www/・・・/composer.phar require linecorp/line-bot-sdk

こんな感じにすればcomposerコマンドを使える。

ext-socketsがないと怒られる

上のsdkをインストールするコマンドを叩くと、ext-socketsがないと怒られる。(エラー内容は下記)

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires linecorp/line-bot-sdk ^7.1 -> satisfiable by linecorp/line-bot-sdk[7.1.0].
    - linecorp/line-bot-sdk 7.1.0 requires ext-sockets * -> it is missing from your system. Install or enable PHP's sockets extension.

To enable extensions, verify that they are enabled in your .ini files:
    - /usr/local/php/7.4/etc/php.ini
    - /usr/local/php/7.4/etc/conf.d/apcu.ini
    - /usr/local/php/7.4/etc/conf.d/mcrypt.ini
    - /usr/local/php/7.4/etc/conf.d/opcache.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

Installation failed, deleting ./composer.json.

過去はこれが要らなかったらしいが、近年このextensionが必要なものに加えられたらしい。

これにはかなりハマった。

というか、ちゃんと書いてくれている人がいたのだが、やりなれていない方法だったので、コマンドややり方などさらに調べる必要があった。

ただ色々回り道しつつ、結局この二つのブログで書かれている通りのことを実施して、うまく入った。

https://note.com/kuroko_peace/n/naffb49e54ab3

さくらレンタルサーバーでLINE BOT SDKがComposerでインストールできない( requires ext-sockets * ) sockets.soエラー

コマンドラインでまずphpのバージョンを調べておいて、php.netのdownloadページから同じバージョンのものをwgetでとってくる。

tarコマンドで解凍して、中身を確認すると、extというフォルダの中に sockets というフォルダがある。

この中にcdして、ここでc言語なのでbuildをする必要がある。

phpizeして、configureファイルができるのでこれを実行してmakeするとbuildが成功する。

この時、生成されたファイルのパスが出る。

・・・

cp ./.libs/sockets.so /home/settenten/www/cs/bot/php-7.4.22/ext/sockets/modules/sockets.so
cp ./.libs/sockets.lai /home/settenten/www/cs/bot/php-7.4.22/ext/sockets/modules/sockets.la
----------------------------------------------------------------------
Libraries have been installed in:
   /home/○○○○/www/cs/bot/php-7.4.22/ext/sockets/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

ここで、make testも実施。 このうち、参考にしたブログの人は、soのみならずlaもphp.iniで指定すると書いてあったが、 一つ目のブログの人のように、soだけをphp.iniで指定したら、line-bot-sdkを無事インストールすることができた。

alias php='/usr/local/bin/php -c /home/〇〇/www/php.ini'

php.iniにエイリアスをつけることも忘れない。

extension_dir = /home/○○○○/www/php-7.4.22/ext/sockets/modules/
extension = sockets.so

extension_dirは、任意の自分で置いたところを指定する。 私は、生成されたそのままのパスを指定した。

これでやっと開発が開始できるところまで来た。

botが送信するメッセージが文字化けする

pushもreplyメッセージも文字化けしました。英語にすると問題がないので、日本語の文字化けのようでした。

こちらは、制御しているPHPファイルの文字コードutf-8に直したところ、文字化けしないようになりました。

:set fenc?

で確認して、

:set fenc=utf-8

です。


20230513追記

何にもしていないのに、いきなりLine botの応答が途絶えたので、マジで結構焦って、別フォルダを切ったり数日てんやわんやだったんですが、なんといつの間にかInternal Server Errorが出なくなった。。。本当にやめてくれって感じです。再度色々調べて勉強にはなりましたが。

状況を書いておきます。

botがいきなり応答しなくなった。おかしいと思って、LINE developersのコンソールからwebhookの検証(ファイルの接続確認)をしてみるも、エラーが出ますとのこと。 同じフォルダに置いている他のphpファイル(phpinfoのファイルを作っていた)も接続ができず、Internal Server Errorが出る。

ただし、同じサーバーの別のドメイン(フォルダを切っている)のサイトは全部見られた。つまりこのbotのファイルを置いているフォルダだけが何かおかしい。変なphpのファイルでも置いてしまったか、間違って直した時に変なコードが混じってしまったかと思い、直近で触っていたファイルを消したりしてみたが、変化なし。

仕方ないので、他のサブドメインを切り、SSL化し、そこに入れ込んでみるが、line-corp-sdkなどをまた入れ直さないといけないようだった。(前作ったフォルダ内にcomposer installしていた)面倒だな〜 と思って、一度最初のフォルダに接続確認をしてみたところ、なんと何もなかったかのように接続ができた・・・・・・・・・・。

本当にやめてほしいし、原因を解明したいけど、どうにも私にはやりようがない。将来的に自分の技術力が上がって、究明できる時のために、一応備忘録としてここに記録しておく。(あと悔しかったから、このまま昇華させないために書いた。)