艦これのAPIを直接叩いて操作しようと思ったけどやめた話
やりたかったこと
寝ている時や仕事中などゲームをプレイできないとき、Jenkins提督に遠征の指揮を執ってほしかった。
Jenkinsがコマンドを実行することにより、帰投した艦隊の受け入れ、補給、遠征への出撃を定期的に行ってくれるイメージ。
これを実現するために、こんな感じのプログラムを書いてみた
https://gist.github.com/oh-sky/6404680
※プログラムの動作確認には自分で用意したモックサーバを使用しており、実際にゲームの操作は行っておりません。
プログラムの動作イメージとしてはこんな感じ
$ #各艦隊のステータス確認 $ ./knkr.rb getDeckPort 第1艦隊 出撃可 第2艦隊 帰投中 第3艦隊 出撃可 $ #遠征から帰投した艦隊の受け入れ $ ./knkr.rb getMissionResult 2 第2艦隊の遠征結果 成功 $ #遠征に送る $ ./knkr.rb startMission 2 5 第2艦隊の遠征終了予定時刻 2013-08-31 20:10:30
たぶん、トークンとアプリサーバのアドレスを入れたら動くと思います。 が、やっていませんし、やらないでください。
絶対にやらないでください。
やめた理由
【ご注意】 利用規約にもある通り、マクロなどの特殊なプログラムを介して「艦これ」をプレイすることは禁止されています。そういった行為はお辞めください。通常のプレイではありえない挙動やプレイ履歴が確認された場合は、その時点でご利用の停止等の対応をさせて頂く場合があります。 #艦これ
— 「艦これ」開発/運営 (@KanColle_STAFF) September 1, 2013
DMMオンラインゲーム利用規約には下記のような記述があります。
第6条(禁止事項)
1.会員は、本サービスを利用するにあたり、故意・過失を問わず以下の各号に定める行為を行ってはならないものとします。
■不適切行為
(8)不正な方法(特殊なプログラムを介しての)でのアクセスを試みる行為
大切なアカウントが轟沈する可能性のあることはできません。
結論
ゲームはルールを守って、楽しくプレイしましょう。
鳥海は俺の嫁
Mac OS XでNFSサーバを立てる方法
/etc/exports を作成する
書式:/PATH/TO/SHARING/DIR -mapall=${uid}:${gid} ${ipaddr}
例えば、IPアドレス192.168.123.45のホストに、UID501,GID20のユーザとして、/var/nfs/exports のマウントを許可するなら
/var/nfs/exports -mapall=501:20 192.168.123.45
と書きます。
/etc/exports
が作成されると、自動的にnfsdが起動します
nfsdを起動したあとに/etc/exports
を編集した場合は
$ sudo nfsd update
で、新しい設定が反映されます。
複数のホストに接続を許可する場合は、IPアドレスをスペースで区切って複数書けば良いようです。 192.168.123.0/24 のような指定はできません
UID,GIDを調べるには
$ dscl . -list /Users uid $ dscl . -list /Groups gid
RDS MySQLインスタンスにてトリガを設定する
MySQLでは、binlogを出力する設定になっている場合、SUPER権限を持つユーザでないとトリガやファンクションを作成できない。
RDSのMySQLインスタンスは、リードレプリカの有無に関係なくbinlogを出力する設定になっており、 且つ利用者側ユーザにSUPER権限は無いため、トリガを作成しようとすると下記のようなエラーが出る。
You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
解決手段
グローバル変数log_bin_trust_function_creators
の値を1
にすれば良い。
RDSの場合はパラメータグループを操作する。
この変更は再起動すること無く反映される。
参考:http://dev.mysql.com/doc/refman/5.1/ja/stored-procedure-logging.html
ApacheでHTTPSのReverseProxy設定
例えばhttps://proxy.example.com/
へのアクセスをhttps://hostname.example.com/
へ転送したいときのVirtualHost設定は下記のようになります。
[prompt]$ sudo vi /etc/apache2/sites-available/proxy.example.com =========================================================================== <VirtualHost *:443> ServerName proxy.example.com SSLEngine on SSLProxyEngine on SSLCertificateFile /path/to/certificate.crt SSLCertificateKeyFile /path/to/private.key ProxyPass / https://hostname.example.com/ ProxyPassReverse / https://hostname.example.com/ </VirtualHost>
当たり前ですが、証明書はproxy.example.com
のものである必要があります。
設定ファイルを書いたら、必要なモジュールのリンクを貼り、Apacheを再起動します。
[prompt]$ sudo a2enmod proxy [prompt]$ sudo a2enmod proxy_http [prompt]$ sudo a2enmod ssl [prompt]$ sudo a2ensite proxy.example.com [prompt]$ sudo /etc/init.d/apache2 restart
※Debianでの設定例です。Ubuntuなら似たような方法で設定できると思います。他のディストリビューションでは、設定ファイルのパスやモジュールのロード方法が異なる場合があります。
おまけ Proxyでアクセス制御を行いたい場合
通常、Order
やAllow
、Deny
といったディテクティブは<Directory>
ディレクティブ内に書くものだけれど、
ディレクトリの存在しないプロキシではどうしたら良いのかというと・・・
<Proxy>
ディレクティブに設定します。
例えば
<VirtualHost *:80> ServerName hoge.example.com <Proxy *> Order deny,allow Deny from all Allow from 172.16.0.0/16 </Proxy> </VirtualHost>
みたいな感じで。
AuthName
、AuthType
といったディレクティブも<Proxy>
内に書きます。
PostfixでメイルのSubjectを書き換える方法
Postfixの header_checksという機能を使います。 header_checksを使うと、ヘッダに任意のパターンを含むメイルをREJECTしたり、REDIRECTしたり、ヘッダを書き換えたりすることができます。
例えば、本番サーバと開発用サーバがあり、開発用サーバからのメイルを判別しやすくするために [test]というprefixを件名につけたいと行った場合、下記のように設定します。
/etc/postfix/header_checks
を下記のような内容で作成
/^Subject: =\?UTF-8\?B\?(.*)/ REPLACE Subject: =?UTF-8?B?W3Rlc3Rd$1
上記はBASE64なUTF-8で書かれたSubjectの先頭に"[test]"を付加する場合。 文字セットやTransfer-Encodingが異なる場合はそれに合わせて変更します。
/etc/postfix/main.cf
に、下記のような行を追加
header_checks = regexp:/etc/postfix/header_checks
postfixを再起動
[prompt]$ sudo /etc/init.d/postfix restart
PHPのSoapClientで、名前空間の接頭辞をns1から任意のものに変えたい場合
<?php /** * SoapClientを継承するクラスにて、__doRequest()メソッドをオーバーライドする */ class MySoapClient extends SoapClient { public function __doRequest($request, $location, $action, $version, $one_way = 0) { $request = preg_replace('/xmlns:ns1/', 'xmlns:myns', $request); $request = preg_replace('/<ns1:/', '<myns:', $request); $request = preg_replace('/<\/ns1:/', '</myns:', $request); return parent::__doRequest($request, $location, $action, $version, $one_way); } } $soapObj = new MySoapClient( null, array( 'soap_version' => SOAP_1_1, 'location' => 'http://example.com/', 'uri' => 'http://example.com/', 'use' => SOAP_LITERAL, )); $soapObj->MethodName( new SoapParam('value', 'param') );
上記のように、SoapClientクラスを継承し、オーバーライドした__doRequest()メソッドにて ns1 を任意の文字列に置換すれば、下記のようなリクエストをサーバに送ることができる。
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myns="http://example.com"> <SOAP-ENV:Body> <myns:MethodName> <param>value</param> </myns:MethodName> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Debianで必要なコマンドがどのパッケージに入っているか調べる方法
ググれば大抵の場合解決するんですが、どうしても自己解決しなければならない場合に
1 まず apt-file をインストールし、データを更新する。
[prompt]$ sudo aptitude update [prompt]$ sudo aptitude install apt-file [prompt]$ sudo apt-file update
2 そして、例えばnslookupがどのパッケージに入っているか調べる場合は
[prompt]$ apt-file search nslookup