API を使って Twitter につぶやきを投稿する
今まで Twitter の TL (自分のツイート) を自作のプログラムで取ってきて、FC2 のブログに投稿するなんてことはしてのたで、 「Twitter 情報を取得する」ということはしていたのですが、今回、ちょっとやりたことがあって、「Twitter に情報を設定する」ということにチャレンジしました。まあ、いろいろな人がいろいろなことしてくれているので、かなり簡単に出来てしまいました。
「Twitter 情報を取得する」をしたことがるので、Twitter の API がどんな感じかくらいは知っていたのですが、いかんせん仕事で使わないと「動けばいい」が大前提で詳しく理解していないので、「あ~、面倒臭そうだな~」という印象でした。自分の TL を取得するのは、Twitter にアカウントを持ってない人でも見れるので、つぶやきを投稿するとなると承認する部分を実装しなきゃいけないんだろうな~と。こんなことなら、暇な 3 月頃の時期にこの辺も押さえておくべきだったと少し公開です。
Windows 上で動作させるのでもう .NET にした方がよかったと思うのですが、面倒なので懲りずに PHP をスタンドアロンで動かすことに。
承認の xAuth/oAuth みたいのをどうするんだろうと、Web で探していると、それをひっくるめたライブラリっぽい物を公開している ホームページ を見つけて即採用です。まあ、これさえ使えば
あとは、そらぁ簡単です。
と、これだけです。自前で作りたければ Services/Twitter.php を見ればソースコードそのものだから随分と参考になるんじゃないかな?API は setUpdate 意外にも色々あるのでたいていのことはできると思います。
こんなことができればですね...
最新の情報が 1 回だけ bot されて終わるのではなく、情報の有益性に寿命がないような場合に、何度もランダムに bot し直すようなことがしたかったんです。
Twitter のつぶやきをオリジナルだけ落としてきて、落としてきたものからランダムでチョイスした物を再度 Twitter に投稿するみたいなことを自動で行うことができませす。オリジナルとクローンの区別は source でつきます(つけなくても確率が変わるだけで動きます)。API で UP した場合は API って表示されるし、もしくは任意の source を埋め込んでもおけばいいと思います。
ただ、これを Windows のタスクスケジューラで動かそうと思っているところが少し貧相です。

「Twitter 情報を取得する」をしたことがるので、Twitter の API がどんな感じかくらいは知っていたのですが、いかんせん仕事で使わないと「動けばいい」が大前提で詳しく理解していないので、「あ~、面倒臭そうだな~」という印象でした。自分の TL を取得するのは、Twitter にアカウントを持ってない人でも見れるので、つぶやきを投稿するとなると承認する部分を実装しなきゃいけないんだろうな~と。こんなことなら、暇な 3 月頃の時期にこの辺も押さえておくべきだったと少し公開です。
Windows 上で動作させるのでもう .NET にした方がよかったと思うのですが、面倒なので懲りずに PHP をスタンドアロンで動かすことに。
承認の xAuth/oAuth みたいのをどうするんだろうと、Web で探していると、それをひっくるめたライブラリっぽい物を公開している ホームページ を見つけて即採用です。まあ、これさえ使えば
あとは、そらぁ簡単です。
require_once "Services/Twitter.php";
$tweet = "おいらのつぶやきを聞いてくれ!"
$user = 'username'
$pass = '********';
$st =& new Services_Twitter($user, $pass);
$st->setUpdate($tweet);
と、これだけです。自前で作りたければ Services/Twitter.php を見ればソースコードそのものだから随分と参考になるんじゃないかな?API は setUpdate 意外にも色々あるのでたいていのことはできると思います。
こんなことができればですね...
最新の情報が 1 回だけ bot されて終わるのではなく、情報の有益性に寿命がないような場合に、何度もランダムに bot し直すようなことがしたかったんです。
Twitter のつぶやきをオリジナルだけ落としてきて、落としてきたものからランダムでチョイスした物を再度 Twitter に投稿するみたいなことを自動で行うことができませす。オリジナルとクローンの区別は source でつきます(つけなくても確率が変わるだけで動きます)。API で UP した場合は API って表示されるし、もしくは任意の source を埋め込んでもおけばいいと思います。
ただ、これを Windows のタスクスケジューラで動かそうと思っているところが少し貧相です。
API を利用してブログ投稿
Twitter のつぶやきを Blog に投稿するツールを PHP で書いた際の、API を利用して FC2 に Blog をアップロードする部分のクラスです。この時、意外にカテゴリが設定できずに少し悩んだので参考になる人もいるのでは?と思い公開しました。ちなみにクラスになっているので、当たり前ですが。クライアント部分を書かないとブログには投稿できません。
FC2 のブログは XML-RPC(←よく知らない) のインターフェースが公開されているので、それを利用してアップするという手順になります。私の家では動いているので、多分、PHP がインストールされていれば動くんだと思います。PHP のバージョンは 5.2.13 です。PHP には精通していないので、細かいところに問題はあるかもしれませんが、とりあえず動くと思います。

FC2 のブログは XML-RPC(←よく知らない) のインターフェースが公開されているので、それを利用してアップするという手順になります。私の家では動いているので、多分、PHP がインストールされていれば動くんだと思います。PHP のバージョンは 5.2.13 です。PHP には精通していないので、細かいところに問題はあるかもしれませんが、とりあえず動くと思います。
<?php
require("XML/RPC.php"); //XML-RPC package 読み込み
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";
class XMLRPC_BlogUploader {
var $m_Host;
var $m_XML_RPC_path;
var $m_Username;
var $m_Password;
var $m_Title;
var $m_Contents;
var $m_Category;
var $m_Year;
var $m_Month;
var $m_Day;
var $m_Hour;
var $m_Minutes;
var $m_Second;
function SetHost($xml_rpc_path, $host) {
$this->m_XML_RPC_path = $xml_rpc_path;
$this->m_Host = $host;
}
function SetAccount($username, $password) {
$this->m_Username = $username;
$this->m_Password = $password;
}
function SetTitle($title) {
$this->m_Title = $title;
}
function SetContents($contents) {
$this->m_Contents = $contents;
}
function SetCategory($cotegory) {
$this->m_Category = $cotegory;
}
function SetDate($year, $month, $day, $hour, $minutes, $second) {
$this->m_Year = $year;
$this->m_Month = $month;
$this->m_Day = $day;
$this->m_Hour = $hour;
$this->m_Minutes = $minutes;
$this->m_Second = $second;
}
function UploadBlog() {
$client = new XML_RPC_client($this->m_XML_RPC_path, $this->m_Host, 80);
// 記事を下書き状態で投稿
$blog_id = new XML_RPC_Value(0, 'string');
$username = new XML_RPC_Value($this->m_Username, 'string');
$password = new XML_RPC_Value($this->m_Password, 'string');
$date = sprintf("%04d%02d%02d\t%02d:%02d:%02d",
$this->m_Year, $this->m_Month, $this->m_Day,
$this->m_Hour, $this->m_Minutes, $this->m_Second);
$data = array('title'=> new XML_RPC_Value($this->m_Title, 'string'),
'description'=> new XML_RPC_Value($this->m_Contents, 'string'),
'dateCreated'=> new XML_RPC_Value($date, 'dateTime.iso8601'));
$contents = new XML_RPC_Value($data, 'struct');
$publish = new XML_RPC_Value(1, 'boolean');
$blog = array($blog_id, $username, $password, $contents, $publish);
$message = new XML_RPC_Message('metaWeblog.newPost', $blog);
$post_id = $this->sendMessage($client, $message);
if (!$post_id || $post_id->faultCode() != 0) {
return false;
}
// ブログのカテゴリ一覧を取得し、指定カテゴリの ID を検索
$blog = array($blog_id, $username, $password);
$message = new XML_RPC_Message('mt.getCategoryList', $blog);
$category_list = $this->sendMessage($client, $message);
if (!$category_list || $category_list->faultCode() != 0) {
return false;
}
$categories = $category_list->value();
for ($i = 0; i < $categories->arraysize(); $i++) {
$category_pair = $categories->arraymem($i);
$category_id = $category_pair->structmem("categoryId");
$category_name = $category_pair->structmem("categoryName");
if (strcmp($category_name->scalarval(), $this->m_Category) == 0) {
// ブログのカテゴリを設定
$category_set = array('categoryId'=> $category_id,
'isPrimary'=> new XML_RPC_Value(1, 'boolean'));
$category = new XML_RPC_Value(array(new XML_RPC_Value($category_set, 'struct')), 'array');
$blog = array($post_id->value(), $username, $password, $category);
$message = new XML_RPC_Message('mt.setPostCategories', $blog);
$retval = $this->sendMessage($client, $message);
if (!$retval || $retval->faultCode() != 0) {
return false;
}
break;
}
}
// ブログを公開
$blog = array($post_id->value(), $username, $password);
$message = new XML_RPC_Message('mt.publishPost', $blog);
$retval = $this->sendMessage($client, $message);
if (!$retval || $retval->faultCode() != 0) {
return false;
}
return true;
}
function sendMessage($client, $message) {
return $client->send($message);
}
}
?>
サンプルのクライアントプログラムも載せておきます。
<?php
require_once("above_class_source.php");
$uploader = new XMLRPC_BlogUploader;
$uploader->SetHost("/xmlrpc.php", "blog.fc2.com");
$uploader->SetAccount("account","password");
$uploader->SetTitle("test");
$uploader->SetContents("test");
$uploader->SetDate(2010, 3, 5, 1, 0, 0);
$uploader->SetCategory("Twitter");
if (!$uploader->UploadBlog()) {
print "error!";
}
unset($uploader);
?>