node.jsを使ってTwitterで特定のユーザがつぶやいた際にメールでお知らせしてみた

More than 3 years have passed since last update.

みなさんこんにちは( ˘ω˘)

クリスマスイブまであと2日☆彡いかがお過ごしでしょうか( ˘ω˘)

僕はバイトです(◞‸◟)

そんな寂しいクリスマスイブにせめて気になるあの子が何をしているか知りたい!!

そんな気持ちを込めてこのプログラムを書きました( ˘ω˘)

Twitter公式に特定ユーザを設定するとプッシュ通知が来る機能があったことを最近友人に知らされ泣きそうになりました


機能概要

Twitterで特定のユーザがつぶやいたらあらかじめ登録したGmailにユーザID, 内容, 投稿日時, 位置情報を含んだメールが届く


使うもの


  • node.js v0.11.11

  • npm 1.3.25

  • Twitter 1.2.5

  • nodemailer 0.7.1

npmやnode, 各ライブラリの導入については割愛させていただきます( ˘ω˘)

nodemailerはv0.7より上のバージョンだと動かない恐れがあるので、バージョン指定してインストールしましょう┏( .-. ┏ ) ┓


実装方式

node.jsのTwitterライブラリに含まれるStreaming APIにより標準入力で指定したユーザのタイムラインを監視し、そのユーザがつぶやいたらnodemailerで送信という流れになります( ˘ω˘)☝

以下実際のコードになります。


server.js


// ライブラリ読み込み
var twitter = require('twitter');
var nodemailer = require('nodemailer');

// 各種Twitter APIを使用するための情報を設定
var client = new twitter({
consumer_key: 'hogehoge',
consumer_secret: 'hogehoge',
access_token_key: 'hogehoge',
access_token_secret: 'hogehoge'
});

// メーラーの設定
var smtpTransport = nodemailer.createTransport("SMTP", {
service: 'Gmail',
auth: {
// 使用するGmailアカウントを登録
user: "hogehoge",
pass: "hogehoge"
}
});

function sendMail(tweet_data){
// メール本文
var sentence = "ユーザID:<b>" + tweet_data["screen_name"] + "</b><br />" +
"内容:<b>" + tweet_data["text"] + "</b><br />" +
"投稿日時:<b>" + tweet_data["created_at"] + "</b><br />" +
"現在地:<b>" + tweet_data["geo"] + "</b>";
// 送信されるメールの内容の設定
var mailOptions = {
from: "Net Stoking",
to: "hogehoge",
subject: "Get information of target",
text: sentence,
html: sentence
}
// 送信処理
smtpTransport.sendMail(mailOptions, function(error, response){
if(error){
console.log(error);
}else{
console.log("Message sent:" + response.message);
}
});
}

// 監視するユーザのIDを標準入力から取得
var target = process.argv[2];
var params = {screen_name: target};

// 監視するユーザのツイートを取得
client.get('statuses/user_timeline', params, function(error, tweets, response){
if (!error) {
// 取得したtweet情報よりユーザ固有IDを文字列形式で取得
var user_id = tweets[0].user.id_str;
// 取得したユーザIDよりストリーミングで使用するオプションを定義
var option = {follow: user_id};
console.log(target + 'のツイートを取得します。');
// ストリーミングでユーザのタイムラインを監視
client.stream('statuses/filter', option, function(stream) {
stream.on('data', function (data) {
console.log(data.text);
// 送信する情報を定義
var tweet_data = {
screen_name: data.user.screen_name,
created_at: data.created_at,
text: data.text,
geo: data.geo,
};
// メールの送信
sendMail(tweet_data);
});
});
}
});


Twitter APIを使用するにはまずTwitter Developersに登録し、consumer_key, consumer_secret,access_token_key ,access_token_secretを取得しましょう。

今回の実装ではユーザID, 投稿内容, 投稿日時, 現在地を取得し送信していますが実際のデータは以下のようにたくさんの情報を含んでいるので使いようによって色々なことができるのではないかと思います((((´ʘ‿ʘ`))))

※ 以下のツイートデータは僕のものです

{ created_at: 'Mon Dec 21 05:53:28 +0000 2015',

id: 678815530103390200,
id_str: '678815530103390208',
text: 'test3',
source: '<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>',
truncated: false,
in_reply_to_status_id: null,
in_reply_to_status_id_str: null,
in_reply_to_user_id: null,
in_reply_to_user_id_str: null,
in_reply_to_screen_name: null,
user:
{ id: 1909478569,
id_str: '1909478569',
name: 'おがワ',
screen_name: 'yukisaibai_',
location: null,
url: 'http://yukisaibai.com/',
description: '低身長男子に光を',
protected: false,
verified: false,
followers_count: 148,
friends_count: 151,
listed_count: 3,
favourites_count: 1381,
statuses_count: 11875,
created_at: 'Thu Sep 26 22:57:57 +0000 2013',
utc_offset: 28800,
time_zone: 'Irkutsk',
geo_enabled: false,
lang: 'ja',
contributors_enabled: false,
is_translator: false,
profile_background_color: '000000',
profile_background_image_url: 'http://pbs.twimg.com/profile_background_images/627672087600062465/A_KbGFs0.png',
profile_background_image_url_https: 'https://pbs.twimg.com/profile_background_images/627672087600062465/A_KbGFs0.png',
profile_background_tile: true,
profile_link_color: '009999',
profile_sidebar_border_color: '000000',
profile_sidebar_fill_color: '000000',
profile_text_color: '000000',
profile_use_background_image: false,
profile_image_url: 'http://pbs.twimg.com/profile_images/677400251175596032/dwleAVjN_normal.jpg',
profile_image_url_https: 'https://pbs.twimg.com/profile_images/677400251175596032/dwleAVjN_normal.jpg',
profile_banner_url: 'https://pbs.twimg.com/profile_banners/1909478569/1445489090',
default_profile: false,
default_profile_image: false,
following: null,
follow_request_sent: null,
notifications: null },
geo: null,
coordinates: null,
place: null,
contributors: null,
is_quote_status: false,
retweet_count: 0,
favorite_count: 0,
entities: { hashtags: [], urls: [], user_mentions: [], symbols: [] },
favorited: false,
retweeted: false,
filter_level: 'low',
lang: 'en',
timestamp_ms: '1450677208816' }

それではみなさん良いクリスマスを( ☞三☞ ˘ω˘)☞三☞









https://gyazo.com/858eb96a9f750e1f98f49bf12bb48162

(๑´ڡ`๑)