欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

新浪微博的账号登录及PHP api操作

程序员文章站 2022-03-29 09:15:08
...
新浪微博 的账号登录及api操作,使用oauth 2.0
官方提供的sdk都太过庞大,这是我自己简化的,提供简单的账号登录、获取个人信息、发布微博等功能,如果需要其他功能可以根据官方的api文档自行添加

[文件] sina.php

001

002 /**

003 * PHP Library for weibo.com

004 *

005 * @author PiscDong (http://www.piscdong.com/)

006 */

007 class sinaPHP

008 {

009 function __construct($client_id, $client_secret, $access_token=NULL){

010 $this->client_id=$client_id;

011 $this->client_secret=$client_secret;

012 $this->access_token=$access_token;

013 }

014

015 function login_url($callback_url){

016 $params=array(

017 'response_type'=>'code',

018 'client_id'=>$this->client_id,

019 'redirect_uri'=>$callback_url

020 );

021 return 'https://api.weibo.com/oauth2/authorize?'.http_build_query($params);

022 }

023

024 function access_token($callback_url, $code){

025 $params=array(

026 'grant_type'=>'authorization_code',

027 'code'=>$code,

028 'client_id'=>$this->client_id,

029 'client_secret'=>$this->client_secret,

030 'redirect_uri'=>$callback_url

031 );

032 $url='https://api.weibo.com/oauth2/access_token';

033 return $this->http($url, http_build_query($params), 'POST');

034 }

035

036 /**

037 function access_token_refresh($refresh_token){

038 }

039 **/

040

041 function get_uid(){

042 $params=array();

043 $url='https://api.weibo.com/2/account/get_uid.json';

044 return $this->api($url, $params);

045 }

046

047 function show_user_by_id($uid){

048 $params=array(

049 'uid'=>$uid

050 );

051 $url='https://api.weibo.com/2/users/show.json';

052 return $this->api($url, $params);

053 }

054

055 function statuses_count($ids){

056 $params=array(

057 'ids'=>$ids

058 );

059 $url='https://api.weibo.com/2/statuses/count.json';

060 return $this->api($url, $params);

061 }

062

063 function get_comments_by_sid($id, $count=10, $page=1){

064 $params=array(

065 'id'=>$id,

066 'page'=>$page,

067 'count'=>$count

068 );

069 $url='https://api.weibo.com/2/comments/show.json';

070 return $this->api($url, $params);

071 }

072

073 function repost_timeline($id, $count=10, $page=1){

074 $params=array(

075 'id'=>$id,

076 'page'=>$page,

077 'count'=>$count

078 );

079 $url='https://api.weibo.com/2/statuses/repost_timeline.json';

080 return $this->api($url, $params);

081 }

082

083 function update($img_c, $pic=''){

084 $params=array(

085 'status'=>$img_c

086 );

087 if($pic!='' && is_array($pic)){

088 $url='https://api.weibo.com/2/statuses/upload.json';

089 $params['pic']=$pic;

090 }else{

091 $url='https://api.weibo.com/2/statuses/update.json';

092 }

093 return $this->api($url, $params, 'POST');

094 }

095

096 function user_timeline($uid, $count=10, $page=1){

097 $params=array(

098 'uid'=>$uid,

099 'page'=>$page,

100 'count'=>$count

101 );

102 $url='https://api.weibo.com/2/statuses/user_timeline.json';

103 return $this->api($url, $params);

104 }

105

106 function querymid($id, $type=1, $is_batch=0){

107 $params=array(

108 'id'=>$id,

109 'type'=>$type,

110 'is_batch'=>$is_batch

111 );

112 $url='https://api.weibo.com/2/statuses/querymid.json';

113 return $this->api($url, $params);

114 }

115

116 function api($url, $params, $method='GET'){

117 $params['access_token']=$this->access_token;

118 if($method=='GET'){

119 $result=$this->http($url.'?'.http_build_query($params));

120 }else{

121 if(isset($params['pic'])){

122 uksort($params, 'strcmp');

123 $str_b=uniqid('------------------');

124 $str_m='--'.$str_b;

125 $str_e=$str_m. '--';

126 $body='';

127 foreach($params as $k=>$v){

128 if($k=='pic'){

129 if(is_array($v)){

130 $img_c=$v[2];

131 $img_n=$v[1];

132 }elseif($v{0}=='@'){

133 $url=ltrim($v, '@');

134 $img_c=file_get_contents($url);

135 $url_a=explode('?', basename($url));

136 $img_n=$url_a[0];

137 }

138 $body.=$str_m."\r\n";

139 $body.='Content-Disposition: form-data; name="'.$k.'"; filename="'.$img_n.'"'."\r\n";

140 $body.="Content-Type: image/unknown\r\n\r\n";

141 $body.=$img_c."\r\n";

142 }else{

143 $body.=$str_m."\r\n";

144 $body.='Content-Disposition: form-data; name="'.$k."\"\r\n\r\n";

145 $body.=$v."\r\n";

146 }

147 }

148 $body.=$str_e;

149 $headers[]="Content-Type: multipart/form-data; boundary=".$str_b;

150 $result=$this->http($url, $body, 'POST', $headers);

151 }else{

152 $result=$this->http($url, http_build_query($params), 'POST');

153 }

154 }

155 return $result;

156 }

157

158 function http($url, $postfields='', $method='GET', $headers=array()){

159 $ci=curl_init();

160 curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);

161 curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);

162 curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);

163 curl_setopt($ci, CURLOPT_TIMEOUT, 30);

164 if($method=='POST'){

165 curl_setopt($ci, CURLOPT_POST, TRUE);

166 if($postfields!='')curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);

167 }

168 $headers[]="User-Agent: sinaPHP(piscdong.com)";

169 curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);

170 curl_setopt($ci, CURLOPT_URL, $url);

171 $response=curl_exec($ci);

172 curl_close($ci);

173 $json_r=array();

174 if($response!='')$json_r=json_decode($response, true);

175 return $json_r;

176 }

177 }

[文件] config.php

1

2 //配置文件

3 header('Content-Type: text/html; charset=UTF-8');

4

5 $sina_k=''; //新浪微博应用App Key

6 $sina_s=''; //新浪微博应用App Secret

7 $callback_url='http://yoururl/callback.php'; //授权回调网址

8 ?>

[文件] index.php

01

02 require_once('config.php');

03 require_once('sina.php');

04

05 function getimgp($u){

06 //图片处理

07 $c=@file_get_contents($u);

08 $name=md5($u).'.jpg';

09 $mime='image/unknown';

10 return array($mime, $name, $c);

11 }

12

13 $sina_t=isset($_SESSION['sina_t'])?$_SESSION['sina_t']:'';

14

15 //检查是否已登录

16 if($sina_t!=''){

17 $sina=new sinaPHP($sina_k, $sina_s, $sina_t);

18

19 //获取登录用户id

20 $sina_uid=$c->get_uid();

21 $uid=$sina_uid['uid'];

22

23 //获取登录用户信息

24 $result=$sina->show_user_by_id($uid);

25 var_dump($result);

26

27 /**

28 //发布微博

29 $content='微博内容';

30 $img='http://www.baidu.com/img/baidu_sylogo1.gif';

31 $img_a=getimgp($img);

32 if($img_a[2]!=''){

33 $result=$sina->update($content, $img_a);

34 //发布带图片微博

35 }else{

36 $result=$sina->update($content);

37 //发布纯文字微博

38 }

39 var_dump($result);

40 **/

41

42 /**

43 //微博列表

44 $result=$sina->user_timeline($uid);

45 var_dump($result);

46 **/

47

48 }else{

49 //生成登录链接

50 $sina=new sinaPHP($sina_k, $sina_s);

51 $login_url=$sina->login_url($callback_url);

52 echo '点击进入授权页面';

53 }

54 ?>

[文件] callback.php

01

02 //授权回调页面,即配置文件中的$callback_url

03 require_once('config.php');

04 require_once('sina.php');

05

06 if(isset($_GET['code']) && $_GET['code']!=''){

07 $o=new sinaPHP($sina_k, $sina_s);

08 $result=$o->access_token($callback_url, $_GET['code']);

09 }

10 if(isset($result['access_token']) && $result['access_token']!=''){

11 echo '授权完成,请记录
access token:';

12

13 //保存登录信息,此示例中使用session保存

14 $_SESSION['sina_t']=$result['access_token']; //access token

15 }else{

16 echo '授权失败';

17 }

18 echo '
返回';

19 ?>