NBus 之 WeiboHandler

Weibo SDK 分析,基于 Weibo SDK 3.3.0 和微博 11.1.1。


记录

分享

TextMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
[Data-Keyed] (1/2) app {
aid = "01A0tAyBhBRcxbuKyhgO3YHALNnaItFocWvdk3o9pNKtpBnf4.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (2/2) sdkVersion 003233000

https://open.weibo.com/weibosdk/request
?checkLink=https://mock.bus.nuomi1.com/weibo/2967526297/
&newVersion=3.3
&objId=D3F0EC56-E29F-4260-9C79-8E23597A183F
校验
1
2
3
4
5
6
7
8
9
10
11
12
13
[Data-Keyed] (1/2) app {
aid = "01A0tAyBhBRcxbuKyhgO3YHALNnaItFocWvdk3o9pNKtpBnf4.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (2/2) sdkVersion 003233000

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?checkLink=https://open.weibo.com/weibosdk
&checkStatus=1
&id=D3F0EC56-E29F-4260-9C79-8E23597A183F
二次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[Data-Keyed] (1/4) transferObject {
"__class" = WBSendMessageToWeiboRequest;
message = {
"__class" = WBMessageObject;
text = "\U90a3\U4e48\Uff0c \U5e26\U7740\U8fd9\U4e9b\U95ee\U9898\Uff0c\U6211\U4eec\U6765\U5ba1\U89c6\U4e00\U4e0bBUS\U3002 \U53ef\U662f\Uff0c\U5373\U4f7f\U662f\U8fd9\U6837\Uff0cBUS\U7684\U51fa\U73b0\U4ecd\U7136\U4ee3\U8868\U4e86\U4e00\U5b9a\U7684\U610f\U4e49\U3002 BUS\U7684\U53d1\U751f\Uff0c\U5230\U5e95\U9700\U8981\U5982\U4f55\U505a\U5230\Uff0c\U4e0dBUS\U7684\U53d1\U751f\Uff0c\U53c8\U4f1a\U5982\U4f55\U4ea7\U751f\U3002 \U751f\U6d3b\U4e2d\Uff0c\U82e5BUS\U51fa\U73b0\U4e86\Uff0c\U6211\U4eec\U5c31\U4e0d\U5f97\U4e0d\U8003\U8651\U5b83\U51fa\U73b0\U4e86\U7684\U4e8b\U5b9e\U3002 \U7ecf\U8fc7\U4e0a\U8ff0\U8ba8\U8bba\Uff0c \U90a3\U4e48\Uff0c \U65e2\U7136\U5982\U4f55\Uff0c \U73b0\U5728\Uff0c\U89e3\U51b3BUS\U7684\U95ee\U9898\Uff0c\U662f\U975e\U5e38\U975e\U5e38\U91cd\U8981\U7684\U3002 \U6240\U4ee5\Uff0c \U6211\U4eec\U90fd\U77e5\U9053\Uff0c\U53ea\U8981\U6709\U610f\U4e49\Uff0c\U90a3\U4e48\U5c31\U5fc5\U987b\U614e\U91cd\U8003\U8651\U3002 \U8fd9\U79cd\U4e8b\U5b9e\U5bf9\U672c\U4eba\U6765\U8bf4\U610f\U4e49\U91cd\U5927\Uff0c\U76f8\U4fe1\U5bf9\U8fd9\U4e2a\U4e16\U754c\U4e5f\U662f\U6709\U4e00\U5b9a\U610f\U4e49\U7684\U3002 \U5eb7\U5fb7\U66fe\U7ecf\U63d0\U5230\U8fc7\Uff0c\U65e2\U7136\U6211\U5df2\U7ecf\U8e0f\U4e0a\U8fd9\U6761\U9053\U8def\Uff0c\U90a3\U4e48\Uff0c\U4efb\U4f55\U4e1c\U897f\U90fd\U4e0d\U5e94\U59a8\U788d\U6211\U6cbf\U7740\U8fd9\U6761\U8def\U8d70\U4e0b\U53bb\U3002\U8fd9\U4f3c\U4e4e\U89e3\U7b54\U4e86\U6211\U7684\U7591\U60d1\U3002";
};
requestID = "537EEDEA-2E2D-4BA4-950A-FFFB9681EC69";
}

[Data-Keyed] (2/4) userInfo {
startTime = "2021-01-20 23:20:10:199";
}

[Data-Keyed] (3/4) app {
aid = "01A0tAyBhBRcxbuKyhgO3YHALNnaItFocWvdk3o9pNKtpBnf4.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (4/4) sdkVersion 003233000

https://open.weibo.com/weibosdk/request
?lfid=com.nuomi1.bus.mock
&luicode=10000360
&newVersion=3.3
&objId=537EEDEA-2E2D-4BA4-950A-FFFB9681EC69
&sdkversion=003233000
&urltype=link
取消
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Data-Keyed] (1/3) transferObject {
"__class" = WBSendMessageToWeiboResponse;
requestID = "537EEDEA-2E2D-4BA4-950A-FFFB9681EC69";
responseID = "4F5017C9-477C-4DDE-9228-95010FA338B6";
statusCode = "-1";
}

[Data-Keyed] (2/3) app {
aid = "01A0tAyBhBRcxbuKyhgO3YHALNnaItFocWvdk3o9pNKtpBnf4.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
}

[Data-String] (3/3) sdkVersion 2.5

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?id=4F5017C9-477C-4DDE-9228-95010FA338B6
&sdkversion=2.5
成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Data-Keyed] (1/4) transferObject {
"__class" = WBSendMessageToWeiboResponse;
requestID = "03FC11CF-F00C-473F-932D-5184D8251938";
responseID = "6A1737DC-DF9F-47B9-8285-C8D971AC39C4";
statusCode = 0;
}

[Data-Keyed] (2/4) userInfo {
startTime = "2021-01-20 23:20:20:616";
}

[Data-Keyed] (3/4) app {
aid = "01A0tAyBhBRcxbuKyhgO3YHALNnaItFocWvdk3o9pNKtpBnf4.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
}

[Data-String] (4/4) sdkVersion 2.5

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?id=6A1737DC-DF9F-47B9-8285-C8D971AC39C4
&sdkversion=2.5

ImageMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
[Data-Keyed] (1/2) app {
aid = "01A1AKMJk8iRqsjcMCEwxDO7FmB1xuiGtSH8BHQNXR08ez_dQ.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (2/2) sdkVersion 003233000

https://open.weibo.com/weibosdk/request
?checkLink=https://mock.bus.nuomi1.com/weibo/2967526297/
&newVersion=3.3
&objId=207A4681-43BA-4B2C-9CC8-F11C4AE80E3C
校验
1
2
3
4
5
6
7
8
9
10
11
12
13
[Data-Keyed] (1/2) app {
aid = "01A1AKMJk8iRqsjcMCEwxDO7FmB1xuiGtSH8BHQNXR08ez_dQ.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (2/2) sdkVersion 003233000

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?checkLink=https://open.weibo.com/weibosdk
&checkStatus=1
&id=207A4681-43BA-4B2C-9CC8-F11C4AE80E3C
二次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[Data-Keyed] (1/4) transferObject {
"__class" = WBSendMessageToWeiboRequest;
message = {
"__class" = WBMessageObject;
imageObject = {
imageData = {length = 7366205, bytes = 0xffd8ffe0 00104a46 49460001 01000048 ... 007eef97 697fffd9 };
};
};
requestID = "0F5CBFC1-3EF3-4AFB-8793-44BA3FC74892";
}

[Data-Keyed] (2/4) userInfo {
startTime = "2021-01-20 23:25:29:581";
}

[Data-Keyed] (3/4) app {
aid = "01A1AKMJk8iRqsjcMCEwxDO7FmB1xuiGtSH8BHQNXR08ez_dQ.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (4/4) sdkVersion 003233000

https://open.weibo.com/weibosdk/request
?lfid=com.nuomi1.bus.mock
&luicode=10000360
&newVersion=3.3
&objId=0F5CBFC1-3EF3-4AFB-8793-44BA3FC74892
&sdkversion=003233000
&urltype=link
取消
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Data-Keyed] (1/3) transferObject {
"__class" = WBSendMessageToWeiboResponse;
requestID = "0F5CBFC1-3EF3-4AFB-8793-44BA3FC74892";
responseID = "8EF9CF3E-4DCE-490F-9B78-06FFCA4C7AD9";
statusCode = "-1";
}

[Data-Keyed] (2/3) app {
aid = "01A1AKMJk8iRqsjcMCEwxDO7FmB1xuiGtSH8BHQNXR08ez_dQ.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
}

[Data-String] (3/3) sdkVersion 2.5

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?id=8EF9CF3E-4DCE-490F-9B78-06FFCA4C7AD9
&sdkversion=2.5
成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Data-Keyed] (1/4) transferObject {
"__class" = WBSendMessageToWeiboResponse;
requestID = "C4E6FB1B-47D1-4E38-A029-2611AB7452E2";
responseID = "A0084B4C-4660-4C2A-B58A-8982ACF390BE";
statusCode = 0;
}

[Data-Keyed] (2/4) userInfo {
startTime = "2021-01-20 23:25:43:438";
}

[Data-Keyed] (3/4) app {
aid = "01A1AKMJk8iRqsjcMCEwxDO7FmB1xuiGtSH8BHQNXR08ez_dQ.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
}

[Data-String] (4/4) sdkVersion 2.5

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?id=A0084B4C-4660-4C2A-B58A-8982ACF390BE
&sdkversion=2.5

WebPageMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
[Data-Keyed] (1/2) app {
aid = "01AxlLuRJfAXDK4PJd5fEj81C7RYHTMgJT-_Ucr45PZ-hsW5A.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (2/2) sdkVersion 003233000

https://open.weibo.com/weibosdk/request
?checkLink=https://mock.bus.nuomi1.com/weibo/2967526297/
&newVersion=3.3
&objId=E09389AA-C38A-4972-8E9F-7AA997179319
校验
1
2
3
4
5
6
7
8
9
10
11
12
13
[Data-Keyed] (1/2) app {
aid = "01AxlLuRJfAXDK4PJd5fEj81C7RYHTMgJT-_Ucr45PZ-hsW5A.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (2/2) sdkVersion 003233000

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?checkLink=https://open.weibo.com/weibosdk
&checkStatus=1
&id=E09389AA-C38A-4972-8E9F-7AA997179319
二次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[Data-Keyed] (1/4) transferObject {
"__class" = WBSendMessageToWeiboRequest;
message = {
"__class" = WBMessageObject;
mediaObject = {
"__class" = WBWebpageObject;
description = Apple;
objectID = "36FDD77B-9DCE-4749-B21C-816912DD1FAA";
thumbnailData = {length = 4827, bytes = 0xffd8ffe0 00104a46 49460001 01000048 ... 7aa27fbd 401fffd9 };
title = iPhone;
webpageUrl = "https://www.apple.com.cn/iphone/";
};
};
requestID = "BDCC97E7-D95B-4729-BA96-F69AA1C9E5D7";
}

[Data-Keyed] (2/4) userInfo {
startTime = "2021-01-20 23:29:23:201";
}

[Data-Keyed] (3/4) app {
aid = "01AxlLuRJfAXDK4PJd5fEj81C7RYHTMgJT-_Ucr45PZ-hsW5A.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (4/4) sdkVersion 003233000

https://open.weibo.com/weibosdk/request
?lfid=com.nuomi1.bus.mock
&luicode=10000360
&newVersion=3.3
&objId=BDCC97E7-D95B-4729-BA96-F69AA1C9E5D7
&sdkversion=003233000
&urltype=link
取消
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Data-Keyed] (1/3) transferObject {
"__class" = WBSendMessageToWeiboResponse;
requestID = "BDCC97E7-D95B-4729-BA96-F69AA1C9E5D7";
responseID = "B74EA5B6-598C-4D37-913D-6E4AE84AD444";
statusCode = "-1";
}

[Data-Keyed] (2/3) app {
aid = "01AxlLuRJfAXDK4PJd5fEj81C7RYHTMgJT-_Ucr45PZ-hsW5A.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
}

[Data-String] (3/3) sdkVersion 2.5

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?id=B74EA5B6-598C-4D37-913D-6E4AE84AD444
&sdkversion=2.5
成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Data-Keyed] (1/4) transferObject {
"__class" = WBSendMessageToWeiboResponse;
requestID = "85BF2074-9D78-4CE6-9B30-8EDB2ABE52BE";
responseID = "14493865-3729-4794-876E-CC8CFC9E5866";
statusCode = 0;
}

[Data-Keyed] (2/4) userInfo {
startTime = "2021-01-20 23:29:36:128";
}

[Data-Keyed] (3/4) app {
aid = "01AxlLuRJfAXDK4PJd5fEj81C7RYHTMgJT-_Ucr45PZ-hsW5A.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
}

[Data-String] (4/4) sdkVersion 2.5

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?id=14493865-3729-4794-876E-CC8CFC9E5866
&sdkversion=2.5

登录

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
[Data-Keyed] (1/2) app {
aid = "01A23X7F7pElp3M5h4BfDFNwhTcJZ2K90Zbum0_Nw18NhhSMU.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (2/2) sdkVersion 003233000

https://open.weibo.com/weibosdk/request
?checkLink=https://mock.bus.nuomi1.com/weibo/2967526297/
&newVersion=3.3
&objId=3A90A4A6-4233-49CB-B539-E7BF2190DAE6
校验
1
2
3
4
5
6
7
8
9
10
11
12
13
[Data-Keyed] (1/2) app {
aid = "01A23X7F7pElp3M5h4BfDFNwhTcJZ2K90Zbum0_Nw18NhhSMU.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (2/2) sdkVersion 003233000

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?checkLink=https://open.weibo.com/weibosdk
&checkStatus=1
&id=3A90A4A6-4233-49CB-B539-E7BF2190DAE6
二次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Data-Keyed] (1/4) transferObject {
"__class" = WBAuthorizeRequest;
redirectURI = "https://api.weibo.com/oauth2/default.html";
requestID = "01594E66-FED2-4CC8-A1F8-189193787357";
}

[Data-Keyed] (2/4) userInfo {
startTime = "2021-01-20 23:30:24:220";
}

[Data-Keyed] (3/4) app {
aid = "01A23X7F7pElp3M5h4BfDFNwhTcJZ2K90Zbum0_Nw18NhhSMU.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
universalLink = "https://mock.bus.nuomi1.com/weibo/2967526297/";
}

[Data-String] (4/4) sdkVersion 003233000

https://open.weibo.com/weibosdk/request
?lfid=com.nuomi1.bus.mock
&luicode=10000360
&newVersion=3.3
&objId=01594E66-FED2-4CC8-A1F8-189193787357
&sdkversion=003233000
&urltype=link
取消
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Data-Keyed] (1/4) transferObject {
"__class" = WBAuthorizeResponse;
requestID = "01594E66-FED2-4CC8-A1F8-189193787357";
responseID = "1391E37A-A9D4-4361-9507-83EEABBF69F1";
statusCode = "-1";
}

[Data-Keyed] (2/4) userInfo {
"sso_error_user_cancelled" = t;
"user_cancelled" = t;
}

[Data-Keyed] (3/4) app {
aid = "01A23X7F7pElp3M5h4BfDFNwhTcJZ2K90Zbum0_Nw18NhhSMU.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
}

[Data-String] (4/4) sdkVersion 2.5

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?id=1391E37A-A9D4-4361-9507-83EEABBF69F1
&sdkversion=2.5
成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[Data-Keyed] (1/4) transferObject {
"__class" = WBAuthorizeResponse;
accessToken = "2.00TGGCmB4J8pOD2c226b4bd9Wrw4bC";
expirationDate = "2026-01-19 15:30:23 +0000";
refreshToken = "2.00TGGCmB4J8pOD14f73f1e16pzyh4D";
requestID = "B6026D5A-6BED-4AD2-9C6F-9FF7E98FC47F";
responseID = "93A6E97F-A002-42E5-A550-F3649D630CA6";
statusCode = 0;
userID = 1625897081;
}

[Data-Keyed] (2/4) userInfo {
"access_token" = "2.00TGGCmB4J8pOD2c226b4bd9Wrw4bC";
app = {
logo = "http://timg.sjs.sinajs.cn/miniblog2style/images/developer/default_50.gif";
name = "\U672a\U901a\U8fc7\U5ba1\U6838\U5e94\U7528";
};
"expires_in" = 157679999;
isRealName = true;
"refresh_token" = "2.00TGGCmB4J8pOD14f73f1e16pzyh4D";
"remind_in" = 157679999;
scope = "";
uid = 1625897081;
}

[Data-Keyed] (3/4) app {
aid = "01A23X7F7pElp3M5h4BfDFNwhTcJZ2K90Zbum0_Nw18NhhSMU.";
appKey = 2967526297;
bundleID = "com.nuomi1.bus.mock";
}

[Data-String] (4/4) sdkVersion 2.5

https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response
?id=93A6E97F-A002-42E5-A550-F3649D630CA6
&sdkversion=2.5

分析

分享

基础信息

  1. appIDwb2967526297
  2. appNameBusMock
  3. appNumber2967526297
  4. bundleIDcom.nuomi1.bus.mock
  5. universalLinkhttps://mock.bus.nuomi1.com/weibo/2967526297/
  6. weiboUniversalLinkhttps://open.weibo.com/weibosdk/
  7. redirectLinkhttps://api.weibo.com/oauth2/default.html

公共部分

从记录到的 URL 和剪切板,我们可以看到初次和校验的步骤并不是必须的,因为返回内容没有 signToken,仅为检测是否支持 Universal Link。

所以二次的步骤才是真正有用的,其中 Universal Link 除了 objId 其余都一样,主要的区别在剪切板。

Universal Link 的公共部分:

  1. lfid${bundleID}
  2. luicode10000360,不明
  3. newVersion3.3,表示 SDK 版本
  4. objId${UUID},表示请求 ID
  5. sdkversion003233000,表示 SDK 版本
  6. urltypelink,表示 Universal Link

剪切板的公共部分:

  1. transferObject 为主要内容
  2. userInfo 为附加内容
  3. app 为基础信息
  4. sdkVersion003233000,表示 SDK 版本

transferObject

我们可以看到:

  1. __classWBSendMessageToWeiboRequest,表示分享请求
  2. message 为具体内容,其中 __classWBMessageObject,剩余内容因分享内容而变,将在下文进行说明
  3. requestID${UUID},表示请求 ID,与 Universal Link 中的 objId 相对应

userInfo

我们可以看到:

  1. startTime${Date},实际上不需要设置

app

我们可以看到:

  1. aid 表示 _用于广告的与设备信息相关的标识符_,保存在 UserDefaults,清除后重新获取会得到新值,实际上不需要设置
  2. appKey${appNumber}
  3. bundleID${bundleID}
  4. universalLink${universalLink}

回调

分享成功或失败时,调用 https://mock.bus.nuomi1.com/weibo/2967526297/weibosdk/response 返回 App,URL 匹配 ${universalLink}/weibosdk/response,数据从剪切板 pasteboardType = transferObject 获取。

我们可以看到:

  1. __classWBSendMessageToWeiboResponse,表示分享响应
  2. requestID${UUID},与 request 中的相对应
  3. responseID${UUID},表示响应 ID
  4. statusCode 为状态码,0 表示成功,-1 表示用户取消

userInfo / app / sdkVersion 与请求时一样,但用户取消时没有 userInfo

TextMessage

修改 transferObject.message.text 值,我们可以看到:

  1. text${text}

ImageMessage

修改 transferObject.message.imageObject 字典,我们可以看到:

  1. imageData${image}

WebPageMessage

修改 transferObject.message.mediaObject 字典,我们可以看到:

  1. __classWBWebpageObject
  2. description${description}
  3. objectID${UUID},与 requestID 没有关系
  4. thumbnailData${image}
  5. title${title}
  6. webpageUrl${link}

登录

请求

Universal Link 部分与分享相同,剪切板部分与分享大致相同,区别在于 transferObject

我们可以看到:

  1. __classWBAuthorizeRequest 表示登录请求
  2. redirectURI${redirectLink}
  3. requestID${UUID},表示请求 ID

成功

与分享不同,登录除了返回的 transferObject 不同,userInfo 也多了额外的数据。

transferObject

我们可以看到:

  1. __classWBAuthorizeResponse,表示登录响应
  2. accessToken 为登录 token
  3. expirationDate 为过期时间
  4. refreshToken 为刷新 token
  5. requestID 为请求 ID
  6. responseID 为响应 ID
  7. statusCode 为状态码
  8. userID 为用户 ID
userInfo

我们可以看到:

  1. access_token 为登录 token
  2. app.logl 为 App logo 链接
  3. app.name 为 App 名称
  4. expires_in 为过期时间间隔
  5. isRealName 可能为是否实名状态
  6. refresh_token 为刷新 token
  7. remind_in 为刷新时间间隔
  8. scope 为权限范围
  9. uid 为用户 ID

可以看到 transferObject 中的信息在 userInfo 都有,但是名称不一样,而且 expirationDate 是计算得出。

取消

数据都在 userInfo,而 transferObject 相同。

我们可以看到:

  1. sso_error_user_cancelled 为登录时用户取消
  2. user_cancelled 为用户取消

总结

本文通过记录和分析 Weibo SDK 的行为,厘清了微博分享和登录的流程。传递数据主要靠剪切板,分享和登录的请求或响应的 Universal Link 都是一致的。

比较奇怪的地方有两处,一是分享和登录都不需要 signToken 校验,仍然会走一次校验流程;二是 aid 设备标识符在清空 UserDefaults 后会得到新值,一般的标识符应该是尽量不变以达到追踪的效果。

完整代码实现请参考来源。

参考

  1. NBus - WeiboHandler