Python自动上传图片到路过图床

本文最后更新于:2 年前

前言


之前介绍了上传图片到imgbox,使用了第三方模块,那么我们现在用requests实现怎么上传图片到路过图床。

流程


首先我们先访问路过网站注册一个新的账号,然后登陆。F12获取登陆的cookie,用于填充在以下的代码中:

至于要提交什么数据其实使用Fiddler就可以了,但是这个不是我们今天讨论的重点。我们先来看看python是怎么实现的。

废话不多说,上代码:

import requests
import time
import json
import re


# 上传图片到路过图床
def send_luguo(img_loc=None):
    # 提交的数据为multi-part,一部分是文件,一部分是数据
    
    ## 打开文件二进制流,命名为source,抓取到的,类型为image/jpeg
    img = open(img_loc, "rb")
    files = [('source', (img_loc.split('\\')[-1], img, 'image/jpeg'))]
    
    ## 提交的数据中有一个重要的字符串为auth_token,基本上会定时变,所以在上传之前我们先访问一次页面获取一下 
    auth_token = get_auth_token()
    data = {
        'type': 'file',
        'action': 'upload',
        'timestamp': int(time.time()) * 1000,
        'auth_token': auth_token,
        'nsfw': "0"
    }
	
    ## 请求的地址
    des_url = 'https://imgtu.com/json'
    
    ## 提交数据和文件,cookies也是转换好的
    try:
        des_post = requests.post(
            url=des_url,
            data=data,
            files=files,
            cookies=luguo_cookies)
        response = des_post.content.decode()
        data = json.loads(response)
        print(data)
        return data['image']['url']
    except Exception as exc:
        print('截图上传失败……%s' % exc)
        return None


# 上传之前先访问一次页面获取auth_token
def get_auth_token():
    url = 'https://imgtu.com/'
    response = requests.get(url, cookies=luguo_cookies)
    html = response.content.decode()
    token = re.search('auth_token=[a-z0-9]*', html).group()
    token = token.split('=')[-1].strip()
    return token


## 将cookie字符串转换成字典的形式
def cookies_raw2jar(raw: str) -> dict:
    """
    Arrange Cookies from raw using SimpleCookies
    """
    if not raw:
        raise ValueError("The Cookies is not allowed to be empty.")

    from http.cookies import SimpleCookie
    cookie = SimpleCookie(raw)
    return {key: morsel.value for key, morsel in cookie.items()}


if __name__ == "__main__":
    luguo_cookie_raw = "" # 登录后获取到的cookie字符串
    luguo_cookies = cookies_raw2jar(luguo_cookie_raw) # 转换成字典
    img_path = r"E:\HUDBT\imgs\Blood.of.Zeus.S01E08.War.for.Olympus.1080p.NF.WEB-DL.DDP5.1.x264-MZABI.mkv.jpg" # 测试的图片链接
    send_luguo(img_path, auth_token) # 上传返回的是图片的地址

输出结果(隐去了一部分不重要的个人信息):

{
  'status_code': 200,
  'success': {
    'message': 'image uploaded',
    'code': 200
  },
  'image': {
    'name': '6oOpND',
    'extension': 'jpg',
    'size': 195587,
    'width': '1216',
    'height': '1055',
    'date': '2021-03-22 19:57:12',
    'date_gmt': '2021-03-22 11:57:12',
    'title': 'Blood.of.Zeus.S01E08.War.for.Olympus.1080p.NF.WEB DL.DDP5.1.x264 MZABI.mkv',
    'description': None,
    'nsfw': '0',
    'storage_mode': 'datefolder',
    'md5': '7cf830075aff82dd6a8bb32d5ad565d7',
    'original_filename': 'Blood.of.Zeus.S01E08.War.for.Olympus.1080p.NF.WEB-DL.DDP5.1.x264-MZABI.mkv.jpg',
    'original_exifdata': '{"FileName":"Blood.of.Zeus.S01E08.War.for.Olympus.1080p.NF.WEB-DL.DDP5.1.x264-MZABI.mkv.jpg","FileDateTime":"1616414232","FileSize":"195587","FileType":"2","MimeType":"image\\/jpeg","SectionsFound":"","COMPUTED":{"html":"width=\\"1216\\" height=\\"1055\\"","Height":"1055","Width":"1216","IsColor":"1"}}',
    'views': '0',
    'category_id': None,
    'chain': '7',
    'thumb_size': '12273',
    'medium_size': '118214',
    'expiration_date_gmt': None,
    'likes': '0',
    'is_animated': '0',
    'source_md5': None,
    'is_approved': '1',
    'file': {
      'resource': {
        'type': 'url'
      }
    },
    'id_encoded': '6oOpND',
    'filename': '6oOpND.jpg',
    'mime': 'image/jpeg',
    'url': 'https://z3.ax1x.com/2021/03/22/6oOpND.jpg',
    'ratio': 1.15260663507109,
    'size_formatted': '195.6 KB',
    'url_viewer': 'https://imgtu.com/i/6oOpND',
    'url_short': 'https://imgtu.com/i/6oOpND',
    'image': {
      'filename': '6oOpND.jpg',
      'name': '6oOpND',
      'mime': 'image/jpeg',
      'extension': 'jpg',
      'url': 'https://z3.ax1x.com/2021/03/22/6oOpND.jpg',
      'size': 195587
    },
    'thumb': {
      'filename': '6oOpND.th.jpg',
      'name': '6oOpND.th',
      'mime': 'image/jpeg',
      'extension': 'jpg',
      'url': 'https://z3.ax1x.com/2021/03/22/6oOpND.th.jpg',
      'size': '12273'
    },
    'medium': {
      'filename': '6oOpND.md.jpg',
      'name': '6oOpND.md',
      'mime': 'image/jpeg',
      'extension': 'jpg',
      'url': 'https://z3.ax1x.com/2021/03/22/6oOpND.md.jpg',
      'size': '118214'
    },
    'display_url': 'https://z3.ax1x.com/2021/03/22/6oOpND.md.jpg',
    'display_width': '680',
    'display_height': 590,
    'views_label': '次浏览',
    'likes_label': '喜欢',
    'how_long_ago': '2 秒 前',
    'date_fixed_peer': '2021-03-22 19:57:12',
    'title_truncated': 'Blood.of.Zeus.S01E08.War....',
    'title_truncated_html': 'Blood.of.Zeus.S01E08.War....',
    'is_use_loader': False
  },
  'request': {
    'type': 'file',
    'action': 'upload',
    'timestamp': '1616414181000',
    'auth_token': '',
    'nsfw': '0'
  },
  'status_txt': 'OK'
}

测试图片:

测试图片

其实发现提供的数据还是挺多的,不仅包括图片链接,还有缩略小图和中等大小的图片。国内很多图床都是这种架构,那么只需要更改部分代码就可以实现上传图片到其他图床了,但是——请不要滥用。

本文只做技术探讨,不鼓励存放过多无意义的图片。本文属于原创作品,如果你喜欢这篇文章请收藏转发,或者给作者一定的打赏支持吧。



本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!