ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/facebook/trunk/facebookapi_php5_restlib.php
Revision: 952
Committed: 2007-10-10T17:24:17-07:00 (17 years, 8 months ago) by douglas
File size: 25273 byte(s)
Log Message:
Oops!

File Contents

# Content
1 <?php
2 # vim: expandtab shiftwidth=2 tabstop=2
3 #
4 # Modified to use JSON when $json is set to true.
5 #
6 # Douglas Thrift
7 #
8 # $Id$
9 //
10 // +---------------------------------------------------------------------------+
11 // | Facebook Platform PHP5 client |
12 // +---------------------------------------------------------------------------+
13 // | Copyright (c) 2007 Facebook, Inc. |
14 // | All rights reserved. |
15 // | |
16 // | Redistribution and use in source and binary forms, with or without |
17 // | modification, are permitted provided that the following conditions |
18 // | are met: |
19 // | |
20 // | 1. Redistributions of source code must retain the above copyright |
21 // | notice, this list of conditions and the following disclaimer. |
22 // | 2. Redistributions in binary form must reproduce the above copyright |
23 // | notice, this list of conditions and the following disclaimer in the |
24 // | documentation and/or other materials provided with the distribution. |
25 // | |
26 // | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
27 // | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
28 // | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
29 // | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
30 // | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
31 // | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
32 // | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
33 // | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
34 // | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
35 // | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
36 // +---------------------------------------------------------------------------+
37 // | For help with this library, contact developers-help@facebook.com |
38 // +---------------------------------------------------------------------------+
39 //
40
41 class FacebookRestClient {
42 public $secret;
43 public $session_key;
44 public $api_key;
45 public $friends_list; // to save making the friends.get api call, this will get prepopulated on canvas pages
46 public $added; // to save making the users.isAppAdded api call, this will get prepopulated on canvas pages
47 public $json;
48
49 /**
50 * Create the client.
51 * @param string $session_key if you haven't gotten a session key yet, leave
52 * this as null and then set it later by just
53 * directly accessing the $session_key member
54 * variable.
55 */
56 public function __construct($api_key, $secret, $session_key=null) {
57 $this->secret = $secret;
58 $this->session_key = $session_key;
59 $this->api_key = $api_key;
60 $this->last_call_id = 0;
61 $this->server_addr = Facebook::get_facebook_url('api') . '/restserver.php';
62 if ($GLOBALS['facebook_config']['debug']) {
63 $this->cur_id = 0;
64 ?>
65 <script type="text/javascript">
66 var types = ['params', 'xml', 'php', 'sxml'];
67 function toggleDisplay(id, type) {
68 for each (var t in types) {
69 if (t != type || document.getElementById(t + id).style.display == 'block') {
70 document.getElementById(t + id).style.display = 'none';
71 } else {
72 document.getElementById(t + id).style.display = 'block';
73 }
74 }
75 return false;
76 }
77 </script>
78 <?php
79 }
80 }
81
82 /**
83 * Returns the session information available after current user logs in.
84 * @param string $auth_token the token returned by auth_createToken or
85 * passed back to your callback_url.
86 * @return assoc array containing session_key, uid
87 */
88 public function auth_getSession($auth_token) {
89 $result = $this->call_method('facebook.auth.getSession', array('auth_token'=>$auth_token));
90 $this->session_key = $result['session_key'];
91 if (isset($result['secret']) && $result['secret']) {
92 // desktop apps have a special secret
93 $this->secret = $result['secret'];
94 }
95 return $result;
96 }
97
98 /**
99 * Returns events according to the filters specified.
100 * @param int $uid Optional: User associated with events.
101 * A null parameter will default to the session user.
102 * @param array $eids Optional: Filter by these event ids.
103 * A null parameter will get all events for the user.
104 * @param int $start_time Optional: Filter with this UTC as lower bound.
105 * A null or zero parameter indicates no lower bound.
106 * @param int $end_time Optional: Filter with this UTC as upper bound.
107 * A null or zero parameter indicates no upper bound.
108 * @param string $rsvp_status Optional: Only show events where the given uid
109 * has this rsvp status. This only works if you have specified a value for
110 * $uid. Values are as in events.getMembers. Null indicates to ignore
111 * rsvp status when filtering.
112 * @return array of events
113 */
114 public function events_get($uid, $eids, $start_time, $end_time, $rsvp_status) {
115 return $this->call_method('facebook.events.get',
116 array(
117 'uid' => $uid,
118 'eids' => $eids,
119 'start_time' => $start_time,
120 'end_time' => $end_time,
121 'rsvp_status' => $rsvp_status));
122 }
123
124 /**
125 * Returns membership list data associated with an event
126 * @param int $eid : event id
127 * @return assoc array of four membership lists, with keys 'attending',
128 * 'unsure', 'declined', and 'not_replied'
129 */
130 public function events_getMembers($eid) {
131 return $this->call_method('facebook.events.getMembers',
132 array('eid' => $eid));
133 }
134
135 /**
136 * Makes an FQL query. This is a generalized way of accessing all the data
137 * in the API, as an alternative to most of the other method calls. More
138 * info at http://developers.facebook.com/documentation.php?v=1.0&doc=fql
139 * @param string $query the query to evaluate
140 * @return generalized array representing the results
141 */
142 public function fql_query($query) {
143 return $this->call_method('facebook.fql.query',
144 array('query' => $query));
145 }
146
147 public function feed_publishStoryToUser($title, $body,
148 $image_1=null, $image_1_link=null,
149 $image_2=null, $image_2_link=null,
150 $image_3=null, $image_3_link=null,
151 $image_4=null, $image_4_link=null) {
152 return $this->call_method('facebook.feed.publishStoryToUser',
153 array('title' => $title,
154 'body' => $body,
155 'image_1' => $image_1,
156 'image_1_link' => $image_1_link,
157 'image_2' => $image_2,
158 'image_2_link' => $image_2_link,
159 'image_3' => $image_3,
160 'image_3_link' => $image_3_link,
161 'image_4' => $image_4,
162 'image_4_link' => $image_4_link));
163 }
164
165 public function feed_publishActionOfUser($title, $body,
166 $image_1=null, $image_1_link=null,
167 $image_2=null, $image_2_link=null,
168 $image_3=null, $image_3_link=null,
169 $image_4=null, $image_4_link=null) {
170 return $this->call_method('facebook.feed.publishActionOfUser',
171 array('title' => $title,
172 'body' => $body,
173 'image_1' => $image_1,
174 'image_1_link' => $image_1_link,
175 'image_2' => $image_2,
176 'image_2_link' => $image_2_link,
177 'image_3' => $image_3,
178 'image_3_link' => $image_3_link,
179 'image_4' => $image_4,
180 'image_4_link' => $image_4_link));
181 }
182
183 public function feed_publishTemplatizedAction($actor_id, $title_template, $title_data,
184 $body_template, $body_data, $body_general,
185 $image_1=null, $image_1_link=null,
186 $image_2=null, $image_2_link=null,
187 $image_3=null, $image_3_link=null,
188 $image_4=null, $image_4_link=null,
189 $target_ids=null) {
190 return $this->call_method('facebook.feed.publishTemplatizedAction',
191 array('actor_id' => $actor_id,
192 'title_template' => $title_template,
193 'title_data' => $title_data,
194 'body_template' => $body_template,
195 'body_data' => $body_data,
196 'body_general' => $body_general,
197 'image_1' => $image_1,
198 'image_1_link' => $image_1_link,
199 'image_2' => $image_2,
200 'image_2_link' => $image_2_link,
201 'image_3' => $image_3,
202 'image_3_link' => $image_3_link,
203 'image_4' => $image_4,
204 'image_4_link' => $image_4_link,
205 'target_ids' => $target_ids));
206 }
207
208 /**
209 * Returns whether or not pairs of users are friends.
210 * Note that the Facebook friend relationship is symmetric.
211 * @param array $uids1: array of ids (id_1, id_2,...) of some length X
212 * @param array $uids2: array of ids (id_A, id_B,...) of SAME length X
213 * @return array of uid pairs with bool, true if pair are friends, e.g.
214 * array( 0 => array('uid1' => id_1, 'uid2' => id_A, 'are_friends' => 1),
215 * 1 => array('uid1' => id_2, 'uid2' => id_B, 'are_friends' => 0)
216 * ...)
217 */
218 public function friends_areFriends($uids1, $uids2) {
219 return $this->call_method('facebook.friends.areFriends',
220 array('uids1'=>$uids1, 'uids2'=>$uids2));
221 }
222
223 /**
224 * Returns the friends of the current session user.
225 * @return array of friends
226 */
227 public function friends_get() {
228 if (isset($this->friends_list)) {
229 return $this->friends_list;
230 }
231 return $this->call_method('facebook.friends.get', array());
232 }
233
234 /**
235 * Returns the friends of the session user, who are also users
236 * of the calling application.
237 * @return array of friends
238 */
239 public function friends_getAppUsers() {
240 return $this->call_method('facebook.friends.getAppUsers', array());
241 }
242
243 /**
244 * Returns groups according to the filters specified.
245 * @param int $uid Optional: User associated with groups.
246 * A null parameter will default to the session user.
247 * @param array $gids Optional: group ids to query.
248 * A null parameter will get all groups for the user.
249 * @return array of groups
250 */
251 public function groups_get($uid, $gids) {
252 return $this->call_method('facebook.groups.get',
253 array(
254 'uid' => $uid,
255 'gids' => $gids));
256 }
257
258 /**
259 * Returns the membership list of a group
260 * @param int $gid : Group id
261 * @return assoc array of four membership lists, with keys
262 * 'members', 'admins', 'officers', and 'not_replied'
263 */
264 public function groups_getMembers($gid) {
265 return $this->call_method('facebook.groups.getMembers',
266 array('gid' => $gid));
267 }
268
269 /**
270 * Returns the outstanding notifications for the session user.
271 * @return assoc array of
272 * notification count objects for 'messages', 'pokes' and 'shares',
273 * a uid list of 'friend_requests', a gid list of 'group_invites',
274 * and an eid list of 'event_invites'
275 */
276 public function notifications_get() {
277 return $this->call_method('facebook.notifications.get', array());
278 }
279
280 /**
281 * Sends an email notification to the specified user.
282 * @return string url which you should send the logged in user to to finalize the message.
283 */
284 public function notifications_send($to_ids, $notification, $email='') {
285 return $this->call_method('facebook.notifications.send',
286 array('to_ids' => $to_ids, 'notification' => $notification, 'email' => $email));
287 }
288
289 /**
290 * Sends a request to the specified user (e.g. "you have 1 event invitation")
291 * @param array $to_ids user ids to receive the request (must be friends with sender, capped at 10)
292 * @param string $type type of request, e.g. "event" (as in "You have an event invitation.")
293 * @param string $content fbml content of the request. really stripped down fbml - just
294 * text/names/links. also, use the special tag <fb:req-choice url="" label="" />
295 * to specify the buttons to be included.
296 * @param string $image url of an image to show beside the request
297 * @param bool $invite whether to call it an "invitation" or a "request"
298 * @return string url which you should send the logged in user to to finalize the message.
299 */
300 public function notifications_sendRequest($to_ids, $type, $content, $image, $invite) {
301 return $this->call_method('facebook.notifications.sendRequest',
302 array('to_ids' => $to_ids, 'type' => $type, 'content' => $content,
303 'image' => $image, 'invite' => $invite));
304 }
305
306 /**
307 * Returns photos according to the filters specified.
308 * @param int $subj_id Optional: Filter by uid of user tagged in the photos.
309 * @param int $aid Optional: Filter by an album, as returned by
310 * photos_getAlbums.
311 * @param array $pids Optional: Restrict to a list of pids
312 * Note that at least one of these parameters needs to be specified, or an
313 * error is returned.
314 * @return array of photo objects.
315 */
316 public function photos_get($subj_id, $aid, $pids) {
317 return $this->call_method('facebook.photos.get',
318 array('subj_id' => $subj_id, 'aid' => $aid, 'pids' => $pids));
319 }
320
321 /**
322 * Returns the albums created by the given user.
323 * @param int $uid Optional: the uid of the user whose albums you want.
324 * A null value will return the albums of the session user.
325 * @param array $aids Optional: a list of aids to restrict the query.
326 * Note that at least one of the (uid, aids) parameters must be specified.
327 * @returns an array of album objects.
328 */
329 public function photos_getAlbums($uid, $aids) {
330 return $this->call_method('facebook.photos.getAlbums',
331 array('uid' => $uid,
332 'aids' => $aids));
333 }
334
335 /**
336 * Returns the tags on all photos specified.
337 * @param string $pids : a list of pids to query
338 * @return array of photo tag objects, with include pid, subject uid,
339 * and two floating-point numbers (xcoord, ycoord) for tag pixel location
340 */
341 public function photos_getTags($pids) {
342 return $this->call_method('facebook.photos.getTags',
343 array('pids' => $pids));
344 }
345
346 /**
347 * Returns the requested info fields for the requested set of users
348 * @param array $uids an array of user ids
349 * @param array $fields an array of strings describing the info fields desired
350 * @return array of users
351 */
352 public function users_getInfo($uids, $fields) {
353 return $this->call_method('facebook.users.getInfo', array('uids' => $uids, 'fields' => $fields));
354 }
355
356 /**
357 * Returns the user corresponding to the current session object.
358 * @return integer uid
359 */
360 public function users_getLoggedInUser(){
361 return $this->call_method('facebook.users.getLoggedInUser', array());
362 }
363
364
365 /**
366 * Returns whether or not the user corresponding to the current session object has the app installed
367 * @return boolean
368 */
369 public function users_isAppAdded() {
370 if (isset($this->added)) {
371 return $this->added;
372 }
373 return $this->call_method('facebook.users.isAppAdded', array());
374 }
375
376 /**
377 * Sets the FBML for the profile of the user attached to this session
378 * @param string $markup The FBML that describes the profile presence of this app for the user
379 * @return array A list of strings describing any compile errors for the submitted FBML
380 */
381 public function profile_setFBML($markup, $uid = null) {
382 return $this->call_method('facebook.profile.setFBML', array('markup' => $markup, 'uid' => $uid));
383 }
384
385 public function profile_getFBML($uid) {
386 return $this->call_method('facebook.profile.getFBML', array('uid' => $uid));
387 }
388
389 public function fbml_refreshImgSrc($url) {
390 return $this->call_method('facebook.fbml.refreshImgSrc', array('url' => $url));
391 }
392
393 public function fbml_refreshRefUrl($url) {
394 return $this->call_method('facebook.fbml.refreshRefUrl', array('url' => $url));
395 }
396
397 public function fbml_setRefHandle($handle, $fbml) {
398 return $this->call_method('facebook.fbml.setRefHandle', array('handle' => $handle, 'fbml' => $fbml));
399 }
400
401 /* UTILITY FUNCTIONS */
402
403 public function call_method($method, $params) {
404 if ($this->json) {
405 $json = $this->post_request($method, $params);
406 # XXX: silly facebook with its invalid JSON
407 $valid = preg_match('/^[\[{].*[\]}]$/', $json);
408 $array = json_decode($valid ? $json : "[$json]", true);
409 $result = $valid ? $array : $array[0];
410 } else {
411 $xml = $this->post_request($method, $params);
412 $sxml = simplexml_load_string($xml);
413 $result = self::convert_simplexml_to_array($sxml);
414 if ($GLOBALS['facebook_config']['debug']) {
415 // output the raw xml and its corresponding php object, for debugging:
416 print '<div style="margin: 10px 30px; padding: 5px; border: 2px solid black; background: gray; color: white; font-size: 12px; font-weight: bold;">';
417 $this->cur_id++;
418 print $this->cur_id . ': Called ' . $method . ', show ' .
419 '<a href=# onclick="return toggleDisplay(' . $this->cur_id . ', \'params\');">Params</a> | '.
420 '<a href=# onclick="return toggleDisplay(' . $this->cur_id . ', \'xml\');">XML</a> | '.
421 '<a href=# onclick="return toggleDisplay(' . $this->cur_id . ', \'sxml\');">SXML</a> | '.
422 '<a href=# onclick="return toggleDisplay(' . $this->cur_id . ', \'php\');">PHP</a>';
423 print '<pre id="params'.$this->cur_id.'" style="display: none; overflow: auto;">'.print_r($params, true).'</pre>';
424 print '<pre id="xml'.$this->cur_id.'" style="display: none; overflow: auto;">'.htmlspecialchars($xml).'</pre>';
425 print '<pre id="php'.$this->cur_id.'" style="display: none; overflow: auto;">'.print_r($result, true).'</pre>';
426 print '<pre id="sxml'.$this->cur_id.'" style="display: none; overflow: auto;">'.print_r($sxml, true).'</pre>';
427 print '</div>';
428 }
429 }
430 if (is_array($result) && isset($result['error_code'])) {
431 throw new FacebookRestClientException($result['error_msg'], $result['error_code']);
432 }
433 return $result;
434 }
435
436 public function post_request($method, $params) {
437 $params['method'] = $method;
438 $params['session_key'] = $this->session_key;
439 $params['api_key'] = $this->api_key;
440 $params['call_id'] = microtime(true);
441 if ($params['call_id'] <= $this->last_call_id) {
442 $params['call_id'] = $this->last_call_id + 0.001;
443 }
444 $this->last_call_id = $params['call_id'];
445 if (!isset($params['v'])) {
446 $params['v'] = '1.0';
447 }
448 if ($this->json)
449 $params['format'] = 'JSON';
450 $post_params = array();
451 foreach ($params as $key => &$val) {
452 if (is_array($val)) $val = implode(',', $val);
453 $post_params[] = $key.'='.urlencode($val);
454 }
455 $post_params[] = 'sig='.Facebook::generate_sig($params, $this->secret);
456 $post_string = implode('&', $post_params);
457
458 if ($this->json) {
459 $result = file_get_contents($this->server_addr, false, stream_context_create(
460 array('http' =>
461 array('method' => 'POST',
462 'header' => 'Content-type: application/x-www-form-urlencoded'."\r\n".
463 'User-Agent: Facebook API PHP5 Client 1.1 (non-curl) '.phpversion()."\r\n".
464 'Content-length: ' . strlen($post_string),
465 'content' => $post_string))));
466 } elseif (function_exists('curl_init')) {
467 // Use CURL if installed...
468 $ch = curl_init();
469 curl_setopt($ch, CURLOPT_URL, $this->server_addr);
470 curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
471 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
472 curl_setopt($ch, CURLOPT_USERAGENT, 'Facebook API PHP5 Client 1.1 (curl) ' . phpversion());
473 $result = curl_exec($ch);
474 curl_close($ch);
475 } else {
476 // Non-CURL based version...
477 $context =
478 array('http' =>
479 array('method' => 'POST',
480 'header' => 'Content-type: application/x-www-form-urlencoded'."\r\n".
481 'User-Agent: Facebook API PHP5 Client 1.1 (non-curl) '.phpversion()."\r\n".
482 'Content-length: ' . strlen($post_string),
483 'content' => $post_string));
484 $contextid=stream_context_create($context);
485 $sock=fopen($this->server_addr, 'r', false, $contextid);
486 if ($sock) {
487 $result='';
488 while (!feof($sock))
489 $result.=fgets($sock, 4096);
490
491 fclose($sock);
492 }
493 }
494 return $result;
495 }
496
497 public static function convert_simplexml_to_array($sxml) {
498 $arr = array();
499 if ($sxml) {
500 foreach ($sxml as $k => $v) {
501 if ($sxml['list']) {
502 $arr[] = self::convert_simplexml_to_array($v);
503 } else {
504 $arr[$k] = self::convert_simplexml_to_array($v);
505 }
506 }
507 }
508 if (sizeof($arr) > 0) {
509 return $arr;
510 } else {
511 return (string)$sxml;
512 }
513 }
514 }
515
516 class FacebookRestClientException extends Exception {
517 }
518
519 // Supporting methods and values------
520
521 /**
522 * Error codes and descriptions for the Facebook API.
523 */
524
525 class FacebookAPIErrorCodes {
526
527 const API_EC_SUCCESS = 0;
528
529 /*
530 * GENERAL ERRORS
531 */
532 const API_EC_UNKNOWN = 1;
533 const API_EC_SERVICE = 2;
534 const API_EC_METHOD = 3;
535 const API_EC_TOO_MANY_CALLS = 4;
536 const API_EC_BAD_IP = 5;
537
538 /*
539 * PARAMETER ERRORS
540 */
541 const API_EC_PARAM = 100;
542 const API_EC_PARAM_API_KEY = 101;
543 const API_EC_PARAM_SESSION_KEY = 102;
544 const API_EC_PARAM_CALL_ID = 103;
545 const API_EC_PARAM_SIGNATURE = 104;
546 const API_EC_PARAM_USER_ID = 110;
547 const API_EC_PARAM_USER_FIELD = 111;
548 const API_EC_PARAM_SOCIAL_FIELD = 112;
549 const API_EC_PARAM_ALBUM_ID = 120;
550
551 /*
552 * USER PERMISSIONS ERRORS
553 */
554 const API_EC_PERMISSION = 200;
555 const API_EC_PERMISSION_USER = 210;
556 const API_EC_PERMISSION_ALBUM = 220;
557 const API_EC_PERMISSION_PHOTO = 221;
558
559 const FQL_EC_PARSER = 601;
560 const FQL_EC_UNKNOWN_FIELD = 602;
561 const FQL_EC_UNKNOWN_TABLE = 603;
562 const FQL_EC_NOT_INDEXABLE = 604;
563
564 public static $api_error_descriptions = array(
565 API_EC_SUCCESS => 'Success',
566 API_EC_UNKNOWN => 'An unknown error occurred',
567 API_EC_SERVICE => 'Service temporarily unavailable',
568 API_EC_METHOD => 'Unknown method',
569 API_EC_TOO_MANY_CALLS => 'Application request limit reached',
570 API_EC_BAD_IP => 'Unauthorized source IP address',
571 API_EC_PARAM => 'Invalid parameter',
572 API_EC_PARAM_API_KEY => 'Invalid API key',
573 API_EC_PARAM_SESSION_KEY => 'Session key invalid or no longer valid',
574 API_EC_PARAM_CALL_ID => 'Call_id must be greater than previous',
575 API_EC_PARAM_SIGNATURE => 'Incorrect signature',
576 API_EC_PARAM_USER_ID => 'Invalid user id',
577 API_EC_PARAM_USER_FIELD => 'Invalid user info field',
578 API_EC_PARAM_SOCIAL_FIELD => 'Invalid user field',
579 API_EC_PARAM_ALBUM_ID => 'Invalid album id',
580 API_EC_PERMISSION => 'Permissions error',
581 API_EC_PERMISSION_USER => 'User not visible',
582 API_EC_PERMISSION_ALBUM => 'Album not visible',
583 API_EC_PERMISSION_PHOTO => 'Photo not visible',
584 FQL_EC_PARSER => 'FQL: Parser Error',
585 FQL_EC_UNKNOWN_FIELD => 'FQL: Unknown Field',
586 FQL_EC_UNKNOWN_TABLE => 'FQL: Unknown Table',
587 FQL_EC_NOT_INDEXABLE => 'FQL: Statement not indexable',
588 FQL_EC_UNKNOWN_FUNCTION => 'FQL: Attempted to call unknown function',
589 FQL_EC_INVALID_PARAM => 'FQL: Invalid parameter passed in',
590 );
591 }
592
593 $profile_field_array = array(
594 "about_me",
595 "activities",
596 "affiliations",
597 "birthday",
598 "books",
599 "current_location",
600 "education_history",
601 "first_name",
602 "hometown_location",
603 "hs_info",
604 "interests",
605 "is_app_user",
606 "last_name",
607 "meeting_for",
608 "meeting_sex",
609 "movies",
610 "music",
611 "name",
612 "notes_count",
613 "pic",
614 "pic_big",
615 "pic_small",
616 "political",
617 "profile_update_time",
618 "quotes",
619 "relationship_status",
620 "religion",
621 "sex",
622 "significant_other_id",
623 "status",
624 "timezone",
625 "tv",
626 "wall_count",
627 "work_history");
628 ?>

Properties

Name Value
svn:keywords Id