Memorandum

普段の生活の覚え書き。主に技術録

【Splatoon2】自動ドット打ちで描いた絵を投稿してみた

きっかけ

私のブログではSplatoon関係の記事がよく見られていますが、そんな中気になる検索キーワードが有り、検索してみました。 「Splatoon Python」で検索してみると、とても興味深い記事を見つけました。

http://esprog.hatenablog.com/entry/2017/08/19/001717

Splatoon 2では絵を描いて投稿出来る機能があるのですが、この記事によるとその絵をドット打ちで描画し、さらに自動で描かせることが出来るらしいです!

これをやるにはある電子部品が必要なのですが、私はこの記事を見た瞬間すぐに注文してしまいました。

必要なもの

注文した商品が届いたので早速やってみました。 必要なものは以下のとおりです。

上記の記事ではPythonやWinAVRなど必要で少し敷居が高いのですが、同じブログの別記事で更に簡略化された方法があったのでそちらで試してみました。

switchとSplatoon 2を持っていれば、Teensy 2.0 ++ というものがあればすぐに試すことが出来ます。(あとの3つは無料のソフトウェアです)

Teensy 2.0 ++というのは小型のマイコンボードで、ボタンが一つだけついてる基盤です。

USB接続でプログラムを書き込むことが出来て、可能性は無限大のようなツールです。

今回行ったのは、Tennsyにswitchのコントローラとしてエミュレートさせて、switchの操作を自動でやってくれるようにプログラムすることで実現しています。

Let's Try

自動ドット打ちの方法は、初めに320*120ピクセルでモノクロの絵を用意します。

webサービスで画像を指定したピクセルサイズに変換してくれるサービスがあったので、私はそれを使いました。

https://www.iloveimg.com/ja/resize-image/resize-jpg

モノクロ化に関しては元記事にもあった、GIMPというソフトを使いました。

画像が用意できれば、元記事のブログ様が作成されたツールでデータ化します。

https://github.com/EsProgram/Switch-Fightstick/archive/1.2.0f.zip

上記のファイルをダウンロード・解凍して、「Image2Hex.exe」を起動してドラッグアンドドロップでデータ化できました。

そしてTeensy 2.0 ++ に書き込むわけですが、その前にTeensyで使用されているAtmel AVRというプロセッサ用のプログラムに変換するソフトが必要です。 それがWinAVRというもので、こちらは下記リンクからインストーラーをダウンロードして実行すると準備完了です。

https://sourceforge.net/projects/winavr/

書き込み&実行!

書き込みするソフトとしてTeensy Loaderを立ち上げて、画像をデータ化したHEXファイルを読み込ませます。 そしてTeensyをUSBでPCに接続して、Teensyのボタンを押すとプログラムの書き込みモードになり、Teensy Loaderで「Operation -> Program」、「Operation -> Reboot」の順で実行すると書き込み完了です。

dot-pixel-art

最後に、Splatoonを起動し、イラスト投稿画面までいき、ペンのサイズ(ドットの大きさ)を最小に設定しておきます。 その後TeensyとswitchをUSBで接続するとドット打ちを始め、2,30分ぐらいで完成します。

ドット打ちしている様子を動画に撮りました。

https://youtu.be/bmZSlcQ_kVU

新しい遊び方

それで完成した絵がこちらです。

https://twitter.com/Dr_RT/status/1082261025490067456

私は絵が得意ではないですけど、こうやって画像を投稿出来たのは凄い楽しかったです。 ちなみにこの記事のアイキャッチ画像が元絵です。

ただ、1/4~1/6のフェスに機材が届かずに投稿が間に合わなかったことが残念でした。 だけどフェスはまだ暫く続くので、次回のフェスでまたドット打ちした絵を投稿したいと思います。

今までソフトウェアの方に興味を持っていましたが、ハードウェアも使いこなせるとさらに出来ることが増え、可能性が広がると思いました。 ドローンやRaspberry Piなど魅力的なハードウェアも増えてきているので、何かやりたいことを見つけて挑戦してみたいと思いました。

編集後記

Teensy 2.0 ++を注文した際に、年末年始を挟んだからか、荷物が予定日を過ぎても届かず、amazonに問い合わせたところ、返金対応をしてくださいました。連絡したすぐその日に返金処理があったので、さすがのスピード対応だなと思いました。 しかし、その後2日ほど経って、注文したTeensy 2.0 ++が届いたので、嬉しかった反面、すこし申し訳ない感じがありました。

【Splatoon2】サーバを利用した自動戦績登録の方法

以前の記事でご紹介したとおりSplatoon 2の対戦成績の保存・分析にstat.inkを利用させて頂いております。

https://memoran.net/splatoon2-analytics-statink/

戦績が溜まっていってデータを眺めるだけでも面白いです。 無事にガチエリアでウデマエXに到達することも出来たので、さらにデータの分析をしていきたいです。

iksm_sessionの有効期限

しかし、現在stat.inkにデータを登録するために使用しているツール「SquidTracks」は、iksm_sessionを利用してデータを取得してきています。 このiksm_sessionには有効期限があるらしく、私の体感では1日に一度もログインされないと新しいiksm_sessionに書き換わり、以前のiksm_sessionだとログインできなくなります。

最近は結構な頻度でSplatoonをプレイして、SquidTracksで登録しているのですが、たまにプレイしない日があり、SquidTracksでログイン出来ないときがあります。 そうなると、もう一度iksm_sessionを取得し直さなければならず、結構手間がかかります。

そこで、現在ブログを運用しているこのサーバで、自動戦績登録を構築してみたのでご紹介します。

splatnet2statink

前回の記事でも少しご紹介したのですが、サーバで動く自動登録のスクリプト splatnet2statink.pyを使うとstat.inkに戦績を登録することが出来ます。

以前の記事でも紹介した下記のURLで導入までの手順をわかりやすく説明しています。

https://archive.fo/td52p

簡単に手順をまとめると

  1. サーバを用意する
  2. 環境を作る
    1. gitインストール
    2. Pythonインストール
    3. pipインストール
    4. ライブラリインストール
  3. splatnet2statink のインストール
  4. splatnet2statink の初期設定(API、言語、iksm_session)

これで登録が出来るかと思います。しかし、私はVPSでサーバを利用しているので、サーバへの接続が切れたら、同時にsplatnet2statinkのスクリプトも落ちてしまい、自動化が出来ませんでした。

nohup

そこで利用したのが、nohupというコマンドです。nohupとはコマンドを実行している際にログアウトしたり切断しても、そのままコマンドの実行を続けることが出来るコマンドです。

linuxサーバからログアウト、切断したときにHUPシグナルというのが送られて、対象のプロセスにkillを送信してプロセスを中断させるそうなのですが、nohupを使うとそのシグナルを無視して処理を継続することが出来ました。

他にもtmuxscreenというコマンドがあるそうですが、私のCentOS 7では標準で用意されていなかったので、今回はnohupコマンドを利用しました。

splatnet2statinkをnohupを利用するコマンドは


$ nohup python splatnet2statink.py -M 10000 &


nohupでコマンドを実行し続けるようにさせ、-Mのオプションで10000秒(約3時間)に一度新着のバトル戦績があるかチェックするようにさせています。

このときにnohup.outという実行結果を出力するファイルが作成されるのですが、実行し続けているとファイルが肥大化するのでここは定期的にチェックする必要があります。 現在3日ほど可動させたところ、ファイル容量は約3.3MByteほどなのでそれほど全体の容量を圧迫してはいないようですが、今後logwatchなどで確認しようと思います。

nohupのプロセスを確認したいときは、


ps x


で、現在動いているプロセス確認することが出来、終了させる場合はPID番号をメモして、


kill (PID番号)


で、プロセスを終了させます。

充実なSplatoonライフを!

現在、大乱闘スマッシュブラザーズ SPECIALが発売され、そちらに注目が行きがちですが、Splatoonもアップデートが続いており、まだまだやりごたえがあると思います。 私もすべてのルールでウデマエXに到達することを目標に続けていきたいと思います。

また、stat.inkでのデータをPythonで分析しようと目論んでいますので、結果が出たらまた報告しようと思います。

今回の方法を試すサーバがない方は私も使用しているConoHaのVPSサーバを検討してみてはいかがでしょうか。最安で1ヶ月630円で使えて、今回のようなスクリプトを組んだり、ブログなどを始めることが出来るのでおすすめです。

スマブラの興味はあるのですが、手を出してしまうとSplatoonが中途半端になりそうなので、手が出せずじまいです。

今回紹介した方法以外に手軽にSplatoonの戦績を保存する方法を見つけました。 スマホアプリでikaWidget2というアプリを使うと、アプリ内で戦績をダウンロードして保存・解析ができます。 こちらはiksm_sessionなどの取得などの手順が必要なく任天堂アカウントでログインするだけなので、PCでの開発データの閲覧や、込み入ったデータ分析をする必要がないという方は、導入してみてもいいかもしれません。

ikaWidget 2
ikaWidget 2
無料
posted withアプリーチ

Android Studioのインストール時の問題・解決手段

Androidとは

スマートフォンと言えばiPhoneAndroidが思い浮かぶと思いますが、Androidは世界のスマートフォン市場のOSで85%を占めているそうです。 Androidオープンソースライセンスで提供されており、誰でも自由にAndroidソースコードを入手して利用できます。 またAndroidを採用した携帯電話メーカーやキャリアは無償で携帯端末にAndroidを搭載し販売することできる上に、改変・追加開発した部分を公開する必要もありません。 (一部の機能とLinuxカーネルとそのライブラリは公開する必要があるそうですが...)

こういった仕様からAndroid市場が大きく成長を続けている要因と見られます。

Androidアプリ開発

Androidのアプリケーションの開発には以下のようなツールを使いますが、全て無料で提供されており、パソコンがあればすぐに開発に取り組むことが出来ます。

WindowsPCでも開発は出来ますが、最近はMacでの開発者も多くなっているようです。 理由として、実機の接続にドライバが不要だったり、AndroidiOSの開発ができることが挙げられるそうです。

Kotlin(ことりん)

AndroidアプリはJavaで開発を行うのが唯一の選択肢でしたが、Android Studio 3.0のリリースと共に新言語Kotlinのサポートが開始されています。 KotlinはJVM(Java Virtual Machine:Java仮想マシン)上で動作することも含め、Javaと100%の互換性があるため、Java開発者も習得が容易な言語になっているそうです。 更にKotlinは次のような特徴があります。

  • 簡潔な少ないコードで済む
  • Null安全である
  • ラムダ式など関数型プログラミングの概念を取り入れている
  • 拡張関数によるクラスの拡張
  • Javaとの相互運用性が高くJavaで書かれたライブラリを引き続き使える

私もAndroid開発を始めるにあたってKotlinを使ってみましたが、JavaPythonJavascriptのような軽量言語の特徴を合わせたような感じで楽に書ける印象でした。

インストール

Android Studioのインストールを行ったのですが、少し躓いたのと、別のソフトが影響を受けたので、原因と解決方法を踏まえて共有したいと思います。

https://developer.android.com/studio/?hl=ja

基本的にダウンロードして、インストールを画面の指示にしたがって勧めていくだけですが、Windowsではインストール後のセットアップ画面で、Google USB Driverをインストールする必要があります。

android_stdio

そしてセットアップ後、実際にアプリ開発に入っていくのですが、その前にPC上で動作するAndroid端末のエミュレータを設定します。 その際に私のWindowsPCでは「intel haxm this computer does not support」とエラーメッセージが表示されエミュレータを起動できませんでした。 haxmとはIntel の Hardware Accelerated Execution Manager (HAXM)のことでIntel CPU を実行するコンピューターのための仮想化エンジンだそうです。

https://docs.microsoft.com/ja-jp/xamarin/android/get-started/installation/android-emulator/hardware-acceleration?pivots=windows

上記を参考にHyper-VWindows ハイパーバイザー プラットフォームを有効化すると、無事にエミュレータの起動ができました。

別問題

しかし、後日別の問題が発生しました。 以前別記事でnox app playerを使用していたのですが、

どうやらHyper-VWindows ハイパーバイザー プラットフォームを有効化していると、nox appを起動したときにブルースクリーンが発生し強制的に再起動になってしまうようです。 そのため、nox appを使用する際はHyper-VWindows ハイパーバイザー プラットフォームを無効化するか、もしくは開発の際に実機を使うなどの対策が必要です。

スマホアプリ開発への第一歩

とりあえずこれで、Androidアプリの開発環境が整いました。 私は参考書を購入して読み進めており、作ってみたいアプリがあるので参考書が終わったら開発に取り組んでみようと思います。 時間はかかるかもしれませんが、完成した際にはこのブログでも紹介しようと思うので、気長に待っていただけると嬉しいです。 またiOSアプリ開発にも興味があるので、そちらの方も取りかかれればいいなぁと思っています。

Webアプリ作りました!

このところブログの更新がなくて申し訳ありませんでした。 実はWebアプリの開発に乗り出していて、そちらの方に時間を割いていました。

18禁のWebアプリになるのですが、興味がある方は是非見ていってください。

AV-Concierge (18禁です!)

このようなWebアプリを一人で開発したのは初めてで、いろいろわからないところも有りましたので、開発の経緯や使用している技術、苦労した点などを書き記して行こうと思います。

きっかけ

開発を始めたきっかけとしては、ニコニコ生放送というサービスで普段見ている生主さんがいるんですけど、ある日の放送中にリスナーさんが「質問内容や好きな女優さんを答えていくと、その人にあったAVを紹介してくれるサービスが欲しい」というコメントが有り、生主や他のリスナーさんもそれに賛同していたので、面白そうだと思い作ってみることにしました。

また、ちょうどその頃Qiitaで18禁系アプリを開発したという投稿があり、使用技術や実装方法などを紹介していたので、それに感銘を受けて私も開発してみる気になりました。 その投稿がこちらです。

https://qiita.com/mikan3rd/items/97cd0795cfcd4f548967

上記のサービスは詳細に技術や実装方法を説明していたのですが、なかなか難易度が高いと思ったので、私はある程度ランクを落としてできることをやってみようと思いました。

データ収集

上記のQiitaの記事でもあったのですが、DMM.R18(現在はFANZA)から商品の情報や画像などを取得していて、私も必要な情報をFANZAから取得してきました。

取得するときに使った方法が機械学習などでよく使われるPythonというプログラミング言語を使用しました。 Pythonと言う言語は使ったことがなかったので、いろいろ調べながら作成していきました。 その中で参考になったサービスが、現在加入しているN予備校機械学習入門というコースがあり、その中でPythonの基礎を学びました。 また、AidemyPython入門のコースを受講しました。

Pythonの文法の基礎を上記のサイトで学び、データ収集をはじめました。 データ収集の方法は以前ブログで紹介した方法で収集することができました。

データ収集の方法を学び、ブログの記事にしたり、また普段の作業で面倒なことを自動化するという事もできましたので、目的以外の副産物もあったと思います。

Webサイト構築

目的のデータを集めることが出来ましたので、次にWebサイトの構築に入りました。 Webサイトの構築はRubyJavaScriptでやったことがあるのですが、今回は復習と応用の意味も兼ねてN予備校で使用した技術を使って構築することにしました。 せっかくPythonを学び始めたので、PythonのWebフレームワークのDjangoというのを使ってみたかったのですが、新しい技術でできるか心配だったので、やったことのあるJavaScriptを使って作成しました。

開発環境はMacbook Pro上に立てた仮想マシンubuntuで開発しました。 使用した技術としては、

上記の技術を一度N予備校で使ったことがあったのですが、やはり自分のサービスに適用させるには知識不足で技術の本質を理解していない感じがありました。 それなので、N予備校の教材をもう一度見直したり、使用している技術で調べたりしながら勧めていきました。

また、最後の最後に迷ったところが、セッション管理が出来ていなくて、選択肢の内容がユーザごとに混合してしまっていました。 セッション管理の技術や知識についても不足していたのでいろいろ理解が出来ていないことが分かりました。

自分の知識の理解を深めるためにも、今後このブログで技術の紹介していこうと思います。

工夫した点

このサービスの肝でもある、選択肢の内容とそれにマッチした商品の紹介の方法を工夫しました。

マッチングの方法は選択した内容と、商品のジャンルを文字列で比べて、その文字列同士が似通っている順番に紹介しています。 マッチングした文字列とジャンル文字列の比較をレーベンシュタイン距離という方法を使って算出しています。 レーベンシュタイン距離は、文字の挿入・削除・置換の処理をいくつ組み合わせたら、一方の文字列をもう片方の文字列に合わせることのできる手数になるのかを算出するアルゴリズムです。

レーベンシュタイン距離を取り入れたことにより、選択した内容にある程度マッチした商品を紹介できているのかなと思います。

しかし、今のところは選択する回数が3回固定で、ジャンルも3つ程度の商品が紹介されがちで、マッチングの程度はまだまだ低いと思います。 今後はデータを拡充して、画像選択や選択内容に合わせた質問内容の表示、AIなどの機械学習技術を導入してよりマッチングの練度を上げれたらいいなと思います。

最後に

こういったWebアプリを一人で開発したことがなかったので、開発して公開出来たのは凄い自信がついたと思います。 開発途中でいろいろ壁があって挫けそうになりましたが、ニコニコ生放送でお気に入りの生主さんに紹介したい、もしかしたらお小遣い程度になるかもという動機でモチベーションを保つことが出来ました。 開発技術の勉強でスクレイピングやブラウザの自動操作などの手法もわかったので、成果物の他にも得るものがあってよかったです。

このアプリを使ってみて何か意見・要望・感想などが有りましたら、どうぞ気兼ねなくコメントいただけると嬉しい限りです。

7 Billion Humans

先日紹介したnintendo switchのソフト「ヒューマン・リソース・マシーン」を全ステージクリアしました!全42ステージの結構なボリュームでしたが、それ以上に後半に行くに連れて難易度も高くなって時間かかりました。 もともと飽き性な性格もあって、躓いてしまうとしばらく放置してしまってたので半年ぐらいかかってしまったと思います。

しかし、先月頃この「ヒューマン・リソース・マシーン」の続編が出るということで、なんとしてもクリアしなくてはと思い、めげずに取り組みました。 前回の記事でも紹介した効率化目標のプログラムサイズとスピード目標は達成できていませんが、それでも達成感が半端ないです。 最後まで手こずったのが素因数分解のプログラムで、大分ごり押しで突き通してしまった感があります。(需要があればプログラム解説もしてみたいです。)

7 billion humans

その続編として発売されているのが「7 billion humans」です。 https://ec.nintendo.com/JP/ja/titles/70010000014082

ストーリー的には全人類の仕事がロボットに奪われ、人類が仕事を求めた結果、 70億人の人々に誰でもできる仕事を与えられたというような感じです。

前作のステージに比べ「当社比77.777778%も多い60以上のステージ」が用意されているそうです。 さらに一人に命令を出す前作と違って、今作では集団に対して命令が出せるスタイルで進めていきます。 前作では偶然のクリアというのがあったのですが、今作ではそれが起きにくいかと思います。 (前作でも偶然のクリアは弾かれます)

遊んでみた

ステージ20ぐらいまで進めてみたのですが、この時点では前作より使える命令が少ないのに対し、それぞれの命令のバリエーションが多いです。 if文も前作では0の場合、マイナスの場合、それ以外の3通りだったのですが、今作では比べる対象を指定したり、イコールやナットイコール、以上・以下などの不等号を使うので、様々なパターンを考えます。 更にステージを進めていくと使える命令が増えていき、複雑な課題に挑戦していくみたいです。

前作でもあったステージごとの効率化目標も若干変わっていて、プログラムサイズ目標は今作もあるのですが、スピード目標が25のランダムテストから平均を算出する方法に変わっています。 前作のスピード目標は具体的な算出方法が分からず不透明だったので、今作は視覚的にもわかりやすくなっていると思います。

なにより、集団に対しての命令を行うので、全員が命令どおりに動いて課題をクリアしたときの達成感が気持ちいいです。 パズルゲームをクリアしたときの達成感に似ていると思います。ぷよぷよテトリスみたいなエンドレスなゲームではなく、もじぴったんや昔やったマイナーなゲームでモグラ~ニャなどのステージクリア型のパズルゲームのような達成感があると思います。

https://www.nintendo.co.jp/titles/50010000011229

実際のプログラミングも自分のやりたいことが出来たときに、気持ちいい達成感と爽快感が味わえます。 プログラミングの楽しみを経験したいという方にもおすすめできるゲームだと思います。

脳が鍛えられるゲーム

プログラミングを始めるにはとっつきにくいという方にも簡単にプログラミングの雰囲気が楽しめる良いゲームだと思います。 小学校でもプログラミング必修化になるというので、論理的思考の習得にも一役買ってくれるかと思います。

前作も十分やりごたえもあるので、興味を持った方は前作も合わせてオススメします。

PCしか持っていない方はSteam版がありますので良かったらどうぞ

https://store.steampowered.com/app/792100/7_Billion_Humans/?l=japanese

【Python】Chromeの自動操作

先日いつものようにSplatoonで遊んでいたらガチマッチで放置勢がいました。 試合開始直後から煽ってきて、試合に参加せず自滅やリスポーン放置を決め込んでいました。 その時はガチヤグラの試合だったのですが、最近ガチヤグラの戦績が悪く、A帯まで落ちたこともあったので、かなり苛立っていました。

幸いその試合は、相手チームの一人が回線落ちをして実質3対3の試合で勝てたのですが、このようなプレイヤーとは二度と試合したくありません。

Splatoon2ではマッチングしたくない相手をブロックする機能と、悪質なプレイヤーを通報する機能があり、以前はイカリング2で通報を一回のみできたのですが、いつからか何度も通報できるようになっていました。(累積してカウントされているかは不明です)

なので、自分の技術試しと好奇心、そして悪質なプレイヤーへのお仕置きとして、通報自動化スクリプトを組んでみました。

API

まずはじめに以前取得したiksm_sessionを使用してPCのChromeイカリング2にアクセスします。

アクセスしてChromeデベロッパーツール(F12)を使用します。 開発者ツールとはWebページの検証ができるツールで、HTMLのソースの確認やJavascriptの実行、パフォーマンス、通信の確認などが行なえます。

イカリング2にアクセスして開発者ツールを開いておき、今回通報したい試合を選び、通報したいプレイヤーを通報します。 すると、開発者ツールの「Network」に今回送信した通報内容が表示されます。

この情報を使って通報を自動化しようとしたのですが、通報にはAPIが使われてるらしく、必要なパラメータが分かりませんでした。

ブラウザ操作の自動化

APIを使っての通報が難しそうなので、Chromeを自動操作して通報するツールの作成に取り掛かりました。

自動化に使ったツールは以前紹介したPythonGoogle ChromeSeleniumです。

Selenium

Seleniumとは様々ブラウザ、プラットフォームで使えるUIテストツールです。 ブラウザで表示される要素を操作・取得し、テストすることが出来ます。

色々なプログラミング言語に対応していて先日導入したPythonでも使えます。

導入

Seleniumを含めた導入手順を以下のサイトを参考にさせていただきました。 https://www.inet-solutions.jp/technology/python-selenium/

簡略な手順としては

  1. Pythonインストール
  2. Seleniumをインストール
  3. WebDriverをインストール

Chromeを使った自動テストを行うと以下のような画面が表示されます。

いざ実装!

実装した処理の流れとして

  1. WebDriverを設定
  2. iksm_sessionをCookieの値として設定
  3. 実際にアクセスし、通報内容を設定して送信

といった感じです。 Cookieの設定方法やXPathと呼ばれる要素の指定方法が初めただったので時間がかかりましたが、慣れると簡単に出来ます。

実装したプログラムが以下です。

クリックで開きます

import requests
import time
from selenium import webdriver

cookie_name = 'iksm_session'
cookie_value = 'XXXXXXXXXXX' #取得したiksm_sessionの値

s = requests.session()

# WebDriverの場所を参照
driver = webdriver.Chrome("C:/Python/Python37/chromedriver_win32/chromedriver.exe")
driver.get("https://app.splatoon2.nintendo.net/")

# cookieとしてiksm_sessionの値をセット
driver.add_cookie({
    'name': cookie_name,
    'value': cookie_value,
    'domain': 'app.splatoon2.nintendo.net'
})

try:
    for i in range(10):
    # 任天堂サーバに負荷をかけないように10秒に一度通報する
        time.sleep(10)
        # 要素の値が読み込めるまで最長10秒待つ
        driver.implicitly_wait(10)
        driver.get("https://app.splatoon2.nintendo.net/results/***/player/********/report_abuse") # 事前に通報したいプレイヤーのURLを取得する

        # 通報内容を入力
        elem_search_word = driver.find_element_by_name("text")
        elem_search_word.send_keys("放置")

        # 通報理由を選択
        elem_search_btn = driver.find_element_by_xpath("//*[@type='radio'][@value='playing_inactivity']")
        elem_search_btn.click()

        # 送信ボタンを押す
        elem_submit_btn = driver.find_element_by_xpath("""//*[@id="app"]/div/div[1]/div[2]/div/div/div/div[2]/div[9]/div/div/div/div/div/div/div[2]/div[2]/form/button""")
        elem_submit_btn.click()
finally:
    time.sleep(1)
    driver.quit()

このスクリプトで10秒に一回、合計10回通報を行えます。手作業のほうが早いかも知れませんが、早すぎてもサーバに負荷をかけてしまうので、抑えめにしています。

No悪質プレイヤー!

今回は悪質プレイヤーの通報を自動化したいという少し意地の悪い動機でしたが、PythonSeleniumを使った自動化を試すことが出来たので、いい経験になったと思います。 自動化で前回紹介したようなスクレイピングをすることができるので、どこかで役に立つと思います。

通報が溜まるとアカウントBANやswitch本体BANなどの処置が行われるので、悪質なプレイヤーは考えを改めてほしいですね。 前作のWiiUSplatoonではチーターが蔓延していて、私も被害にあったので今回はそういったことがないように願います。

【Python】スクレイピング

前回インストールしたPythonを使ってWebスクレイピングをやってみようと思います。

スクレイピングとは

スクレイピング(scraping)とは主にウェブサイトから情報を収集し、その情報を厳選・加工しデータを生成することです。 似たような言葉でクローリング(crawling)というのがあります。これは同じ様にウェブサイトから情報を収集するのですが、収集した情報を加工せずそのままのデータを使うことを指すことが多いようです。 GoogleGoogle botというサービスもクローリングの代表的な例です。

機械学習を行うために、大量のデータが必要になるのでスクレイピングによって多くのデータを集めます。

今回は本格的なスクレイピングの準備として、このサイトの記事名を集めてみました。

環境構築

  • Python 3.7.0
  • BeautifulSoup
  • urllib

BeautifulSoupとはPythonのライブラリの一つでスクレイピングに特化した機能を持っています。全ての機能を把握しきれていませんが、HTMLやXMLといった文章の構文解析をメインに使っています。

urllibはURLを扱うためのモジュールを集めたパッケージで下記のモジュールがあります。

  • urllib.request
    • URLを開いて読むためのパッケージ
  • urllib.error
    • urllib.requestが発生させる例外を持っている
  • urlib.parse
    • URLをパース(構文解析)するためのモジュール
  • urllib.robotparser
    • robots.txtファイルをパースするためのモジュール

今回は簡易的な試しということでurllib.requestだけを使いました。

urllibは最初から導入されているパッケージですが、BeautifulSoupの方はインストールする必要があります。Pythonのライブラリをインストールするためにpipというのを使います。 pipとはPythonのパッケージ管理ツールでMacだとHomebrewのようなもので、CentOSだとyumみたいなものです。pipは標準でPythonと一緒にインストールされているためそのまま使うことができるかと思います。

下記のコマンドでインストールします。

pip3 install beautifulsoup4

アルゴリズム

取得する前にサイトのソースを表示して記事名がどこに書かれているかを探します。 探すときはGoogle Chromeの開発者ツール(F12)を使うと便利です。

上図の赤枠ポインタのマークをクリックして、ソースを見たい部分をクリックするとその部分のソースが表示されます。

私のサイトでは"main"の中の"div id=list"の中に一覧として表示されているようです。 その中から"title"プロパティに記事名がありました。

そのため、このサイトの記事名一覧を取得するアルゴリズムとして下記の方法で実装しました。

  1. ページ下部の「次のページ」ボタンが表示されなくなるまで以下の2~5を繰り返す
  2. main_bodyにid:mainの要素を格納
  3. 2の要素の中から"div id=list"の要素を取得し格納
  4. 3の要素からtitleプロパティを抜き出し表示する
  5. 「次のページ」ボタンが示すURLを取得し、次の解析するURLに設定する

実装

以上から下記のような実装になりました。

クリックで開きます

# coding: UTF-8
import urllib.request
from bs4 import BeautifulSoup

# アクセスするURL
BASE_URL = "https://memoran.net"

# URLにアクセスする htmlが帰ってくる ⇨ <html><head><title>...
html = urllib.request.urlopen(BASE_URL)

# htmlをBeautifulSoupで扱う
soup = BeautifulSoup(html, "html.parser")

count = 0

# 次のページが存在する限り繰り返す
while True:
# 記事名を取得して表示
 main_body = soup.find("main", {"id":"main"})
 theme = main_body.find("div", {"id":"list"})
 for a in theme:
   print(a.get('title'))
   count += 1

 PAGER_NEXT = soup.find("a", {"class":"next page-numbers"})
 if PAGER_NEXT != None:
   NEXT_LINK = PAGER_NEXT.get("href")
   print()
   print(NEXT_LINK)
   html = urllib.request.urlopen(NEXT_LINK)
   soup = BeautifulSoup(html, "html.parser")

 if PAGER_NEXT == None:
   print()
   break

実行結果は以下のようになります。URLをそのまま表示するとカード形式で表示されてしまうので``付きに加工しています。

クリックで開きます

Pythonインストール方法
Vimの使い方
【Splatoon2】stat.inkを利用した戦績データの分析
【悲報】Xperia 画面割れ
【N予備校】実践サーバーサイドプログラミング完了
apacheからnginxへの移行検討
【WordPress】Cocoonでのページネーション変更
WordPressコンテナへのVim導入
WordPressのバックアップ
AMP対応のメリット・デメリット(問題点)

`https://memoran.net/page/2/`
dockerでローカルにwordpress環境を作る
ブラックジャックプログラムの実装
ブラックジャックの設計手法例
【M570】マウスチャタリング解消
【書評】UMLモデリングの本質
BlackJackプログラム
【WordPress】Cocoon導入
WPA/WPA2脆弱性
logwatchの活用例(不正アクセスの発見、対策)
PHPバージョンアップ

`https://memoran.net/page/3/`
EC-CUBEインストール(2)
EC-CUBEインストール(1)
SSL証明書更新
【N予備校】サーバーサイドプログラミング入門
コンテッサ購入(中古)
【Nintendo Switch】プロコン修理
【Splatoon 2】イカリング2をPCで閲覧
Docker導入
Markdown記法
MacBook Pro 修理

`https://memoran.net/page/4/`
ログインページへの対策
仮想化技術
【Nintendo Switch】ヒューマン・リソース・マシーン
埋め込み機能(embed)
Nmap
ペネトレーションテスト
攻撃手法
脆弱性の種類(2)
入学しました
セキュリティ用語集(セキュリティ対策とセキュリティ情報)

`https://memoran.net/page/5/`
セキュリティ用語集(脆弱性と攻撃手法)
脆弱性の種類(1)
fail2ban導入
迷路プログラム
豆苗生活
VPNのスヽメ
セキュリティについて
VPSのすゝめ
ブログデビュー

記事の総数は49

感想

Pythonを初めたばっかりですが、意外ととっつきやすくうまく思ったとおりに動いてくれました。 実行スピードもそれほど気にならなかったのですが、データ量が多くなると厳しいかも知れません。 サイトによってはAPIが用意されているところもあるので、APIを利用したスクレイピングにも挑戦していきたいです。