Category:Web’

ゴーストからTwitterに投稿する(其の参―中級編)

 - by Don

目次

準備

上級編を見てわかる通り、普通にやると準備が大変です。なので中級編では筆者が準備した環境を中継して投稿する方法を紹介します。

「概要」で説明した通り、以下のものが必要になります。

  • BOT用Twitterアカウント
  • Twitter APIの認証キー(2つ)※Twitter開発者登録は不要
    • ACCESS_TOKEN(アプリに対しアカウント毎に割り当てられる)
    • ACCESS_TOKEN_SECRET(アプリに対しアカウント毎に割り当てられる)
  • PHPが使用可能なサーバ(PHP7でなくても可)

BOT用TwitterアカウントとPHPが使用可能なサーバは例によって各自用意してください。

Twitter APIの認証キー(2つ)は以下のリンクから取得してきてください。

UKABOT

適当な名前のPHPファイルを作成してサーバにアップロードします。今回はsample.phpとしました。このファイルにコードを記述していきます。

<?php
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$url = 'http://nikolat.starfree.jp/rentalbot/sendtweet.php';
$mes = 'サーバから送信テスト';
$post_data = array('access_token' => ACCESS_TOKEN, 'access_token_secret' => ACCESS_TOKEN_SECRET, 'status' => $mes);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$res =  curl_exec($ch);
curl_close($ch); 

header('Content-Type: text/plain; charset=UTF-8');
print 'おしまい';

文字コードはUTF-8にしておきましょう。XXXの部分は自身が取得した2つのAPIの認証キーに書き換えてください。これを保存してWebブラウザからこのphpファイルがあるURLにアクセスしてみましょう。ブラウザには「おしまい」と表示され、BOTのアカウントに「サーバから送信テスト」と投稿されるはずです。

今はWebブラウザからアクセスしましたが、最終的にはSSPからアクセスし、メッセージを転送することを目標としています。

送信するテキストの部分を以下のように書き換えましょう。

<?php
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$url = 'http://nikolat.starfree.jp/rentalbot/sendtweet.php';
$mes = $_POST['message'];
$post_data = array('access_token' => ACCESS_TOKEN, 'access_token_secret' => ACCESS_TOKEN_SECRET, 'status' => $mes);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$res =  curl_exec($ch);
curl_close($ch); 

header('Content-Type: text/plain; charset=UTF-8');
print 'おしまい';

そしてSSPから以下のSakuraScriptを入力します。

\![execute,http-post,【URL】,--param=message=SSPから送信テスト]

【URL】は先ほどWebブラウザからアクセスしたphpファイルがあるURLに置き換えてください。BOTのアカウントに「SSPから送信テスト」と投稿されるはずです。

これでゴーストからTwitterに投稿することができました。

エラー処理

上記のコードは最小限の構成になっています。エラー処理くらいは加えたほうが良いでしょう。

<?php
header('Content-Type: text/plain; charset=UTF-8');

define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$url = 'http://nikolat.starfree.jp/rentalbot/sendtweet.php';
$key = 'message';
if (!isset($_POST[$key])) {
  print 'メッセージのパラメータ名が違います。';
  exit();
}
$mes = $_POST[$key];
$post_data = array('access_token' => ACCESS_TOKEN, 'access_token_secret' => ACCESS_TOKEN_SECRET, 'status' => $mes);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$res =  curl_exec($ch);
if(curl_error($ch)) {
  print curl_error($ch);
} else {
  print $res;
}
curl_close($ch); 

ここで表示されるはずのメッセージはSakuraScriptを実行したゴーストのフォルダ内 ghost\master\var\sample.php に格納されています。

注意事項

ここで解説した方法は筆者のサーバを経由して投稿する方法になります。筆者がサーバの利用継続手続きを失念したり、筆者のTwitterアカウントが凍結されたりすれば動かなくなりますが、泣かないでください。

ゴーストからTwitterに投稿する(其の弐―上級編)

 - by Don

目次

準備

「概要」で説明した通り、以下のものが必要になります。

  • BOT用Twitterアカウント
  • Twitter APIの認証キー(4つ)※Twitter開発者登録が必要
    • CONSUMER_KEY(アプリ毎に割り当てられる)
    • CONSUMER_SECRET(アプリ毎に割り当てられる)
    • ACCESS_TOKEN(アプリに対しアカウント毎に割り当てられる)
    • ACCESS_TOKEN_SECRET(アプリに対しアカウント毎に割り当てられる)
  • PHP7が使用可能なサーバ
  • OAuthライブラリ(TwitterOAuth)

BOT用Twitterアカウントは各自用意してください。

Twitter APIの認証キー取得についても、Web上に解説記事がたくさんあるのでここで解説することはしません。筆者がざっと探してみた限りでは以下の記事がわかりやすいと思いました。BOTに投稿させるため、BOT自身のアカウントで登録した方が良いです。※Twitterアプリ開発経験者や複数BOT作成予定の人はこの限りではありません

PHP7が使用可能なサーバも各自用意してください。筆者は駄でべWikiを参考にスターサーバー(フリープラン)を利用しています。(PHPのバージョンをしっかり確認してください。PHP5ではダメです。)

最後にTwitterOAuthの入手ですが、ここでは最新版ではなくversion 1.1.0をこちらから入手します。

twitteroauth

理由は、最新版では依存モジュールがあって色々めんどくさいからです。動けばいい、の精神で古いバージョンを使用します。

展開したフォルダはtwitteroauthとリネームしてサーバにアップロードします。同一ディレクトリ内に適当な名前のPHPファイルを作成します。

directory-sample

今回はsample.phpとしました。このファイルにコードを記述していきます。

<?php
require 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

define('CONSUMER_KEY', 'XXXXXXXXXXXXXXXXXXXX');
define('CONSUMER_SECRET', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$mes = 'サーバから送信テスト';

$twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

$res = $twitter->post('statuses/update', array('status' => $mes));
print 'おしまい';

文字コードはUTF-8にしておきましょう。XXXの部分は自身が取得した4つのAPIの認証キーに書き換えてください。これを保存してWebブラウザからこのphpファイルがあるURLにアクセスしてみましょう。ブラウザには「おしまい」と表示され、BOTのアカウントに「サーバから送信テスト」と投稿されるはずです。

今はWebブラウザからアクセスしましたが、最終的にはSSPからアクセスし、メッセージを転送することを目標としています。

送信するテキストの部分を以下のように書き換えましょう。

<?php
require 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

define('CONSUMER_KEY', 'XXXXXXXXXXXXXXXXXXXX');
define('CONSUMER_SECRET', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$mes = $_POST['message'];

$twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
 
$res = $twitter->post('statuses/update', array('status' => $mes));
print 'おしまい';

そしてSSPから以下のSakuraScriptを入力します。

\![execute,http-post,【URL】,--param=message=SSPから送信テスト]

【URL】は先ほどWebブラウザからアクセスしたphpファイルがあるURLに置き換えてください。BOTのアカウントに「SSPから送信テスト」と投稿されるはずです。

これでゴーストからTwitterに投稿することができました。

エラー処理

上記のコードは最小限の構成になっています。エラー処理くらいは加えたほうが良いでしょう。

<?php
require 'twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

define('CONSUMER_KEY', 'XXXXXXXXXXXXXXXXXXXX');
define('CONSUMER_SECRET', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN', 'XXXXXXXXXXXXXXXXXXXX');
define('ACCESS_TOKEN_SECRET', 'XXXXXXXXXXXXXXXXXXXX');

$key = 'message';
if (!isset($_POST[$key])) {
  print 'メッセージのパラメータ名が違います。';
  exit();
}
$mes = $_POST[$key];

$twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
 
$res = $twitter->post('statuses/update', array('status' => $mes));

if($twitter->getLastHttpCode() == 200) {
  print '投稿が完了しました。';
} else {
  print '投稿に失敗しました。';
}

ここで表示されるはずのメッセージはSakuraScriptを実行したゴーストのフォルダ内 ghost\master\var\sample.php に格納されています。

ゴーストからTwitterに投稿する(其の壱―概要)

 - by Don

本稿では伺かのゴーストからTwitterに投稿する方法について記述します。

ゴーストからのweb拍手送信を応用した内容となっています。
こちらを実践したことがある、または仕組みが理解できることを前提としています。

本稿は以下のように3部に分けて解説していきます。

「概要」では、大まかな仕組みと流れについて説明していきます。

「上級編」では、具体的に必要な準備や記述すべきコードを説明していきます。これが基本であり理想とされる対応となります。

「中級編」では、「上級編」で必要とされた準備のうちの一部を筆者が肩代わりすることで少しだけ敷居を下げた方法を説明していきます。本格的に対応する前に試用したい場合などにご利用ください。

ゴーストから自分の用意したサーバにメッセージを送信する

ゴーストからのweb拍手送信の動作原理を解説すると、SSPのSakuraScriptである\![execute,http-post]を使用してサーバにメッセージを送信し、サーバ側でメッセージを保存することでゴースト作者が閲覧できるようになっています。

send-webclap

ゴーストからTwitterへの投稿は、これの応用で、このサーバからTwitterにメッセージを転送することで実現します。

send-to-twitter

上級編

「上級編」では、PHP7を使用してTwitterにメッセージを転送するプログラムの記述を解説します。そのため以下のものを準備する必要があります。

  • BOT用Twitterアカウント
  • Twitter APIの認証キー(4つ)※Twitter開発者登録が必要
    • CONSUMER_KEY(アプリ毎に割り当てられる)
    • CONSUMER_SECRET(アプリ毎に割り当てられる)
    • ACCESS_TOKEN(アプリに対しアカウント毎に割り当てられる)
    • ACCESS_TOKEN_SECRET(アプリに対しアカウント毎に割り当てられる)
  • PHP7が使用可能なサーバ
  • OAuthライブラリ(TwitterOAuth)

※PHPとはWebプログラミングに使われるプログラミング言語の一つで、伺かで言えば「里々」みたいなものです。コピペで動くように解説するつもりなので必ずしもPHPに習熟する必要はありませんが、自分流にカスタマイズする場合はある程度習得することが望ましいです。なお、筆者はあまりPHPに詳しくありません。

中級編

「中級編」では、筆者のBOT用登録済みアプリを使って筆者サーバを経由して投稿する形式を取ります。そのため必要な準備は以下のものだけになります。

  • BOT用Twitterアカウント
  • Twitter APIの認証キー(2つ)※Twitter開発者登録は不要
    • ACCESS_TOKEN(アプリに対しアカウント毎に割り当てられる)
    • ACCESS_TOKEN_SECRET(アプリに対しアカウント毎に割り当てられる)
  • PHPが使用可能なサーバ(PHP7でなくても可)

forward-to-twitter

GAEで動かしていたアプリの移転

 - by Don

Google App Engineに依存して動作させていたゴーストやプラグインの移転作業を行いました。

びーふれんず
Twitterへの投稿機能を復活させました。ついでに画像投稿機能も復活させました。(@beefriends)
ついっとゅう
スターサーバーへ移転しました。今のところtweetの取得はできますがDMの取得や投稿は正常に動いておりません。昔の古い仕様のままなので折を見て改修したいところです。
【きょうの伺か】+
スターサーバーへ移転しました。(@osusume_ukagaka)

新しいサーバがどの程度使えるかまだ様子見の段階ですが、とりあえず動いたので一安心です。

SoSiReMi障害情報

 - by Don

2013-02-03 17:00現在までにかけてSoSiReMiサモンナイツ・クインテットにおいてネットワーク更新が正常に行われていない状態が確認されました。

原因はNARアップロード時に内部でネットワーク更新用ファイルの作成を行う際、処理が失敗したことによるものです。

連続した更新問い合わせによる負荷の増大が懸念されたため、管理者権限でNARの削除・新規アップロードを行い、原状回復を致しました。それに伴い、過去のダウンロード回数やネットワーク更新回数等のログは破棄されました。

ご利用中のゴーストマスタ並びにユーザの皆様には度々ご不便をお掛けしてしまい申し訳ありません。不安定なアップローダーで恐縮ですが、温かい目で見守って頂ければ幸いです。

最近SoSiReMiの障害情報ブログみたくなってきましたね。

絵日記の終わり

 - by Don

びーふれんずの日記投稿機能はland.toサーバを経由していたのですが、今日Google App Engineの方に移植して引き上げてきました。それに伴い、移植が困難であると判断したため、デスクトップのスクリーンショットを投稿する「絵日記」機能を廃止しました。また、投稿先はTwitterはてなハイクの2箇所のみとなります。

land.toに置いていたBOTはこれで全部引き上げたはずです。今の場所もいつまで続くかわかりませんが、長く続くといいですね。

SoSiReMiを少し最適化

 - by Don

SoSiReMiを一から作り直している傍ら、現状のものもアクセス解析の部分は少しの手間で改善できる気がしたので、改善してみた結果がこちら。

22:00時点で80%くらいなので、以前よりはマシですが1日持たない感じです。まあ、アクセス解析見れなくてもそんなに困らないですが…。

それよりも、その下の転送量がまだ10%にも満たないところに注目です。ご利用中のゴーストマスタ様方から容量削減にご協力頂いたことにより、SoSiReMiはもうしばらく生き長らえることができそうです。本当にありがとうございました。

これに甘えず、本格的な最適化に向けて準備を進めたいと思います。

ドスドス

 - by Don

今日はまた随分早い時間にSoSiReMiが落ちております。DL数はさすがに落ち着いているはずで、こういう時はまず攻撃を疑うものです。ログを見てみると大変わかりやすいDoS攻撃が確認できました。

dos

サイズの大きいNARに狙いを定めているあたりが効果的ですね。

対策

Google App EngineにはDoS Protection Serviceという機能が標準で利用できますので、早速試してみます。Pythonの場合はdos.yamlというファイルをルートに入れて、デプロイするだけです。書式はこんな感じです。

blacklist:- subnet: 1.2.3.4
  description: a single IP address
- subnet: 1.2.3.4/24
  description: an IPv4 subnet
- subnet: abcd::123:4567
  description: an IPv6 address
- subnet: abcd::123:4567/48
  description: an IPv6 subnet

とりあえずこれで様子を見ることにします。

お勉強ついでに

DoSというと一般にはトラフィック増大を引き起こして対象をサービス停止に追い込むものですが、クラウドサービスに対するものはEDoS(Economic Denial Of Service)と呼んだりするそうです。クラウドサービスは基本的にスケールが売りなのでDoS攻撃程度で落ちたりしないものですが、サービス体系が一般的に従量課金ですので、運営者に経済的な打撃を与えることが可能になります。ウチは無料枠超えたら現在のように落としてもらっているので大丈夫ですが、上限を定めていない青天井の契約形態のサービスは怖くて利用できないですね。

参考

SoSiReMiの分析

 - by Don

2012-10-01 10:09 – 16:00 の間、SoSiReMiが落ちていました。ご利用中の方々には大変ご不便をお掛けしました。

原因は先月も予想していましたが、新規公開ゴーストのダウンロード数が跳ね上がったことによる転送量オーバーです。1GB/dayまでの転送量が許されていますが、6.7MBのNARであれば160回ダウンロードされると余裕で1GBを超える計算になります。

quota analysis of sosiremi

上の100%になってしまっている方はアクセス解析のカウントを司るAPIです。これが上限を超えた場合でもアクセス解析を非表示化して何とか運用を続けています。その下のもうすぐ100%になりそうな方が転送量です。2012-10-01 23:00現在のものなので、もうすぐまた落ちます…。23:30追記:落ちました。

対策

SiReFaSoは巡回間隔を空けることで現状はなんとかなりそうですが、SoSiReMiはこのままではマズイですね。外部ストレージを活用するなどして全面的に作り直さないといけません。管理人が膝に矢を受けてしまったため作業が停滞しておりますが、回復までしばらくお待ち下さい…。

補足

SiReFaSoの時も気を回して頂いた方がいらっしゃいましたが、決して「使うな」と言ってるわけではないので早合点なさらないようお願いします。ご利用中または今後ご利用をお考えのゴーストマスタ様でご協力頂けることがあるとすれば、表情差分のみで構成された立ち絵のシェルに関してはelement合成によってNARの容量削減が見込めるため、転送量の削減に効果があります。SoSiReMiと地球にやさしいNARになりますので、ご検討頂けると助かります。

SiReFaSoの巡回間隔の変更

 - by Don

本日、以下のサイトにてメンテナンスを行いました。

内容は先週お知らせした通り、Google App Engineからの催促に応えたものです。

HRDに移行後もこれまで通りの動作を確認しましたが、1つ不都合が生じました。

リソース消費量の増加

以下の画像は20:30現在におけるSiReFaSoのリソース消費量です。

HRD

16:00にリセットされるので、4時間半経過した時点でDatastore Read Operationsという項目が3分の1消費されていることになります。これはSiReFaSoの設計において、登録時や巡回時にデータを更新する時に消費される項目なのですが、このままいけば明日の16:00まで持たないと考えられます。リソース消費量が100%になると、サイトがダウンして閲覧できなくなります(これまでにも何度か登録や更新が多い日にダウンしましたが)。

9:00追記

朝起きたらこんな感じでした。

hrd2

今日は16:00まで巡回はストップしておきます。

対策

リソース消費量削減のため、SiReFaSoの巡回間隔を、「1時間に1回」から「2時間に1回」に変更しました。もっとリソースを節約した設計を考えるべきところですが、前回の大幅な設計変更の際に既にかなりの節約を達成しており、これ以上は乾いた雑巾を絞るに等しい状態です。当面はこの巡回間隔で様子を見ながら、他の対策を考えることにします。

補足

1回の更新(巡回)で5~6%程度の消費を確認しています。最低でも24回+新規登録・更新用に数回=計30回分くらいは確保したい→1回の更新で3%の消費を目指す必要があります(HRDに移行する前はこのくらいだったんですけど)。かなり難題です。

またSoSiReMiとMiDoLaSoにも同じ影響がありますが、元々のリソース消費量があまり多くないのでまだ対策を打つほどではありません。でもSoSiReMiの場合は新規公開時にダウンロード数が跳ね上がるのでそれで落ちることがあるかもしれません。