小莫 发表于 2021-5-24 11:43

【Python】批量上传图片到“新浪图床”并获取图片地址

本帖最后由 小莫 于 2021-5-24 18:30 编辑

前段时间,准备整个随机图片API,然后就到网上爬取了2.8万+张图片,
图片总量高达78.6 GB(其实图片只有42.5GB)


本来准备放自己的服务器的,然后发现我的服务器太小了放不进去。。。。

于是准备去薅资本家的羊毛,找了找,“新浪图床”不错(虽然新浪没有说过他们有图床),

找到了前辈写的浏览器插件:https://github.com/Suxiaogang/WeiboPicBed

但这个对我来说需求不够(毕竟要上传2.8万张)

没办法,只能自己写Python脚本了。

在经历了各种失败和报错,找了各种资料,终于搞定了;

使用库 urllib3

上代码:
# coding=utf-8
import urllib3
import os
import json
import base64
import time


# 上传图片
def UpImg(File):
    try:
      http = urllib3.PoolManager()
      # 设置UA和Cookie
      headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
            'Cookie': '你的新浪Ccookie',
      }
      # 上传接口
      url = "https://picupload.weibo.com/interface/pic_upload.php?ori=1&mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog"


      f = open(File, 'rb')
      values = {
            'b64_data': base64.b64encode(f.read()),   # 将图片转换为base64
            'pic1': File
      }
      f.close()
      r = http.request('POST', url, fields=values, headers=headers)# post方式调用API
      data = r.data.decode('utf-8')# 解析返回内容
      data = data.replace('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />', '')
      data = data.replace('<script type="text/javascript">document.domain="sina.com.cn";</script>', '')
      jData = json.loads(data)# 解析返回的json
      pid = jData['data']['pics']['pic_2']['pid']

      # 拼接图片地址
      imgUrl = 'http://ww1.sinaimg.cn/large/{pid}.jpg'.format(pid=pid)
      print("图片{file}上传成功,地址:{imgUrl}".format(file=File, imgUrl=imgUrl))
      return imgUrl
    except:
      print("图片{file}上传失败,3秒后将重试".format(file=File))
      time.sleep(3)
      UpImg(File)


if __name__ == '__main__':
    path = "需要上传的图片所在目录"
    urlList = []
    for file in os.listdir(path):
      url = UpImg(path + "\\" + file)
      # 写入图片地址到本地文件
      f = open('filelist.txt', 'a+')
      f.write(url + "\n")
      f.close()



完成后:



最后附上我的随机图片API:https://api.aoe.top/Img/RandomBackgroundImg
图片列表地址:https://pan.aoe.top/images/SaveImgs/

[↓↓↓↓ API 效果(每次刷新显示不同的图片)↓↓↓↓]
https://api.aoe.top/Img/RandomBackgroundImg

chen180 发表于 2021-8-19 10:46

随便去取 发表于 2021-5-24 19:27
经测试txt文件只能是项目文件夹里,并且如果只有一张图 就会在第二行显示上传txt错误,希望楼主可以改进B ...

我改了一下,刚学python,改的不好》


# coding=utf-8
import urllib3
import os
import json
import base64
import time

Cookie = '替换为自己的cookies'


# 上传图片
def UpImg(File):
    try:
      http = urllib3.PoolManager()
      # 设置UA和Cookie
      headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
            'Cookie': Cookie,
      }
      # 上传接口
      url = "https://picupload.weibo.com/interface/pic_upload.php?ori=1&mime=image%2Fjpeg&data=base64&url=0&markpos=1&logo=&nick=0&marks=1&app=miniblog"

      f = open(File, 'rb')
      values = {
            'b64_data': base64.b64encode(f.read()),# 将图片转换为base64
            'pic1': File
      }
      f.close()
      r = http.request('POST', url, fields=values, headers=headers)# post方式调用API
      data = r.data.decode('utf-8')# 解析返回内容
      data = data.replace('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />', '')
      data = data.replace('<script type="text/javascript">document.domain="sina.com.cn";</script>', '')
      jData = json.loads(data)# 解析返回的json
      pid = jData['data']['pics']['pic_2']['pid']

      # 拼接图片地址
      imgUrl = 'http://ww1.sinaimg.cn/large/{pid}.jpg'.format(pid=pid)
      print("图片{file}上传成功,地址:{imgUrl}".format(file=File, imgUrl=imgUrl))
      return imgUrl
    except:
      print("图片{file}上传失败,3秒后将重试".format(file=File))
      time.sleep(3)
      print(f'文件上传失败:{file}')
      UpImg(File)
      # return "文件上传失败"


# 允许上传的文件类型
allowFileType = ["jpg", "png", "jpeg", "gif"]

if __name__ == '__main__':
    # Cookie = input("1. 先输入Cookie")
    path = input("2. 输入文件路径")
    urlList = []
    for file in os.listdir(path):
      suffix = os.path.splitext(file)
      if len(suffix) == 2:
            # could pass ?
            fileName = suffix
            fileType = suffix
            if fileType in allowFileType:
                pass
            else:
                print(f'当前数据格式不支持,skip...{file}')
                continue
      else:
            print(f'可能是文件夹:{file}')
            continue

      url = UpImg(path + "\\" + file)
      # 写入图片地址到本地文件 这个文件名称因为携带了 路径,因此再文件夹下
      f = open(path + '\\urls.txt', 'a+')
      f.write(url + "\n")
      f.close()

小莫 发表于 2021-5-25 19:29

随便去取 发表于 2021-5-24 19:27
经测试txt文件只能是项目文件夹里,并且如果只有一张图 就会在第二行显示上传txt错误,希望楼主可以改进B ...

哦,没有判断文件类型,你可以自己加一个;
我默认图片的目录只有图片,没有别的,如果

小莫 发表于 2021-5-24 11:45

我突然发现我头像被清理。 {:301_1009:}

丶伊扬 发表于 2021-5-24 12:08

小莫 发表于 2021-5-24 11:45
我突然发现我头像被清理。

我回你一下看看我的{:301_997:}

叶凯 发表于 2021-5-24 12:09

图片能存活多久

kk1212 发表于 2021-5-24 13:05

楼主真厉害,这种方法实在是太好了。

3404071 发表于 2021-5-24 13:46

感觉今天上传,明天就被清理了。。

牧星 发表于 2021-5-24 13:59

不错的思路,学习下

初级菜鸟 发表于 2021-5-24 14:24

防盗链不就没法访问了

小莫 发表于 2021-5-24 14:37

初级菜鸟 发表于 2021-5-24 14:24
防盗链不就没法访问了

解决防盗链可以用
<meta name="referrer" content="no-referrer" />

小莫 发表于 2021-5-24 14:42

叶凯 发表于 2021-5-24 12:09
图片能存活多久

我看不少博客都是外链的新浪图片,虽然19年新浪弄了个防盗链,但很快就被攻破了。
另外,从11年开始就有人在用这玩意做图床了。。
页: [1] 2 3
查看完整版本: 【Python】批量上传图片到“新浪图床”并获取图片地址