はじめに
はてなブログは予約投稿と同時にシェアもできる。ただしアカウントは1つしか紐付けられないので、2つ目のアカウントでのシェアは手動でコピペである。エンジニアなのでちゃんと自動化しましょうということで今回の記事です。
実現方法
大げさですが。。。(笑)
- はてなブログで予約投稿と同時にシェア
→アカウント1でシェアされる - その数分後にアカウント2で「from:アカウント1 #はてなブログ」で検索する
→最新のシェアツイートを取得する - 同じ内容をアカウント2でツイートする
2の検索と3の投稿をrubyのtwitter-gemで書いて、それを1日1回vpsからcronで実行します。
twitter-gemに関してはこの記事を参照してください。
さくら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字に収めるところが難しい。。。機械的に要約できないもんな。