当社で開発したツイッターAPIを使って、TwitterのTweetを取得してブログに投稿するツールのソースです。
ツイッターのつぶやきをブログに投稿するツールです。
TwitterのAPIとブログのメール投稿機能を使って、ツイッターのつぶやきをブログにエントリするためのツールのソースを公開します。
ツイッターは、ブログに比べて格段につぶやきやすいので、割と頻繁に更新が可能です。 ただ、つぶやきっぱなしはもったいないというか、できれば運営しているブログにも反映したい、というところから、 あちこちのサイトを参考に、perlを使って自作してみました。
機能としては、特定のユーザーの昨日の1日のTwitterでのつぶやきをAPIで取得して、 Net::SMTPを使ってブログ更新用アドレスにメールを送信し、 1エントリとしてブログに投稿します。
同様の機能を提供する仕組みが「twtr2src」というところにあるのですが、 ブログ投稿アドレスをtwtr2srcに登録する必要があり、企業としては公式ブログ等に投稿できるメールアドレスを渡してしまうのは、 セキュリティ上、やや不安な面があります。(このツールが使えない、設置方法が理解できない方はこちらを利用されれば良いと思います。)
ですので、こちらのツールを自社のサーバーに設置してcronを使って1日1度実行するようにすれば、安心だと思います。
当ソースは、GPLライセンスで提供いたしますので、ご自由にお使い頂いて構いません。 ただし、不具合があった場合の責任は負いかねますので自己責任でお願い致します。
【利用手順】
【稼動実績のあるサーバーとブログの組み合わせ】
【既知の不具合】
#!/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(); }
【補足】
【参考にさせて頂いたサイト様】
【更新履歴】
2010/05/01
cronからの実行では、Cwdモジュールのgetcwd()の結果が、実行ユーザーのホームディレクトリになってしまい、 ブログエントリ用のファイルが無いエラーになるのを修正
2010/04/08
Net::SMTP、Date::Simpleを使っていると使えないサーバーが多いようなので、メール送信をMIME::Liteに、昨日、一昨日の日付をモジュール使わずに計算して取得するように修正
2010/04/06
公開
随時更新して行きますので、ぜひブックマーク、RSSリーダーへのご登録お願い致します。
ツイート
主なサービス内容一覧
− 2012.03.01 よりサービス内容変更になりました。−
料金 \5,250 (税込)を1回だけお支払い頂く、 順位上昇の保証がない SEO対策サービスです。
内容は、約1ヶ月間掛けて、ブログやなどから、 被リンク、バックリンクと言った外部評価を獲得していくための作業をさせて頂きます。
SEOの外部評価強化対策(被リンク対策)や、「キーワード 都市名」レベルの順位アップにご利用下さい。 歯科、眼科、美容室、司法書士、行政書士、弁護士、賃貸・不動産業、リサイクル業者様など商圏がある程度限定される方にはオススメです。
弊社が保有するディレクトリー型サイトへの掲載を料金を頂いて審査させて頂くサービスです。
掲載されるページから御社サイトへの良質なアクセスがあるように努めております。
当社が運営するサイトのトップページフッターのテキスト広告をご提供いたします。
1サイトに付き、月額5,250円(税込み)で、最低4ヶ月分からとなります。