python版本源码:http://ertao.xyz/info/48/
api文件代码
<?php
2 /**
3 * 上传图片到微博图床
4 * @author Ertao
5 * @param $file 图片文件/图片url
6 * @param $multipart 是否采用multipart方式上传
7 * @return 返回的json数据
8 * @code 200:正常;201:错误;203:cookie获取失败;404:请勿直接访问
9 * @ps 图片尺寸可供选择:square、thumb150、orj360、orj480、mw690、mw1024、mw2048、small、bmiddle、large 默认为:thumb150,请自行替换
10 */
11 header("Access-Control-Allow-Origin:*");
12 header('Content-type: application/json');
13 error_reporting(0);
14 if (!is_file('sina_config.php')) {
15 CookieSet('SUB;','0');
16 }
17 include 'sina_config.php';
18 //账号
19 $sinauser = 'admin';
20 //密码
21 $sinapwd = 'password';
22 if (time() - $config['time'] >20*3600||$config['cookie']=='SUB;') {
23 $cookie = login($sinauser,$sinapwd);
24 if($cookie&&$cookie!='SUB;'){
25 CookieSet($cookie,$time = time());
26 }else{
27 return error('203','获取cookie出现错误,请检查账号状态或者重新获取cookie');
28 }
29 }
30 if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {exit;}
31 $type=$_GET['type'];
32 if($type=='multipart'){
33 $multipart = true;
34 $file = $_FILES["file"]["tmp_name"];
35 }elseif(isset($_GET['img'])){
36 $multipart = false;
37 $file = $_GET['img'];
38 }else{
39 return error('404','请勿直接访问');
40 }
41 if (isset($file) && $file != "") {
42 include 'sina_config.php';
43 $cookie = $config['cookie'];
44 echo upload($file, $multipart,$cookie);
45 }else{
46 return error('201','上传错误');
47 }
48
49 function CookieSet($cookie,$time){
50 $newConfig = '<?php
51 $config = array(
52 "cookie" => "'.$cookie.'",
53 "time" => "'.$time.'",
54 );';
55 @file_put_contents('sina_config.php', $newConfig);
56 }
57
58 function error($code,$msg){
59 $arr = array('code'=>$code,'msg'=>$msg);
60 echo json_encode($arr);
61 }
62 /**
63 * 新浪微博登录(无加密接口版本)
64 * @param string $u 用户名
65 * @param string $p 密码
66 * @return string 返回最有用最精简的cookie
67 */
68 function login($u,$p){
69 $loginUrl = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543';
70 $loginData['entry'] = 'sso';
71 $loginData['gateway'] = '1';
72 $loginData['from'] = 'null';
73 $loginData['savestate'] = '30';
74 $loginData['useticket'] = '0';
75 $loginData['pagerefer'] = '';
76 $loginData['vsnf'] = '1';
77 $loginData['su'] = base64_encode($u);
78 $loginData['service'] = 'sso';
79 $loginData['sp'] = $p;
80 $loginData['sr'] = '1920*1080';
81 $loginData['encoding'] = 'UTF-8';
82 $loginData['cdult'] = '3';
83 $loginData['domain'] = 'sina.com.cn';
84 $loginData['prelt'] = '0';
85 $loginData['returntype'] = 'TEXT';
86 return loginPost($loginUrl,$loginData);
87 }
88
89 /**
90 * 发送微博登录请求
91 * @param string $url 接口地址
92 * @param array $data 数据
93 * @return json 算了,还是返回cookie吧//返回登录成功后的用户信息json
94 */
95 function loginPost($url,$data){
96 $tmp = '';
97 if(is_array($data)){
98 foreach($data as $key =>$value){
99 $tmp .= $key."=".$value."&";
100 }
101 $post = trim($tmp,"&");
102 }else{
103 $post = $data;
104 }
105 $ch = curl_init();
106 curl_setopt($ch,CURLOPT_URL,$url);
107 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
108 curl_setopt($ch,CURLOPT_HEADER,1);
109 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
110 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
111 curl_setopt($ch,CURLOPT_POST,1);
112 curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
113 $return = curl_exec($ch);
114 curl_close($ch);
115 return 'SUB' . getSubstr($return,"Set-Cookie: SUB",'; ') . ';';
116 }
117
118 /**
119 * 取本文中间
120 */
121 function getSubstr($str,$leftStr,$rightStr){
122 $left = strpos($str, $leftStr);
123 //echo '左边:'.$left;
124 $right = strpos($str, $rightStr,$left);
125 //echo '<br>右边:'.$right;
126 if($left <= 0 or $right < $left) return '';
127 return substr($str, $left + strlen($leftStr), $right-$left-strlen($leftStr));
128 }
129
130
131 function upload($file, $multipart = true,$cookie) {
132 $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';
133 if($multipart) {
134 $url .= '&cb=http://weibo.com/aj/static/upimgback.html?_wv=5&callback=STK_ijax_'.time();
135 if (class_exists('CURLFile')) { // php 5.5
136 $post['pic1'] = new \CURLFile(realpath($file));
137 } else {
138 $post['pic1'] = '@'.realpath($file);
139 }
140 } else {
141 $post['b64_data'] = base64_encode(file_get_contents($file));
142 }
143 // Curl提交
144 $ch = curl_init($url);
145 curl_setopt_array($ch, array(
146 CURLOPT_POST => true,
147 CURLOPT_VERBOSE => true,
148 CURLOPT_RETURNTRANSFER => true,
149 CURLOPT_HTTPHEADER => array("Cookie: $cookie"),
150 CURLOPT_POSTFIELDS => $post,
151 ));
152 $output = curl_exec($ch);
153 curl_close($ch);
154 // 正则表达式提取返回结果中的json数据
155 preg_match('/({.*)/i', $output, $match);
156 if(!isset($match[1])) return error('201','上传错误');
157 $a=json_decode($match[1],true);
158 $width = $a['data']['pics']['pic_1']['width'];
159 $size = $a['data']['pics']['pic_1']['size'];
160 $height = $a['data']['pics']['pic_1']['height'];
161 $pid = $a['data']['pics']['pic_1']['pid'];
162 if(!$pid){return error('201','上传错误');}
163 $arr = array('code'=>'200','width'=>$width,"height"=>$height,"size"=>$size,"pid"=>$pid,"url"=>"http://ws3.sinaimg.cn/thumb150/".$pid.".jpg");
164 return json_encode($arr);
165 }
js代码:
/**
* @act 新浪图床上传
* @version 1.0
* @author Ertao
* @date <?php echo date("Y-m-d");?>
* @url http://ertao.xyz
*/
$(document).ready(function() {
$("input[type='file']").change(function(e) {
images_upload(this.files)
});
var obj = $('body');
obj.on('dragenter', function(e) {
e.stopPropagation();
e.preventDefault()
});
obj.on('dragover', function(e) {
e.stopPropagation();
e.preventDefault()
});
obj.on('drop', function(e) {
e.preventDefault();
images_upload(e.originalEvent.dataTransfer.files)
})
});
//远程上传
var url_upload = function() {
var urls = $("#urls").val();
var url_arr = urls.split("\n");
if (urls == "" || url_arr.length == 0) {
layer.alert("请贴入需要上传的网络图片地址.");
return;
}
$('#url_upload_model').modal('hide');
$('.mselector > button')[1].innerHTML = '上传中';
for (var i = 0; i < url_arr.length; i++) {
$.ajax({
url: 'https://api.yum6.cn/sinaimg.php',
type: 'GET',
data: {
img: url_arr[i]
},
cache: false,
dataType: 'json',
success: function(data) {
layer.msg('上传中');
if (typeof data.pid != 'undefined') {
$('#url-res-txt').append('https://ws3.sinaimg.cn/large/'+data.pid + '.jpg\n');
$('.mselector > button')[1].innerHTML = '成功 ' + (i + 1) + '/' + url_arr.length;
var apc = "<img src='" + data.url + "' alt='" + data.url + "'><p><a id='copy' data-clipboard-target='#copy' href='#' title='点击复制链接'>https://ws3.sinaimg.cn/large/" + data.pid + ".jpg</a></p><br>";
$('.preview').css('display', 'block');
$(".preview>hr").after(apc)
} else {
$('.mselector > button')[1].innerHTML = '第' + (i + 1) + '张上传失败'
} if (typeof data.pid != 'undefined') {
$('.mselector > button')[1].innerHTML = '上传成功'
} else {
$('.mselector > button')[1].innerHTML = '上传失败';
$('#url-res-txt').append(data.code + '\n');
layer.alert(data.code)
}
},
error: function(XMLResponse) {
layer.alert("error:" + XMLResponse.responseText)
}
})
}
};
//本地上传
var images_upload = function(files) {
var flag = 0;
$('textarea').empty();
$(files).each(function(key, value) {
$('.mselector > button')[0].innerHTML = '上传中';
image_form = new FormData();
image_form.append('file', value);
$.ajax({
url: 'https://api.ertao.xyz/sinaimg.php?type=multipart', //此处填写API地址,这个地址是原作者提供调用,可以直接使用无问题
type: 'POST',
data: image_form,
mimeType: 'multipart/form-data',
contentType: false,
cache: false,
processData: false,
dataType: 'json',
success: function(data) {
flag++;
if (typeof data.url != 'undefined') {
$('#url-res-txt').append('https://ws3.sinaimg.cn/large/'+data.pid + '.jpg\n');
$('.mselector > button')[0].innerHTML = '成功 ' + flag + '/' + files.length;
var apc = "<img src='" + data.url + "' alt='" + data.url + "'><p><a id='copy"+ flag +"' data-clipboard-target='#copy"+ flag +"' href='#' title='点击复制链接' >https://ws3.sinaimg.cn/large/" + data.pid + ".jpg</a></p><br>";
$('.preview').css('display', 'block');
$(".preview>hr").after(apc)
} else {
$('.mselector > button')[0].innerHTML = '第' + flag + '张上传失败'
} if (flag == $("input[type='file']")[0].files.length) {
if (typeof data.url != 'undefined') {
$('.mselector > button')[0].innerHTML = '上传成功'
} else {
$('.mselector > button')[0].innerHTML = '上传失败';
$('#url-res-txt').append(data.code + '\n');
layer.alert(data.code)
}
}
},
error: function(XMLResponse) {
layer.alert("error:" + XMLResponse.responseText)
}
})
})
};
document.onpaste = function(e) {
var data = e.clipboardData;
for (var i = 0; i < data.items.length; i++) {
var item = data.items[i];
if (item.kind == 'file' && item.type.match(/^image\//i)) {
var blob = item.getAsFile();
images_upload(blob)
}
}
}
//复制
var clipboard = new ClipboardJS('a');
clipboard.on('success',function(e){
e.clearSelection();
layer.msg('复制成功!');
});
clipboard.on('error',function(e){
e.clearSelection();
layer.msg('复制失败!');
});
HTML代码
自己引入css美化
<div class="container clearfix">
<div class="panel panel-default">
<div class="panel-heading">新浪图床外链<small class="text-capitalize">-Sina Img</small></div>
<div class="panel-body">
<div class="text-center">
<div class="mselector">
<input type="file" accept="image/*" multiple="">
<button type="button" class="btn btn-primary">选择本地图片</button>
<button type="button" class="btn btn-success" data-toggle="modal" data-target="#url_upload_model">上传远程图片</button>
</div>
<hr/>
<textarea id="url-res-txt" class="form-control" rows="5" placeholder="上传后的图片外链地址将显示在此处哦、下方会同时显示外链地址和预览图。" ></textarea>
<div class="preview">
<hr/>
</div>
<div id="url_upload_model" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">上传远程图片</h4>
</div>
<div class="modal-body">
<p class="lead">请在下方输入远程图片地址~每行一个~</p>
<textarea class="form-control" name="urls" rows="3" id="urls"></textarea>
<p id="urlUploadNotice"></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary" onclick="url_upload();">上传</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="sinaimg.js"></script>
发表评论