【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
随便去取 发表于 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-24 19:27
经测试txt文件只能是项目文件夹里,并且如果只有一张图 就会在第二行显示上传txt错误,希望楼主可以改进B ...
哦,没有判断文件类型,你可以自己加一个;
我默认图片的目录只有图片,没有别的,如果 我突然发现我头像被清理。 {:301_1009:} 小莫 发表于 2021-5-24 11:45
我突然发现我头像被清理。
我回你一下看看我的{:301_997:} 图片能存活多久 楼主真厉害,这种方法实在是太好了。 感觉今天上传,明天就被清理了。。 不错的思路,学习下 防盗链不就没法访问了 初级菜鸟 发表于 2021-5-24 14:24
防盗链不就没法访问了
解决防盗链可以用
<meta name="referrer" content="no-referrer" />
叶凯 发表于 2021-5-24 12:09
图片能存活多久
我看不少博客都是外链的新浪图片,虽然19年新浪弄了个防盗链,但很快就被攻破了。
另外,从11年开始就有人在用这玩意做图床了。。