美文网首页
利用微博当图床-php语言实现

利用微博当图床-php语言实现

作者: 四季变幻 | 来源:发表于2019-03-13 15:48 被阅读0次

什么是微博图床?

微博图床,指把图片上传到新浪微博的图库,然后用这个图片外链达到节约本地服务器空间及加快图片加载速度的目的。

相比于其它的图床,利用微博当图床具有加载速度快、不限流量、不限容量等优点。网上有许多浏览器插件或在线工具能够实现。直接利用第三方的工具如果只是上传一两张图片倒也方便,如果要大批量上传并获取外链就得自己写一个了。

微博图床实现方法探究

目前已知有两个方法能实现,其一是利用微博官方的开放平台的发微博 API 实现。这种方法也是我最先考虑的方法,因为毕竟是官方渠道,应该靠谱些。

然而经过一番折腾后,我发现这一方法根本不可行。因为微博限制了这一 API 的调用频次,在连续上传时立即就会被封堵。 流汗

方法二是利用微博的 MINI 发布框(http://weibo.com/minipublish)的图片上传功能。

正是这个发布框暴露了微博的一个图片上传接口

  1. http://picupload.service.weibo.com/interface/pic_upload.php

网上的这些微博图床大都也是利用这个接口实现的。

利用这一接口的优点是可以实现快速连续上传图片而不被封。缺点是必须要带着微博登录的 Cookie 才能访问。

PHP代码

说了这么多,现在贴一下相关php代码:

  1. /**

    • 上传图片到微博图床
    • @param $file 图片文件/图片url
    • @param $multipart 是否采用multipart方式上传
    • @return 返回的json数据
  2. */

  3. function upload(file,multipart = true) {

  4. $cookie = ''; // 微博cookie

  5. $url = 'http://picupload.service.weibo.com/interface/pic_upload.php'

  6. .'?mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog';

  7. if($multipart) {

  8. $url .= '&cb=http://weibo.com/aj/static/upimgback.html?wv=5&callback=STK_ijax'.time();

  9. if (class_exists('CURLFile')) { // php 5.5

  10. post['pic1'] = new CURLFile(realpath(file));

  11. } else {

  12. post['pic1'] = '@'.realpath(file);

  13. }

  14. } else {

  15. post['b64_data'] = base64_encode(file_get_contents(file));

  16. }

  17. // Curl提交

  18. ch = curl_init(url);

  19. curl_setopt_array($ch, array(

  20. CURLOPT_POST => true,

  21. CURLOPT_VERBOSE => true,

  22. CURLOPT_RETURNTRANSFER => true,

  23. CURLOPT_HTTPHEADER => array("Cookie: $cookie"),

  24. CURLOPT_POSTFIELDS => $post,

  25. ));

  26. output = curl_exec(ch);

  27. curl_close($ch);

  28. // 正则表达式提取返回结果中的json数据

  29. preg_match('/({.*)/i', output,match);

  30. if(!isset($match[1])) return '';

  31. return $match[1];

  32. }

如你所见,代码中包含两种上传方式,一种是 multipart 方式上传,通过这种方式上传效率较高,局限性是只能上传服务器的本地图片。

另一种方式是base64方式,可以上传远程图片。(文字的表述可能不清楚,用代码就明白了 惊讶

)

  1. upload('mypic.jpg', true); // multipart方式上传
  2. upload('http://www.mysite.cn/mypic.jpg', false); // 非multipart方式(base64)上传

无论通过以上哪种方式,返回的都会是一段如下所示的json数据。

  1. {"code":"A20001","data":{"count":2,"data":"eyJ1aWQiOjIyODczOTc1NzUsImFwcCI6Im1pbmlibG9nIiwiY291bnQiOjIsInRpbWUiOjE0OTM3ODE0NzQuMzQ5LCJwaWNzIjp7InBpY18yIjp7InJldCI6LTIsIm5hbWUiOiJwaWNfMiJ9LCJwaWNfMSI6eyJ3aWR0aCI6MzAwLCJzaXplIjo4Njk5LCJyZXQiOjEsImhlaWdodCI6MzAwLCJuYW1lIjoicGljXzEiLCJwaWQiOiI4ODU2ZWFjN2d5MWZmODA4NGhtanpqMjA4YzA4YzN5ZSJ9fX0=","pics":{"pic_2":{"ret":-2,"name":"pic_2"},"pic_1":{"width":300,"size":8699,"ret":1,"height":300,"name":"pic_1","pid":"8856eac7gy1ff8084hmjzj208c08c3ye"}}}}

其它的不用管,我们只需要 pic_1 这个子节点中的数据

利用微博当图床-php语言实现

如图所示,pid码就是忙活了这么久之后最终要用到的。

http://ww2.sinaimg.cn/large/ + 获取到的pid 就能组合成图片的外链。

比如上面示范的那段数据中包含的图片外链地址就是

http://ww2.sinaimg.cn/large/8856eac7gy1ff8084hmjzj208c08c3ye

其实 pid 中还包含了更多“秘密”,这里提供一下 pid 的终极解码算法 坏笑

  1. /**
    • @param string $pid 微博图床pid,或者微博图床链接。传递的是链接的话,
    • 仅是将链接的尺寸更改为目标尺寸而已。 
      
    • @param string $size 图片尺寸
    • @param bool $https (true) 是否使用 https 协议
    • @return string 图片链接
    • 当 $pid 既不是 pid 也不是合法的微博图床链接时返回空值
  2. */
  3. function getImageUrl(pid,size = 0, $https = true)
  4. {
  5. $sizeArr = array('large', 'mw1024', 'mw690', 'bmiddle', 'small', 'thumb180', 'thumbnail', 'square');
  6. pid = trim(pid);
  7. size =sizeArr[$size];
  8. // 传递 pid
  9. if (preg_match('/^[a-zA-Z0-9]{32}/',pid) === 1) {
  10. return (https ? 'https' : 'http') . '://' . (https ? 'ws' : 'ww')
  11. . ((crc32(pid) & 3) + 1) . ".sinaimg.cn/" .size
  12. . "/pid." . (pid[21] === 'g' ? 'gif' : 'jpg');
  13. }
  14. // 传递 url
  15. url =pid;
  16. $imgUrl = preg_replace_callback('/^(https?://[a-z]{2}\d.sinaimg.cn/)'
  17. . '(large|bmiddle|mw1024|mw690|small|square|thumb180|thumbnail)'
  18. . '(/[a-z0-9]{32}.(jpg|gif))/i', function (match) use ($size) {
  19. return match[1] .size . $match[3];
  20. }, url, -1,count);
  21. if ($count === 0) {
  22. return '';
  23. }
  24. return $imgUrl;
  25. }

附:微博Cookie获取方法

首先登录微博,然后按F12打开控制台 Network,然后再刷新页面就可以在 Headers 中看到cookie。

利用微博当图床-php语言实现 注:微博 cookie 的有效期似乎只有一天……要想“永久”有效,还得研究研究微博的模拟登录算法……博主水平有限,暂未研究成功 大哭

原文:https://mkblog.cn/854/#title-2
相关:
https://github.com/178146582/Fantasy-field

发现一个微博图床API和图片上传代码

Weibo-Picture-Store: 又一款新浪微博图床 Chrome 插件,支持自定义尺寸

已知的自定义裁剪格式:
large -> 原始图片
mw690 -> 最大 690 像素宽度裁剪
thumbnail -> 缩略图
small -> 小图
square -> 80 像素正方形裁剪
thumb150 -> 150 像素正方形裁剪
thumb180 -> 180 像素正方形裁剪
thumb300 -> 300 像素正方形裁剪
orj180 -> 180 像素宽度原比例缩放
orj360 -> 360 像素宽度原比例缩放
crop.x.y.x1.y1.w -> 自定义矩形裁剪,其中 x, y 表示左上角坐标,x1, y1 表示右下角坐标,w 是宽度

相关文章

  • 利用微博当图床-php语言实现

    什么是微博图床? 微博图床,指把图片上传到新浪微博的图库,然后用这个图片外链达到节约本地服务器空间及加快图片加载速...

  • 微博图床,上传图片的小能手

    前言 寻找一个免费的图床软件,微博图床真的是太好不过了~~(手动感谢微博图床!)。之前安装微博图床的chrome插...

  • 微博图床

    title: 微博图床date: 2017-01-11 15:45:28tags: 实用工具categories:...

  • Markdown图床的选择

    强烈推荐,有道云笔记的Markdown功能,实现多客户端同步编写,以及在线预览 国内图床 七牛   收费 微博图床...

  • GitHub + jsDelivr + PicGo打造免费图床

    GitHub + jsDelivr + PicGo 打造稳定快速、高效免费图床 目前图床优劣 微博等博客图床:以前...

  • (图床源码) 免费新浪图床源码

    PHP幻想领域轻量级新浪图床源码是使用 PHP 语言开发的一款轻量级的新浪图床系统.它的诞生,并不是最终的解决方案...

  • hexo使用新浪微博图床自动部署

    使用新浪微博图床请先参考之前两篇文章: python模拟微博登陆 使用新浪微博图床 自动部署涉及到以下文章: Li...

  • MarkDown使用分享

    Chrome插件:新浪微博图床 使用方法:上传或拖曳图片转换为html或UBB或MarkDown格式 下载地址:微博图床

  • 使用新浪微博图床

    首先感谢新浪微博提供的免费图床(对外链无限制),以及吊炸天的cdn图片加速服务,从此妈妈再也不用担心我的图床不能用...

  • 好用的Chrome插件

    新浪微博图床 (需要登录新浪微博) SimpleUndoClose (恢复近期关闭的网站标签) SwitchyOm...

网友评论

      本文标题:利用微博当图床-php语言实现

      本文链接:https://www.haomeiwen.com/subject/bnxtmqtx.html