autojs不用oss的sdk, 直接用http上传文件

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 牙叔教程 简单易懂

牙叔教程 简单易懂

目标

自己计算签名, 然后用http上传文件

在Header中包含签名

在这个文档中, 有一个计算签名的例子

import hmac
import hashlib
import base64
h = hmac.new("Q0YehC6ZyugWfjod5y8Rcqrc1y****".encode('utf-8'),
             "PUT\nODBGOERFMDMzQTcxxxzA5QzdFNUYzMDQxNEM\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-oss-meta-magic:abracadabra\nx-oss-meta-author:foo@example.com\n/oss-example/nelson".encode('utf-8'), hashlib.sha1)
signature =  base64.encodestring(h.digest())
print(signature)


这是用python2计算的,

计算结果是

al2vHOlTWQdQtM6oqJAEZh7d****


我们用python2计算一下看是不是

结果不一样子, 搞个锤子

把python代码修改为autojs代码

同时也可以, 参考android 和 java的sdk;

我们只添加必备字段

  • AccessKeyId   LTAI5t7iuxxxUU4ApjG
  • AccessKeySecret   GNrlNLxxxxosQgxuu
  • VERB   PUT
  • \n
  • Date  Sun, 22 Nov 2015 08:16:38 GMT                     此次操作的时间,Date必须为GMT格式且不能为空。
  • CanonicalizedResource          /examplebucket/

签名字符串计算公式

Signature = base64(hmac-sha1(AccessKeySecret,VERB + “\n” + Content-MD5 + “\n”+ Content-Type + “\n” + Date + “\n” + CanonicalizedOSSHeaders+ CanonicalizedResource))


我们只留下必备字段

Signature = base64(hmac-sha1(AccessKeySecret,VERB + "\n" + Date + "\n" + CanonicalizedResource))


上面的python代码去掉多余选项改为

import hmac
import hashlib
import base64
h = hmac.new("LTAI5t7iuNjWdyMkXUU4ApjG".encode('utf-8'),
             "PUT\nThu, 17 Nov 2005 18:49:58 GMT\n/autojs-study/yashu.txt".encode('utf-8'), hashlib.sha1)
signature =  base64.encodestring(h.digest())
print(signature)


运行结果

修改为对应的autojs代码

encryptText = "GNrlNLxxxxakxxxgxuu";
VERB = "PUT";
Date = "Thu, 17 Nov 2005 18:49:58 GMT";
CanonicalizedResource = "/autojs-study/yashu.txt";
encryptKey = VERB + "\n" + Date + "\n" + CanonicalizedResource;
r = HmacSHA1Encrypt(encryptKey, encryptText);


运行结果


上传文件请求语法

PUT / HTTP/1.1
Host: BucketName.oss-cn-hangzhou.aliyuncs.com
Date: GMT Date
x-oss-acl: Permission
Authorization: SignatureValue
<?xml version="1.0" encoding="UTF-8"?>
<CreateBucketConfiguration>
    <StorageClass>Standard</StorageClass>
</CreateBucketConfiguration>


公共HTTP头定义

  • Authorization
  • Content-Length
  • Content-Type
  • Date
  • Host             访问Host值,格式为.oss-cn-hangzhou.aliyuncs.com


不管怎么调, 就是报签名错误

autojs请求代码

let headers = {
  "Content-Type": "application/x-www-form-urlencoded",
  Date: date,
  Authorization: Authorization,
  Host: "autojs-study.oss-cn-beijing.aliyuncs.com",
};
body = {
  "yashu.txt": "bbbb",
};
body = JSON.stringify(body);
let url = "http://autojs-study.oss-cn-beijing.aliyuncs.com";
r = http.request(url, {
  method: "PUT",
  body: body,
  headers: headers,
});
log(r.statusCode);
log(r.body.string());


响应报错内容

<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>


不知道哪里不对, 我觉得我哪里都是按照规则来的,

那么就抓包看看吧

下载一个 wireshark

然后执行python代码, 上传文件

python2 PutObject.py -i LTAI5t7iuxxx4ApjG -k GNrlNLxxxxxSosQgxuu -e oss-cn-beijing.aliyuncs.com -b autojs-study -f localfile.txt -o aliyun3.txt


去oss控制台看看, 文件aliyun3.txt上传成功


快捷键 ctrl + shift + D , 清空wireshark记录, 再次执行python命令, 抓包看看


右击/ 追踪流/ http流

PUT /aliyun3.txt HTTP/1.1
Accept-Encoding: identity
Content-Length: 3
Connection: close
User-Agent: Python-urllib/2.7
Host: autojs-study.oss-cn-beijing.aliyuncs.com
Date: Fri, 03 Jun 2022 08:09:46 GMT
Content-Type: application/x-www-form-urlencoded
Authorization: OSS LTAI5txxxx4ApjG:hjJHO6yP/mkYfFDpPEUjB1lvIOA=
aaa


我们主要关心的是签名,

python的签名计算

def GetSignature(self):
  print(self.bk)
  content = "PUT\n\n{0}\n{1}\n/{2}/{3}".format(self.types,self.GetGMT(),self.bk,self.oj)
  print(content)
  mac = hmac.new("{0}".format(self.sk),content, sha)
  Signature = base64.b64encode(mac.digest())
  return Signature


我们把content打印出来

PUT
application/x-www-form-urlencoded
Fri, 03 Jun 2022 08:09:46 GMT    
/autojs-study/aliyun3.txt


我们用同样的数据计算签名


autojs9支持反引号, 复制黏贴就可以计算签名了, python与autojs计算出来的签名结果是一致的


接下来构造请求

首先是URL

let url = "http://autojs-study.oss-cn-beijing.aliyuncs.com/aliyun3.txt";


然后是拼接 Authorization

Authorization = "OSS " + AccessKeyId + ":" + Signature;


再构造header

let headers = {
  "Accept-Encoding": "identity",
  "Content-Length": "3",
  Connection: "close",
  "User-Agent": "Python-urllib/2.7",
  Host: "autojs-study.oss-cn-beijing.aliyuncs.com",
  Date: "Fri, 03 Jun 2022 08:09:46 GMT",
  "Content-Type": "application/x-www-form-urlencoded",
  Authorization: "OSS LTAI5xxxxU4ApjG:hjJHO6yP/mkYfFDpPEUjB1lvIOA=",
};


最后是body

body = {
  "aliyun3.txt": "bbb",
};
body = JSON.stringify(body);


构造完成, 发起请求

let url = "http://autojs-study.oss-cn-beijing.aliyuncs.com/aliyun3.txt";
r = http.request(url, {
  method: "PUT",
  body: body,
  headers: headers,
});
log(r.statusCode);
log(r.body.string());


报错

RequestTimeTooSkewed


时间过期了, 我们用当前的时间试试

function getTime() {
  return new Date().toGMTString();
}


不出意外, 还是报错, 签名不对


用wireshark抓一下, 手机发送的请求

试了好几个网卡, 都抓不到手机, 在雷电模拟器上运行autojs, 再抓包吧

雷电模拟器抓包的包


之前的python包

PUT /aliyun3.txt HTTP/1.1
Accept-Encoding: identity
Content-Length: 3
Connection: close
User-Agent: Python-urllib/2.7
Host: autojs-study.oss-cn-beijing.aliyuncs.com
Date: Fri, 03 Jun 2022 08:09:46 GMT
Content-Type: application/x-www-form-urlencoded
Authorization: OSS LTAIxxxxApjG:hjJHO6yP/mkYfFDpPEUjB1lvIOA=
aaa


autojs的body是

body = {
  "aliyun3.txt": "bbb",
};


python的body是

aaa


我们把autojs的body改成aaa试试


autojs的body改成了aaa, 可是还是报错签名错误

再抓一遍python的包试试


没有任何区别, 明明一模一样

我是看不出哪里不对, 然后就该干嘛干嘛, 该吃饭吃饭,

但是脑子里还是对这个问题有各种猜想,

有时间了就试试猜想, 然后就蒙对了

不用oss的sdk, 用http就可以上传文件了

测试环境

手机: Mi 11 Pro
Android版本: 12
Autojs版本: 9.1.20


名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程

声明

部分内容来自网络 本教程仅用于学习, 禁止用于其他用途

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
2月前
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1455 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
2月前
|
存储 网络安全 对象存储
缺乏中间证书导致通过HTTPS协议访问OSS异常
【10月更文挑战第4天】缺乏中间证书导致通过HTTPS协议访问OSS异常
141 4
|
5月前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
JSON Java Serverless
函数计算产品使用问题之如何使用Go SDK从HTTP上下文中提取JSON数据
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
JSON Serverless 对象存储
函数计算产品使用问题之如何创建一个同时具有HTTP触发器和OSS触发器的函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
运维 Java Serverless
Serverless 应用引擎产品使用合集之是否提供工具来给OSS配置HTTPS证书
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
7月前
|
消息中间件 网络协议 开发工具
MQ产品使用合集之rocketmq5.x只有tcp接入点吗,python sdk需要http接入点,请问怎么使用
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
228 2
|
7月前
|
安全 Go 开发工具
对象存储OSS产品常见问题之go语言SDK client 和 bucket 并发安全如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
164 9
|
4月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
121 0
|
1月前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
85 1