forked from xiaosier/libweibo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
saetv2.ex.class.php
3295 lines (3029 loc) · 107 KB
/
saetv2.ex.class.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
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?php
/**
* PHP SDK for weibo.com (using OAuth2)
*
* @author Elmer Zhang <freeboy6716@gmail.com>
*/
/**
* @ignore
*/
class OAuthException extends Exception {
// pass
}
/**
* 新浪微博 OAuth 认证类(OAuth2)
*
* 授权机制说明请大家参考微博开放平台文档:{@link http://open.weibo.com/wiki/Oauth2}
*
* @package sae
* @author Elmer Zhang
* @version 1.0
*/
class SaeTOAuthV2 {
/**
* @ignore
*/
public $client_id;
/**
* @ignore
*/
public $client_secret;
/**
* @ignore
*/
public $access_token;
/**
* @ignore
*/
public $refresh_token;
/**
* Contains the last HTTP status code returned.
*
* @ignore
*/
public $http_code;
/**
* Contains the last API call.
*
* @ignore
*/
public $url;
/**
* Set up the API root URL.
*
* @ignore
*/
public $host = "https://api.weibo.com/2/";
/**
* Set timeout default.
*
* @ignore
*/
public $timeout = 30;
/**
* Set connect timeout.
*
* @ignore
*/
public $connecttimeout = 30;
/**
* Verify SSL Cert.
*
* @ignore
*/
public $ssl_verifypeer = FALSE;
/**
* Respons format.
*
* @ignore
*/
public $format = 'json';
/**
* Decode returned json data.
*
* @ignore
*/
public $decode_json = TRUE;
/**
* Contains the last HTTP headers returned.
*
* @ignore
*/
public $http_info;
/**
* Set the useragnet.
*
* @ignore
*/
public $useragent = 'Sae T OAuth2 v0.1';
/**
* print the debug info
*
* @ignore
*/
public $debug = FALSE;
/**
* boundary of multipart
* @ignore
*/
public static $boundary = '';
/**
* Set API URLS
*/
/**
* @ignore
*/
function accessTokenURL() { return 'https://api.weibo.com/oauth2/access_token'; }
/**
* @ignore
*/
function authorizeURL() { return 'https://api.weibo.com/oauth2/authorize'; }
/**
* construct WeiboOAuth object
*/
function __construct($client_id, $client_secret, $access_token = NULL, $refresh_token = NULL) {
$this->client_id = $client_id;
$this->client_secret = $client_secret;
$this->access_token = $access_token;
$this->refresh_token = $refresh_token;
}
/**
* authorize接口
*
* 对应API:{@link http://open.weibo.com/wiki/Oauth2/authorize Oauth2/authorize}
*
* @param string $url 授权后的回调地址,站外应用需与回调地址一致,站内应用需要填写canvas page的地址
* @param string $response_type 支持的值包括 code 和token 默认值为code
* @param string $state 用于保持请求和回调的状态。在回调时,会在Query Parameter中回传该参数
* @param string $display 授权页面类型 可选范围:
* - default 默认授权页面
* - mobile 支持html5的手机
* - popup 弹窗授权页
* - wap1.2 wap1.2页面
* - wap2.0 wap2.0页面
* - js js-sdk 专用 授权页面是弹窗,返回结果为js-sdk回掉函数
* - apponweibo 站内应用专用,站内应用不传display参数,并且response_type为token时,默认使用改display.授权后不会返回access_token,只是输出js刷新站内应用父框架
* @return array
*/
function getAuthorizeURL( $url, $response_type = 'code', $state = NULL, $display = NULL ) {
$params = array();
$params['client_id'] = $this->client_id;
$params['redirect_uri'] = $url;
$params['response_type'] = $response_type;
$params['state'] = $state;
$params['display'] = $display;
return $this->authorizeURL() . "?" . http_build_query($params);
}
/**
* access_token接口
*
* 对应API:{@link http://open.weibo.com/wiki/OAuth2/access_token OAuth2/access_token}
*
* @param string $type 请求的类型,可以为:code, password, token
* @param array $keys 其他参数:
* - 当$type为code时: array('code'=>..., 'redirect_uri'=>...)
* - 当$type为password时: array('username'=>..., 'password'=>...)
* - 当$type为token时: array('refresh_token'=>...)
* @return array
*/
function getAccessToken( $type = 'code', $keys ) {
$params = array();
$params['client_id'] = $this->client_id;
$params['client_secret'] = $this->client_secret;
if ( $type === 'token' ) {
$params['grant_type'] = 'refresh_token';
$params['refresh_token'] = $keys['refresh_token'];
} elseif ( $type === 'code' ) {
$params['grant_type'] = 'authorization_code';
$params['code'] = $keys['code'];
$params['redirect_uri'] = $keys['redirect_uri'];
} elseif ( $type === 'password' ) {
$params['grant_type'] = 'password';
$params['username'] = $keys['username'];
$params['password'] = $keys['password'];
} else {
throw new OAuthException("wrong auth type");
}
$response = $this->oAuthRequest($this->accessTokenURL(), 'POST', $params);
$token = json_decode($response, true);
if ( is_array($token) && !isset($token['error']) ) {
$this->access_token = $token['access_token'];
//$this->refresh_token = $token['refresh_token'];
} else {
throw new OAuthException("get access token failed." . $token['error']);
}
return $token;
}
/**
* 解析 signed_request
*
* @param string $signed_request 应用框架在加载iframe时会通过向Canvas URL post的参数signed_request
*
* @return array
*/
function parseSignedRequest($signed_request) {
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$sig = self::base64decode($encoded_sig) ;
$data = json_decode(self::base64decode($payload), true);
if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') return '-1';
$expected_sig = hash_hmac('sha256', $payload, $this->client_secret, true);
return ($sig !== $expected_sig)? '-2':$data;
}
/**
* @ignore
*/
function base64decode($str) {
return base64_decode(strtr($str.str_repeat('=', (4 - strlen($str) % 4)), '-_', '+/'));
}
/**
* 读取jssdk授权信息,用于和jssdk的同步登录
*
* @return array 成功返回array('access_token'=>'value', 'refresh_token'=>'value'); 失败返回false
*/
function getTokenFromJSSDK() {
$key = "weibojs_" . $this->client_id;
if ( isset($_COOKIE[$key]) && $cookie = $_COOKIE[$key] ) {
parse_str($cookie, $token);
if ( isset($token['access_token']) && isset($token['refresh_token']) ) {
$this->access_token = $token['access_token'];
$this->refresh_token = $token['refresh_token'];
return $token;
} else {
return false;
}
} else {
return false;
}
}
/**
* 从数组中读取access_token和refresh_token
* 常用于从Session或Cookie中读取token,或通过Session/Cookie中是否存有token判断登录状态。
*
* @param array $arr 存有access_token和secret_token的数组
* @return array 成功返回array('access_token'=>'value', 'refresh_token'=>'value'); 失败返回false
*/
function getTokenFromArray( $arr ) {
if (isset($arr['access_token']) && $arr['access_token']) {
$token = array();
$this->access_token = $token['access_token'] = $arr['access_token'];
if (isset($arr['refresh_token']) && $arr['refresh_token']) {
$this->refresh_token = $token['refresh_token'] = $arr['refresh_token'];
}
return $token;
} else {
return false;
}
}
/**
* GET wrappwer for oAuthRequest.
*
* @return mixed
*/
function get($url, $parameters = array()) {
$response = $this->oAuthRequest($url, 'GET', $parameters);
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response, true);
}
return $response;
}
/**
* POST wreapper for oAuthRequest.
*
* @return mixed
*/
function post($url, $parameters = array(), $multi = false) {
$response = $this->oAuthRequest($url, 'POST', $parameters, $multi );
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response, true);
}
return $response;
}
/**
* DELTE wrapper for oAuthReqeust.
*
* @return mixed
*/
function delete($url, $parameters = array()) {
$response = $this->oAuthRequest($url, 'DELETE', $parameters);
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response, true);
}
return $response;
}
/**
* Format and sign an OAuth / API request
*
* @return string
* @ignore
*/
function oAuthRequest($url, $method, $parameters, $multi = false) {
if (strrpos($url, 'http://') !== 0 && strrpos($url, 'https://') !== 0) {
$url = "{$this->host}{$url}.{$this->format}";
}
switch ($method) {
case 'GET':
$url = $url . '?' . http_build_query($parameters);
return $this->http($url, 'GET');
default:
$headers = array();
if (!$multi && (is_array($parameters) || is_object($parameters)) ) {
$body = http_build_query($parameters);
} else {
$body = self::build_http_query_multi($parameters);
$headers[] = "Content-Type: multipart/form-data; boundary=" . self::$boundary;
}
return $this->http($url, $method, $body, $headers);
}
}
/**
* Make an HTTP request
*
* @return string API results
* @ignore
*/
function http($url, $method, $postfields = NULL, $headers = array()) {
$this->http_info = array();
$ci = curl_init();
/* Curl settings */
curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ci, CURLOPT_ENCODING, "");
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
if (version_compare(phpversion(), '5.4.0', '<')) {
curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 1);
} else {
curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 2);
}
curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
curl_setopt($ci, CURLOPT_HEADER, FALSE);
switch ($method) {
case 'POST':
curl_setopt($ci, CURLOPT_POST, TRUE);
if (!empty($postfields)) {
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
$this->postdata = $postfields;
}
break;
case 'DELETE':
curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
if (!empty($postfields)) {
$url = "{$url}?{$postfields}";
}
}
if ( isset($this->access_token) && $this->access_token )
$headers[] = "Authorization: OAuth2 ".$this->access_token;
if ( !empty($this->remote_ip) ) {
if ( defined('SAE_ACCESSKEY') ) {
$headers[] = "SaeRemoteIP: " . $this->remote_ip;
} else {
$headers[] = "API-RemoteIP: " . $this->remote_ip;
}
} else {
if ( !defined('SAE_ACCESSKEY') ) {
$headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR'];
}
}
curl_setopt($ci, CURLOPT_URL, $url );
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers );
curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE );
$response = curl_exec($ci);
$this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
$this->http_info = array_merge($this->http_info, curl_getinfo($ci));
$this->url = $url;
if ($this->debug) {
echo "=====post data======\r\n";
var_dump($postfields);
echo "=====headers======\r\n";
print_r($headers);
echo '=====request info====='."\r\n";
print_r( curl_getinfo($ci) );
echo '=====response====='."\r\n";
print_r( $response );
}
curl_close ($ci);
return $response;
}
/**
* Get the header info to store.
*
* @return int
* @ignore
*/
function getHeader($ch, $header) {
$i = strpos($header, ':');
if (!empty($i)) {
$key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
$value = trim(substr($header, $i + 2));
$this->http_header[$key] = $value;
}
return strlen($header);
}
/**
* @ignore
*/
public static function build_http_query_multi($params) {
if (!$params) return '';
uksort($params, 'strcmp');
$pairs = array();
self::$boundary = $boundary = uniqid('------------------');
$MPboundary = '--'.$boundary;
$endMPboundary = $MPboundary. '--';
$multipartbody = '';
foreach ($params as $parameter => $value) {
if( in_array($parameter, array('pic', 'image')) && $value{0} == '@' ) {
$url = ltrim( $value, '@' );
$content = file_get_contents( $url );
$array = explode( '?', basename( $url ) );
$filename = $array[0];
$multipartbody .= $MPboundary . "\r\n";
$multipartbody .= 'Content-Disposition: form-data; name="' . $parameter . '"; filename="' . $filename . '"'. "\r\n";
$multipartbody .= "Content-Type: image/unknown\r\n\r\n";
$multipartbody .= $content. "\r\n";
} else {
$multipartbody .= $MPboundary . "\r\n";
$multipartbody .= 'content-disposition: form-data; name="' . $parameter . "\"\r\n\r\n";
$multipartbody .= $value."\r\n";
}
}
$multipartbody .= $endMPboundary;
return $multipartbody;
}
}
/**
* 新浪微博操作类V2
*
* 使用前需要先手工调用saetv2.ex.class.php <br />
*
* @package sae
* @author Easy Chen, Elmer Zhang,Lazypeople
* @version 1.0
*/
class SaeTClientV2
{
/**
* 构造函数
*
* @access public
* @param mixed $akey 微博开放平台应用APP KEY
* @param mixed $skey 微博开放平台应用APP SECRET
* @param mixed $access_token OAuth认证返回的token
* @param mixed $refresh_token OAuth认证返回的token secret
* @return void
*/
function __construct( $akey, $skey, $access_token, $refresh_token = NULL)
{
$this->oauth = new SaeTOAuthV2( $akey, $skey, $access_token, $refresh_token );
}
/**
* 开启调试信息
*
* 开启调试信息后,SDK会将每次请求微博API所发送的POST Data、Headers以及请求信息、返回内容输出出来。
*
* @access public
* @param bool $enable 是否开启调试信息
* @return void
*/
function set_debug( $enable )
{
$this->oauth->debug = $enable;
}
/**
* 设置用户IP
*
* SDK默认将会通过$_SERVER['REMOTE_ADDR']获取用户IP,在请求微博API时将用户IP附加到Request Header中。但某些情况下$_SERVER['REMOTE_ADDR']取到的IP并非用户IP,而是一个固定的IP(例如使用SAE的Cron或TaskQueue服务时),此时就有可能会造成该固定IP达到微博API调用频率限额,导致API调用失败。此时可使用本方法设置用户IP,以避免此问题。
*
* @access public
* @param string $ip 用户IP
* @return bool IP为非法IP字符串时,返回false,否则返回true
*/
function set_remote_ip( $ip )
{
if ( ip2long($ip) !== false ) {
$this->oauth->remote_ip = $ip;
return true;
} else {
return false;
}
}
/**
* 获取最新的公共微博消息
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/public_timeline statuses/public_timeline}
*
* @access public
* @param int $count 单页返回的记录条数,默认为50。
* @param int $page 返回结果的页码,默认为1。
* @param int $base_app 是否只获取当前应用的数据。0为否(所有数据),1为是(仅当前应用),默认为0。
* @return array
*/
function public_timeline( $page = 1, $count = 50, $base_app = 0 )
{
$params = array();
$params['count'] = intval($count);
$params['page'] = intval($page);
$params['base_app'] = intval($base_app);
return $this->oauth->get('statuses/public_timeline', $params);//可能是接口的bug不能补全
}
/**
* 获取当前登录用户及其所关注用户的最新微博消息。
*
* 获取当前登录用户及其所关注用户的最新微博消息。和用户登录 http://weibo.com 后在“我的首页”中看到的内容相同。同friends_timeline()
* <br />对应API:{@link http://open.weibo.com/wiki/2/statuses/home_timeline statuses/home_timeline}
*
* @access public
* @param int $page 指定返回结果的页码。根据当前登录用户所关注的用户数及这些被关注用户发表的微博数,翻页功能最多能查看的总记录数会有所不同,通常最多能查看1000条左右。默认值1。可选。
* @param int $count 每次返回的记录数。缺省值50,最大值200。可选。
* @param int $since_id 若指定此参数,则只返回ID比since_id大的微博消息(即比since_id发表时间晚的微博消息)。可选。
* @param int $max_id 若指定此参数,则返回ID小于或等于max_id的微博消息。可选。
* @param int $base_app 是否只获取当前应用的数据。0为否(所有数据),1为是(仅当前应用),默认为0。
* @param int $feature 过滤类型ID,0:全部、1:原创、2:图片、3:视频、4:音乐,默认为0。
* @return array
*/
function home_timeline( $page = 1, $count = 50, $since_id = 0, $max_id = 0, $base_app = 0, $feature = 0 )
{
$params = array();
if ($since_id) {
$this->id_format($since_id);
$params['since_id'] = $since_id;
}
if ($max_id) {
$this->id_format($max_id);
$params['max_id'] = $max_id;
}
$params['count'] = intval($count);
$params['page'] = intval($page);
$params['base_app'] = intval($base_app);
$params['feature'] = intval($feature);
return $this->oauth->get('statuses/home_timeline', $params);
}
/**
* 获取当前登录用户及其所关注用户的最新微博消息。
*
* 获取当前登录用户及其所关注用户的最新微博消息。和用户登录 http://weibo.com 后在“我的首页”中看到的内容相同。同home_timeline()
* <br />对应API:{@link http://open.weibo.com/wiki/2/statuses/friends_timeline statuses/friends_timeline}
*
* @access public
* @param int $page 指定返回结果的页码。根据当前登录用户所关注的用户数及这些被关注用户发表的微博数,翻页功能最多能查看的总记录数会有所不同,通常最多能查看1000条左右。默认值1。可选。
* @param int $count 每次返回的记录数。缺省值50,最大值200。可选。
* @param int $since_id 若指定此参数,则只返回ID比since_id大的微博消息(即比since_id发表时间晚的微博消息)。可选。
* @param int $max_id 若指定此参数,则返回ID小于或等于max_id的微博消息。可选。
* @param int $base_app 是否基于当前应用来获取数据。1为限制本应用微博,0为不做限制。默认为0。可选。
* @param int $feature 微博类型,0全部,1原创,2图片,3视频,4音乐. 返回指定类型的微博信息内容。转为为0。可选。
* @return array
*/
function friends_timeline( $page = 1, $count = 50, $since_id = 0, $max_id = 0, $base_app = 0, $feature = 0 )
{
return $this->home_timeline( $since_id, $max_id, $count, $page, $base_app, $feature);
}
/**
* 获取用户发布的微博信息列表
*
* 返回用户的发布的最近n条信息,和用户微博页面返回内容是一致的。此接口也可以请求其他用户的最新发表微博。
* <br />对应API:{@link http://open.weibo.com/wiki/2/statuses/user_timeline statuses/user_timeline}
*
* @access public
* @param int $page 页码
* @param int $count 每次返回的最大记录数,最多返回200条,默认50。
* @param mixed $uid 指定用户UID或微博昵称
* @param int $since_id 若指定此参数,则只返回ID比since_id大的微博消息(即比since_id发表时间晚的微博消息)。可选。
* @param int $max_id 若指定此参数,则返回ID小于或等于max_id的提到当前登录用户微博消息。可选。
* @param int $base_app 是否基于当前应用来获取数据。1为限制本应用微博,0为不做限制。默认为0。
* @param int $feature 过滤类型ID,0:全部、1:原创、2:图片、3:视频、4:音乐,默认为0。
* @param int $trim_user 返回值中user信息开关,0:返回完整的user信息、1:user字段仅返回uid,默认为0。
* @return array
*/
function user_timeline_by_id( $uid = NULL , $page = 1 , $count = 50 , $since_id = 0, $max_id = 0, $feature = 0, $trim_user = 0, $base_app = 0)
{
$params = array();
$params['uid']=$uid;
if ($since_id) {
$this->id_format($since_id);
$params['since_id'] = $since_id;
}
if ($max_id) {
$this->id_format($max_id);
$params['max_id'] = $max_id;
}
$params['base_app'] = intval($base_app);
$params['feature'] = intval($feature);
$params['count'] = intval($count);
$params['page'] = intval($page);
$params['trim_user'] = intval($trim_user);
return $this->oauth->get( 'statuses/user_timeline', $params );
}
/**
* 获取用户发布的微博信息列表
*
* 返回用户的发布的最近n条信息,和用户微博页面返回内容是一致的。此接口也可以请求其他用户的最新发表微博。
* <br />对应API:{@link http://open.weibo.com/wiki/2/statuses/user_timeline statuses/user_timeline}
*
* @access public
* @param string $screen_name 微博昵称,主要是用来区分用户UID跟微博昵称,当二者一样而产生歧义的时候,建议使用该参数
* @param int $page 页码
* @param int $count 每次返回的最大记录数,最多返回200条,默认50。
* @param int $since_id 若指定此参数,则只返回ID比since_id大的微博消息(即比since_id发表时间晚的微博消息)。可选。
* @param int $max_id 若指定此参数,则返回ID小于或等于max_id的提到当前登录用户微博消息。可选。
* @param int $feature 过滤类型ID,0:全部、1:原创、2:图片、3:视频、4:音乐,默认为0。
* @param int $trim_user 返回值中user信息开关,0:返回完整的user信息、1:user字段仅返回uid,默认为0。
* @param int $base_app 是否基于当前应用来获取数据。1为限制本应用微博,0为不做限制。默认为0。
* @return array
*/
function user_timeline_by_name( $screen_name = NULL , $page = 1 , $count = 50 , $since_id = 0, $max_id = 0, $feature = 0, $trim_user = 0, $base_app = 0 )
{
$params = array();
$params['screen_name'] = $screen_name;
if ($since_id) {
$this->id_format($since_id);
$params['since_id'] = $since_id;
}
if ($max_id) {
$this->id_format($max_id);
$params['max_id'] = $max_id;
}
$params['base_app'] = intval($base_app);
$params['feature'] = intval($feature);
$params['count'] = intval($count);
$params['page'] = intval($page);
$params['trim_user'] = intval($trim_user);
return $this->oauth->get( 'statuses/user_timeline', $params );
}
/**
* 批量获取指定的一批用户的timeline
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/timeline_batch statuses/timeline_batch}
*
* @param string $screen_name 需要查询的用户昵称,用半角逗号分隔,一次最多20个
* @param int $count 单页返回的记录条数,默认为50。
* @param int $page 返回结果的页码,默认为1。
* @param int $base_app 是否只获取当前应用的数据。0为否(所有数据),1为是(仅当前应用),默认为0。
* @param int $feature 过滤类型ID,0:全部、1:原创、2:图片、3:视频、4:音乐,默认为0。
* @return array
*/
function timeline_batch_by_name( $screen_name, $page = 1, $count = 50, $feature = 0, $base_app = 0)
{
$params = array();
if (is_array($screen_name) && !empty($screen_name)) {
$params['screen_name'] = join(',', $screen_name);
} else {
$params['screen_name'] = $screen_name;
}
$params['count'] = intval($count);
$params['page'] = intval($page);
$params['base_app'] = intval($base_app);
$params['feature'] = intval($feature);
return $this->oauth->get('statuses/timeline_batch', $params);
}
/**
* 批量获取指定的一批用户的timeline
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/timeline_batch statuses/timeline_batch}
*
* @param string $uids 需要查询的用户ID,用半角逗号分隔,一次最多20个。
* @param int $count 单页返回的记录条数,默认为50。
* @param int $page 返回结果的页码,默认为1。
* @param int $base_app 是否只获取当前应用的数据。0为否(所有数据),1为是(仅当前应用),默认为0。
* @param int $feature 过滤类型ID,0:全部、1:原创、2:图片、3:视频、4:音乐,默认为0。
* @return array
*/
function timeline_batch_by_id( $uids, $page = 1, $count = 50, $feature = 0, $base_app = 0)
{
$params = array();
if (is_array($uids) && !empty($uids)) {
foreach($uids as $k => $v) {
$this->id_format($uids[$k]);
}
$params['uids'] = join(',', $uids);
} else {
$params['uids'] = $uids;
}
$params['count'] = intval($count);
$params['page'] = intval($page);
$params['base_app'] = intval($base_app);
$params['feature'] = intval($feature);
return $this->oauth->get('statuses/timeline_batch', $params);
}
/**
* 返回一条原创微博消息的最新n条转发微博消息。本接口无法对非原创微博进行查询。
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/repost_timeline statuses/repost_timeline}
*
* @access public
* @param int $sid 要获取转发微博列表的原创微博ID。
* @param int $page 返回结果的页码。
* @param int $count 单页返回的最大记录数,最多返回200条,默认50。可选。
* @param int $since_id 若指定此参数,则只返回ID比since_id大的记录(比since_id发表时间晚)。可选。
* @param int $max_id 若指定此参数,则返回ID小于或等于max_id的记录。可选。
* @param int $filter_by_author 作者筛选类型,0:全部、1:我关注的人、2:陌生人,默认为0。
* @return array
*/
function repost_timeline( $sid, $page = 1, $count = 50, $since_id = 0, $max_id = 0, $filter_by_author = 0 )
{
$this->id_format($sid);
$params = array();
$params['id'] = $sid;
if ($since_id) {
$this->id_format($since_id);
$params['since_id'] = $since_id;
}
if ($max_id) {
$this->id_format($max_id);
$params['max_id'] = $max_id;
}
$params['filter_by_author'] = intval($filter_by_author);
return $this->request_with_pager( 'statuses/repost_timeline', $page, $count, $params );
}
/**
* 获取当前用户最新转发的n条微博消息
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/repost_by_me statuses/repost_by_me}
*
* @access public
* @param int $page 返回结果的页码。
* @param int $count 每次返回的最大记录数,最多返回200条,默认50。可选。
* @param int $since_id 若指定此参数,则只返回ID比since_id大的记录(比since_id发表时间晚)。可选。
* @param int $max_id 若指定此参数,则返回ID小于或等于max_id的记录。可选。
* @return array
*/
function repost_by_me( $page = 1, $count = 50, $since_id = 0, $max_id = 0 )
{
$params = array();
if ($since_id) {
$this->id_format($since_id);
$params['since_id'] = $since_id;
}
if ($max_id) {
$this->id_format($max_id);
$params['max_id'] = $max_id;
}
return $this->request_with_pager('statuses/repost_by_me', $page, $count, $params );
}
/**
* 获取@当前用户的微博列表
*
* 返回最新n条提到登录用户的微博消息(即包含@username的微博消息)
* <br />对应API:{@link http://open.weibo.com/wiki/2/statuses/mentions statuses/mentions}
*
* @access public
* @param int $page 返回结果的页序号。
* @param int $count 每次返回的最大记录数(即页面大小),不大于200,默认为50。
* @param int $since_id 若指定此参数,则只返回ID比since_id大的微博消息(即比since_id发表时间晚的微博消息)。可选。
* @param int $max_id 若指定此参数,则返回ID小于或等于max_id的提到当前登录用户微博消息。可选。
* @param int $filter_by_author 作者筛选类型,0:全部、1:我关注的人、2:陌生人,默认为0。
* @param int $filter_by_source 来源筛选类型,0:全部、1:来自微博、2:来自微群,默认为0。
* @param int $filter_by_type 原创筛选类型,0:全部微博、1:原创的微博,默认为0。
* @return array
*/
function mentions( $page = 1, $count = 50, $since_id = 0, $max_id = 0, $filter_by_author = 0, $filter_by_source = 0, $filter_by_type = 0 )
{
$params = array();
if ($since_id) {
$this->id_format($since_id);
$params['since_id'] = $since_id;
}
if ($max_id) {
$this->id_format($max_id);
$params['max_id'] = $max_id;
}
$params['filter_by_author'] = $filter_by_author;
$params['filter_by_source'] = $filter_by_source;
$params['filter_by_type'] = $filter_by_type;
return $this->request_with_pager( 'statuses/mentions', $page, $count, $params );
}
/**
* 根据ID获取单条微博信息内容
*
* 获取单条ID的微博信息,作者信息将同时返回。
* <br />对应API:{@link http://open.weibo.com/wiki/2/statuses/show statuses/show}
*
* @access public
* @param int $id 要获取已发表的微博ID, 如ID不存在返回空
* @return array
*/
function show_status( $id )
{
$this->id_format($id);
$params = array();
$params['id'] = $id;
return $this->oauth->get('statuses/show', $params);
}
/**
* 根据微博id号获取微博的信息
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/show_batch statuses/show_batch}
*
* @param string $ids 需要查询的微博ID,用半角逗号分隔,最多不超过50个。
* @return array
*/
function show_batch( $ids )
{
$params=array();
if (is_array($ids) && !empty($ids)) {
foreach($ids as $k => $v) {
$this->id_format($ids[$k]);
}
$params['ids'] = join(',', $ids);
} else {
$params['ids'] = $ids;
}
return $this->oauth->get('statuses/show_batch', $params);
}
/**
* 通过微博(评论、私信)ID获取其MID
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/querymid statuses/querymid}
*
* @param int|string $id 需要查询的微博(评论、私信)ID,批量模式下,用半角逗号分隔,最多不超过20个。
* @param int $type 获取类型,1:微博、2:评论、3:私信,默认为1。
* @param int $is_batch 是否使用批量模式,0:否、1:是,默认为0。
* @return array
*/
function querymid( $id, $type = 1, $is_batch = 0 )
{
$params = array();
$params['id'] = $id;
$params['type'] = intval($type);
$params['is_batch'] = intval($is_batch);
return $this->oauth->get( 'statuses/querymid', $params);
}
/**
* 通过微博(评论、私信)MID获取其ID
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/queryid statuses/queryid}
*
* @param int|string $mid 需要查询的微博(评论、私信)MID,批量模式下,用半角逗号分隔,最多不超过20个。
* @param int $type 获取类型,1:微博、2:评论、3:私信,默认为1。
* @param int $is_batch 是否使用批量模式,0:否、1:是,默认为0。
* @param int $inbox 仅对私信有效,当MID类型为私信时用此参数,0:发件箱、1:收件箱,默认为0 。
* @param int $isBase62 MID是否是base62编码,0:否、1:是,默认为0。
* @return array
*/
function queryid( $mid, $type = 1, $is_batch = 0, $inbox = 0, $isBase62 = 0)
{
$params = array();
$params['mid'] = $mid;
$params['type'] = intval($type);
$params['is_batch'] = intval($is_batch);
$params['inbox'] = intval($inbox);
$params['isBase62'] = intval($isBase62);
return $this->oauth->get('statuses/queryid', $params);
}
/**
* 按天返回热门微博转发榜的微博列表
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/hot/repost_daily statuses/hot/repost_daily}
*
* @param int $count 返回的记录条数,最大不超过50,默认为20。
* @param int $base_app 是否只获取当前应用的数据。0为否(所有数据),1为是(仅当前应用),默认为0。
* @return array
*/
function repost_daily( $count = 20, $base_app = 0)
{
$params = array();
$params['count'] = intval($count);
$params['base_app'] = intval($base_app);
return $this->oauth->get('statuses/hot/repost_daily', $params);
}
/**
* 按周返回热门微博转发榜的微博列表
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/hot/repost_weekly statuses/hot/repost_weekly}
*
* @param int $count 返回的记录条数,最大不超过50,默认为20。
* @param int $base_app 是否只获取当前应用的数据。0为否(所有数据),1为是(仅当前应用),默认为0。
* @return array
*/
function repost_weekly( $count = 20, $base_app = 0)
{
$params = array();
$params['count'] = intval($count);
$params['base_app'] = intval($base_app);
return $this->oauth->get( 'statuses/hot/repost_weekly', $params);
}
/**
* 按天返回热门微博评论榜的微博列表
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/hot/comments_daily statuses/hot/comments_daily}
*
* @param int $count 返回的记录条数,最大不超过50,默认为20。
* @param int $base_app 是否只获取当前应用的数据。0为否(所有数据),1为是(仅当前应用),默认为0。
* @return array
*/
function comments_daily( $count = 20, $base_app = 0)
{
$params = array();
$params['count'] = intval($count);
$params['base_app'] = intval($base_app);
return $this->oauth->get( 'statuses/hot/comments_daily', $params);
}
/**
* 按周返回热门微博评论榜的微博列表
*
* 对应API:{@link http://open.weibo.com/wiki/2/statuses/hot/comments_weekly statuses/hot/comments_weekly}
*
* @param int $count 返回的记录条数,最大不超过50,默认为20。
* @param int $base_app 是否只获取当前应用的数据。0为否(所有数据),1为是(仅当前应用),默认为0。
* @return array
*/
function comments_weekly( $count = 20, $base_app = 0)
{
$params = array();
$params['count'] = intval($count);
$params['base_app'] = intval($base_app);
return $this->oauth->get( 'statuses/hot/comments_weekly', $params);
}
/**
* 转发一条微博信息。
*
* 可加评论。为防止重复,发布的信息与最新信息一样话,将会被忽略。
* <br />对应API:{@link http://open.weibo.com/wiki/2/statuses/repost statuses/repost}
*
* @access public
* @param int $sid 转发的微博ID