微博图床图片上传流程:模拟登陆 > 获取Cookie > 上传图片 > 获取上传信息 。
核心源码:
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 | <?php /** * Created by PhpStorm. * User: 小灰灰 * Date: 2018/12/23 9:02 * Other: 需登录授权api */ class Test { public function index(){ $u="你的新浪账号"; $p="你的新浪密码"; $cookie =self::weiboLogin($u,$p); //获取的cookie $pic_file = "https://edu.qinhui88.com/assets/static/image/logo.png"; $uploda=self::weiboUpload($pic_file,$cookie); $uplodadata=(json_decode($uploda)); $pid = $uplodadata->{"data"}->{'pics'}->{'pic_1'}->{'pid'}; $get = self::getImageUrl($pid,3); print_r($get); } /** * 新浪微博登录 * @param string $u 微博账户 * @param string $p 密码 * @return string 返回cookie */ function weiboLogin($u,$p){ $loginUrl = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543'; $loginData['entry'] = 'sso'; $loginData['gateway'] = '1'; $loginData['from'] = 'null'; $loginData['savestate'] = '30'; $loginData['useticket'] = '0'; $loginData['pagerefer'] = ''; $loginData['vsnf'] = '1'; $loginData['su'] = base64_encode($u); $loginData['service'] = 'sso'; $loginData['sp'] = $p; $loginData['sr'] = '1920*1080'; $loginData['encoding'] = 'UTF-8'; $loginData['cdult'] = '3'; $loginData['domain'] = 'sina.com.cn'; $loginData['prelt'] = '0'; $loginData['returntype'] = 'TEXT'; return self::loginPost($loginUrl,$loginData); } /** * 发送微博登录请求 * @param string $url 接口地址 * @param array $data 数据 * @return json 返回cookie */ function loginPost($url,$data){ $tmp = ''; if(is_array($data)){ foreach($data as $key =>$value){ $tmp .= $key."=".$value."&"; } $post = trim($tmp,"&"); }else{ $post = $data; } $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_HEADER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$post); $return = curl_exec($ch); curl_close($ch); $preg = "/SUB=.*?;/"; preg_match($preg,$return,$arr); return $arr['0']; } /** * 上传图片到微博图床 * @param $file 图片文件/图片url * @param $multipart 上传方式,true采用本地上传,false采用url上传 * @return 返回的json数据 */ function weiboUpload($file,$cookie, $multipart = true) { $ch = curl_init('http://picupload.service.weibo.com/interface/pic_upload.php?mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_VERBOSE => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Cookie: $cookie"], CURLOPT_POSTFIELDS => ['b64_data' => base64_encode(file_get_contents($file))], ]); $res = curl_exec($ch); curl_close($ch); preg_match('/({.*)/i', $res, $match); if(!isset($match[1])) return ''; return $match[1]; } /** * 获取不同尺寸的图片链接 * @param string $pid 微博图床pid,或者微博图床链接(带后缀)。 * @param string $size 图片尺寸 0-7(数字越大尺寸越大) * @param bool $https (true) 是否使用 https 协议 * @return string 图片链接 当 $pid 既不是 pid 也不是合法的微博图床链接时返回空值 */ function getImageUrl($pid, $size = 0, $https = true){ $sizeArr = array('large', 'mw1024', 'mw690', 'bmiddle', 'small', 'thumb180', 'thumbnail', 'square'); $pid = trim($pid); $sizedata = $sizeArr[$size]; // 传递 pid $data =array( 'large'=> self::geturl($pid,$sizedata) ); return json_encode($data); } /** * 获取图片链接 * @param string $pid 微博图床pid,或者微博图床链接(带后缀)。 * @param string $size 图片尺寸 0-7(数字越大尺寸越大) * @param bool $https (true) 是否使用 https 协议 * @return string 图片链接 当 $pid 既不是 pid 也不是合法的微博图床链接时返回空值 */ function getUrl($pid,$size){ global $https; if (preg_match('/^[a-zA-Z0-9]{32}$/', $pid) === 1) { return ($https ? 'https' : 'http') . '://' . ($https ? 'ws' : 'ww') . ((crc32($pid) & 3) + 1) . ".sinaimg.cn/" . $size . "/$pid." . ($pid[21] === 'g' ? 'gif' : 'jpg'); } // 传递 url $url = $pid; $imgUrl = preg_replace_callback('/^(https?:\/\/[a-z]{2}\d\.sinaimg\.cn\/)'.'(large|bmiddle|mw1024|mw690|small|square|thumb180|thumbnail)'.'(\/[a-z0-9]{32}\.(jpg|gif))$/i', function ($match) use ($size) { return $match[1] . $size . $match[3]; }, $url, -1, $count); if ($count === 0) { return ''; } return $imgUrl; } } |