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
|
剪切板
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 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==
|
分析
分享
基础信息
appID 为 tencent1110603370
appName 为 BusMock
appNumber 为 1110603370
bundleID 为 com.nuomi1.bus.mock
qqUniversalLink 为 https://qm.qq.com/opensdkul/
universalLink 为 https://mock.bus.nuomi1.com/qq_conn/1110603370/
urlScheme 为 tencent1110603370://
公共部分
从记录到的 URL,我们可以看到 Universal Link 的公共部分:
appsign_txid 为 QQ + HEX(${appNumber})
bundleid 为 encodeBase64(${bundleID})
callback_name 为 ${appsign_txid}
callback_type 为 scheme
cflag 表示控制标记,将在下文进行说明
description 为 encodeBase64(${description}),部分 MessageType 不存在此项
generalpastboard 为 1,表示通过 UIPasteboard.general 传递数据
sdkv 为 3.5.1,表示 SDK 版本
shareType 为 Endpoint,0 表示 QQ 好友,1 表示 QQ 空间,将在下文进行说明
src_type 为 app,表示拉起 QQ 的来源
thirdAppDisplayName 为 encodeBase64(${appName})
title 为 encodeBase64(${title}),部分 MessageType 不存在此项
version 为 1,表示 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; }
|
我们可以看到:
appsign_bundlenull 不明
appsign_redirect 表示重定向 URL,但该 URL 属于 URL Scheme 格式,需要转换为 Universal Link 格式
appsign_redirect_pasteboard 表示剪切板数据
appsign_retcode 表示返回代码
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" }
|
我们可以看到:
error 为错误标记,0 表示成功,-4 表示用户取消
error_description 为 encodeBase64("the user give up the current operation")
source 为 qq,可能表示从 QQ 返回
source_scheme 为 mqqapi,不明
剪切板
QQ SDK 大多数情况下通过 URL 传递数据,涉及大文件时通过剪切板 pasteboardType = com.tencent.mqq.api.apiLargeData 传递数据。数据格式是 [String: Any] 键值对,再使用 NSKeyedArchiver 转换为 Data 进行传递。
file_data 为大文件,将在下文进行说明
pasted_string 为剪切板已拷贝的字符串
previewimagedata 为预览图
TextMessage
我们可以看到:
file_data 为 encodeBase64(${text}),注意没有使用剪切板进行传递
file_type 为 text
ImageMessage
我们可以看到:
file_type 为 img
objectlocation 为 pasteboard,表示通过剪切板进行传递
同时使用剪切板设置 file_data / previewimagedata。
AudioMessage
我们可以看到:
file_type 为 audio
flashurl 为 encodeBase64(${dataLink}),表示音频文件的 URL
objectlocation 为 pasteboard,实际上不需要设置
url 为 encodeBase64(${link})
VideoMessage
我们可以看到:
file_type 为 video
objectlocation 为 pasteboard,实际上不需要设置
url 为 encodeBase64(${link})
WebPageMessage
我们可以看到:
file_type 为 news
objectlocation 为 url,实际上不需要设置
pasteboard 为空,可能是 BUG
url 为 encodeBase64(${link})
FileMessage
我们可以看到:
fileName 为 text(${fullName}),注意没有使用 base64 进行编码
file_type 为 localFile
objectlocation 为 pasteboard
同时使用剪切板设置 file_data。
MiniProgramMessage
我们可以看到:
file_type 为 news
mini_appid 为 text(${miniProgramID})
mini_code64 为 1,不明
mini_path 为 encodeBase64(${path})
mini_type 为 MiniProgramType,1 表示 preview 预览,3 表示 online 正式,4 表示 test 测试
mini_weburl 为 encodeBase64(${link}),表示兼容旧版的网页 URL
objectlocation 为 url
pasteboard 为空
QQ 的小程序分享需要关联一个 AudioMessage / VideoMessage / WebPageMessage,这里选择了 WebPageMessage,因此部分数据与 WebPageMessage 相同。
cflag
这个控制标记受分享行为与分享类型影响:
2 表示 qqapiCtrlFlagQZoneShareForbid 屏蔽好友选择器上的空间入口
16 表示 qqapiCtrlFlagQQShareDataline 数据线 ,FileMessage 需要设置此项
64 表示 kQQAPICtrlFlagQQShareEnableMiniProgram 小程序 ,MiniProgramMessage 需要设置此项
cflag 属于 OptionSet,通过位运算声明支持一种或多种特性。
shareType
大多数情况下把 shareType 改为 1 即可分享到 QQ 空间。但是 TextMessage / ImageMessage 不支持直接分享到 QQ 空间,因此需要把 shareType 改为 0 且 cflag 改为 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; }
|
我们可以看到:
app_id 为 ${appNumber}
app_name 为 ${appName}
appsign_token 为空
bundleid 为 ${bundleID}
client_id 为 ${appNumber}
refUniversallink 为 {universalLink}
response_type 为 token,可能表示需要返回登录 token
scope 为权限范围,get_user_info 表示 kOPEN_PERMISSION_GET_USER_INFO 获取用户信息
sdkp 为 i,可能表示系统 iOS
sdkv 为 3.5.1_lite,表示 SDK 详细版本
status_machine 为 iPhone12,1,表示设备型号
status_os 为 14.3,表示系统版本
status_version 为 14,可能表示系统主要版本
成功
登录成功时,调用 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; }
|
我们可以看到:
access_token 为登录 token
encrytoken 不明
expires_in 为过期时间间隔
msg 不明
openid 为开放 ID
passDataResp 不明
pay_token 可能为支付 token
pf 可能为平台标记 platform
ret 可能为返回代码 result
user_cancelled 为 NO,表示成功
取消
取消登录时,调用 tencent1110603370://qzapp/mqzone/0 返回 App,URL 匹配 ${appID}://qzapp/mqzone/0,数据从 pasteboard 获取。
decodeBase64 之后,发现格式为 archivedData:
1 2 3
| { "user_cancelled" = YES; }
|
我们可以看到:
user_cancelled 为 YES,表示用户取消
总结
本文通过记录和分析 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。
完整代码实现请参考来源。
参考
- NBus - QQHandler