国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ WeChat アプレット WeChatの開発 WeChat QRコードログインでのJSコード解析

WeChat QRコードログインでのJSコード解析

Apr 02, 2017 pm 02:17 PM
jsコード 微信

多くの場(chǎng)所で、QRコードログイン、QRコード決済、QRコードアカウント(ここではQRコードスタリオン、詐欺は言うまでもありません)、QRコード認(rèn)証、多端末補(bǔ)助認(rèn)証などのアプリケーションが増えています。まず QR コードとは何かについて説明します。実際、QR コードはバイナリ データを格納する白黒コードです畫像 、ログインに QR コードが必要な場(chǎng)合、サーバーは一時(shí)的で固有の QR コード情報(bào)を生成し、それをクライアントに送信し、QR コードの形式で Web ページに書き込みます (畫像) すると、統(tǒng)一された 4 つの正方形の QR コードが表示されます。ここでは、単純な WeChat ログインを考慮しません。

まず最初に、認(rèn)証プロセス全體について説明します。

クライアント Web ページは継続的に https 接続をサーバーに送信し、ごくわずかなデータを送信した後に接続が切斷されます。login1c709c.

js を見てみましょう。 WeChat Web ページの

ファイル:

(function($, _aoWin) {
_aoWin.QRLogin = {};
  _aoWin.LoginLog = "";
 var _sBaseHost = "",
    _oLoginQrCodeImg = document.getElementById("loginQrCode");
 if (document.domain == "qq.com") {
 _sBaseHost = "weixin.qq.com";
 } else if(location.hostname.match(/(wechat\.com)$/)){
 _sBaseHost = "wechat.com";
 }else{
    _sBaseHost = "wechatapp.com";
  }
 
 var show_tip = 1,
 _sCurUUId,
 _oResetTimeout,
    _aWebMMCallbacks = [],
    _oDetactWebMMInterval = setInterval(function(){
      if(_aoWin.WebMM){
        clearInterval(_oDetactWebMMInterval);
        var callback;
        while(callback = _aWebMMCallbacks.shift()){
          if(typeof(callback) != "function") continue;
          callback();
        }
      }
    }, 1000);

function _logInPage(_asLog){
    _aoWin.LoginLog = LoginLog + _asLog + "\n";
  }
 
  function _afterLoadWebMMDo(callback){
    if(!_aoWin.WebMM){
      _aWebMMCallbacks.push(callback);
    }else{
      callback();
    }
  }
 
  function _reportNow(text){
    _logInPage(text);
    _afterLoadWebMMDo(function(){
      WebMM.ossLog({Text: text});
      WebMM.flushOssLog();
    });
  }
 
  var reLoadQRImgCount = 0,
    loadQRCodeTime = 0,
    loadQRImgSucc = function(){
      clearInterval(loadQRImgWatchDog);
      _logInPage("Load QRCode Success, time=" + (new Date().getTime() - loadQRCodeTime) + "ms, reload count: " + reLoadQRImgCount);
    },
    loadQRImgFail = function(img){
      _reportNow("Load QRcode fail!" + status + ", src: " + img.src + ", time: " + (new Date().getTime() - loadQRCodeTime) + "ms");
    },
    loadQRImgWatchDog = null;
 function _loadQRImg(uuid) {
    _poll(uuid);
    _logInPage("Load QRCode Start");
    loadQRCodeTime = new Date().getTime();
 
    _oLoginQrCodeImg.onload = function(){
      loadQRImgSucc();
      _oLoginQrCodeImg.onload = null;
    };
    _oLoginQrCodeImg.onerror = function(){loadQRImgFail(this)};
    _oLoginQrCodeImg.src = "https://login."+_sBaseHost+"/qrcode/"+uuid+"?t=webwx";
 
    loadQRImgWatchDog = setInterval(function(){
      if (reLoadQRImgCount >= 5) {
        _reset();
        return;
      }
      reLoadQRImgCount++;
 
      var _img = new Image();
      _img.onload = function () {
        if(!_oLoginQrCodeImg.onload) return;
 
        _oLoginQrCodeImg.onload = null;
        _oLoginQrCodeImg.src = this.src;//replace
        loadQRImgSucc();
      };
      _img.onerror = function(){loadQRImgFail(this)};
      _img.src = _oLoginQrCodeImg.src + "&r=" + new Date().getTime();
    }, 5000);
  }
 
  var _sSecondRequestTime = 0,
    _nAjaxTimeout = 100 * 1000,
    _nNewLoginFuncErrCount = 0;
 function _poll(_asUUID) {
 var _self = arguments.callee,
      _nTime = 0;
 _sCurUUId = _asUUID;
 
    _logInPage("_poll Request Start, time: " + new Date().getTime());
    _nTime = new Date().getTime();
 $.ajax({
 type: "GET",
 url: "https://login." + _sBaseHost + "/cgi-bin/mmwebwx-bin/login?uuid=" + _asUUID + "&tip=" + show_tip,
 dataType: "script",
 cache: false,
 timeout: _nAjaxTimeout,
 success: function(data, textStatus, jqXHR) {
      _logInPage("_poll Request Success, code: " + window.code + ", time: " + (new Date().getTime() - _nTime) + "ms");
  switch (_aoWin.code) {
  case 200:
   _sSecondRequestTime = new Date().getTime() - _sSecondRequestTime;
        _logInPage("Second Request Success, time: " + _sSecondRequestTime + "ms");
  clearTimeout(_oResetTimeout);
 
        var _fNewLoginFunc = function(){
          $.ajax({
            url: _aoWin.redirect_uri + "&fun=new",//new login page
            type: "GET",
            success:function(msg) {
              _logInPage("new func reponse, reponseMsg: " + msg);
              var code = msg.match(/<script>(.*)<\/script>/);
              var skey=msg.match(/<skey>(.*)<\/skey>/);
              if(code){
                eval(code[1]);
              }else{
                $("#container").show();
                $("#login_container").hide();
              }
              if(skey && skey[1]){
               WebMM.model("account").setSkey(skey[1]);
              }
            },
            error:function(jqXHR, textStatus, errorThrown){
              _nNewLoginFuncErrCount++;
              if(_nNewLoginFuncErrCount > 5){
                if(confirm("Call new login page func error, refresh?")){location.reload()}
                return;
              }
              _reportNow(_aoWin.redirect_uri + " New login page func error: " + textStatus +" retryCount:" + _nNewLoginFuncErrCount);
              setTimeout(_fNewLoginFunc, 500);
            }
          });
        };
        _fNewLoginFunc();
 
        _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Success, uuid: " + _asUUID + ", time: " + _sSecondRequestTime + "ms");
  break;
 
  case 201:
        clearTimeout(_oResetTimeout);
  show_tip = 0;
  $(&#39;.errorMsg&#39;).hide();
  $(&#39;.normlDesc&#39;).hide();
  $(&#39;.successMsg&#39;).show();
        _reportNow("/cgi-bin/mmwebwx-bin/login, First Request Success, uuid: " + _asUUID);
        _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Start, uuid: " + _asUUID);
 
        _sSecondRequestTime = new Date().getTime();
 
        //_nAjaxTimeout = 5 * 1000;
        _self(_asUUID);
        break;
 
  case 408:
  setTimeout(function(){
   _self(_asUUID);
  }, 500);
  break;
 
  case 400:
  case 500:
        _reset();
        _afterLoadWebMMDo(function(){
   _aoWin.Log.d("500, Login Poll Svr Exception");
  });
  break;
  }
 },
 error: function(jqXHR, textStatus, errorThrown) {
  if (textStatus == &#39;timeout&#39;) {
        setTimeout(function(){
          _self(_asUUID);
        }, 500);
  } else {
        setTimeout(function(){
          _self(_asUUID);
        }, 5000);
 
        _logInPage("_poll Request Error:" + textStatus);
        _afterLoadWebMMDo(function(){
          _aoWin.Log.e("Login Poll Error:" + textStatus);
        });
  }
 }
 });
 }

var getUUIDCount = 0,
    _getUUIDWatchDog,
    _bGetUUIDSuccess = false;//ajax success?
 function _getUUID() {
    getUUIDCount++;
    var _self = arguments.callee,
      _loadError = function(errorText){
        _reportNow("Load UUID Error! ErrorText: " + errorText + " getUUIDCount=" + getUUIDCount);
        if(getUUIDCount > 5){
          if (confirm("Load uuid error. Refresh?")) {
            location.reload();
          }
        }
        setTimeout(function(){
          _self();
        }, 500);
      };
 
    clearTimeout(_getUUIDWatchDog);
    _getUUIDWatchDog = setTimeout(function(){
      if(!_aoWin.QRLogin.code){
        _logInPage("GetUUID Timeout, WatchDog Run");
        _self();
      }
    }, 10000);
    
        $.ajax({      
          type: "GET",      
          url: "https://login." + _sBaseHost + "/jslogin?appid=wx782c26e4c19acffb&redirect_uri="+encodeURIComponent(location.protocol+"//"+location.host+"/cgi-bin/mmwebwx-bin/webwxnewloginpage")+"&fun=new&lang=" + document.lang,
           dataType: "script",
      cache: false,
      success : function(){
        clearTimeout(_getUUIDWatchDog);
        if(_bGetUUIDSuccess) return;
        if (_aoWin.QRLogin && _aoWin.QRLogin.code == 200) {
          _logInPage("GetUUID Success, UUID=" + QRLogin.uuid);
          _bGetUUIDSuccess = true;
 
          clearTimeout(_oResetTimeout);
          _oResetTimeout = setTimeout(function(){
            location.reload();//Note: Don&#39;t run _reset(). If you run _reset(), there will may have many _poll request, as they get 408 return code
          }, 5 * 60 *1000);//5 mins
 
          _loadQRImg(QRLogin.uuid);
        } else {
          var QRLoginCode = (_aoWin.QRLogin && _aoWin.QRLogin.code) ? _aoWin.QRLogin.code : "None";
          _logInPage("GetUUID Error, QRLogin.code=" + QRLoginCode);
          _loadError("QRLogin.code= " + QRLoginCode);
        }
      },
      error : function(xhr, textStatus, errorThrown){
        _logInPage("GetUUID Error, textStatus=" + textStatus);
        _loadError(textStatus);
      }
    });
 }
 
  function _reset(){
    location.reload();
  }
 
 if ($("#login_container").is(":visible") ) {
    _getUUID();
 }
 
  
 var _bHadLog = false;
 function _ossLog() {
 if (_bHadLog) return;
 _bHadLog = true;
 var _sUvid = document.cookie.match(new RegExp( "(^| )"+"webwxuvid"+"=([^;]*)(;|$)"));
    if(!_sUvid || _sUvid.length < 3) return;
    _sUvid = _sUvid[2];
 (new Image()).src = "/cgi-bin/mmwebwx-bin/webwxstatreport?funkey=indexdemo&uvid="+_sUvid+"&uuid="+_sCurUUId;
 }
 
 
 if($("img.guide").length > 0) {
 var _nTimer = 0,
  _oGuide$ = $(".guide"),
  _oGuideTrigger$ = $("#guideTrigger, #tipTrigger"),
  _oMask$ = $(".mask");
 
  function _back() {
  _nTimer = setTimeout(function() {
  _oMask$.stop().animate({opacity:0}, function(){$(".mask").hide()});
  _oGuide$.stop().animate({marginLeft:"-120px",opacity:0}, "400", "swing",function(){
   _oGuide$.hide();
  });
  }, 100);
 }
 
 /*guide*/
 _oGuide$.css({"left":"50%", "opacity":0});
 _oGuideTrigger$.css({"backgroundColor":"white", "opacity":"0"});
 _oGuideTrigger$.mouseover(function(){
  clearTimeout(_nTimer);
  _oMask$.show().stop().animate({"opacity":0.2});
  _oGuide$.css("display", "block").stop().animate({marginLeft:"+168px", opacity:1}, 900, "swing", function() {
  _oGuide$.animate({marginLeft:"+153px"}, 300);
  });
  _ossLog();
 }).mouseout(_back);
 
 _oGuide$.mouseover(function(){
  clearTimeout(_nTimer);
 }).mouseout(_back);
 }
})(jQuery, window);
js を注意深く読むと、Web クライアントからのログイン要求側(cè)がわかります。Web クライアントは、現(xiàn)在の QR コードにあるかどうかを要求するために、500 ミリ秒ごとにサーバーへの SSL 要求を開始します。他のクライアント(攜帯電話)認(rèn)証で使用されている場(chǎng)合、戻り結(jié)果が201の場(chǎng)合は、QRコード端末をスキャンして同じアカウントのログイン認(rèn)証を取得したことを意味します。それ以外の場(chǎng)合は、再度リクエストを送信します。 500 ミリ秒。このプロセスは、QR コードがスキャンされるか、QR コードがタイムアウトになるまで続きます (無効)。使用されるツールは次のとおりです: パケット キャプチャ ツール Fidller、Chrome F12 開発者ツール、誤った発見に注意してください。 WeChat クライアントには min-webmm1cba21.js があり、これは明らかな XSS フィルター仕様です。

以上がWeChat QRコードログインでのJSコード解析の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國(guó)語版

SublimeText3 中國(guó)語版

中國(guó)語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

コピーコミック(公式ウェブサイトの入り口)_COPYコミック(NBA)本物のオンライン読書ポータル コピーコミック(公式ウェブサイトの入り口)_COPYコミック(NBA)本物のオンライン読書ポータル Jun 05, 2025 pm 04:12 PM

コミックのコピーは間違いなく見逃せない寶物です。ここでは、情熱的で刺激的な競(jìng)爭(zhēng)力のあるストーリーからリラックスしたユーモラスな毎日のコメディまで、さまざまなスタイルのバスケットボールコミックを見つけることができます。クラシックを追體験したいか、新しい作品を発見したいかにかかわらず、漫畫をコピーすることであなたのニーズを満たすことができます。 Copy Comicsが提供する本物のオンライン読書ポータルを通じて、海賊版のリソースのトラブルに別れを告げ、高解像度とスムーズな読書體験を楽しんで、お?dú)荬巳毪辘违偿撺氓骷窑颔单荸`トし、本物のコミックの発展に貢獻(xiàn)できます。

UCブラウザまたはQQブラウザのどちらが良いですか? UCおよびQQブラウザーの詳細(xì)な比較と評(píng)価 UCブラウザまたはQQブラウザのどちらが良いですか? UCおよびQQブラウザーの詳細(xì)な比較と評(píng)価 May 22, 2025 pm 08:33 PM

UCブラウザまたはQQブラウザの選択は、ニーズに依存します。1。UCブラウザは、高速負(fù)荷とリッチなエンターテイメント機(jī)能を追求するユーザーに適しています。 2。QQブラウザは、Tencent製品との安定性とシームレスな接続が必要なユーザーに適しています。

トップ10 AIライティングソフトウェアランキングは、どのAIライティングソフトウェアが無料であるかを推奨しています トップ10 AIライティングソフトウェアランキングは、どのAIライティングソフトウェアが無料であるかを推奨しています Jun 04, 2025 pm 03:27 PM

2025年の最新の業(yè)界動(dòng)向と多次元評(píng)価データを組み合わせることで、以下は、一般的な創(chuàng)造、學(xué)術(shù)研究、商業(yè)マーケティングなどの主流のシナリオをカバーしながら、中國(guó)の最適化とローカリゼーションサービスを考慮しながら、包括的なAIライティングソフトウェアの推奨事項(xiàng)のトップ10です。

無料のコミックについては、NISコミックのオンラインで公式ページをご覧ください。 NIS Comicsログインページの無料エントリWebサイト 無料のコミックについては、NISコミックのオンラインで公式ページをご覧ください。 NIS Comicsログインページの無料エントリWebサイト Jun 12, 2025 pm 08:18 PM

コミック愛好家のために作成することに専念する沒入型の読書體験プラットフォームである素?cái)长圣偿撺氓?、自宅と海外で多?shù)の高品質(zhì)のコミックリソースを集めます。コミックリーディングプラットフォームであるだけでなく、コミックアーティストや読者をつなぎ、コミック文化を共有するコミュニティでもあります。 NES Comicsを使用すると、シンプルで直感的なインターフェイスデザインと強(qiáng)力な検索機(jī)能を通じて、お?dú)荬巳毪辘巫髌筏蚝?jiǎn)単に見つけて、スムーズで快適な読書體験を楽しむことができます。長(zhǎng)い待っていて退屈な作戦に別れを告げ、すぐに素?cái)长事嫟问澜绀巳毪?、コミックの旅を始めましょう?/p>

カエルマンオンライン視聴玄関マンカエルマン(ウェブページの入り口)オンラインで見る カエルマンオンライン視聴玄関マンカエルマン(ウェブページの入り口)オンラインで見る Jun 12, 2025 pm 08:06 PM

フロッグマンコミックは、豊かで多様なコミックリソースと便利でスムーズなオンライン読書體験を備えた多くのコミック愛好家にとって最初の選択肢となっています。それは活気のある池のようなもので、新鮮で興味深い物語が絶えず現(xiàn)れており、あなたが発見して探索するのを待っています。 Frog Man Comicsは、情熱的な冒険から甘い愛、ファンタジーやサイエンスフィクションからサスペンス推論まで、どんなジャンルが好きであっても、お?dú)荬巳毪辘巫髌筏蛞姢膜堡毪长趣扦蓼?。シンプルで直感的なインターフェイスデザインにより、簡(jiǎn)単に開始したり、読みたい漫畫をすぐに見つけたり、エキサイティングなコミックの世界に沒頭したりできます。

Baoziコミック(入り口)_ Baoziコミック(新しい入り口)2025 Baoziコミック(入り口)_ Baoziコミック(新しい入り口)2025 Jun 05, 2025 pm 04:18 PM

ここでは、漫畫の広大な海を楽しみ、情熱的な若い男のコミックから繊細(xì)で感動(dòng)的な女の子のコミック、サスペンスで脳を燃やすミステリーコミックから、リラックスした面白い毎日のコミックまで、すべてがあり、常にあなたの心に觸れることができるものがあります。私たちは大量の本物のコミックリソースを持っているだけでなく、最新の作品を常に紹介し、更新して、お?dú)荬巳毪辘违偿撺氓颏扦毪坤痹绀iむことができるようにします。

b最新の登録アドレス_ Exchangeを登録する方法 b最新の登録アドレス_ Exchangeを登録する方法 May 26, 2025 pm 07:12 PM

2025b Anhuiの最新の公式ウェブサイトは、https://www.marketwebb.co/zh-cn/join?ref=507720986&amp; Type = Wenzi; Binance Exchangeは、北米、ヨーロッパ、臺(tái)灣、中東、香港、マレーシアを含む180か國(guó)と地域にサービスを提供するグローバルな暗號(hào)通貨取引所です。 600を超える暗號(hào)通貨を提供し、世界中に2億7000萬人の登録ユーザーがいます。

Android電話でHuobiをダウンロードする方法は? Huobiダウンロードチュートリアル(ステップバイステップチュートリアル) Android電話でHuobiをダウンロードする方法は? Huobiダウンロードチュートリアル(ステップバイステップチュートリアル) Jun 12, 2025 pm 10:12 PM

Android攜帯電話のユーザーは、次の手順からHuobi/Huobiアプリをダウンロードしてインストールできます。1。ネットワークが安定しており、ストレージスペースで十分であることを確認(rèn)してください。 2. Huobi/Huobiの公式Webサイトからアプリをダウンロードし、ブラウザを使用して公式Webサイトにアクセスし、ダウンロードリンクをクリックするか、QRコードをスキャンするか、ApptreasureやHuawei App Marketなどのサードパーティのアプリケーションストアを検索してダウンロードしてください。 3.ダウンロードされた.apkファイルを見つけ、「不明なソースアプリ」のインストール許可を有効にし、インストールを完了するためのプロンプトに従ってください。

See all articles