吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5095|回复: 27
收起左侧

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

  [复制链接]
小莫 发表于 2021-5-24 11:43
本帖最后由 小莫 于 2021-5-24 18:30 编辑

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

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

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

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

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

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

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

使用库 urllib3

上代码:
[Python] 纯文本查看 复制代码
# 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()



完成后:
QQ截图20210524110725.png


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

[↓↓↓↓ API 效果(每次刷新显示不同的图片)↓↓↓↓]


免费评分

参与人数 2吾爱币 +3 热心值 +2 收起 理由
kk1212 + 2 + 1 楼主真优秀
jamescookers988 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

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


[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[0]
            fileType = suffix[1][1:]
            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
丶伊扬 发表于 2021-5-24 12:08
小莫 发表于 2021-5-24 11:45
我突然发现我头像被清理。

我回你一下看看我的
叶凯 发表于 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年开始就有人在用这玩意做图床了。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表