[Python Puppeteer (Pyppeteer) cron]bitFlyer 損益グラフを自動でスクリーンショット撮影して Twitter, Discord, LINEに送信
やりたいこと
ビットフライヤー(bF)の日次損益、月次損益、年次損益のスクリーンショットを自動で取得して、Twitter、Discord、LINE に送りたい(スクショ撮り忘れるので自動化したい
関連note
サーバとか持ってない人向け、マニュアルとかガッツリ書いた分だけちょっと高い
何ができるの?
・bitFlyer損益グラフ(Web版)を自動スクショ
・Twitter, LINE, Discord のうち、自分が送りたいアプリにのみ送信
・数字込みグラフ、数字無しグラフ、損益額(テキストのみ)のスクショ送信をアプリごとに選択可能
・損益グラフのサイズ変更機能(アプリごとに別サイズを設定可能)
・損益グラフの元ネタ(csv)のダウンロード(Discordに送信可能)
使い方の一例
他にもありますが、代表的な使い方はこちら。
botの挙動バレ対策として、「ツイートではグラフ無し(or グラフ縮小)」にして、「LINEやDiscordには挙動解析用にグラフ拡大して送信」などもできます。もちろん「ツイートはせずに、自分用のLINE、Discordにだけ送信」なども可能です。
・毎日の損益ツイートを自動化
・損益の数値だけ自動ツイート
・損益のグラフだけ自動ツイート
・日次損益の数値+月次損益グラフだけ自動ツイート
・日次損益グラフをサイズ縮小して自動ツイート
・botの挙動を確認するために、日次損益グラフをサイズ拡大して、自分(仲間)だけのLINEやDiscordに送信
・botの挙動を確認するために、日次損益グラフの元データ(csvファイル)を自分(仲間)だけのDiscordに送信
・毎日の損益推移の記録に、全損益情報を自分(仲間)だけのLINEやDiscordに送信
動作イメージ
これは具体的な数値削除したバージョンをTwitterに投稿、日次損益のみ
こっちはLINEやDiscord(自分のみ)に送ったやつ。自分しかいないので、具体的な損益値も込み。面倒なので、フルセット(日次+月次+年次)の1枚のみを送信
グラフは見せたくない方向けに、損益値(テキスト)部分のみのスクショ
グラフサイズの変更機能を追加しました(埋め込みだと分かりづらいので、元ツイートの画像を見てください🙇)
使用している技術とか
みんながSeleniumでやってるので、Pyppeteer + Headless Chrome でやってみた。
・Python 3.6
・Pyppeteer(Puppeteer)
・Headless Chrome
・cron
Puppeteer は、Google が開発しているライブラリ、Headless Chrome を使った自動テストなどができます。
Pyppeteer は、みやこ(@MiyakoDev)さんが Puppeteer を Python 用にポーティングしたライブラリです。
使っているPythonのパッケージ(旧版)
import os
import asyncio
import json
import requests
from requests_oauthlib import OAuth1Session
from configparser import ConfigParser
from pyppeteer import launch
import pyppeteer.errors
from datetime import datetime
from time import sleep
from logging import getLogger,INFO,DEBUG,StreamHandler
使っているPythonのパッケージ(新版)
・os→pathlib に変更
・configparser の使用を廃止
import pathlib
import asyncio
import json
import config as cfg
import requests
from requests_oauthlib import OAuth1Session
from pyppeteer import launch
from datetime import datetime
from time import sleep
from logging import getLogger,INFO,DEBUG,StreamHandler,FileHandler,Formatter
検証環境
この環境で動いたというだけであって、これにあわせれば良いと言うわけではないです。
環境1(Macbook Pro) ※cron動作は未確認
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.5
BuildVersion: 17F77
$ pyenv --version
pyenv 1.1.5
$ pyenv versions
system
* anaconda3-5.0.0
$ python --version
Python 3.6.2 :: Anaconda, Inc.
$ pip --version
pip 10.0.1
$ pip show requests requests_oauthlib pyppeteer oauthlib urllib3 certifi
Name: requests
Version: 2.18.4
---
Name: requests-oauthlib
Version: 1.0.0
---
Name: pyppeteer
Version: 0.0.19
---
Name: oauthlib
Version: 2.1.0
---
Name: urllib3
Version: 1.22
---
Name: certifi
Version: 2018.1.18
環境2(GCP US-West: Ubuntu 16.04.4-LTS)
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
$ pyenv --version
pyenv 1.2.5
$ pyenv versions
system
* anaconda3-5.0.0
$ python --version
Python 3.6.2 :: Anaconda, Inc.
$ pip --version
pip 10.0.1
$ pip show requests requests_oauthlib pyppeteer oauthlib urllib3 certifi
Name: requests
Version: 2.18.4
---
Name: requests-oauthlib
Version: 1.0.0
---
Name: pyppeteer
Version: 0.0.19
---
Name: oauthlib
Version: 2.1.0
---
Name: urllib3
Version: 1.22
---
Name: certifi
Version: 2018.4.16
環境3(GCP US-West: Ubuntu 16.04.4-LTS)
※環境2のpyppeteerバージョンをアップさせたもの
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
$ pyenv --version
pyenv 1.2.5
$ pyenv versions
system
* anaconda3-5.0.0
$ python --version
Python 3.6.2 :: Anaconda, Inc.
$ pip --version
pip 18.0
$ pip show requests requests_oauthlib pyppeteer oauthlib urllib3 certifi
Name: requests
Version: 2.18.4
---
Name: requests-oauthlib
Version: 1.0.0
---
Name: pyppeteer
Version: 0.0.24
---
Name: oauthlib
Version: 2.1.0
---
Name: urllib3
Version: 1.22
---
Name: certifi
Version: 2018.4.16
他の方の動作確認済環境
AWS Cloud9
トラブってたが、パラメータ追加で動作とのこと
※Mac, Ubunutuでパラメータ追加後の正常動作を確認したので、ソースコードに取り込みました
Windows(VPS)
タスクスケジューラ → BATファイル → python とすることで、Windows上でも動作できたとのこと。
タスクスケジューラからのPython実行は下記を参考にしてください。
CentOS7
確認中/確認予定の環境
AWS
OS, Distributionなど未確認ですが、Headless Chrome のインストールがうまくいかないとのこと。別途、調べてみるつもりです。
スクリプトでやっていること
Python
・PyppeteerでHeadless Chromeを起動
・Headless ChromeでbifFlyerにログイン
・アレをアレして2FAをスキップ(※設定で2FAを解除する必要はない)
・損益グラフのページに移動
・スクショを27枚取得
1. 全ての損益
2. 日次損益
3. 月次損益
4. 年次損益
5〜8. 1〜4から数値を削除したもの
9〜11. 日次、月次、年次損益のテキスト部分
12〜27. 1〜8をTwitter/LINE/Discord向けにそれぞれ取得
・コンフィグ設定に従い、各ツールに各スクショを送信
(※Twitterには数値なしの日次損益のみ、Discordには数値ありの全損益、など設定可能)
・スクショファイルを削除
Cron(スクリプトじゃないけど)
・設定した時刻や間隔でスクショの取得と共有(↑のPython実行)
サンプル画像
数値なし全損益画像
数値なし日次損益画像(グラフサイズ変更)
数値あり日次損益画像
日次損益(テキスト)
他画像も基本は同じなので省略。
参考ページ(順不同)
これ見れば作れます。
有料エリアにあるもの
いつも有料設定で無料エリアに全情報載せてるんだけど、このnoteは頑張ったので有料エリアを設定してます。
・Python コード
・crontab 設定まわり
買うと得られるもの
・PyppeteerでbitFlyerにログインしてスクショ撮る方法
・Pyppeteerでの2FAのスキップ方法(たぶんSeleniumでも同じことできる)
・PythonからTwitter/LINE/Discordへの通知(送信)方法 (※LINE/Discord はほぼれぷすさんのやつ)
買わないほうが良いと思う人
・pythonとかpipとかサッパリな人(ゼロからの導入手順は載せていません)
・Linuxコマンドがサッパリな人(特に説明しません)
・AWSとかGCPとか、VPSとか、自宅サーバやPCとか、自由に使えるマシンが無い人(マシンありきな内容です)
・自分で作れる人
ちなみに、GCP の US-West リージョンで f1-micro(性能低いやつ)なら、1台だけ無料で動かせます。このあたりを見れば稼働まではいけるので、あとはPythonとかpipとか入れれば動かせます。Python環境構築も参考サイト貼っておきます(この通りやればスクショ取得もちゃんと動くか、は見てないので知りません)
※この後の免責事項にも書いていますが、本noteでは導入手順の説明や個別対応は基本的にしません。
免責事項、および禁止事項
購入した時点で以下に同意したものとみなします。
・コードは提供しますが、個別の導入トラブル対応や、詳細なコード説明はしません。(ただし、明らかなこちらの不備などはのぞく)
・Python コードは動けばいいやで作ってるので、キレイには書けてません。コメントなども少ないので、何をやってるか知りたい方はコードを読んで理解してください。
・Pythonやpipなど、実行環境はすでに整っている前提で内容を記載しています。
・bitFlyer社の仕様変更により上手く動作しなくなる可能性があります。その際、修正コードの提供は確約できません(やるかもしれませんし、やらないかもしれません)。bitFlyer社の仕様(class名変更など)が変わった場合、損益値の削除に失敗して意図せず損益値ありの画像が共有(公開)される可能性があります。
・Twitter App、LINE Notify、Discord Webhooks の設定方法・利用方法は参考URLを載せる程度で説明はしません。
・cronやその他のLinuxコマンドに関して、細かい説明はしません。各自で調べてください。
・Ubuntu 16.04.4 LTSで実行したコマンドはある程度記載していますが、不足しているコマンドなどあるかもしれません。問合せには可能な範囲で対応しますが、あまり期待しないでください。
・CentOS など他ディストリビューションでの動作検証や導入はしてないので、問合せを受けても答えられません。(Python動かす環境さえ作れれば基本的には同じはず)
・本noteの内容を無断で誰でもアクセスできるブログなどに公開すること、また改変したものを有料noteなどの商材として販売することを禁じます。大改造して本noteよりも明らかに有益であるため有料販売したい場合などは、一度ご連絡をお願いします。
更新情報
2018/08/03 10:24
・損益値のテキスト情報を取得して、メッセージ中に追加するよう変更(Python コードを変更、購入&設定済の方はコードを置き換えるだけで良いです)
・Macでcronの参考サイトを追加
・購入者向けの連絡事項を追加
2018/08/04 13:24
・以下の変更を行ったので、更新される際はPythonコード、config.iniの両方を置き換えてください。
・login時のページ遷移待機方法を waitForNavigation から waitForSelector に変更(※https://twitter.com/naoto33228429/status/1025573063247577090)
・メッセージ末尾の余計な改行を削除(※https://twitter.com/AAAAisBraver/status/1025571034961829889)
・Discordでメンションができるよう変更([Discord] isMention を True に設定要)
2018/08/05 13:27
・以下の変更を行ったので、更新される際はPythonコード、config.iniの両方を置き換えてください。
・コンフィグ変更箇所は以下の通りです。
[Twitter/LINE/Discord] shareTextX 追加
[Chromium] ssWidth, ssHeight → chartWidth, chartHeight, textWidth, textHeight に変更
・損益値(テキスト)部分のみのスクショ対応。対応オプションは shareTextX
・複数メッセージ(画像)を送信する際、時刻情報(何時にキャプチャしたか)を先頭メッセージにのみ付与するよう変更。
・AWS Cloud9でのエラー対応(Headless Chrome の起動オプションに 'args': ['--no-sandbox', '--disable-setuid-sandbox'] を追加)
(※https://twitter.com/c0ban_shark/status/1025935196032397312)
・リファクタリング(震え声
2018/08/09 02:37
・Tweet時のメッセージ付与漏れを修正
・導入時の参考サイトを追加
2018/09/08 13:38
・以下の変更を行ったので、更新される際はPythonコード、config.iniの両方を置き換えてください。コードやコンフィグなど魔改造していて置換したくないという方へ:待ち時間は move2Performance の最後で sleep() している部分なので、ここをハードコーディングで書き換えてもらってもOKです。
・損益グラフページ遷移後の待ち時間をコンフィグ化
[bitFlyer] wait_chart
・グローバル変数 cfg を各クラス、関数の引数から削除
2018/09/20 11:05
・Loading Dataでうまく撮影できてない方へのご連絡です(内容の更新はありません)
・Loading Dataでうまく撮れていない場合は、↑(9/8 更新内容)の待ち時間を長めに設定してみてください
2018/09/20 16:53
・正式にLoading Data対策を行いました。move2Performance で、Loading Dataの表示が消えるまで待ったり、いつまでもLoading Dataの場合にはリロードしたりするようにしています。最大5回リロードしてもダメな場合はLINE、Discordにエラー通知を送ります
2018/09/21 17:41
・グラフサイズの変更機能を追加しました
・コンフィグ記載ファイルを config.py に変更しました。
・上記に伴い色々とリファクタリングしました。ガッツリと変更しているので、旧版のコードも合わせて残しておきます
・「新版のコードに変更したらうまく動かない」などあれば、コメントやTwitter リプ/DM でご連絡ください。コメントやリプを残す場合には、有料部の漏洩につながるような記載はご注意いただけますと幸いです
2018/09/29 01:39
・ログイン時2FAを未設定、かつ新規IPからのログインの場合にエラーとなるケース(https://twitter.com/Hapix3/status/1030219868103012352)に対応しました。共通部なので旧版、新版ともに修正しています
(※不正ログインなどのリスクを減らすためにも、ログイン時の2FA設定はしておいた方が良いと思います)
2018/09/29 16:32
・[新版のみ] グラフ元データ(csv)をダウンロードする機能を追加しました。必要に応じて、CSV_DIR, CSV_DL を設定してください
・[新版のみ] スクショ進行具合が分かるようにログを追加しました
2018/09/30 15:04
・[新版のみ] グラフ元データ(csv)をDiscordに送信する機能を追加しました。必要に応じて、CSV_SEND_DISCORD を設定してください
2018/11/18 10:16
・セビルさんのnote(https://note.mu/seville/n/n51698d1218fa)を関連noteに追記
2019/11/02 11:05
・セビルさんnoteが削除されているようなので本記事からも削除
・pip3 の話を補足として追加
ここから有料エリアです。
ここから先は
¥ 1,000
サポート頂けると励みになります BTC,BCH: 39kcicufyycWVf8gcGxgsFn2B8Nd7reNUA LTC: LUFGHgdx1qqashDw4WxDcSYQPzd9w9f3iL MONA: MJXExiB7T7FFXKYf9SLqykrtGYDFn3gnaM