You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
276 lines
8.4 KiB
276 lines
8.4 KiB
<?php
|
|
defined('BASE_PATH') OR exit('No direct script access allowed');
|
|
|
|
class weibo
|
|
{
|
|
|
|
public $api_url = 'https://api.weibo.com/2/';
|
|
public $format = 'json';
|
|
|
|
/**
|
|
* 构造函数
|
|
*
|
|
* @param unknown $app
|
|
* @param string $access_token
|
|
*/
|
|
public function __construct($config, $access_token = NULL)
|
|
{
|
|
$this->client_id = $config['app_key'];
|
|
$this->client_secret = $config['app_secret'];
|
|
$this->access_token = $access_token;
|
|
}
|
|
|
|
/**
|
|
* 获取授权地址
|
|
*
|
|
* @param unknown $info
|
|
* @param unknown $url
|
|
* @return mixed
|
|
*/
|
|
public function redirect($callback_url)
|
|
{
|
|
return $this->login_url($callback_url, $this->scope);
|
|
}
|
|
|
|
/**
|
|
* 回调用户数据
|
|
*
|
|
* @param unknown $info
|
|
* @param unknown $url
|
|
* @param unknown $code
|
|
* @return boolean
|
|
*/
|
|
public function callback($callback_url, $code)
|
|
{
|
|
$result = $this->access_token($callback_url, $code);
|
|
if (isset($result['access_token']) && $result['access_token'] != '') {
|
|
// 保存登录信息,此示例中使用session保存
|
|
$this->access_token = $result['access_token']; // access token
|
|
$openid = $this->get_openid();
|
|
$userinfo = $this->get_user_info($openid);
|
|
if($userinfo['gender'] == 'f'){
|
|
$userinfo['gender'] = 1;
|
|
}elseif ($userinfo['gender'] == 'm'){
|
|
$userinfo['gender'] = 2;
|
|
}else {
|
|
$userinfo['gender'] = 0;
|
|
}
|
|
$data = array(
|
|
'openid' => basename(__FILE__, '.php') . '_' . $openid,
|
|
'name' => $this->get_user_name($userinfo),
|
|
'sex' => $userinfo['gender'],
|
|
'avatar' => $userinfo['profile_image_url']
|
|
);
|
|
return $data;
|
|
} else {
|
|
// echo "授权失败";
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 生成授权网址
|
|
*
|
|
* @param unknown $callback_url
|
|
* @return string
|
|
*/
|
|
public function login_url($callback_url)
|
|
{
|
|
$params = array(
|
|
'response_type' => 'code',
|
|
'client_id' => $this->client_id,
|
|
'redirect_uri' => $callback_url
|
|
);
|
|
return 'https://api.weibo.com/oauth2/authorize?' . http_build_query($params, '', '&');
|
|
}
|
|
|
|
/**
|
|
* 获取access token
|
|
*
|
|
* @param unknown $callback_url
|
|
* @param unknown $code
|
|
* @return Ambigous <multitype:, mixed>
|
|
*/
|
|
public function access_token($callback_url, $code)
|
|
{
|
|
$params = array(
|
|
'grant_type' => 'authorization_code',
|
|
'code' => $code,
|
|
'client_id' => $this->client_id,
|
|
'client_secret' => $this->client_secret,
|
|
'redirect_uri' => $callback_url
|
|
);
|
|
$url = 'https://api.weibo.com/oauth2/access_token';
|
|
return $this->http($url, http_build_query($params, '', '&'), 'POST');
|
|
}
|
|
|
|
/**
|
|
* 获取登录用户的uid
|
|
*
|
|
* @return Ambigous <>
|
|
*/
|
|
public function get_openid()
|
|
{
|
|
$params = array();
|
|
$result = $this->api('account/get_uid', $params);
|
|
return $result['uid'];
|
|
}
|
|
|
|
/**
|
|
* 根据uid获取用户信息
|
|
*
|
|
* @param unknown $uid
|
|
* @return Ambigous <multitype:, mixed>
|
|
*/
|
|
public function get_user_info($uid)
|
|
{
|
|
$params = array(
|
|
'uid' => $uid
|
|
);
|
|
return $this->api('users/show', $params);
|
|
}
|
|
|
|
/**
|
|
* 获取用户名
|
|
*
|
|
* @param unknown $user_info
|
|
* @return Ambigous <multitype:, mixed>
|
|
*/
|
|
public function get_user_name($userinfo)
|
|
{
|
|
|
|
if ($userinfo['screen_name'] != '') {
|
|
return $userinfo['screen_name'];
|
|
} else {
|
|
return $userinfo['name'];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 发布微博
|
|
*
|
|
* @param unknown $img_c
|
|
* @param string $pic
|
|
* @return Ambigous <multitype:, mixed>
|
|
*/
|
|
public function update($img_c, $pic = '')
|
|
{
|
|
$params = array(
|
|
'status' => $img_c
|
|
);
|
|
if ($pic != '' && is_array($pic)) {
|
|
$url = 'statuses/upload';
|
|
$params['pic'] = $pic;
|
|
} else {
|
|
$url = 'statuses/update';
|
|
}
|
|
return $this->api($url, $params, 'POST');
|
|
}
|
|
|
|
/**
|
|
* 根据uid获取用户微博列表
|
|
*
|
|
* @param unknown $uid
|
|
* @param number $count
|
|
* @param number $page
|
|
* @return Ambigous <multitype:, mixed>
|
|
*/
|
|
public function user_timeline($uid, $count = 10, $page = 1)
|
|
{
|
|
$params = array(
|
|
'uid' => $uid,
|
|
'page' => $page,
|
|
'count' => $count
|
|
);
|
|
return $this->api('statuses/user_timeline', $params);
|
|
}
|
|
|
|
/**
|
|
* 调用接口
|
|
*
|
|
* @param unknown $url
|
|
* @param unknown $params
|
|
* @param string $method
|
|
* @return Ambigous <multitype:, mixed>
|
|
* //示例:根据uid获取用户信息
|
|
* $result=$sina->api('users/show', array('uid'=>$uid), 'GET');
|
|
*/
|
|
public function api($url, $params = array(), $method = 'GET')
|
|
{
|
|
$url = $this->api_url . $url . '.' . $this->format;
|
|
$params['access_token'] = $this->access_token;
|
|
if ($method == 'GET') {
|
|
$query = http_build_query($params, '', '&');
|
|
$result = $this->http($url . '?' . $query);
|
|
} else {
|
|
if (isset($params['pic'])) {
|
|
uksort($params, 'strcmp');
|
|
$str_b = uniqid('------------------');
|
|
$str_m = '--' . $str_b;
|
|
$str_e = $str_m . '--';
|
|
$body = '';
|
|
foreach ($params as $k => $v) {
|
|
if ($k == 'pic') {
|
|
if (is_array($v)) {
|
|
$img_c = $v[2];
|
|
$img_n = $v[1];
|
|
} elseif ($v{0} == '@') {
|
|
$url = ltrim($v, '@');
|
|
$img_c = file_get_contents($url);
|
|
$url_a = explode('?', basename($url));
|
|
$img_n = $url_a[0];
|
|
}
|
|
$body .= $str_m . "\r\n";
|
|
$body .= 'Content-Disposition: form-data; name="' . $k . '"; filename="' . $img_n . '"' . "\r\n";
|
|
$body .= "Content-Type: image/unknown\r\n\r\n";
|
|
$body .= $img_c . "\r\n";
|
|
} else {
|
|
$body .= $str_m . "\r\n";
|
|
$body .= 'Content-Disposition: form-data; name="' . $k . '"' . "\r\n\r\n";
|
|
$body .= $v . "\r\n";
|
|
}
|
|
}
|
|
$body .= $str_e;
|
|
$headers[] = 'Content-Type: multipart/form-data; boundary=' . $str_b;
|
|
$result = $this->http($url, $body, 'POST', $headers);
|
|
} else {
|
|
$query = http_build_query($params, '', '&');
|
|
$result = $this->http($url, $query, 'POST');
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 提交请求
|
|
*
|
|
* @param unknown $url
|
|
* @param string $postfields
|
|
* @param string $method
|
|
* @param unknown $headers
|
|
* @return Ambigous <multitype:, mixed>
|
|
*/
|
|
private function http($url, $postfields = '', $method = 'GET', $headers = array())
|
|
{
|
|
$ci = curl_init();
|
|
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
|
|
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
|
|
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
|
|
curl_setopt($ci, CURLOPT_TIMEOUT, 30);
|
|
if ($method == 'POST') {
|
|
curl_setopt($ci, CURLOPT_POST, TRUE);
|
|
if ($postfields != '')
|
|
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
|
|
}
|
|
$headers[] = 'User-Agent: ECTouch.cn';
|
|
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
|
|
curl_setopt($ci, CURLOPT_URL, $url);
|
|
$response = curl_exec($ci);
|
|
curl_close($ci);
|
|
$json_r = array();
|
|
if ($response != '')
|
|
$json_r = json_decode($response, true);
|
|
return $json_r;
|
|
}
|
|
|
|
}
|
|
|