2

QT 5.0.2 ビルド済みおよび QT クリエーター 2.7.0 を使用しています。私の目標は、una​​me、パスワード、および steamguard コードを使用してプログラムでSteam ネットワークにログインすることです。または、より正確に言うと、 QNetworkAccessManager を最初の初期化されていない状態から、ユーザーとしてログインしているかのように Steam 関連サイトからデータを取得できる状態にします。

したがって、ログインは 4 つのステップ (4 つの要求と応答の組み合わせ) で行われます。ユーザー名を「hyper」とします

1. 最初のリクエスト:

post https://store.steampowered.com/login/getrsakey/?username=hyper

これが私の機能です:

void http::steam_auth(const QString &uname, const QString &pwd)
{
    QString encrypted_password, sg, pkey_exp, pkey_mod, timestamp, emailsteamid;
    QJsonDocument json_buffer;
    QByteArray buffer;
    QUrl rsa(steam_getrsa), login(steam_dologin); //steam login urls
    QUrlQuery urlquery;

ここでリクエストを送信します。

  urlquery.addQueryItem("username", uname); //first step
    urlquery.addQueryItem("l", "english"); //set communication language
    rsa.setQuery(urlquery);
    QNetworkRequest first(rsa);
    QNetworkReply *reply = this->get(first);
    buffer = reply->readAll();

応答として、次のようになります。

{"success":true,"publickey_mod":"AC41A964789638B6A3B3BD5ADD9F3680FA45881C70FD2032B10A3BB6D2ACF021C2B3D564DC44DE3054E3BF78A1753399223C794A0DED03A76CD1F1DFE851E30F0D6F14484C258EB6053676A47D20A68E11ECCD783F343594DDA3817AA5DCCE75FAF5C68BB197DA1FF12F22F9FCD83624D00A23CC57A367563ADBBCEDF5C8742A57B12A4BD04DC02A55C80F4F6984B1E2D5A99081510326E1C6BAB2C2723560487E8F7EA1A2CB55AEFC5594C9FBB71CAD553CB2D866214BC41156259FEC55362D38DCDBE8FADFB577FE0736CE3E37AF6D2CDDF28FA218C1E477E29B17713BFC48A227455B6B0DE09884CC0820CE40CD4877D93704D00E20A235FCF55D100A01C1","publickey_exp":"010001","timestamp":"284691100000"}

つまり、すべて問題ありません。次に、パスワードを送信する前に暗号化する必要があります

json_buffer = QJsonDocument::fromJson(buffer);
pkey_exp = json_buffer.object().value("publickey_exp").toString();
pkey_mod = json_buffer.object().value("publickey_mod").toString();
timestamp = json_buffer.object().value("timestamp").toString();
delete reply;
urlquery.clear();
encrypted_password = app::core::get_encrypted_password(pwd, pkey_exp, pkey_mod);

2. 暗号化されたパスワードを送信します。

urlquery.addQueryItem("username", uname);
urlquery.addQueryItem("password", encrypted_password);
urlquery.addQueryItem("emailauth", "");
urlquery.addQueryItem("captchagid", "");
urlquery.addQueryItem("captcha_text", "");
urlquery.addQueryItem("emailsteamid", "");
urlquery.addQueryItem("rsatimestamp", timestamp);
urlquery.addQueryItem("remember_login", "false");
login.setQuery(urlquery);
QNetworkRequest second(login);
second.setUrl(login);
reply = this->get(second);
buffer = reply->readAll();

次のようにリクエスト文字列を取得します。

post https://store.steampowered.com/login/dologin/?username=solidbeetle2&password=YmhTKVkRXyiCYe6wx+ZJ8PIhzj4A4BLWgJFOE5ge7nbIAM6m1G9qHh+Iqx30ZLdB0wW0xdWDNCgHBNPHKLA+P2pYhPF0DeL9v8UQsers6NCNNPZ0SFN4HhNlu6Gwh8QAjrNykev7N5FADXwJnFjPBvmvthATmrktVEtFYF54lckaPnijXYSDIpfEjmG8+bCDKT/GLaUiftA2QauUY9ap8WHSEoykiTmfL344ghzjhCA33UKx0NIgBrDdI1RLfHVcmAcU/c9NEhoHLOT93n8hqWY+YVx9VbOcKqqZPrbCiQoU2BZrqK6N7aj+K6kH0VWHH7+LD2KJx4BUJgHOmNqVDg%3D%3D&emailauth=&captchagid=&captcha_text=&emailsteamid=&rsatimestamp=50693150000&remember_login=false

私が知る限り、それは完全に有効です.SteamサイトのJSは同じajaxを送信しますが... ここに問題があります これで応答を受け取るとmessage:Invalid loginjsonで表示されます...しかし、完全なクエリを保存するとリクエストからファイルへの文字列をコピーし、それをブラウザまたは HTTP アナライザー内の HTTP リクエスト ビルダーに貼り付けると、問題なく動作し、次のメッセージ が表示されます。足りないものはありますか?QNetworkAccessManager は何らかの形でこれを壊しますか?:c不明な点 がありましたら申し訳ありません。必要に応じてもう一度説明します。前もって感謝します!

PS アプリが送信しているリクエストを確認する確実な方法はありますか?

PSS qml オプションを使用してプロジェクトをデバッグすると、qt 作成者がクラッシュするようです。idk なぜ...

4

1 に答える 1

3

私はこのすべてのものを検査し、最終的に私の目標を達成することができました. 要するに、問題は qt の Web 指向のクラスにありました。qurlquery が / や = などの文字を % エンコード形式でエンコードする必要があることは明らかなように思われましたが、そうではないため、QString で手動で置き換える必要がありました。誰かが作業ルーチンを必要とする場合は、ここで見つけることができます(それはきれいではありません:c)

于 2013-06-16T10:01:23.560 に答える