読者です 読者をやめる 読者になる 読者になる

ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

はてなブログの投稿を複数twitterアカウントでシェアするrubyスクリプト書いた

Programming

はじめに

take-she12.hatenablog.com

はてなブログは予約投稿と同時にシェアもできる。ただしアカウントは1つしか紐付けられないので、2つ目のアカウントでのシェアは手動でコピペである。エンジニアなのでちゃんと自動化しましょうということで今回の記事です。

実現方法

大げさですが。。。(笑)

  1. はてなブログで予約投稿と同時にシェア
    →アカウント1でシェアされる
  2. その数分後にアカウント2で「from:アカウント1 #はてなブログ」で検索する
    →最新のシェアツイートを取得する
  3. 同じ内容をアカウント2でツイートする

2の検索と3の投稿をrubytwitter-gemで書いて、それを1日1回vpsからcronで実行します。

twitter-gemに関してはこの記事を参照してください。

qiita.com

さくらvpsのセキュリティ設定

どんだけ今更なんだよってことですが、個人的な開発のgitlab用にしか使ってなくて、毎月1000円お布施させていただいてます。(笑) ログインしてゴリゴリ何かやるって使い方もまったくやってなくてほこりかぶってるんですがこれを機にセキュリティ設定見直しました。

etc/sshd/sshd_config

sshの設定ですね。鍵認証してねぇ。。。

変更点は以下。2222は例です。

Port 2222
PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication yes

ポート変えたとしても時間の問題で破られるわけで、良くないです。

/etc/sysconfig/iptables

開発環境では迷わずオフにするiptablesですが、そういうわけにもいきません。

# Generated by iptables-save v1.4.7 on Sat Jan 30 08:39:49 2016
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -s 111.111.111.111/24 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2222 -j ACCEPT
COMMIT
# Completed on Sat Jan 30 08:39:49 2016

111.111.111.111は自分のipの例です。output policyをacceptにしちゃうのは良くないんだろうけど、まぁ乗っ取られた時点で終わりかーってことでいいかなと。

rbenv

rbenv入ってないし、入ってるrubyは1.8.7でtwitterのgem使えないのでrbenv入れました。

なんとなく最新の2.2.0を。

[root@sakura ~]# ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
[root@sakura ~]# rbenv global 2.2.0
[root@sakura ~]# ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]

参考: CentOS/RHEL に Ruby 2.x をインストールする : まだプログラマーですが何か?

rubyでtweetを検索して投稿する

ようやく本題です。

require 'rubygems'
require 'twitter'
require 'pp'
require 'date'

# authentication
client = Twitter::REST::Client.new do |config|
  config.consumer_key = (省略)
  config.consumer_secret = (省略)
  config.access_token = (省略)
  config.access_token_secret = (省略)
end

client.search("from:tkss_lab #はてなブログ", lang: "ja").take(1).each do |tweet|
  @tweet_text = tweet.full_text.gsub(/ツナワタリマイライフ/,'')
  @tweet_time = tweet.created_at
end
#86400sec = 1day
if Time.now - @tweet_time < 86400
  client.update("#{@tweet_text}")
else
  client.update("今日はブログの更新がないみたいだよ!")
end

twitterのアクセストークン、コンシューマーキーの取得方法は省略しますが、単に検索して1件取得したものの本文と投稿日時をインスタンス変数に格納。

日時が現在時刻から考えて1日以内であれば投稿、1日以上であれば更新がないと判断して「更新ないよ!」とツイートします。

流れは

  • 10時or12時に自動投稿する
  • 12時10分頃にこのscriptをcronで実行する

ただ最初全然ツイートされなくて。いろいろ試したら文字数が問題っぽいのでブログタイトルをgsubで置換して削りました。文字列を削るdeleteを使うと、なぜかタイトルの1文字目が削られるという怪奇現象に陥ったのでgsubで。

ということで、2アカウント目へのシェアも自動化できました。

/etc/crontab

10 12 * * * take /bin/bash -lc 'ruby /home/take/script/post_hatena.rb >>/tmp/exec.log 2>>/tmp/exec_error.log'

これめちゃくちゃハマりました。。。

rbenvの実行環境読み込んでくれなくて、bash -lcを使って渡してあげることで解決。

あとについてるのはデバッグのための標準出力と標準エラー出力をファイルに出しました。cronのログ見てもコマンドそのものがうまくいったかは分からないので。。。

参考: cronでrbenvのrubyを使う3つの方法 - sonots:blog

まとめ

で、ここまでやって何なんですが、どうもはてなブログapiを公開していることがわかりました。

はてなブログAtomPub - Hatena Developer Center

今後は

  • 投稿するカテゴリによってアカウントを使い分ける
  • 予約投稿しているエントリーの予告ツイートをする(1/30はこの記事、1/31はこの記事、のような)

1つめは既に投稿している記事に対してgetしてカテゴリを持ってくればいけそうです。 ただアカウントを分けるのはaccess_tokenを使い分ければいけるかな?

2つめは下書きの投稿日を取得できるかがキーです。下書きエントリー一覧取得はあるようなので出来そうですね。 ただ140字に収めるところが難しい。。。機械的に要約できないもんな。

次回ははてなブログAPIを触ってみます。