当社で開発したツイッターAPIを使って、TwitterのTweetを取得してブログに投稿するツールのソースです。

Yahoo!ブックマークに登録 はてなブックマークに登録 Twitterでフォローお願いします。

VALID SEO

ツイッターのつぶやきをブログに投稿するツールです。

TwitterのAPIとブログのメール投稿機能を使って、ツイッターのつぶやきをブログにエントリするためのツールのソースを公開します。

ツイッターは、ブログに比べて格段につぶやきやすいので、割と頻繁に更新が可能です。 ただ、つぶやきっぱなしはもったいないというか、できれば運営しているブログにも反映したい、というところから、 あちこちのサイトを参考に、perlを使って自作してみました。

機能としては、特定のユーザーの昨日の1日のTwitterでのつぶやきをAPIで取得して、 Net::SMTPを使ってブログ更新用アドレスにメールを送信し、 1エントリとしてブログに投稿します。

同様の機能を提供する仕組みが「twtr2src」というところにあるのですが、 ブログ投稿アドレスをtwtr2srcに登録する必要があり、企業としては公式ブログ等に投稿できるメールアドレスを渡してしまうのは、 セキュリティ上、やや不安な面があります。(このツールが使えない、設置方法が理解できない方はこちらを利用されれば良いと思います。)

ですので、こちらのツールを自社のサーバーに設置してcronを使って1日1度実行するようにすれば、安心だと思います。

当ソースは、GPLライセンスで提供いたしますので、ご自由にお使い頂いて構いません。 ただし、不具合があった場合の責任は負いかねますので自己責任でお願い致します。

【利用手順】

  1. このソースを「utf-8」にて「blog_entry_from_twitter.pl」という名称で保存します。
    (名称は何でも良いのですが便宜上、この名前で話を進めます。)
  2. 同じ場所に「blog_list.csv」を作成します。
  3. cronを実行できるサーバーを用意し、perlを実行する際のパスを確認します。
  4. ソースの冒頭のperlを実行する際のパスをサーバーに合わせて修正します。
  5. 同じく、サーバー上にファイルを設置する場所の絶対パスを確認します。
    今現在、cronを使って処理を実行していないのであれば、ホームディレクトリの下に「batch」という名のディレクトリを作成します。 (「batch」という名称は何でも良いのですが便宜上、この名前で話を進めます。)
  6. FTPかFTPソフトを使って、サーバーにアップロードします。
  7. 「blog_entry_from_twitter.pl」には、実行権限を与えます。
  8. cronの設定画面、もしくは、サーバーにログインしてcrontab -e で定期実行する設定を行います。
  9. 毎日定期的に「blog_entry_from_twitter.pl」が実行されてブログにツイッターのつぶやきが投稿される「はず」です。

【稼動実績のあるサーバーとブログの組み合わせ】

  • さくらサーバー => Seesaaブログ

【既知の不具合】

  • 1日のつぶやきがブログで投稿できる文字数を超えると投稿が切れます。
#!/usr/bin/perl
#↑サーバーで指定されているperlのパスに修正してください。
#-------------------------------------------------------------------------------
# Copyright (C)2009-9999 valid seo  Revision: 1.3 
#-------------------------------------------------------------------------------
use strict;
use utf8;

use XML::Simple;
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';

use Encode;

use LWP::Simple;

#この辺りはインストールが必要な環境もあるかもしれません。
use HTTP::Date;


################################################################################
# ■変数定義
################################################################################


# TwitterのAPIのURLです。一度に20ツイート取得するようにしてます。
# 1日にそれ以上つぶやく方は、処理軽減のために適切な数値に変更してください。

my $count = 20;
my $api_url = "http://api.twitter.com/1/statuses/user_timeline.xml?count=$count";

#
# 投稿するブログリストのファイルです。ファイルの場所はスクリプトと同じ場所に
# 設置してください。
# ファイル内の並びは、
#
#  「twitterのID,投稿先ブログの指定メールアドレス,投稿者メールアドレス,ブログURL」
#
# です。
#
use FindBin;
my $home = "$FindBin::Bin";

my $blog_list = "$home/blog_list.csv";


################################################################################
# ●メイン処理
#   前日のつぶやきをTwitterのuser_timeline APIを使って取得後、
#   ブログにメール投稿
################################################################################

#
# 昨日の日付を取得する
#
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 1*24*60*60);
$year += 1900;

my $yesterday        = sprintf("%04d-%02d-%02d",$year,$mon+1,$mday);
my $yesterday_number = sprintf("%04d%02d%02d",$year,$mon+1,$mday);

#
#投稿時の件名を設定
#
# 
my $formated_date = sprintf("%04d年%02d月%02d日",$year,$mon+1,$mday);

#
# ブログの標題をカスタマイズしたい場合は、この辺りを修正してください。
#
my $mail_subject = "$formated_date のつぶやき";

#
# ブログリスト一覧分処理を実行する
#
open( MASTER , "<", $blog_list )  or die "$blog_list をオープンすることができません。";

while(){
    chomp;
    sleep(1);
    &post_yesterday_tweets($_);
}

close(MASTER);

#-------------------------------------------------------------------------------

print "\n Operation Done! \n";
exit(0);

###############################################################################
# ■サブルーチン
###############################################################################

#-------------------------------------------------------------------------------
# 取得したTweetをメールを使ってブログ投稿する処理
#-------------------------------------------------------------------------------
sub post_yesterday_tweets{

    my ($twitter_id,$blog_post_to,$blog_post_from,$blog_url) = split(/,/, @_[0]);

    print " Now Operating-> $twitter_id to $blog_url \n";

    my %yesterday_tweets;

    my $page = 1;
    my $has_next     = "yes";
    my $is_send_mail = "no";

    my $mail_body ="";

    while ( $has_next eq "yes" ) {

        my $post_url = "$api_url&screen_name=$twitter_id&page=$page";

        my $response = get( $post_url );
        my $response_xml = XMLin( $response );
        my %statuses = %{ $response_xml->{status} };

        foreach my $id (reverse sort keys %statuses){

            my $status = $response_xml->{status}{$id};

            my $created_at =  $status->{created_at};
               $created_at =~ s/\+0000/UTC/;
               $created_at = str2time($created_at);

            my ($date_str ,$time_str) = split(/ /, HTTP::Date::time2iso($created_at));

            my $date_number = $date_str;
               $date_number =~ s{\-}{}g;

            if ( $date_number == $yesterday_number ){
                $status->{created_at} = HTTP::Date::time2iso($created_at);
                $yesterday_tweets{$id} = $status;

                $is_send_mail = "yes";
            }
            elsif  ( $date_number < $yesterday_number ){
                $has_next = "no";
                last; #foreach 抜ける
            }

        }

        $page++;

    }

    if($is_send_mail eq "yes"){
        $mail_body = &assemble_mail_body(%yesterday_tweets);
        &mail_send($blog_post_to,$blog_post_from,$mail_subject,$mail_body);
    }

}
#-------------------------------------------------------------------------------
# 取得したTweetをメール送信時用に整形する処理
#-------------------------------------------------------------------------------
sub assemble_mail_body{

    my (%yesterday_tweets) = @_;
    my $assembled_mail_body = "";

    foreach my $key ( sort keys %yesterday_tweets ) {

        my $status = $yesterday_tweets{$key};

        my $text     = $status->{text};
        my $source   = $status->{source};
        my ($tweet_date ,$tweet_at) = split(/ /, $status->{created_at});

        #
        # ここを修正すれば好きな形にしてメール投稿できます。
        #
        $assembled_mail_body .= << EOM
$tweet_at on $source
$text


EOM
;
    }

    return $assembled_mail_body;
}

#-------------------------------------------------------------------------------
# MIME::Liteを使ってメール送信する処理
#-------------------------------------------------------------------------------
sub mail_send{


    my ($to,$from,$subject,$body) = @_;
    my $jis = find_encoding( "jis" );

    $subject = encode( $jis, $subject );
    $body    = encode( $jis, $body );

    use MIME::Lite;

    my $mail = MIME::Lite->new(
                  From => "$from"
                 ,To => "$to"
                 ,Subject => "$subject"
                 ,Type => 'text/plain; charset="ISO-2022-JP"'
                 ,Encoding => '7bit'
                 ,Data => "$body"
               );

    $mail->send();


}

【補足】

  • 投稿の件名は、$mail_subject で設定してますので、修正したい場合はその辺りを変更してください。
  • 投稿される本文の整形は、sub assemble_mail_body{}で行っていますので、修正したい場合はその部分を修正してください。

【参考にさせて頂いたサイト様】

【更新履歴】

  • 2010/05/01

    cronからの実行では、Cwdモジュールのgetcwd()の結果が、実行ユーザーのホームディレクトリになってしまい、 ブログエントリ用のファイルが無いエラーになるのを修正

  • 2010/04/08

    Net::SMTP、Date::Simpleを使っていると使えないサーバーが多いようなので、メール送信をMIME::Liteに、昨日、一昨日の日付をモジュール使わずに計算して取得するように修正

  • 2010/04/06

    公開

主なサービス内容一覧

○ 1回払いSEOサービス

− 2012.03.01 よりサービス内容変更になりました。−

料金 \5,250 (税込)を1回だけお支払い頂く、 順位上昇の保証がない SEO対策サービスです。

内容は、約1ヶ月間掛けて、ブログやなどから、 被リンク、バックリンクと言った外部評価を獲得していくための作業をさせて頂きます。

SEOの外部評価強化対策(被リンク対策)や、「キーワード 都市名」レベルの順位アップにご利用下さい。 歯科、眼科、美容室、司法書士、行政書士、弁護士、賃貸・不動産業、リサイクル業者様など商圏がある程度限定される方にはオススメです。

詳細はこちら

○ エフズディレクトリー登録審査サービス

弊社が保有するディレクトリー型サイトへの掲載を料金を頂いて審査させて頂くサービスです。

掲載されるページから御社サイトへの良質なアクセスがあるように努めております。

詳細はこちら

○ テキスト広告販売

当社が運営するサイトのトップページフッターのテキスト広告をご提供いたします。
1サイトに付き、月額5,250円(税込み)で、最低4ヶ月分からとなります。


詳細はこちら

ページTOPへ