NBus 之 QQHandler

QQ SDK 分析,基于 QQ SDK 3.5.1 和 QQ 8.5.0。


记录

分享

TextMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=2
&file_data=6YKj5LmI77yMIOW4puedgOi/meS6m+mXrumimO+8jOaIkeS7rOadpeWuoeinhuS4gOS4i0JVU+OAgiDlj6/mmK/vvIzljbPkvb/mmK/ov5nmoLfvvIxCVVPnmoTlh7rnjrDku43nhLbku6PooajkuobkuIDlrprnmoTmhI/kuYnjgIIgQlVT55qE5Y+R55Sf77yM5Yiw5bqV6ZyA6KaB5aaC5L2V5YGa5Yiw77yM5LiNQlVT55qE5Y+R55Sf77yM5Y+I5Lya5aaC5L2V5Lqn55Sf44CCIOeUn+a0u+S4re+8jOiLpUJVU+WHuueOsOS6hu+8jOaIkeS7rOWwseS4jeW+l+S4jeiAg+iZkeWug+WHuueOsOS6hueahOS6i+WunuOAgiDnu4/ov4fkuIrov7DorqjorrrvvIwg6YKj5LmI77yMIOaXoueEtuWmguS9le+8jCDnjrDlnKjvvIzop6PlhrNCVVPnmoTpl67popjvvIzmmK/pnZ7luLjpnZ7luLjph43opoHnmoTjgIIg5omA5Lul77yMIOaIkeS7rOmDveefpemBk++8jOWPquimgeacieaEj+S5ie+8jOmCo+S5iOWwseW/hemhu+aFjumHjeiAg+iZkeOAgiDov5nnp43kuovlrp7lr7nmnKzkurrmnaXor7TmhI/kuYnph43lpKfvvIznm7jkv6Hlr7nov5nkuKrkuJbnlYzkuZ/mmK/mnInkuIDlrprmhI/kuYnnmoTjgIIg5bq35b635pu+57uP5o+Q5Yiw6L+H77yM5pei54S25oiR5bey57uP6LiP5LiK6L+Z5p2h6YGT6Lev77yM6YKj5LmI77yM5Lu75L2V5Lic6KW/6YO95LiN5bqU5aao56KN5oiR5rK/552A6L+Z5p2h6Lev6LWw5LiL5Y6744CC6L+Z5Ly85LmO6Kej562U5LqG5oiR55qE55aR5oOR44CC
&file_type=text
&generalpastboard=1
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&version=1
校验
1
2
3
https://mock.bus.nuomi1.com/qq_conn/1110603370/com.nuomi1.bus.mock/mqqsignapp
?appsign_extrainfo=ewogICJhcHBzaWduX3JlZGlyZWN0X3Bhc3RlYm9hcmQiIDogIiIsCiAgImFwcHNpZ25fcmVkaXJlY3QiIDogIm1xcWFwaTpcL1wvc2hhcmVcL3RvX2ZyaT9hcHBzaWduX3R4aWQ9UVE0MjMyNzY2QSZidW5kbGVpZD1ZMjl0TG01MWIyMXBNUzVpZFhNdWJXOWphdz09JmNhbGxiYWNrX25hbWU9UVE0MjMyNzY2QSZjYWxsYmFja190eXBlPXNjaGVtZSZjZmxhZz0yJmZpbGVfZGF0YT02WUtqNUxtSTc3eU1JT1c0cHVlZGdPaVwvbWVTNm0rbVhydW1pbU8rOGpPYUlrZVM3ck9hZHBlV3VvZWluaHVTNGdPUzRpMEpWVStPQWdpRGxqNlwvbW1LXC92dkl6bGpiUGt2YlwvbW1LXC9vdjVubW9MZnZ2SXhDVlZQbm1vVGxoN3JuanJEa3U0M25oTGJrdTZQb29hamt1b2JrdUlEbHJwcm5tb1RtaElcL2t1WW5qZ0lJZ1FsVlQ1NXFFNVkrUjU1U2Y3N3lNNVlpdzVicVY2WnlBNkthQjVhYUM1TDJWNVlHYTVZaXc3N3lNNUxpTlFsVlQ1NXFFNVkrUjU1U2Y3N3lNNVkrSTVMeWE1YWFDNUwyVjVMcW41NVNmNDRDQ0lPZVVuK2EwdStTNHJlKzhqT2lMcFVKVlUrV0h1dWVPc09TNmh1KzhqT2FJa2VTN3JPV3dzZVM0amVXK2wrUzRqZWlBZytpWmtlV3VnK1dIdXVlT3NPUzZodWVhaE9TNmkrV3VudU9BZ2lEbnU0XC9vdjRma3VJcm92N0RvcnFqb3JycnZ2SXdnNllLajVMbUk3N3lNSU9hWG91ZUV0dVdtZ3VTOWxlKzhqQ0RuanJEbG5LanZ2SXpvcDZQbGhyTkNWVlBubW9UcGw2N3BvcGp2dkl6bW1LXC9wblo3bHVManBuWjdsdUxqcGg0M29wb0hubW9UamdJSWc1b21BNUx1bDc3eU1JT2FJa2VTN3JPbUR2ZWVmcGVtQmsrKzhqT1dQcXVpbWdlYWNpZWFFaitTNWllKzhqT21DbytTNWlPV3dzZVdcL2hlbWh1K2FGanVtSGplaUFnK2laa2VPQWdpRG92NW5ucDQza3VvdmxycDdscjdubW5Lemt1cnJtbmFYb3I3VG1oSVwva3VZbnBoNDNscEtmdnZJem5tN2prdjZIbHI3bm92NW5rdUtya3VKYm5sWXprdVpcL21tS1wvbW5Jbmt1SURscnBybWhJXC9rdVlubm1vVGpnSUlnNWJxMzViNjM1cHUrNTd1UDVvK1E1WWl3NkwrSDc3eU01cGVpNTRTMjVvaVI1YmV5NTd1UDZMaVA1TGlLNkwrWjVwMmg2WUdUNkxldjc3eU02WUtqNUxtSTc3eU01THU3NUwyVjVMaWM2S1dcLzZZTzk1TGlONWJxVTVhYW81NktONW9pUjVyS1wvNTUyQTZMK1o1cDJoNkxldjZMV3c1TGlMNVk2NzQ0Q0M2TCtaNUx5ODVMbU82S2VqNTYyVTVMcUc1b2lSNTVxRTU1YVI1b09SNDRDQyZmaWxlX3R5cGU9dGV4dCZnZW5lcmFscGFzdGJvYXJkPTEmc2Rrdj0zLjUuMSZzaGFyZVR5cGU9MCZzcmNfdHlwZT1hcHAmdGhpcmRBcHBEaXNwbGF5TmFtZT1RblZ6VFc5amF3PT0mdmVyc2lvbj0xIiwKICAiYXBwc2lnbl9yZXRjb2RlIiA6ICIyNTEwNSIsCiAgImFwcHNpZ25fdG9rZW4iIDogIjZjNzg0MjMyNzY2YTI4ODEyMmRmNWZlZThmMTZmYzM4IiwKICAiYXBwc2lnbl9idW5kbGVudWxsIiA6ICIyIgp9
&generalpastboard=1
二次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_token=6c784232766a288122df5fee8f16fc38
&appsign_txid=QQ4232766A
&appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=2
&file_data=6YKj5LmI77yMIOW4puedgOi/meS6m+mXrumimO+8jOaIkeS7rOadpeWuoeinhuS4gOS4i0JVU+OAgiDlj6/mmK/vvIzljbPkvb/mmK/ov5nmoLfvvIxCVVPnmoTlh7rnjrDku43nhLbku6PooajkuobkuIDlrprnmoTmhI/kuYnjgIIgQlVT55qE5Y+R55Sf77yM5Yiw5bqV6ZyA6KaB5aaC5L2V5YGa5Yiw77yM5LiNQlVT55qE5Y+R55Sf77yM5Y+I5Lya5aaC5L2V5Lqn55Sf44CCIOeUn+a0u+S4re+8jOiLpUJVU+WHuueOsOS6hu+8jOaIkeS7rOWwseS4jeW+l+S4jeiAg+iZkeWug+WHuueOsOS6hueahOS6i+WunuOAgiDnu4/ov4fkuIrov7DorqjorrrvvIwg6YKj5LmI77yMIOaXoueEtuWmguS9le+8jCDnjrDlnKjvvIzop6PlhrNCVVPnmoTpl67popjvvIzmmK/pnZ7luLjpnZ7luLjph43opoHnmoTjgIIg5omA5Lul77yMIOaIkeS7rOmDveefpemBk++8jOWPquimgeacieaEj+S5ie+8jOmCo+S5iOWwseW/hemhu+aFjumHjeiAg+iZkeOAgiDov5nnp43kuovlrp7lr7nmnKzkurrmnaXor7TmhI/kuYnph43lpKfvvIznm7jkv6Hlr7nov5nkuKrkuJbnlYzkuZ/mmK/mnInkuIDlrprmhI/kuYnnmoTjgIIg5bq35b635pu+57uP5o+Q5Yiw6L+H77yM5pei54S25oiR5bey57uP6LiP5LiK6L+Z5p2h6YGT6Lev77yM6YKj5LmI77yM5Lu75L2V5Lic6KW/6YO95LiN5bqU5aao56KN5oiR5rK/552A6L+Z5p2h6Lev6LWw5LiL5Y6744CC6L+Z5Ly85LmO6Kej562U5LqG5oiR55qE55aR5oOR44CC
&file_type=text
&generalpastboard=1
&openredirect=1
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&version=1
三次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_token=6c784232766a288122df5fee8f16fc38
&appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=2
&file_data=6YKj5LmI77yMIOW4puedgOi/meS6m+mXrumimO+8jOaIkeS7rOadpeWuoeinhuS4gOS4i0JVU+OAgiDlj6/mmK/vvIzljbPkvb/mmK/ov5nmoLfvvIxCVVPnmoTlh7rnjrDku43nhLbku6PooajkuobkuIDlrprnmoTmhI/kuYnjgIIgQlVT55qE5Y+R55Sf77yM5Yiw5bqV6ZyA6KaB5aaC5L2V5YGa5Yiw77yM5LiNQlVT55qE5Y+R55Sf77yM5Y+I5Lya5aaC5L2V5Lqn55Sf44CCIOeUn+a0u+S4re+8jOiLpUJVU+WHuueOsOS6hu+8jOaIkeS7rOWwseS4jeW+l+S4jeiAg+iZkeWug+WHuueOsOS6hueahOS6i+WunuOAgiDnu4/ov4fkuIrov7DorqjorrrvvIwg6YKj5LmI77yMIOaXoueEtuWmguS9le+8jCDnjrDlnKjvvIzop6PlhrNCVVPnmoTpl67popjvvIzmmK/pnZ7luLjpnZ7luLjph43opoHnmoTjgIIg5omA5Lul77yMIOaIkeS7rOmDveefpemBk++8jOWPquimgeacieaEj+S5ie+8jOmCo+S5iOWwseW/hemhu+aFjumHjeiAg+iZkeOAgiDov5nnp43kuovlrp7lr7nmnKzkurrmnaXor7TmhI/kuYnph43lpKfvvIznm7jkv6Hlr7nov5nkuKrkuJbnlYzkuZ/mmK/mnInkuIDlrprmhI/kuYnnmoTjgIIg5bq35b635pu+57uP5o+Q5Yiw6L+H77yM5pei54S25oiR5bey57uP6LiP5LiK6L+Z5p2h6YGT6Lev77yM6YKj5LmI77yM5Lu75L2V5Lic6KW/6YO95LiN5bqU5aao56KN5oiR5rK/552A6L+Z5p2h6Lev6LWw5LiL5Y6744CC6L+Z5Ly85LmO6Kej562U5LqG5oiR55qE55aR5oOR44CC
&file_type=text
&generalpastboard=1
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&version=1
成功
1
2
https://mock.bus.nuomi1.com/qq_conn/1110603370/com.nuomi1.bus.mock
?sdkactioninfo=ewogICJzZGtfYWN0aW9uX3F1ZXJ5IiA6ICJhcHBzaWduX2J1bmRsZW51bGw9MiZzb3VyY2U9cXEmc291cmNlX3NjaGVtZT1tcXFhcGkmZXJyb3I9MCZ2ZXJzaW9uPTEiLAogICJzZGtfYWN0aW9uX3BhdGgiIDogIiIsCiAgInNka19hY3Rpb25fc2hlbWUiIDogInRlbmNlbnQxMTEwNjAzMzcwIiwKICAic2RrX2FjdGlvbl9ob3N0IiA6ICJyZXNwb25zZV9mcm9tX3FxIgp9
1
2
3
4
5
6
7
tencent1110603370://response_from_qq
?appsign_bundlenull=2
&appsign_token=6c784232766a288122df5fee8f16fc38
&error=0
&source=qq
&source_scheme=mqqapi
&version=1
取消
1
2
https://mock.bus.nuomi1.com/qq_conn/1110603370/com.nuomi1.bus.mock
?sdkactioninfo=ewogICJzZGtfYWN0aW9uX3F1ZXJ5IiA6ICJlcnJvcl9kZXNjcmlwdGlvbj1kR2hsSUhWelpYSWdaMmwyWlNCMWNDQjBhR1VnWTNWeWNtVnVkQ0J2Y0dWeVlYUnBiMjQ9JmFwcHNpZ25fYnVuZGxlbnVsbD0yJnNvdXJjZT1xcSZzb3VyY2Vfc2NoZW1lPW1xcWFwaSZlcnJvcj0tNCZ2ZXJzaW9uPTEiLAogICJzZGtfYWN0aW9uX3BhdGgiIDogIiIsCiAgInNka19hY3Rpb25fc2hlbWUiIDogInRlbmNlbnQxMTEwNjAzMzcwIiwKICAic2RrX2FjdGlvbl9ob3N0IiA6ICJyZXNwb25zZV9mcm9tX3FxIgp9
1
2
3
4
5
6
7
8
tencent1110603370://response_from_qq
?appsign_bundlenull=2
&appsign_token=6c784232766a288122df5fee8f16fc38
&error=-4
&error_description=dGhlIHVzZXIgZ2l2ZSB1cCB0aGUgY3VycmVudCBvcGVyYXRpb24=
&source=qq
&source_scheme=mqqapi
&version=1
清空剪切板
1
[["[Data-Keyed] com.tencent.mqq.api.apiLargeData, {\n}"]]
设置剪切板
1
[["[Data-Keyed] com.tencent.mqq.api.apiLargeData, {\n    \"pasted_string\" = NBus;\n}"]]
QQ 空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=0
&file_data=6YKj5LmI77yMIOW4puedgOi/meS6m+mXrumimO+8jOaIkeS7rOadpeWuoeinhuS4gOS4i0JVU+OAgiDlj6/mmK/vvIzljbPkvb/mmK/ov5nmoLfvvIxCVVPnmoTlh7rnjrDku43nhLbku6PooajkuobkuIDlrprnmoTmhI/kuYnjgIIgQlVT55qE5Y+R55Sf77yM5Yiw5bqV6ZyA6KaB5aaC5L2V5YGa5Yiw77yM5LiNQlVT55qE5Y+R55Sf77yM5Y+I5Lya5aaC5L2V5Lqn55Sf44CCIOeUn+a0u+S4re+8jOiLpUJVU+WHuueOsOS6hu+8jOaIkeS7rOWwseS4jeW+l+S4jeiAg+iZkeWug+WHuueOsOS6hueahOS6i+WunuOAgiDnu4/ov4fkuIrov7DorqjorrrvvIwg6YKj5LmI77yMIOaXoueEtuWmguS9le+8jCDnjrDlnKjvvIzop6PlhrNCVVPnmoTpl67popjvvIzmmK/pnZ7luLjpnZ7luLjph43opoHnmoTjgIIg5omA5Lul77yMIOaIkeS7rOmDveefpemBk++8jOWPquimgeacieaEj+S5ie+8jOmCo+S5iOWwseW/hemhu+aFjumHjeiAg+iZkeOAgiDov5nnp43kuovlrp7lr7nmnKzkurrmnaXor7TmhI/kuYnph43lpKfvvIznm7jkv6Hlr7nov5nkuKrkuJbnlYzkuZ/mmK/mnInkuIDlrprmhI/kuYnnmoTjgIIg5bq35b635pu+57uP5o+Q5Yiw6L+H77yM5pei54S25oiR5bey57uP6LiP5LiK6L+Z5p2h6YGT6Lev77yM6YKj5LmI77yM5Lu75L2V5Lic6KW/6YO95LiN5bqU5aao56KN5oiR5rK/552A6L+Z5p2h6Lev6LWw5LiL5Y6744CC6L+Z5Ly85LmO6Kej562U5LqG5oiR55qE55aR5oOR44CC
&file_type=text
&generalpastboard=1
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&version=1

ImageMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=2
&file_type=img
&generalpastboard=1
&objectlocation=pasteboard
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&version=1
剪切板
1
[["[Data-Keyed] com.tencent.mqq.api.apiLargeData, {\n    \"file_data\" = {length = 1814667, bytes = 0x47494638 39612c01 a900f700 0082afc1 ... 1420568b 8000003b };\n}"]]
设置缩略图
1
[["[Data-Keyed] com.tencent.mqq.api.apiLargeData, {\n    \"file_data\" = {length = 1814667, bytes = 0x47494638 39612c01 a900f700 0082afc1 ... 1420568b 8000003b };\n    previewimagedata = {length = 4827, bytes = 0xffd8ffe0 00104a46 49460001 01000048 ... 7aa27fbd 401fffd9 };\n}"]]
校验
1
[["[Data-Keyed] com.tencent.tencent1110603370, {\n    \"appsign_bundlenull\" = 2;\n    \"appsign_redirect\" = \"mqqapi://share/to_fri?thirdAppDisplayName=QnVzTW9jaw==&shareType=0&objectlocation=pasteboard&file_type=img&callback_name=QQ4232766A&src_type=app&version=1&cflag=2&callback_type=scheme&generalpastboard=1&sdkv=3.5.1&bundleid=Y29tLm51b21pMS5idXMubW9jaw==&appsign_txid=QQ4232766A\";\n    \"appsign_redirect_pasteboard\" =     {\n        \"file_data\" = {length = 1814667, bytes = 0x47494638 39612c01 a900f700 0082afc1 ... 1420568b 8000003b };\n        previewimagedata = {length = 4827, bytes = 0xffd8ffe0 00104a46 49460001 01000048 ... 7aa27fbd 401fffd9 };\n    };\n    \"appsign_retcode\" = 25105;\n    \"appsign_token\" = 6c784232766a288122df5fee8f16fc38;\n}"]]
QQ 空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=0
&file_type=img
&generalpastboard=1
&objectlocation=pasteboard
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&version=1

AudioMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=2
&description=6YCD6LeR6K6h5YiS
&file_type=audio
&flashurl=aHR0cHM6Ly9tdXNpYy4xNjMuY29tL3NvbmcvbWVkaWEvb3V0ZXIvdXJsP2lkPTI1NzA2Mjg0Lm1wMw==
&generalpastboard=1
&objectlocation=pasteboard
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&title=Q2hlbWljYWwgQnVz
&url=aHR0cHM6Ly9tdXNpYy4xNjMuY29tLyMvc29uZz9pZD0yNTcwNjI4NA==
&version=1
剪切板
1
[["[Data-Keyed] com.tencent.mqq.api.apiLargeData, {\n}"]]
QQ 空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=0
&description=6YCD6LeR6K6h5YiS
&file_type=audio
&flashurl=aHR0cHM6Ly9tdXNpYy4xNjMuY29tL3NvbmcvbWVkaWEvb3V0ZXIvdXJsP2lkPTI1NzA2Mjg0Lm1wMw==
&generalpastboard=1
&objectlocation=pasteboard
&sdkv=3.5.1
&shareType=1
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&title=Q2hlbWljYWwgQnVz
&url=aHR0cHM6Ly9tdXNpYy4xNjMuY29tLyMvc29uZz9pZD0yNTcwNjI4NA==
&version=1

VideoMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=2
&description=TW90aW9uZ2FydGVu
&file_type=video
&generalpastboard=1
&objectlocation=pasteboard
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&title=QW5pbWF0aW9uIERhbmNpbmc=
&url=aHR0cHM6Ly9naXBoeS5jb20vZ2lmcy9hbmltYXRpb24tZGFuY2luZy1jdXRlLWwwRXhoZ0RZbXNlcmtGYWJt
&version=1
剪切板
1
[["[Data-Keyed] com.tencent.mqq.api.apiLargeData, {\n}"]]
QQ 空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=0
&description=TW90aW9uZ2FydGVu
&file_type=video
&generalpastboard=1
&objectlocation=pasteboard
&sdkv=3.5.1
&shareType=1
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&title=QW5pbWF0aW9uIERhbmNpbmc=
&url=aHR0cHM6Ly9naXBoeS5jb20vZ2lmcy9hbmltYXRpb24tZGFuY2luZy1jdXRlLWwwRXhoZ0RZbXNlcmtGYWJt
&version=1

WebPageMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=2
&description=QXBwbGU=
&file_type=news
&generalpastboard=1
&objectlocation=url
&pasteboard=
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&title=aVBob25l
&url=aHR0cHM6Ly93d3cuYXBwbGUuY29tLmNuL2lwaG9uZS8=
&version=1
剪切板
1
(Empty)
QQ 空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=0
&description=QXBwbGU=
&file_type=news
&generalpastboard=1
&objectlocation=url
&pasteboard=
&sdkv=3.5.1
&shareType=1
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&title=aVBob25l
&url=aHR0cHM6Ly93d3cuYXBwbGUuY29tLmNuL2lwaG9uZS8=
&version=1

FileMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=18
&fileName=J1ZajKJKzD0PK.gif
&file_type=localFile
&generalpastboard=1
&objectlocation=pasteboard
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&version=1
剪切板
1
[["[Data-Keyed] com.tencent.mqq.api.apiLargeData, {\n    \"file_data\" = {length = 1814667, bytes = 0x47494638 39612c01 a900f700 0082afc1 ... 1420568b 8000003b };\n}"]]

MiniProgramMessage

初次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
https://qm.qq.com/opensdkul/mqqapi/share/to_fri
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&callback_name=QQ4232766A
&callback_type=scheme
&cflag=64
&description=5o6o6I2Q5L2g5L2/55So6L+Z5Liq5bCP56iL5bqP
&file_type=news
&generalpastboard=1
&mini_appid=1108108864
&mini_code64=1
&mini_path=L3BhZ2VzL2NvbXBvbmVudC9wYWdlcy9sYXVuY2hBcHA4MTMvbGF1bmNoQXBwODEzP2E9YWFhJmI9YmJiJmM9Y2Nj
&mini_type=3
&mini_weburl=aHR0cHM6Ly93d3cuYXBwbGUuY29tLmNuL2lwaG9uZS8=
&objectlocation=url
&pasteboard=
&sdkv=3.5.1
&shareType=0
&src_type=app
&thirdAppDisplayName=QnVzTW9jaw==
&title=aHR0cHM6Ly93d3cuYXBwbGUuY29tLmNuL2lwaG9uZS8=
&url=aHR0cHM6Ly93d3cuYXBwbGUuY29tLmNuL2lwaG9uZS8=
&version=1
剪切板
1
(Empty)

登录

初次

1
2
3
4
5
6
https://qm.qq.com/opensdkul/mqqOpensdkSSoLogin/SSoLogin/tencent1110603370
?appsign_txid=QQ4232766A
&bundleid=Y29tLm51b21pMS5idXMubW9jaw==
&objectlocation=url
&pasteboard=YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGvEB0LDC0uLzAxMjM0NTY3ODk6Ozw9Pj9DS0xNTk9QUVUkbnVsbNMNDg8QHixXTlMua2V5c1pOUy5vYmplY3RzViRjbGFzc60REhMUFRYXGBkaGxwdgAKAA4AEgAWABoAHgAiACYAKgAuADIANgA6tHyAhIiMkJSYnKCkfK4APgBCAEYASgBOAFIAWgBeAGIAZgBqAD4AbgBxWYXBwX2lkVHNka3BdcmVzcG9uc2VfdHlwZVhhcHBfbmFtZV1hcHBzaWduX3Rva2VuVXNjb3BlWGJ1bmRsZWlkXnN0YXR1c192ZXJzaW9uVHNka3Zec3RhdHVzX21hY2hpbmVZc3RhdHVzX29zWWNsaWVudF9pZF8QEHJlZlVuaXZlcnNhbGxpbmtaMTExMDYwMzM3MFFpVXRva2VuV0J1c01vY2tQ0g9AQUJZTlMuc3RyaW5ngBVdZ2V0X3VzZXJfaW5mb9JERUZHWiRjbGFzc25hbWVYJGNsYXNzZXNfEA9OU011dGFibGVTdHJpbmejSElKXxAPTlNNdXRhYmxlU3RyaW5nWE5TU3RyaW5nWE5TT2JqZWN0XxATY29tLm51b21pMS5idXMubW9ja1IxNFozLjUuMV9saXRlWmlQaG9uZTEyLDFUMTQuM18QL2h0dHBzOi8vbW9jay5idXMubnVvbWkxLmNvbS9xcV9jb25uLzExMTA2MDMzNzAv0kRFUlNfEBNOU011dGFibGVEaWN0aW9uYXJ5o1JUSlxOU0RpY3Rpb25hcnkACAARABoAJAApADIANwBJAEwAUQBTAHMAeQCAAIgAkwCaAKgAqgCsAK4AsACyALQAtgC4ALoAvAC+AMAAwgDQANIA1ADWANgA2gDcAN4A4ADiAOQA5gDoAOoA7ADzAPgBBgEPAR0BIwEsATsBQAFPAVkBYwF2AYEBgwGJAZEBkgGXAaEBowGxAbYBwQHKAdwB4AHyAfsCBAIaAh0CKAIzAjgCagJvAoUCiQAAAAAAAAIBAAAAAAAAAFUAAAAAAAAAAAAAAAAAAAKW
&sdkv=3.5.1

成功

1
2
https://mock.bus.nuomi1.com/qq_conn/1110603370/com.nuomi1.bus.mock
?sdkactioninfo=ewogICJzZGtfYWN0aW9uX3F1ZXJ5IiA6ICJvYmplY3Rsb2NhdGlvbj11cmwmcGFzdGVib2FyZD1ZbkJzYVhOME1ERFVBUUlEQkFVR0J3cFlKSFpsY25OcGIyNVpKR0Z5WTJocGRtVnlWQ1IwYjNCWUpHOWlhbVZqZEhNU0FBR0dvRjhRRDA1VFMyVjVaV1JCY21Ob2FYWmxjdEVJQ1ZSeWIyOTBnQUd2RUJ3TERDc3NMUzR2TURFeU16UTFOamM0T1RvN1BrVkdSMGhKU2t0TVZTUnVkV3hzMHcwT0R4QWRLbGRPVXk1clpYbHpXazVUTG05aWFtVmpkSE5XSkdOc1lYTnpyQkVTRXhRVkZoY1lHUm9iSElBQ2dBT0FCSUFGZ0FhQUI0QUlnQW1BQ29BTGdBeUFEYXdlSHlBaElpTWtKU1luS0NtQURvQVBnQkNBRVlBU2dCU0FGWUFXZ0JlQUdJQVpnQnFBRzFwbGVIQnBjbVZ6WDJsdVh4QVNZWEJ3YzJsbmJsOWlkVzVrYkdWdWRXeHNXbVZ1WTNKNWRHOXJaVzVUY21WMFhIQmhjM05FWVhSaFVtVnpjRlp2Y0dWdWFXUlNjR1plZFhObGNsOWpZVzVqWld4c1pXUlZjR1pyWlhsWmNHRjVYM1J2YTJWdVUyMXpaMXhoWTJObGMzTmZkRzlyWlc0U0FIYW5BRkV5WHhBZ05tSTVZVEJqTkRGa1ptVmxPR0ZoWldJMU1qWTVZell5WlRnME56UTFaR1lRQU5JT0R6dzlvSUFUMGo5QVFVSmFKR05zWVhOemJtRnRaVmdrWTJ4aGMzTmxjMTVPVTAxMWRHRmliR1ZCY25KaGVhTkJRMFJYVGxOQmNuSmhlVmhPVTA5aWFtVmpkRjhRSUVNM01UWTVNRGcyTVVZeU9USXpOREl6T0VGQ01rWXpSRGswTlRCRFJEa3dYbTl3Wlc1dGIySnBiR1ZmYVc5elVrNVBYeEFnWXprNU1qa3daR1JpT1RObVlUWTNaVE15TXpGalpUVTNNakJrTmprek1qbGZFQ0JFUlRJek4wVTVSak5HTWtJNU5FTkVNekl3UmtFeFJURXlNREU0TWpBeVFsQmZFQ0F5TnpNeU5rVkNPVVJCT0RrNE5qQXpPREV3TXpFME5FTkRRVFZFTXpsQlJkSVwvUUUxT1h4QVRUbE5OZFhSaFlteGxSR2xqZEdsdmJtRnllYU5OVDBSY1RsTkVhV04wYVc5dVlYSjVBQWdBRVFBYUFDUUFLUUF5QURjQVNRQk1BRkVBVXdCeUFIZ0Fmd0NIQUpJQW1RQ21BS2dBcWdDc0FLNEFzQUN5QUxRQXRnQzRBTG9BdkFDK0FNc0F6UURQQU5FQTB3RFZBTmNBMlFEYkFOMEEzd0RoQU9NQTVRRHdBUVVCRUFFVUFTRUJLQUVyQVRvQlFBRktBVTRCV3dGZ0FXSUJoUUdIQVl3QmpRR1BBWlFCbndHb0FiY0J1d0hEQWN3Qjd3SCtBZ0VDSkFKSEFrZ0Nhd0p3QW9ZQ2lnQUFBQUFBQUFJQkFBQUFBQUFBQUZBQUFBQUFBQUFBQUFBQUFBQUFBQUtYIiwKICAic2RrX2FjdGlvbl9wYXRoIiA6ICJcL21xem9uZVwvMCIsCiAgInNka19hY3Rpb25fc2hlbWUiIDogInRlbmNlbnQxMTEwNjAzMzcwIiwKICAic2RrX2FjdGlvbl9ob3N0IiA6ICJxemFwcCIKfQ==
1
2
3
tencent1110603370://qzapp/mqzone/0
?objectlocation=url
&pasteboard=YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGvEBwLDCssLS4vMDEyMzQ1Njc4OTo7PkVGR0hJSktMVSRudWxs0w0ODxAdKldOUy5rZXlzWk5TLm9iamVjdHNWJGNsYXNzrBESExQVFhcYGRobHIACgAOABIAFgAaAB4AIgAmACoALgAyADaweHyAhIiMkJSYnKCmADoAPgBCAEYASgBSAFYAWgBeAGIAZgBqAG1pleHBpcmVzX2luXxASYXBwc2lnbl9idW5kbGVudWxsWmVuY3J5dG9rZW5TcmV0XHBhc3NEYXRhUmVzcFZvcGVuaWRScGZedXNlcl9jYW5jZWxsZWRVcGZrZXlZcGF5X3Rva2VuU21zZ1xhY2Nlc3NfdG9rZW4SAHanAFEyXxAgNmI5YTBjNDFkZmVlOGFhZWI1MjY5YzYyZTg0NzQ1ZGYQANIODzw9oIAT0j9AQUJaJGNsYXNzbmFtZVgkY2xhc3Nlc15OU011dGFibGVBcnJheaNBQ0RXTlNBcnJheVhOU09iamVjdF8QIEM3MTY5MDg2MUYyOTIzNDIzOEFCMkYzRDk0NTBDRDkwXm9wZW5tb2JpbGVfaW9zUk5PXxAgM2RmODE2YzU3MTY3NDIwZjRkN2QzODkzYTk2N2ExZjVfECA2RjQyRURBNEY1RjM0NzM3ODQ4NDQ4M0MyREYzRTM4OFBfECAyNzMyNkVCOURBODk4NjAzODEwMzE0NENDQTVEMzlBRdI/QE1OXxATTlNNdXRhYmxlRGljdGlvbmFyeaNNT0RcTlNEaWN0aW9uYXJ5AAgAEQAaACQAKQAyADcASQBMAFEAUwByAHgAfwCHAJIAmQCmAKgAqgCsAK4AsACyALQAtgC4ALoAvAC+AMsAzQDPANEA0wDVANcA2QDbAN0A3wDhAOMA5QDwAQUBEAEUASEBKAErAToBQAFKAU4BWwFgAWIBhQGHAYwBjQGPAZQBnwGoAbcBuwHDAcwB7wH+AgECJAJHAkgCawJwAoYCigAAAAAAAAIBAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAKX

取消

1
2
3
tencent1110603370://qzapp/mqzone/0
?objectlocation=url
&pasteboard=YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGlCwwVFhdVJG51bGzTDQ4PEBIUV05TLmtleXNaTlMub2JqZWN0c1YkY2xhc3OhEYACoROAA4AEXnVzZXJfY2FuY2VsbGVkU1lFU9IYGRobWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNEaWN0aW9uYXJ5ohocWE5TT2JqZWN0CBEaJCkyN0lMUVNZX2ZueYCChIaIipmdoq22w8YAAAAAAAABAQAAAAAAAAAdAAAAAAAAAAAAAAAAAAAAzw==

分析

分享

基础信息

  1. appIDtencent1110603370
  2. appNameBusMock
  3. appNumber1110603370
  4. bundleIDcom.nuomi1.bus.mock
  5. qqUniversalLinkhttps://qm.qq.com/opensdkul/
  6. universalLinkhttps://mock.bus.nuomi1.com/qq_conn/1110603370/
  7. urlSchemetencent1110603370://

公共部分

从记录到的 URL,我们可以看到 Universal Link 的公共部分:

  1. appsign_txidQQ + HEX(${appNumber})
  2. bundleidencodeBase64(${bundleID})
  3. callback_name${appsign_txid}
  4. callback_typescheme
  5. cflag 表示控制标记,将在下文进行说明
  6. descriptionencodeBase64(${description}),部分 MessageType 不存在此项
  7. generalpastboard1,表示通过 UIPasteboard.general 传递数据
  8. sdkv3.5.1,表示 SDK 版本
  9. shareTypeEndpoint0 表示 QQ 好友,1 表示 QQ 空间,将在下文进行说明
  10. src_typeapp,表示拉起 QQ 的来源
  11. thirdAppDisplayNameencodeBase64(${appName})
  12. titleencodeBase64(${title}),部分 MessageType 不存在此项
  13. version1,表示 API 版本

初次

当 App 初次分享到 QQ 时,调用 https://qm.qq.com/opensdkul/mqqapi/share/to_fri 拉起 QQ,URL 匹配 {qqUniversalLink}/mqqapi/share/to_fri

校验

此时需要进行 Universal Link 校验,调用 https://mock.bus.nuomi1.com/qq_conn/1110603370/com.nuomi1.bus.mock/mqqsignapp 返回 App,URL 匹配 ${universalLink}/${bundleID}/mqqsignapp,数据从 appsign_extrainfo 获取。

decodeBase64 之后,发现格式为 json

1
2
3
4
5
6
7
{
"appsign_redirect_pasteboard": "",
"appsign_redirect": "mqqapi://share/to_fri?appsign_txid=QQ4232766A&bundleid=Y29tLm51b21pMS5idXMubW9jaw==&callback_name=QQ4232766A&callback_type=scheme&cflag=2&file_data=6YKj5LmI77yMIOW4puedgOi/meS6m+mXrumimO+8jOaIkeS7rOadpeWuoeinhuS4gOS4i0JVU+OAgiDlj6/mmK/vvIzljbPkvb/mmK/ov5nmoLfvvIxCVVPnmoTlh7rnjrDku43nhLbku6PooajkuobkuIDlrprnmoTmhI/kuYnjgIIgQlVT55qE5Y+R55Sf77yM5Yiw5bqV6ZyA6KaB5aaC5L2V5YGa5Yiw77yM5LiNQlVT55qE5Y+R55Sf77yM5Y+I5Lya5aaC5L2V5Lqn55Sf44CCIOeUn+a0u+S4re+8jOiLpUJVU+WHuueOsOS6hu+8jOaIkeS7rOWwseS4jeW+l+S4jeiAg+iZkeWug+WHuueOsOS6hueahOS6i+WunuOAgiDnu4/ov4fkuIrov7DorqjorrrvvIwg6YKj5LmI77yMIOaXoueEtuWmguS9le+8jCDnjrDlnKjvvIzop6PlhrNCVVPnmoTpl67popjvvIzmmK/pnZ7luLjpnZ7luLjph43opoHnmoTjgIIg5omA5Lul77yMIOaIkeS7rOmDveefpemBk++8jOWPquimgeacieaEj+S5ie+8jOmCo+S5iOWwseW/hemhu+aFjumHjeiAg+iZkeOAgiDov5nnp43kuovlrp7lr7nmnKzkurrmnaXor7TmhI/kuYnph43lpKfvvIznm7jkv6Hlr7nov5nkuKrkuJbnlYzkuZ/mmK/mnInkuIDlrprmhI/kuYnnmoTjgIIg5bq35b635pu+57uP5o+Q5Yiw6L+H77yM5pei54S25oiR5bey57uP6LiP5LiK6L+Z5p2h6YGT6Lev77yM6YKj5LmI77yM5Lu75L2V5Lic6KW/6YO95LiN5bqU5aao56KN5oiR5rK/552A6L+Z5p2h6Lev6LWw5LiL5Y6744CC6L+Z5Ly85LmO6Kej562U5LqG5oiR55qE55aR5oOR44CC&file_type=text&generalpastboard=1&sdkv=3.5.1&shareType=0&src_type=app&thirdAppDisplayName=QnVzTW9jaw==&version=1",
"appsign_retcode": "25105",
"appsign_token": "6c784232766a288122df5fee8f16fc38",
"appsign_bundlenull": "2"
}

如果 appsign_extrainfo 没有数据,可以从剪切板 pasteboardType = com.tencent.${appID} 获取数据。

格式为 archivedData

1
2
3
4
5
6
7
8
9
10
{
"appsign_bundlenull" = 2;
"appsign_redirect" = "mqqapi://share/to_fri?thirdAppDisplayName=QnVzTW9jaw==&shareType=0&objectlocation=pasteboard&file_type=img&callback_name=QQ4232766A&src_type=app&version=1&cflag=2&callback_type=scheme&generalpastboard=1&sdkv=3.5.1&bundleid=Y29tLm51b21pMS5idXMubW9jaw==&appsign_txid=QQ4232766A";
"appsign_redirect_pasteboard" = {
"file_data" = {length = 1814667, bytes = 0x47494638 39612c01 a900f700 0082afc1 ... 1420568b 8000003b };
previewimagedata = {length = 4827, bytes = 0xffd8ffe0 00104a46 49460001 01000048 ... 7aa27fbd 401fffd9 };
};
"appsign_retcode" = 25105;
"appsign_token" = 6c784232766a288122df5fee8f16fc38;
}

我们可以看到:

  1. appsign_bundlenull 不明
  2. appsign_redirect 表示重定向 URL,但该 URL 属于 URL Scheme 格式,需要转换为 Universal Link 格式
  3. appsign_redirect_pasteboard 表示剪切板数据
  4. appsign_retcode 表示返回代码
  5. appsign_token 表示分享 token

二次

拿到 token 之后,进行第二次分享,此时 URL 比初次多了 appsign_token / openredirect = 1,并且 appsign_txid 重复了一次,应该是 BUG?

三次

进行第三次分享时,openredirect 没有了,重复的 appsign_txid 也变回了一个。

成功

分享成功时,调用 https://mock.bus.nuomi1.com/qq_conn/1110603370/com.nuomi1.bus.mock 返回 App,URL 匹配 ${universalLink}/${bundleID},注意没有额外的 path,数据从 sdkactioninfo 获取。

decodeBase64 之后,发现格式为 json

1
2
3
4
5
6
{
"sdk_action_query": "appsign_bundlenull=2&source=qq&source_scheme=mqqapi&error=0&version=1",
"sdk_action_path": "",
"sdk_action_sheme": "tencent1110603370",
"sdk_action_host": "response_from_qq"
}

我们可以看到,用这些数据拼接成 URL 后,与通过 URL Scheme 返回时调用的 URL 一致,URL 匹配 ${appID}://response_from_qq,注意没有 path

取消

取消分享与分享成功的处理流程一致,只不过返回数据略有不同:

1
2
3
4
5
6
{
"sdk_action_query": "error_description=dGhlIHVzZXIgZ2l2ZSB1cCB0aGUgY3VycmVudCBvcGVyYXRpb24=&appsign_bundlenull=2&source=qq&source_scheme=mqqapi&error=-4&version=1",
"sdk_action_path": "",
"sdk_action_sheme": "tencent1110603370",
"sdk_action_host": "response_from_qq"
}

我们可以看到:

  1. error 为错误标记,0 表示成功,-4 表示用户取消
  2. error_descriptionencodeBase64("the user give up the current operation")
  3. sourceqq,可能表示从 QQ 返回
  4. source_schememqqapi,不明

剪切板

QQ SDK 大多数情况下通过 URL 传递数据,涉及大文件时通过剪切板 pasteboardType = com.tencent.mqq.api.apiLargeData 传递数据。数据格式是 [String: Any] 键值对,再使用 NSKeyedArchiver 转换为 Data 进行传递。

  1. file_data 为大文件,将在下文进行说明
  2. pasted_string 为剪切板已拷贝的字符串
  3. previewimagedata 为预览图

TextMessage

我们可以看到:

  1. file_dataencodeBase64(${text}),注意没有使用剪切板进行传递
  2. file_typetext

ImageMessage

我们可以看到:

  1. file_typeimg
  2. objectlocationpasteboard,表示通过剪切板进行传递

同时使用剪切板设置 file_data / previewimagedata

AudioMessage

我们可以看到:

  1. file_typeaudio
  2. flashurlencodeBase64(${dataLink}),表示音频文件的 URL
  3. objectlocationpasteboard,实际上不需要设置
  4. urlencodeBase64(${link})

VideoMessage

我们可以看到:

  1. file_typevideo
  2. objectlocationpasteboard,实际上不需要设置
  3. urlencodeBase64(${link})

WebPageMessage

我们可以看到:

  1. file_typenews
  2. objectlocationurl,实际上不需要设置
  3. pasteboard 为空,可能是 BUG
  4. urlencodeBase64(${link})

FileMessage

我们可以看到:

  1. fileNametext(${fullName}),注意没有使用 base64 进行编码
  2. file_typelocalFile
  3. objectlocationpasteboard

同时使用剪切板设置 file_data

MiniProgramMessage

我们可以看到:

  1. file_typenews
  2. mini_appidtext(${miniProgramID})
  3. mini_code641,不明
  4. mini_pathencodeBase64(${path})
  5. mini_typeMiniProgramType1 表示 preview 预览,3 表示 online 正式,4 表示 test 测试
  6. mini_weburlencodeBase64(${link}),表示兼容旧版的网页 URL
  7. objectlocationurl
  8. pasteboard 为空

QQ 的小程序分享需要关联一个 AudioMessage / VideoMessage / WebPageMessage,这里选择了 WebPageMessage,因此部分数据与 WebPageMessage 相同。

cflag

这个控制标记受分享行为与分享类型影响:

  1. 2 表示 qqapiCtrlFlagQZoneShareForbid 屏蔽好友选择器上的空间入口
  2. 16 表示 qqapiCtrlFlagQQShareDataline 数据线FileMessage 需要设置此项
  3. 64 表示 kQQAPICtrlFlagQQShareEnableMiniProgram 小程序MiniProgramMessage 需要设置此项

cflag 属于 OptionSet,通过位运算声明支持一种或多种特性。

shareType

大多数情况下把 shareType 改为 1 即可分享到 QQ 空间。但是 TextMessage / ImageMessage 不支持直接分享到 QQ 空间,因此需要把 shareType 改为 0cflag 改为 0 从好友选择器里选择 QQ 空间进行分享。同时 FileMessage / MiniProgramMessage 不支持分享到 QQ 空间。

登录

当 App 使用 QQ 登录时,调用 https://qm.qq.com/opensdkul/mqqOpensdkSSoLogin/SSoLogin/tencent1110603370 打开 QQ,URL 匹配 ${qqUniversalLink}/mqqOpensdkSSoLogin/SSoLogin/${appID},数据从 pasteboard 获取。

decodeBase64 之后,发现格式为 archivedData

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"app_id" = 1110603370;
"app_name" = BusMock;
"appsign_token" = "";
bundleid = "com.nuomi1.bus.mock";
"client_id" = 1110603370;
refUniversallink = "https://mock.bus.nuomi1.com/qq_conn/1110603370/";
"response_type" = token;
scope = "get_user_info";
sdkp = i;
sdkv = "3.5.1_lite";
"status_machine" = "iPhone12,1";
"status_os" = "14.3";
"status_version" = 14;
}

我们可以看到:

  1. app_id${appNumber}
  2. app_name${appName}
  3. appsign_token 为空
  4. bundleid${bundleID}
  5. client_id${appNumber}
  6. refUniversallink{universalLink}
  7. response_typetoken,可能表示需要返回登录 token
  8. scope 为权限范围,get_user_info 表示 kOPEN_PERMISSION_GET_USER_INFO 获取用户信息
  9. sdkpi,可能表示系统 iOS
  10. sdkv3.5.1_lite,表示 SDK 详细版本
  11. status_machineiPhone12,1,表示设备型号
  12. status_os14.3,表示系统版本
  13. status_version14,可能表示系统主要版本

成功

登录成功时,调用 https://mock.bus.nuomi1.com/qq_conn/1110603370/com.nuomi1.bus.mock 返回 App,URL 匹配 ${universalLink}/${bundleID},没有 path,数据从 sdkactioninfo 获取。

decodeBase64 之后,发现格式为 json

1
2
3
4
5
6
{
"sdk_action_query": "objectlocation=url&pasteboard=YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGvEBwLDCssLS4vMDEyMzQ1Njc4OTo7PkVGR0hJSktMVSRudWxs0w0ODxAdKldOUy5rZXlzWk5TLm9iamVjdHNWJGNsYXNzrBESExQVFhcYGRobHIACgAOABIAFgAaAB4AIgAmACoALgAyADaweHyAhIiMkJSYnKCmADoAPgBCAEYASgBSAFYAWgBeAGIAZgBqAG1pleHBpcmVzX2luXxASYXBwc2lnbl9idW5kbGVudWxsWmVuY3J5dG9rZW5TcmV0XHBhc3NEYXRhUmVzcFZvcGVuaWRScGZedXNlcl9jYW5jZWxsZWRVcGZrZXlZcGF5X3Rva2VuU21zZ1xhY2Nlc3NfdG9rZW4SAHanAFEyXxAgNmI5YTBjNDFkZmVlOGFhZWI1MjY5YzYyZTg0NzQ1ZGYQANIODzw9oIAT0j9AQUJaJGNsYXNzbmFtZVgkY2xhc3Nlc15OU011dGFibGVBcnJheaNBQ0RXTlNBcnJheVhOU09iamVjdF8QIEM3MTY5MDg2MUYyOTIzNDIzOEFCMkYzRDk0NTBDRDkwXm9wZW5tb2JpbGVfaW9zUk5PXxAgYzk5MjkwZGRiOTNmYTY3ZTMyMzFjZTU3MjBkNjkzMjlfECBERTIzN0U5RjNGMkI5NENEMzIwRkExRTEyMDE4MjAyQlBfECAyNzMyNkVCOURBODk4NjAzODEwMzE0NENDQTVEMzlBRdI/QE1OXxATTlNNdXRhYmxlRGljdGlvbmFyeaNNT0RcTlNEaWN0aW9uYXJ5AAgAEQAaACQAKQAyADcASQBMAFEAUwByAHgAfwCHAJIAmQCmAKgAqgCsAK4AsACyALQAtgC4ALoAvAC+AMsAzQDPANEA0wDVANcA2QDbAN0A3wDhAOMA5QDwAQUBEAEUASEBKAErAToBQAFKAU4BWwFgAWIBhQGHAYwBjQGPAZQBnwGoAbcBuwHDAcwB7wH+AgECJAJHAkgCawJwAoYCigAAAAAAAAIBAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAKX",
"sdk_action_path": "/mqzone/0",
"sdk_action_sheme": "tencent1110603370",
"sdk_action_host": "qzapp"
}

与分享回调一样,拼接成 URL 后进行处理,URL 匹配 ${appID}://qzapp/mqzone/0,数据从 pasteboard 获取。

decodeBase64 之后,发现格式为 archivedData

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"access_token" = 27326EB9DA8986038103144CCA5D39AE;
"appsign_bundlenull" = 2;
encrytoken = 6b9a0c41dfee8aaeb5269c62e84745df;
"expires_in" = 7776000;
msg = "";
openid = C71690861F29234238AB2F3D9450CD90;
passDataResp = (
);
"pay_token" = DE237E9F3F2B94CD320FA1E12018202B;
pf = "openmobile_ios";
pfkey = c99290ddb93fa67e3231ce5720d69329;
ret = 0;
"user_cancelled" = NO;
}

我们可以看到:

  1. access_token 为登录 token
  2. encrytoken 不明
  3. expires_in 为过期时间间隔
  4. msg 不明
  5. openid 为开放 ID
  6. passDataResp 不明
  7. pay_token 可能为支付 token
  8. pf 可能为平台标记 platform
  9. ret 可能为返回代码 result
  10. user_cancelledNO,表示成功

取消

取消登录时,调用 tencent1110603370://qzapp/mqzone/0 返回 App,URL 匹配 ${appID}://qzapp/mqzone/0,数据从 pasteboard 获取。

decodeBase64 之后,发现格式为 archivedData

1
2
3
{
"user_cancelled" = YES;
}

我们可以看到:

  1. user_cancelledYES,表示用户取消

总结

本文通过记录和分析 QQ SDK 的行为,厘清了 QQ 分享和登录的流程。传递数据主要靠 URL,大文件则使用剪切板。但可能是历史原因,QQ 在处理数据使用了多种方式,pure URL query / json in URL query / data in pasteboard / data in URL query。URL query 的命名也是五花八门。

还有一个可能是 BUG 的问题,在 App 支持 Universal Link 的情况下,取消登录返回 App 时 QQ 使用 URL Scheme 进行回调,而不是 Universal Link,但其他的操作都是 Universal Link。

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

参考

  1. NBus - QQHandler