SinaUpload.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. namespace app\common\util;
  3. class SinaUpload
  4. {
  5. public $_config=[];
  6. public function __construct($config=array()){
  7. $this->config($config);
  8. }
  9. public function config($config=array()){
  10. $this->_config = array_merge($this->_config, $config);
  11. }
  12. function check()
  13. {
  14. if (time() - $this->_config['time'] >20*3600 || $this->_config['cookie']=='SUB;' || $this->_config['cookie']==''){
  15. $cookie = self::login($this->_config['user'],$this->_config['pwd']);
  16. if($cookie && $cookie!='SUB;'){
  17. $this->_config['cookie'] = $cookie;
  18. $this->_config['time'] = time();
  19. $config_old = config('maccms');
  20. $config_new['upload']=$config_old['upload'];
  21. $config_new['upload']['api']['weibo'] = $this->_config;
  22. $config_new = array_merge($config_old, $config_new);
  23. $res = mac_arr2file(APP_PATH . 'extra/maccms.php', $config_new);
  24. if ($res === false) {
  25. return ['code'=>'202','msg'=>'写入微博登录状态失败'];
  26. }
  27. }else{
  28. return ['code'=>'203','msg'=>'获取新浪微博cookie出现错误,请检查账号状态或者重新获取cookie'];
  29. }
  30. }
  31. return ['code'=>'1','msg'=>'ok'];
  32. }
  33. function login($u,$p){
  34. $loginUrl = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543';
  35. $loginData['entry'] = 'sso';
  36. $loginData['gateway'] = '1';
  37. $loginData['from'] = 'null';
  38. $loginData['savestate'] = '30';
  39. $loginData['useticket'] = '0';
  40. $loginData['pagerefer'] = '';
  41. $loginData['vsnf'] = '1';
  42. $loginData['su'] = base64_encode($u);
  43. $loginData['service'] = 'sso';
  44. $loginData['sp'] = $p;
  45. $loginData['sr'] = '1920*1080';
  46. $loginData['encoding'] = 'UTF-8';
  47. $loginData['cdult'] = '3';
  48. $loginData['domain'] = 'sina.com.cn';
  49. $loginData['prelt'] = '0';
  50. $loginData['returntype'] = 'TEXT';
  51. return self::loginPost($loginUrl,$loginData);
  52. }
  53. /**
  54. * 发送微博登录请求
  55. * @param string $url 接口地址
  56. * @param array $data 数据
  57. * @return json 算了,还是返回cookie吧//返回登录成功后的用户信息json
  58. */
  59. function loginPost($url,$data){
  60. $tmp = '';
  61. if(is_array($data)){
  62. foreach($data as $key =>$value){
  63. $tmp .= $key."=".$value."&";
  64. }
  65. $post = trim($tmp,"&");
  66. }else{
  67. $post = $data;
  68. }
  69. $ch = curl_init();
  70. curl_setopt($ch,CURLOPT_URL,$url);
  71. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  72. curl_setopt($ch,CURLOPT_HEADER,1);
  73. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  74. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  75. curl_setopt($ch,CURLOPT_POST,1);
  76. curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
  77. $return = curl_exec($ch);
  78. curl_close($ch);
  79. return 'SUB' . self::getSubstr($return,"Set-Cookie: SUB",'; ') . ';';
  80. }
  81. /**
  82. * 取本文中间
  83. */
  84. function getSubstr($str,$leftStr,$rightStr){
  85. $left = strpos($str, $leftStr);
  86. //echo '左边:'.$left;
  87. $right = strpos($str, $rightStr,$left);
  88. //echo '<br>右边:'.$right;
  89. if($left <= 0 or $right < $left) return '';
  90. return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));
  91. }
  92. function upload($file, $multipart = true,$cookie) {
  93. $url = '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';
  94. if($multipart) {
  95. $url .= '&cb=http://weibo.com/aj/static/upimgback.html?_wv=5&callback=STK_ijax_'.time();
  96. if (class_exists('CURLFile')) { // php 5.5
  97. $post['pic1'] = new \CURLFile(realpath($file));
  98. } else {
  99. $post['pic1'] = '@'.realpath($file);
  100. }
  101. } else {
  102. $post['b64_data'] = base64_encode(file_get_contents($file));
  103. }
  104. // Curl提交
  105. $ch = curl_init($url);
  106. curl_setopt_array($ch, array(
  107. CURLOPT_POST => true,
  108. CURLOPT_VERBOSE => true,
  109. CURLOPT_RETURNTRANSFER => true,
  110. CURLOPT_HTTPHEADER => array("Cookie: $cookie"),
  111. CURLOPT_POSTFIELDS => $post,
  112. ));
  113. $output = curl_exec($ch);
  114. curl_close($ch);
  115. // 正则表达式提取返回结果中的json数据
  116. preg_match('/({.*)/i', $output, $match);
  117. if(!isset($match[1])) return ['code'=>'301','msg'=>'上传错误'];
  118. $a=json_decode($match[1],true);
  119. $width = $a['data']['pics']['pic_1']['width'];
  120. $size = $a['data']['pics']['pic_1']['size'];
  121. $height = $a['data']['pics']['pic_1']['height'];
  122. $pid = $a['data']['pics']['pic_1']['pid'];
  123. if(!$pid){return ['code'=>'202','msg'=>'上传错误']; }
  124. $size = 'large';
  125. if(!empty($GLOBALS['config']['upload']['api']['weibo']['size'])){
  126. $size = $GLOBALS['config']['upload']['api']['weibo']['size'];
  127. }
  128. return ['code'=>'200','width'=>$width,"height"=>$height,"size"=>$size,"pid"=>$pid,"url"=>"http://ws3.sinaimg.cn/".$size."/".$pid.".jpg"];
  129. }
  130. }