【インターンレポート】「LINE証券」LINE公式アカウントでの値動きランキング自動配信

自己紹介

2020年の8月から9月にかけて技術職 就業型コースのインターンシップに参加した遠藤皓義です。現在は慶應義塾大学の経済学部3年に在籍していて、コーポレートファイナンスやミクロ経済学を勉強しています。

今回のインターンを通して私が取り組んだ内容をご紹介させて頂きます。

LINE証券について

LINE証券では個人向けの株取引サービスを提供しています。
サービスの特色としては、誰でも気軽に少額から投資を始められる点を強みとしています。一般的な株式取引は100株単位(単元株)での取引となりますが、「LINE証券」では”いちかぶ”(単元未満株)という、1株単位で取引することが可能なため、1株数百円から投資を始められます!

僕もこのインターンをきっかけにLINE証券を使って投資を始めたので、それがインターンの収穫の一つだったりします笑

プロジェクト+背景

続いて僕の担当したプロジェクトを紹介させて頂きます。

一般の人が株を始めると最初に大体下の二つの壁にぶつかります(僕も始めてみて実感しました笑)

  • どの株をいつ買ったらいいかわからない
  • 買ったはいいけどいつ売ればいいのかわからない

またこれらの壁を乗り越えていざ株の取引を始めてみても、そのうち飽きて取引しなくなってしまうパターンも多いです。

そこで今回LINE証券のLINE公式アカウントにて株に関する情報を配信することで、こういった売買のタイミングを決めかねていたり、ちょっと取引を行わなくなってしまったユーザーに取引のきっかけを作ろうというプロジェクトが立ち上がりました。

今回僕が担当したのは、その中の配信物の一つである、株の値動きランキングを自動配信するバッチプログラムの作成になります。

具体的には
LINE証券内で保持している株価情報から最も値上がり・値下がりしている株TOP5の情報を持ってくる
    ↓
それをおしゃれなメッセージにまとめて、ユーザーに送信する
という一連のプロセスを定期的に自動で行うためのプログラムになります。

LINE公式アカウントでの自動配信について

始めに、今回公式アカウントからメッセージを送信するために用いた物を紹介させて頂きます。

LINE公式アカウントで高度なチャットBotを運用するなどのために、Messaging APIというものが提供されています。

このAPIの主な機能としては以下の機能があります。

  • Botサーバー側でwebhookを登録し、ユーザーから来たメッセージを受信して、返信する機能
  • 対象ユーザーを指定して任意のタイミングでメッセージを送る機能

プロジェクトではこの二つ目の任意タイミングでメッセージ送信を行う機能を使い、株価ランキングを配信します。

次に配信するメッセージに関してですが、僕らが普段友達と送り合うテキストメッセージよりも、もっとデザイン性の高いコンテンツを配信するため、今回はflex message という特殊なメッセージ種類を配信しています。
flex messageはCSS Flexible Box(CSS Flexbox)を用いて記述し、レイアウトを自由にカスタマイズできるメッセージのことです。
これを用いることで、下の図のような凝ったデザインや横に複数のコンテンツを並べるカルーセル方式のメッセージなど、通常のメッセージ種類では実現できないメッセージを配信することができます。

そして下が実際に送られるメッセージになります。今回はこのカルーセルメッセージを使って、一つのコンテンツに一つの銘柄の情報を入れて、それを並べた形で配信しています。

※ 開発中の画面です。
flex messageはこんな感じのjsonで書かれています。

json

{
  "type": "bubble",
  "body": {
    "type": "box",
    "layout": "vertical",
    "contents": [
      {
        "type": "image",
        "url": "https://scdn.line-apps.com/n/channel_devcenter/img/flexsnapshot/clip/clip1.jpg",
        "size": "full",
        "aspectMode": "cover",
and more... (実際の配信メッセージのものではないです)

使用技術:

今回使用したのはKotlin + Spring frameworkになります。LINE証券のサーバーサイドではJavaからKotlinへの移行がされており、直近で開発されたものはほとんどがKotlinで書かれています。

Kotlinは全く触れたことがなくて不安だったのですが、使ってみるとJavaに比べて圧倒的にコードを書かなくていいありがたみに感動し、今ではめちゃくちゃ気に入っています笑

作った物紹介

作成したバッチプログラムが中で行っていることは下の図のように主に三つのステップに分かれています。

1. 株情報取得+メッセージ生成
ここでは配信する情報を集めて、flex message を作成します。
まず配信するメッセージの作成に必要な下の3つの情報を集めてきます。

  1. 値上がり・値下がりランキング(値段情報)
  2. 銘柄名
  3. 1.の値段情報の取得日時

これらの情報は別々の内部APIより提供されているため、それぞれのAPIを呼び出して一つのEntityにまとめます。
特に株の値段とその値段がいつ時点のものかについては正確性が求められますので、BigDecimal型で数値を受け取ったり、値段の更新タイミングを詳細に確認するといった処理が必要でした。必要な情報が集まったらあらかじめ準備しておいた、flex messageのjsonの雛形に値を代入していきます。

今回の場合は雛形をstringとして読み込み、appache commonsのStringSubstitutor を用いて直接値を埋め込んで、flex message を完成させます。

2. 送信対象ユーザーの取得
現在は配信対象のユーザーが3つのセグメントに分かれていて、プログラム起動時のoptionとしてどのセグメントに送るか指定します。
その後LINE証券サービスの行動ログデータベースから、送信対象となるユーザーのIDを引っ張ってきます。
ちなみにデータベースへの接続はSpringのjdbc templateを用いました。

3. 送信
2.でとってきた送信対象ユーザーに対して、1.で作ったflex messageを送って完了です!

前述したMessaging APIには一度に複数のユーザーにメッセージを送るマルチキャストメッセージ機能いうものがあり、そこにユーザーIDとメッセージの二つを投げれば、後はMessaging APIの方でユーザーIDで指定されたユーザーの方々にメッセージを届けてくれます。

しかしながら、このマルチキャスト機能が一度にまとめてメッセージ送信できるのが500ユーザーまでという上限があるため、小分けにして送らなければならず、少し実行のボトルネックになっています。多い時には数百万のユーザーに対してメッセージを送ることになるので、結構時間がかかります。

今回は間に合いませんでしたが、ここを並列化などでより高速に行えるようにできればいいなと思います。

その他

今回は原則リモートでの就業でしたが、会社の雰囲気を感じたかったので、自分の希望で週に1度オフィスに出社して働かせてもらいました。自分の所属していたLINE証券のある大崎オフィスのほか、新宿ミライナの本社、7月にできたばかりの四谷オフィスを案内して頂けました!どのオフィスも専門の空間デザイナーチームによって設計されていて、そこにいるだけでモチベーションを上げてくれます。ちなみにこれらが東京にある全てのオフィスになるようで、全部に行ったインターンは僕が初めてだそうです笑

感想

就業型インターンという名前の通り、実際にリリースされる機能に携わることができて、尚且つ一つのプロジェクトを丸々任せてもらえました。改めてここまで主体性を持って働けたのはとても貴重な経験だと感じています。開発に関しては、設計から実装まで全部自分で行うことができ、その都度的確なコードレビューをして頂けるので、自分のコーディング力や商業向けの開発力を大きく成長させられました。それに加えて、企画ミーティングには最初の回から参加し、途中企画側とのコミュニケーションも可能な限り自分がやっていたので、本当に一エンジニア社員としての仕事内容をこのインターン期間でほとんど体験できたように感じます。

必ず充実したインターンになると思いますので、興味のある方はぜひ応募してみて下さい!