-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathyudomi.php
302 lines (252 loc) · 9.01 KB
/
yudomi.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
<?php
require_once("config/config.php");
require_once("lib/vendor/twitteroauth/twitteroauth.php");
require_once("lib/vendor/spyc/spyc.php");
/**
* ゆどみBot
*
* 定期的にゆどうふに話しかけるだけの簡単なお仕事をします(※愛をこめて)
*
* @author yuchimiri
* @version 1.0
*/
class Yudomi {
/**
* home_timeline取得URL
*/
const HOME_TIMELINE_URL = "http://twitter.com/statuses/home_timeline.xml";
/**
* user_timeline取得URL
*/
const USER_TIMELINE_URL = "http://twitter.com/statuses/user_timeline.xml";
/**
* ユーザ情報取得URL
*/
const USER_SHOW_URL = "http://twitter.com/users/show.xml";
/**
* POST用URL
*/
const STATUS_UPDATE_URL = "https://twitter.com/statuses/update.xml";
/**
* 発言リストが書かれたファイル
*/
const MESSAGES_FILENAME = "./data/messages.yml";
/**
* タイムラインの取得を開始するIDを記録したファイル
*/
const SINCE_ID_FILENAME = "./tmp/since_id";
/**
* タイムラインを取得する最大数
*/
const TIMELINE_COUNT = 30;
/**
* OAuthオブジェクト
*
* @var TwitterOAuth
*/
public $toa;
/**
* ゆどみのプロフィール
*
* @var array
*/
public $yudomi;
/**
* 発言リスト
*
* @var array
*/
public $messages = array();
/**
* 現在時刻(時分)
*
* @var string
*/
public $time = "";
/**
* 一回replyした人のアカウントを残しておく用
*
* @var array
*/
public $uniq_id = array();
/**
* コンストラクタ
*/
public function __construct() {
// 認証に必要なKEYが設定されているか確認
if (CONSUMER_KEY == "" || CONSUMER_SECRET == "" || ACCESS_TOKEN == "" || ACCESS_TOKEN_SECRET == "") {
echo "Please set CONSUMER and ACCESS keys.";
exit;
}
// OAuthオブジェクト作成
$this->toa = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
// 自分のプロフィール取得
$user = $this->toa->oAuthRequest(self::USER_SHOW_URL, "GET", array("screen_name"=>KANOJO));
$xml = simplexml_load_string($user);
$this->yudomi = $this->getProfile($xml);
// 発言リストを配列で取得
$this->messages = Spyc::YAMLLoad(self::MESSAGES_FILENAME);
// 現在時刻(時分)取得
$this->time = date("Hi");
}
/**
* 時間ごとのつぶやき
*
* 発言リストに定義された時刻とテキストをもとに発言する
*/
public function lovecall() {
// 発言リストを取得
$messages = $this->getMessages("lovecall");
// 現在時刻(時分)と発言リストのキーが一致した場合
if (array_key_exists($this->time, $messages)) {
$rand_key = array_rand($messages[$this->time], 1);
$message = "@".KARESHI." ".$messages[$this->time][$rand_key];
$this->tweet($message);
$this->uniq_id[] = KARESHI;
}
return;
}
/**
* 反応するだけ
*
* タイムラインに自分の名前を見つけたら返事をする
*/
public function response() {
$tweets = array();
// home_timelineを取得
$since_id = $this->getSinceid();
$timeline = $this->getHomeTimeline($since_id, TIMELINE_COUNT);
foreach($timeline as $status){
// 自分の名前が入っている発言があれば反応する。今回既にリプライしたユーザにはしない。
if ($status["screen_name"] != $this->yudomi["screen_name"] && preg_match("/".$this->yudomi["name"]."/", $status["text"]) && !in_array($status["screen_name"], $this->uniq_id)) {
$messages = $this->getMessages("reply");
$rand_key = array_rand($messages, 1);
$message = "@".$status["screen_name"]." ".$messages[$rand_key];
$this->tweet($message, (string)$status["status_id"]);
$this->uniq_id[] = $status["screen_name"];
}
$this->saveSinceid($status["status_id"]);
}
return;
}
/**
* @自分の発言があったときのリプライ
*
* @todo 実装
*/
public function reply() {}
/**
* つぶやく
*
* @param string $message つぶやき
* @param int $in_reply_to_status_id 返信元のstatus_id
*/
public function tweet($message, $in_reply_to_status_id = null) {
if (is_null($in_reply_to_status_id)) {
$this->toa->oAuthRequest(self::STATUS_UPDATE_URL, "POST", array("status"=>$message));
} else {
$this->toa->oAuthRequest(self::STATUS_UPDATE_URL, "POST", array("status"=>$message, "in_reply_to_status_id"=>$in_reply_to_status_id));
}
}
/**
* ホームタイムラインの取得
*
* @param int $since_id タイムラインの取得を開始するID
* @param int $count タイムラインの取得数
*/
public function getHomeTimeline($since_id = 1, $count = 10) {
$result = array();
$timeline = $this->toa->oAuthRequest(self::HOME_TIMELINE_URL, "GET", array("since_id"=>$since_id, "count"=>$count));
$xml = simplexml_load_string($timeline);
// 古いtweetが前にくるように入れ替えつつ、statusだけを取得
foreach ($xml->status as $item) {
// xmlデータは扱いやすいように配列にする
$status = $this->getStatus($item);
array_unshift($result, $status);
}
return $result;
}
/**
* ユーザタイムラインの取得
*
* @param string $screen_name ユーザアカウント
* @param int $since_id タイムラインの取得を開始するID
* @param int $count タイムラインの取得数
*
*/
public function getUserTimeline($screen_name, $since_id = 1, $count = 10) {
$result = array();
$timeline = $this->toa->oAuthRequest(self::USER_TIMELINE_URL, "GET", array("screen_name"=>$screen_name, "since_id"=>$since_id, "count"=>$count));
$xml = simplexml_load_string($timeline);
// 古いtweetが前にくるように入れ替えつつ、statusだけを取得
foreach ($xml->status as $item) {
// xmlデータは扱いやすいように配列にする
$status = $this->getStatus($item);
array_unshift($result, $status);
}
return $result;
}
/**
* 発言リストから指定されたキーの下にあるものを返す
*
* @param string key リストのキー名
*/
public function getMessages($name) {
$result = array();
if (array_key_exists($name, $this->messages)) {
$result = $this->messages[$name];
}
return $result;
}
/**
* 取得開始IDを取得する
*
* @return int 取得開始ID
*/
private function getSinceid() {
$since_id = trim(file_get_contents(self::SINCE_ID_FILENAME));
$result = (is_numeric($since_id))?$since_id:1;
return $result;
}
/**
* 開始IDを保存する
*
* @param int $since_id
*/
private function saveSinceid($since_id) {
file_put_contents(self::SINCE_ID_FILENAME, $since_id);
}
/**
* status情報を配列に入れて返します
*
* @param xmlObject $data status情報
* @return array 配列に入ったstatus情報
*/
private function getStatus($data) {
// 空のstatus情報を生成
$status = array();
$status["created_at"] = $data->created_at; // つぶやいた日時
$status["status_id"] = $data->id; // つぶやきのID
$status["text"] = $data->text; // つぶやき
$status["user_id"] = $data->user->id; // ユーザID
$status["screen_name"] = $data->user->screen_name; // HN
$status["name"] = $data->user->name; // name
return $status;
}
/**
* ユーザ情報を配列に入れて返します
*
* @param xmlObject $data ユーザ情報
* @return array 配列に入ったユーザ情報
*/
private function getProfile($data) {
// 空のユーザ情報を生成
$profile = array();
$profile["id"] = $data->id; // つぶやいた日時
$profile["name"] = $data->name; // つぶやきのID
$profile["screen_name"] = $data->screen_name; // つぶやきのID
$profile["location"] = $data->location; // つぶやき
$profile["description"] = $data->description; // ユーザID
return $profile;
}
}