Успешный вызов интерфейса
Первоначально это был просто вызов индексного интерфейса wx.Код Python выглядит следующим образом:
urllib3.disable_warnings()
page = SessionPage()
state = page.post(url='https://search.weixin.qq.com/cgi-bin/wxaweb/wxindex',
json={
"openid": "xxxxxxxxxxx",
"search_key": "xxxxxxxxxxxx",
"cgi_name": "GetMultiChannel",
"query": ["母亲节"],
"start_ymd": "20210422",
"end_ymd": "20230518"
},
headers={
'Host': 'search.weixin.qq.com',
'referer': 'https://servicewechat.com/wxc026e7662ec26a3a/42/page-frame.html',
'user-agent': 'Mozilla/5.0 (Linux; Android 7.1.2; SM-G9810 Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36 MMWEBID/3687 MicroMessenger/8.0.27.2220(0x28001B36) WeChat/arm32 Weixin NetType/WIFI Language/zh_CN ABI/arm32 MiniProgramEnv/android',
'Content-Type': 'application/json'
}, show_errmsg=True,
verify=False)
print('state:' + str(state))
print('响应:' + page.html)
Код очень простой, по перехвату Чарльза параметры собираются, и запрос выполняется напрямую!
Неудачный вызов интерфейса
Когда я был счастлив, я отправил еще один запрос, и ответ стал таким: {"code":-10000, "msg": "авторизация не удалась."}, не удалось!
Невероятно, я пробовал еще несколько раз, но авторизация все время не удалась, я уверен, действительно не удалась!
Поэтому я начал искать причины неудачи.
После многократного сравнения параметров Чарльза выяснилось, что search_key в запросе является динамическим параметром, который будет периодически меняться.
Итак, следующий контент посвящен изучению того, почему и как изменяется search_key.
обратный источник
Данные индекса wx поступают из небольшой программы wx index, поэтому необходимо перевернуть wxapkg и изучить исходный код.
Найдите на эмуляторе соответствующий пакет апплета wxapkg, перетащите его, распакуйте с помощью wxappUnpacker и обнаружите массу ошибок.
Основная причина - ошибка конфигурации app.json, Ошибка: xxx.js, _typeof3 не является функцией и другие ошибки. После устранения их по одной используйте инструмент разработки wx, чтобы открыть исходный код и просмотреть соответствующий код:
i = require("./login"),
r = i.checkLogin
! function a(h) {
return r().then(function (r) {
h && n.setId();
var l = t(t({
openid: r.openid,
search_key: r.search_key
}, n.data), e);
n.log("➡️", "request\n", l), n.timestamp = Date.now(),
wx.request({
url: "https://search.weixin.qq.com/cgi-bin/wxaweb/".concat(n.cgi),
data: l,
method: "POST",
header: {
"Content-Type": "application/json"
},
success: function (t) {
......
Видно, что запрошенный параметр search_key поступает из r.search_key, r — из i.checkLogin, i — из входа в систему, find login.js, а checkLogin определяется следующим образом:
checkLogin: function () {
var n = wx.getStorageSync(e);
return n ? new Promise(function (e) {
e(JSON.parse(n));
}) : r();
}
Следовательно, search_key в параметре — это значение, полученное из кэша, а место его хранения:
return wx.login({
success: function (o) {
! function t() {
return wx.request({
url: "https://search.weixin.qq.com/cgi-bin/searchweb/weapplogin",
data: {
appid: "appidxxxxxxxxxxxxxxxxxx",
js_code: o.code
},
success: function (o) {
var r = o.data,
u = void 0 === r ? {} : r;
try {
0 == u.errcode ? (wx.setStorageSync(e, JSON.stringify(u.data)), c = 0, i = null,
n(u.data)) : a(u, "weapplogin", t);
} catch (n) {
a(n, "weapplogin", t);
}
},
fail: function (n) {
a(n, "weapplogin", t);
}
});
}();
},
Таким образом, сохраненное значение поступает из ответа интерфейса cgi-bin/searchweb/weapplogin, и этому интерфейсу необходимо передать два параметра appid и js_code. Appid легко назвать, а js_code берется из кода wx.login, что сделать непросто.
После долгих поисков я не увидел подробного описания wx.login(), но согласно некоторым сообщениям в Интернете говорится, что уже существует зрелая платформа авторизации wx, и код можно получить через свою платформу без вызова wx.login().
Поэтому попытка вызвать индекс wx через интерфейс в конечном итоге терпит неудачу.
наконец
Итак, наконец, кто из воротил вводит платформу авторизации?