Azureaと云う、JScriptで拡張を書けるtwitter clientをずっと使っています。久方ぶりにAzureaScriptを書きました。
半手動の定期ポストです。OPTION
を弄ってください。
twitterbot.netに頼らなくて済みますし、自分がtime lineにいない時に定期postされたりしません。古い情報を延々とpostし続ける間抜けなことも減ると思います。
追記: 2012-08-17
最新版は、Azurea Wikiにて管理します。
[Scripts/regularPost.js - Azurea Wiki http://azurea.info/ja/wiki/index.php?Scripts%2FregularPost.js ]
/** * @fileOverview Regular post AzureaScript. * @author ne_Sachirou * @version 20120817 * @license Public Domain */ OPTION = { /** @type boolean */ isEnabled: true, /** @type boolean */ isFooter: false, /** @type number */ duration: 1000 * 60 * 60, /** @type Array.<string> */ texts: [] }; OPTION.texts = OPTION.texts.concat(constractTweet( 'SpinorNetwork 16曲無料公開中。58曲を千円で販売中', [ 'ヾ(〃l _ l)ノ゙「ホットミルク、ミルク無しで。」本当に解けるのか?', '(〃l _ l)b☆我々は失敗を悟った。出来上がったcpVineは、スピノール振動として最早ネットワークを成さなかったのだ。', 'トテチタ(((〃l _ l)KrmAkxlI2はわたしたちがSpinorNetworkへ放った音響楽譜が反射して集まり、像を成したものである。', 'ヾ(〃l _ l)ノ゙あなたにも作れる音楽♪', 'カスヾ(〃l _ l)ノ゙! やった!カス!' ], ' j.mp/OwoOIa #Crainの所業')); OPTION.texts = OPTION.texts.concat(constractTweet( '新曲:', [ 'いっしょに作るヾ(〃l _ l)ノ゙♪お天気雨とおもちゃのパレード/He-puni Perty/選択花を替える園', '選択花を替える園では、赤い花と青い花が咲きます。それぞれの花は、日毎に色を変えます。ランダムではありません。', '選択花を替える園でないている蝉は、選択花の色を目から、音へ変えています。ド・モルガン蝉、と呼んでください。' ], ' j.mp/NohgvG #c4se')); /** * Helper for set `OPTION.texts`. * @param {string} header * @param {Array.<string>} middles * @param {string} footer * @return {Array.<string>} */ function constractTweet (header, middles, footer) { var i = iz = 0, texts = []; for (i = 0, iz = middles.length; i < iz; ++i) { texts[i] = header + middles[i] + footer; } return texts; } (function () { /** @const */ var FOOTER_SECTION = 'Misc', FOOTER_KEY = 'FooterText'; var Footer, lastTimeToPost = 0; /** * @param {string} text * @return {Object} */ function _log (text) { text = text.toString(); return System.showMessage(text, text.slice(0, 10), 0); } /** * @param {Array.<Object>} arr * @return {Object} */ function Array_random (arr) { return arr[Math.floor(Math.random() * arr.length)]; } /** * @return {boolean} */ function isTimeToPost () { if (!OPTION.isEnabled) { return false; } if (lastTimeToPost + OPTION.duration < new Date().getTime()) { return true; } return false; } Footer = { isRestored: true, isDesabled: true, backup: '', /** * @return {string} */ get: function () { return System.settings.getValue(FOOTER_SECTION, FOOTER_KEY); }, /** * @param {string} footerText */ set: function (footerText) { System.settings.setValue(FOOTER_SECTION, FOOTER_KEY, footerText); }, /** * @param {string} status_text * @return {string} */ remove: function (status_text) { return status_text.replace(new RegExp(Footer.get() + '$'), ''); }, /** * @param {string} footerText */ cover: function (footerText) { if (Footer.isRestored) { Footer.isDesabled = TextArea.disableFooterText; Footer.backup = Footer.get(); } Footer.set(footerText); TextArea.disableFooterText = false; Footer.isRestored = false; }, /** */ restore: function () { Footer.set(Footer.backup); TextArea.disableFooterText = Footer.isDesabled; Footer.isRestored = true; } }; TwitterService.addEventListener('preSendUpdateStatus', function (status) { var text = Array_random(OPTION.texts); if (!isTimeToPost()) { return false; } if (OPTION.isFooter) { if (status.in_reply_to_status_id !== '0') { return false; } status.text = Footer.remove(status.text); Footer.cover(text); System.setTimeout(function () { lastTimeToPost = new Date().getTime(); TwitterService.status.update(status.text + Footer.get(), 0); Footer.restore(); }, 100); return true; } else { System.setTimeout(function () { lastTimeToPost = new Date().getTime(); TwitterService.status.update(text, 0); }, 1000); } }); }());