ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9135|回复: 30

[求助] 如何通过VBA上传图片到指定网址:https://666666.imgbb.com/

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-1-2 19:55 | 显示全部楼层 |阅读模式
各位大佬晚上好,首先祝大家元旦快乐希望大佬可以抽出宝贵的时间帮我解决一下这个问题
现在手里有几万张图片需要转换成链接,所以我现在想上传这些图片到这个网址网址:https://666666.imgbb.com/
用户名:666666
密码:123123abc


自己已经研究了两天了,不知道怎么办
已经从  http://club.excelhome.net/thread-1159783-1-1.html   这个大佬的帖子中学习过了,可还是上传的时候显示该页面不存在

我使用了这一段代码:
--------------------------------------------------------------------------------------
Sub Main()
    Const Uid As String = "" '论坛UID
    Const Hash As String = "" '上传的Hash,从Fiddler里取
    Dim Boundary As String
    Dim SendData
    Dim FileFullName As String
    Dim FileShortName As String
    Dim Title As String
    Dim Filetype As String

    FileFullName = "D:\测试2.rar"
    FileShortName = Mid(FileFullName, InStrRev(FileFullName, "") + 1)
    Title = Left(FileShortName, InStrRev(FileShortName, ".") - 1)
    Filetype = "rar"

    '获取Boundary
    Boundary = GetBoundary()
    '获取上传所需的SendData
    SendData = GetUpLoadSendData(Boundary, FileFullName, _
                "Filename", FileShortName, _
                "proid", "0", _
                "hash", Hash, _
                "uid", Uid, _
                "title", Title, _
                "filetype", Filetype, _
                "Filedata", FileShortName, _
                "Upload", "Submit Query")

    '上传
    With CreateObject("MSXML2.XMLHTTP")
        .Open "POST", "http://club.excelhome.net/misc.php?mod=swfupload&fid=2&action=swfupload&operation=upload", False
        .setRequestHeader "Content-Type", "multipart/form-data; boundary=" & Boundary
        .Send SendData
        Debug.Print .responsetext '出现一串数字则为成功。到论坛发帖的界面可看到“未使用的附件”的提示。
    End With
End Sub

Function GetBoundary() As String
    '生成Boundary
    Dim i As Integer, r As Integer
    Do While i < 30
        r = Int(Rnd * 75 + 48)
        If r < 58 Or (r > 64 And r < 91) Or r > 96 Then
            GetBoundary = GetBoundary & Chr(r)
            i = i + 1
        End If
    Loop
    GetBoundary = String(10, "-") & GetBoundary
End Function

Function GetUpLoadSendData(Boundary As String, FileFullName As String, ParamArray NameValue()) As Byte()
    'NameValue()必须成双,前一个是名称,后一个是值
    'NameValue()最后一对是文件流之后的名称值对
    'NameValue()倒数第二对是文件流信息相关的两个数据

    Dim DataBefore, DataAfter
    Dim arrBytData(1 To 3), bytData() As Byte
    Dim i As Long, j As Long, n As Long

    '连接文件流之前的各项名称值对
    For i = 0 To UBound(NameValue) - 4 Step 2 '最后两对单独处理
        DataBefore = DataBefore & "--" & Boundary & vbCrLf
        DataBefore = DataBefore & "Content-Disposition: form-data; name=""" & NameValue(i) & """" & vbCrLf
        DataBefore = DataBefore & vbCrLf
        DataBefore = DataBefore & NameValue(i + 1) & vbCrLf
    Next

    '连接文件流此项的Content-Disposition
    DataBefore = DataBefore & "--" & Boundary & vbCrLf
    DataBefore = DataBefore & "Content-Disposition: form-data; name=""" & NameValue(i) & """; filename=""" & NameValue(i + 1) & """" & vbCrLf
    DataBefore = DataBefore & "Content-Type: application/octet-stream" & vbCrLf
    DataBefore = DataBefore & vbCrLf

    '文件流前面的字符串转为流
    arrBytData(1) = StrToUTF8Byte(DataBefore)

    '文件转流
    arrBytData(2) = FileToByte(FileFullName)

    '文件流之后的字符串(一项)
    DataAfter = "--" & Boundary & vbCrLf
    DataAfter = DataAfter & "Content-Disposition: form-data; name=""" & NameValue(i) & """" & vbCrLf
    DataAfter = DataAfter & vbCrLf
    DataAfter = DataAfter & NameValue(i + 1) & vbCrLf
    DataAfter = DataAfter & "--" & Boundary & "--"
    arrBytData(3) = StrToUTF8Byte(DataAfter) '转为流

    '合并字符流和文件流
    ReDim bytData(UBound(arrBytData(1)) + UBound(arrBytData(2)) + UBound(arrBytData(3)) + 2)
    For i = 1 To 3
        For j = 0 To UBound(arrBytData(i))
            bytData(n) = arrBytData(i)(j)
            n = n + 1
        Next
    Next

    GetUpLoadSendData = bytData
End Function

Function StrToUTF8Byte(strText)
    '文本转UTF-8编码并去除BOM头
    With CreateObject("adodb.stream")
        .Mode = 3 'adModeReadWrite
        .Type = 2 'adTypeText
        .Charset = "UTF-8"
        .Open
        .Writetext strText
        .Position = 0
        .Type = 1 'adTypeBinary
        .Position = 3 '去除UTF-8编码文本前面的BOM头(三个字节)
        StrToUTF8Byte = .Read()
        .Close
    End With
End Function

Function FileToByte(strFileName As String)
    '文件转流
     With CreateObject("Adodb.Stream")
        .Open
        .Type = 1 'adTypeBinary
        .LoadFromFile strFileName
        FileToByte = .Read
        .Close
    End With
End Function


--------------------------------------------------------------------------------------

该网站带了API对接,可是不知道怎么用,就在网站的左上角

新人第一次发帖,期待各位大佬的指点


下面是各位大佬可能会用到的自定义公式:
大部分还是从这个帖子复制的:
不懂html也来学网抓(xmlhttp/winhttp+fiddler)
http://club.excelhome.net/thread-1159783-1-1.html
(出处: ExcelHome技术论坛)
向前辈致敬

Function GetBoundary() As String
    '生成Boundary
    Dim I As Integer, r As Integer
    Do While I < 16
        r = Int(Rnd * 75 + 48)
        If r < 58 Or (r > 64 And r < 91) Or r > 96 Then
            GetBoundary = GetBoundary & Chr(r)
            I = I + 1
        End If
    Loop
    GetBoundary = String(4, "-") & "WebKitFormBoundary" & GetBoundary
End Function

Function GetUpLoadSendData(Boundary As String, filePath As String, Timestamp As String, Auth_token As String) As Byte()

    Dim DataBefore, DataAfter
    Dim arrBytData(1 To 3), bytData() As Byte
    Dim I As Long, j As Long, n As Long

    '文件流之前的字符串
    DataBefore = DataBefore & "--" & Boundary & vbCrLf
    DataBefore = DataBefore & "Content-Disposition: form-data; name=" & Chr(34) & "source" & Chr(34) & "; filename=" & Chr(34) & qqq & Chr(34) & vbCrLf
    DataBefore = DataBefore & "Content-Type: image/jpeg" & vbCrLf
    DataBefore = DataBefore & vbCrLf


    '文件流前面的字符串转为流
    arrBytData(1) = StrToUTF8Byte(DataBefore)

    '文件转流
    arrBytData(2) = FileToByte(filePath)

    '文件流之后的字符串
    DataAfter = "--" & Boundary & vbCrLf
    DataAfter = DataAfter & "Content-Disposition: form-data; name=" & Chr(34) & " type " & Chr(34) & vbCrLf
    DataAfter = DataAfter & vbCrLf
    DataAfter = DataAfter & "file" & vbCrLf

    DataAfter = "--" & Boundary & vbCrLf
    DataAfter = DataAfter & "Content-Disposition: form-data; name=" & Chr(34) & " action " & Chr(34) & vbCrLf
    DataAfter = DataAfter & vbCrLf
    DataAfter = DataAfter & "upload" & vbCrLf

    DataAfter = "--" & Boundary & vbCrLf
    DataAfter = DataAfter & "Content-Disposition: form-data; name=" & Chr(34) & " timestamp " & Chr(34) & vbCrLf
    DataAfter = DataAfter & vbCrLf
    DataAfter = DataAfter & Timestamp & vbCrLf

    DataAfter = "--" & Boundary & vbCrLf
    DataAfter = DataAfter & "Content-Disposition: form-data; name=" & Chr(34) & " auth_token " & Chr(34) & vbCrLf
    DataAfter = DataAfter & vbCrLf
    DataAfter = DataAfter & Auth_token & vbCrLf

    DataAfter = "--" & Boundary & vbCrLf
    DataAfter = DataAfter & "Content-Disposition: form-data; name=" & Chr(34) & " album_id " & Chr(34) & vbCrLf
    DataAfter = DataAfter & vbCrLf
    DataAfter = DataAfter & "6Jn83D" & vbCrLf

    DataAfter = "--" & Boundary & vbCrLf
    DataAfter = DataAfter & "Content-Disposition: form-data; name=" & Chr(34) & " expiration " & Chr(34) & vbCrLf
    DataAfter = DataAfter & vbCrLf
    DataAfter = DataAfter & "P1W" & vbCrLf

    DataAfter = DataAfter & "--" & Boundary & "--"
    arrBytData(3) = StrToUTF8Byte(DataAfter) '转为流

    '合并字符流和文件流
    ReDim bytData(UBound(arrBytData(1)) + UBound(arrBytData(2)) + UBound(arrBytData(3)) + 2)
    For I = 1 To 3
        For j = 0 To UBound(arrBytData(I))
            bytData(n) = arrBytData(I)(j)
            n = n + 1
        Next
    Next

    GetUpLoadSendData = bytData
End Function

Function StrToUTF8Byte(strText)
    '文本转UTF-8编码并去除BOM头
    With CreateObject("adodb.stream")
        .Mode = 3 'adModeReadWrite
        .Type = 2 'adTypeText
        .Charset = "UTF-8"
        .Open
        .Writetext strText
        .Position = 0
        .Type = 1 'adTypeBinary
        .Position = 3 '去除UTF-8编码文本前面的BOM头(三个字节)
        StrToUTF8Byte = .Read()
        .Close
    End With
End Function

Function FileToByte(strFileName As String)
    '文件转流
     With CreateObject("Adodb.Stream")
        .Open
        .Type = 1 'adTypeBinary
        .LoadFromFile strFileName
        FileToByte = .Read
        .Close
    End With
End Function




TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-2 19:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
当然我的目的是要图片的链接,如果有其他方法非常感谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-2 20:00 | 显示全部楼层
只需要帮我把图片成功传上去就可以了,剩下的我相信自己可以解决,非常感谢

TA的精华主题

TA的得分主题

发表于 2021-1-3 06:20 来自手机 | 显示全部楼层
lingshimizi 发表于 2021-1-2 19:58
当然我的目的是要图片的链接,如果有其他方法非常感谢

curl --location --request POST "https://api.imgbb.com/1/upload?expiration=600&key=YOUR_CLIENT_API_KEY" --form "image=R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"

需要key

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-3 09:18 | 显示全部楼层
zpy2 发表于 2021-1-3 06:20
curl --location --request POST "https://api.imgbb.com/1/upload?expiration=600&key=YOUR_CLIENT_API_ ...

非常感谢您的回复

7a850eb392949184c993cf7e43305aba
cd99d232322357c06a065b33299362b7
48cfe7fc9b454d8b813bbc2268b3389f

这个点击添加就可以了,我刚添加了三个

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-3 09:34 | 显示全部楼层
curl --location --request POST "https://api.imgbb.com/1/upload?&key=48cfe7fc9b454d8b813bbc2268b3389f" --form "image=R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
(里面有四个参数:
Parameters
key (required)
The API key.
image (required)
A binary file, base64 data, or a URL for an image. (up to 32 MB)
name (optional)
The name of the file, this is automatically detected if uploading a file with a POST and multipart / form-data
expiration (optional)
Enable this if you want to force uploads to be auto deleted after certain time (in seconds 60-15552000)

参量
密钥(必填)
API密钥。
图片(必填)
二进制文件,base64数据或图像的URL。 (最大32 MB)
名称(可选)
文件名,如果上传带有POST和multipart / form-data的文件,则会自动检测到该文件名
到期(可选)
如果您要强制在一定时间后(60秒至55552000秒)自动删除上载,请启用此选项)


这是人家提供的josn响应示例:
(说实话,完全不知道怎么用在VBA里面)
{
  "data": {
    "id": "2ndCYJK",
    "title": "c1f64245afb2",
    "url_viewer": "https://ibb.co/2ndCYJK",
    "url": "https://i.ibb.co/w04Prt6/c1f64245afb2.gif",
    "display_url": "https://i.ibb.co/98W13PY/c1f64245afb2.gif",
    "size": "42",
    "time": "1552042565",
    "expiration":"0",
    "image": {
      "filename": "c1f64245afb2.gif",
      "name": "c1f64245afb2",
      "mime": "image/gif",
      "extension": "gif",
      "url": "https://i.ibb.co/w04Prt6/c1f64245afb2.gif",
    },
    "thumb": {
      "filename": "c1f64245afb2.gif",
      "name": "c1f64245afb2",
      "mime": "image/gif",
      "extension": "gif",
      "url": "https://i.ibb.co/2ndCYJK/c1f64245afb2.gif",
    },
    "medium": {
      "filename": "c1f64245afb2.gif",
      "name": "c1f64245afb2",
      "mime": "image/gif",
      "extension": "gif",
      "url": "https://i.ibb.co/98W13PY/c1f64245afb2.gif",
    },
    "delete_url": "https://ibb.co/2ndCYJK/670a7e48ddcb85ac340c717a41047e5c"
  },
  "success": true,
  "status": 200
}

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-3 09:49 | 显示全部楼层
本帖最后由 lingshimizi 于 2021-1-3 10:40 编辑

这里有个图片

响应示例也可以在那个网页上找到
1 (1).jpg

TA的精华主题

TA的得分主题

发表于 2021-1-3 11:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
selenium可以实现批量上传文件,你研究下

TA的精华主题

TA的得分主题

发表于 2021-1-3 11:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
image.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-3 11:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lingshimizi 于 2021-1-3 11:28 编辑

这个确实可以一次拖进去好多个,可是我的是图片在两千个文件夹里面的,每个文件夹有1到30个图片后续可能增加到两万个文件夹
只需要成功传上去得到链接就好,后续的我可以自己想办法解决
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-8 07:45 , Processed in 0.047379 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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