日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開(kāi)發(fā)其它知識(shí) → 微信電腦網(wǎng)頁(yè)二維碼掃描登陸簡(jiǎn)單實(shí)現(xiàn)

      微信電腦網(wǎng)頁(yè)二維碼掃描登陸簡(jiǎn)單實(shí)現(xiàn)

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2014/9/1 5:30:34字體大小:A-A+

      作者:西西點(diǎn)擊:987次評(píng)論:0次標(biāo)簽: 微信電腦

      二維碼掃描V4.5 安卓版
      • 類型:商務(wù)辦公大。3.0M語(yǔ)言:中文 評(píng)分:10.0
      • 標(biāo)簽:
      立即下載

      看那個(gè)微信電腦端的掃描登錄看起來(lái)叼叼噠,找了一篇文章了解一下具體的實(shí)現(xiàn)思路和過(guò)程,看了牛人的分析后,發(fā)現(xiàn)實(shí)現(xiàn)起來(lái)也不是很難,這里我就簡(jiǎn)單的實(shí)現(xiàn)了一下。可能功能和流暢度沒(méi)有微信做的好,具體是我對(duì)前端不是很了解。

        好了,不多說(shuō),首先要有一個(gè)二維碼的生成軟件才行,這里找了一個(gè)叫QrenCode的軟件,好處是可以在命令行中進(jìn)行生成。(下載地址: http://pkgs.org/download/qrencode 找自己合適的下載 應(yīng)該還要一個(gè)依賴庫(kù)libqrencode)

      1 #QrenCode 下面是centos6.4的安裝命令 
      2 wget http://dl.fedoraproject.org/pub/epel/6/i386/qrencode-3.4.2-1.el6.i686.rpm3 wget http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/i586/RPMS.classic/libqrencode-3.4.3-alt1.i586.rpm 4 rpm -ivh libqrencode-3.4.3-alt1.i586.rpm5 rpm -ivh qrencode-3.4.2-1.el6.i686.rpm

        命令行生成二維碼的方法

      生成二維碼格式
      qrencode -o [filename.png] ‘[text/url/information to encode]‘
      參數(shù)-o 表示生成到指定文件-s num 表示生成的二維碼的大小,每個(gè)點(diǎn)使用num個(gè)像素代替-v num 表示生成的版本

        創(chuàng)建一個(gè)login.c文件用于創(chuàng)建一個(gè)用于顯示二維碼的cgi (這里用的服務(wù)器是我博客中提到的web服務(wù)器,雖然還有bug,但是還是夠用的。其他的服務(wù)器應(yīng)該也是可以的。用自己的服務(wù)器會(huì)不會(huì)被罵((逃 )

       1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <time.h> 5 #include <unistd.h> 6 #include <sys/wait.h> 7  8 int rand_str(char *str,int num) 9 {10     int i,j;11     for(i=0;i<num;i++)12     {13         j=rand()%3;14         if(j==0)15         {16             str[i]='a'+rand()%26;17         }18         else if(j==1)19         {20             str[i]='A'+rand()%26;21         }22         else if(j==2)23         {24             str[i]='0'+rand()%10;25         }26     }27     str[i]=0;28     return 0;29 }30 31 int main(int argc,char **args)32 {33     int i;34     char code[64];35     char str[64];36     char qc[128];37     char filename[64];38     char cmd[128];39     int status;40     pid_t pid;41     srand(time(NULL));42     rand_str(code,20);43 44 45     strcpy(qc,"http://192.168.198.157:8080/login/");46     strcat(qc,code);47 48     strcpy(filename,code);49     strcat(filename,".png");50 51     sprintf(cmd,"qrencode -o www/qc/%s -s 10 '%s'",filename,qc);52 53     //生成二維碼54     system(cmd);55 56     printf("<html><head><title>掃描登錄</title></head><body>");57     printf("<img src=\"%s\" />",filename);58     printf("</body></html>");59 60     return 0;61 }

        運(yùn)行結(jié)果,基本每次都是可以隨機(jī)的。

        這里還有一點(diǎn)要說(shuō)的,就是隨機(jī)算法的問(wèn)題(好像是什么十大算法之類的),我弄不了,使用的是庫(kù)函數(shù)。我這個(gè)程序的隨機(jī)種子是1秒一次,也就是1秒才會(huì)變換一次,還有一個(gè)問(wèn)題就是這個(gè)srand函數(shù)的隨機(jī)種子數(shù)好像不多,應(yīng)該是6W多吧,這個(gè)如果用戶一多就麻煩了。我這里想到的另一個(gè)辦法是根據(jù)那個(gè)毫秒數(shù)來(lái)弄(例如用加密算法來(lái)對(duì)這個(gè)毫秒進(jìn)行加密得到一個(gè)字符串,再加個(gè)什么的都可以,例如用戶名什么的,最主要的是保證唯一,這個(gè)如果實(shí)際產(chǎn)品中實(shí)現(xiàn)應(yīng)該不是很難)。

        接下來(lái)要做的是根據(jù)這個(gè)url地址再生成一個(gè)cgi程序,用于手機(jī)APP的調(diào)用。我這里想到的辦法是每次刷新這個(gè)login頁(yè)面時(shí),就復(fù)制一個(gè)cgi程序,給APP調(diào)用。APP的調(diào)用機(jī)制是根據(jù)這個(gè)用二維碼生成的url地址發(fā)送一個(gè)確認(rèn)包。(確認(rèn)包使用get方式可以,用post方式也可以,另外用一臺(tái)服務(wù)器也是可以的,這個(gè)要看用戶量等具體情況。總之就是這樣了。)

        我這里為了演示的方便就采用get方式(原因嘛?我沒(méi)有APP這種客戶端,就簡(jiǎn)單的在手機(jī)上對(duì)這個(gè)url后面加上個(gè)參數(shù)了。)

        本次實(shí)驗(yàn)用到的3個(gè)程序代碼 (代碼中的目錄問(wèn)題是因?yàn)槲业姆⻊?wù)器設(shè)計(jì)有缺陷,導(dǎo)致有些目錄要使用相對(duì)于程序的絕對(duì)路徑,有的可以使用相對(duì)路徑,總之我試驗(yàn)的時(shí)候有點(diǎn)坑,不過(guò)不影響代碼的可讀性)

        login.c

       1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <time.h> 5 #include <unistd.h> 6 #include <sys/wait.h> 7  8 int rand_str(char *str,int num) 9 {10     int i,j;11     for(i=0;i<num;i++)12     {13         j=rand()%3;14         if(j==0)15         {16             str[i]='a'+rand()%26;17         }18         else if(j==1)19         {20             str[i]='A'+rand()%26;21         }22         else if(j==2)23         {24             str[i]='0'+rand()%10;25         }26     }27     str[i]=0;28     return 0;29 }30 31 int main(int argc,char **args)32 {33     int i;34     char code[64];35     char str[64];36     char qc[128];37     char filename[64];38     char cmd[128];39     int status;40     pid_t pid;41     srand(time(NULL));42     rand_str(code,20);43 44 45     strcpy(qc,"http://192.168.198.157:8080/qc/");46     strcat(qc,code);47 48     strcpy(filename,code);49     strcat(filename,".png");50 51     //生成二維碼52     sprintf(cmd,"qrencode -o www/qc/%s -s 10 '%s'",filename,qc);53     system(cmd);54 55 56     printf("<html><head><title>掃描登錄</title></head><body>");57     printf("<img src=\"%s\" />",filename);58     printf("<br>如果APP上顯示登錄成功那么就點(diǎn)擊該按鈕進(jìn)行跳轉(zhuǎn)<br>");59     printf("<form method=\"get\" action=\"welcome\">");//這里的action居然不能帶參數(shù),哎前端不會(huì)啊60     printf("<input type=\"hidden\" name=\"code\" value=\"%s\">",code);61     printf("<input type=\"submit\" value=\"提交\"></form>");62     printf("</body></html>");63 64     sprintf(cmd,"ln -s callback www/qc/%s",code);65     system(cmd);66 67     return 0;68 }

           callback.c

       1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4  5 int split(char **arr,char *str,const char*del) 6 { 7     char *s=NULL; 8     int i=0; 9     s=strtok(str,del);10     while(s!=NULL)11     {12         *arr++=s;13         s=strtok(NULL,del);14         i++;15     }16     return i;17 }18 19 void split_key(char *ch,char *key,char *value)20 {21     int len;22     int i;23     int j;24     len=strlen(ch);25     j=0;26     for(i=0;i<len;i++)27     {28         if(ch[i]=='=')29         {30             i++;31             break;32         }33         key[j]=ch[i];34         j++;35     }36     key[j]=0;37     j=0;38     for(;i<len;i++)39     {40         value[j]=ch[i];41         j++;42     }43     value[j]=0;44     return ;45 }46 47 int main(int argc,char **args)48 {49     char *data;50     char *myargs[32];51     int cnt=0;52     int i;53     char key[32],value[32];54     char username[32],code[32];55     char cmd[128];56     FILE * fp=NULL;57     memset(myargs,0,sizeof(myargs));58     memset(username,0,sizeof(username));59     cnt=split(myargs,args[1],"&");60 61     for(i=0;i<cnt;i++)62     {63         split_key(myargs[i],key,value);64         if(strcmp(key,"username")==0)65             strcpy(username,value);66         if(strcmp(key,"code")==0)67             strcpy(code,value);68     }69 70     //這里可以寫(xiě)上完整的網(wǎng)頁(yè)和處理過(guò)程71 72     if(username[0]!=0)73     {74         printf("<p>通過(guò)移動(dòng)端進(jìn)行用戶登錄成功,當(dāng)前登陸的用戶是:</p>");75         printf("<font color=\"red\">%s</font>   現(xiàn)在可以在瀏覽器中進(jìn)行操作了",username);76     }77     else78     {79         printf("參數(shù)錯(cuò)誤\n");80     }81 82     sprintf(cmd,"www/qc/%s.html",code);83     fp=fopen(cmd,"w");84     fprintf(fp,"您好,用戶:%s  通過(guò)APP移動(dòng)端登錄成功.  采用的uuid是:%s\n",username,code);85     fclose(fp);86 87     return 0;88 }

        welcome.c

       1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5  6 int split(char **arr,char *str,const char*del) 7 { 8     char *s=NULL; 9     int i=0;10     s=strtok(str,del);11     while(s!=NULL)12     {13         *arr++=s;14         s=strtok(NULL,del);15         i++;16     }17     return i;18 }19 20 void split_key(char *ch,char *key,char *value)21 {22     int len;23     int i;24     int j;25     len=strlen(ch);26     j=0;27     for(i=0;i<len;i++)28     {29         if(ch[i]=='=')30         {31             i++;32             break;33         }34         key[j]=ch[i];35         j++;36     }37     key[j]=0;38     j=0;39     for(;i<len;i++)40     {41         value[j]=ch[i];42         j++;43     }44     value[j]=0;45     return ;46 }47 48 int main(int argc,char **args)49 {50     char *data;51     char *myargs[32];52     int cnt=0;53     int i;54     char key[32],value[32];55     char code[32];56     char cmd[128];57     memset(myargs,0,sizeof(myargs));58     cnt=split(myargs,args[1],"&");59 60     for(i=0;i<cnt;i++)61     {62         split_key(myargs[i],key,value);63         if(strcmp(key,"code")==0)64             strcpy(code,value);65     }66 67     sprintf(cmd,"www/qc/%s.html",code);68     //這里可以寫(xiě)上完整的網(wǎng)頁(yè)69     if(access(cmd,F_OK)==0)70     {71         printf("終于登錄了,可以各種操作了");72     }73     else74     {75         printf("請(qǐng)確認(rèn)是否通過(guò)APP掃描登陸過(guò)");76     }77 78     return 0;79 }

        代碼就放在那里,具體的操作過(guò)程就用截圖方式進(jìn)行講解

        (1) 打開(kāi)服務(wù)器,輸入網(wǎng)址: http://192.168.198.157:8080/qc/login

        (2)如果沒(méi)有通過(guò)移動(dòng)端的的驗(yàn)證,此時(shí)點(diǎn)擊提交是不起作用的。

        (3)我們使用手機(jī)客戶端進(jìn)行驗(yàn)證(由于我沒(méi)有設(shè)計(jì)可用的APP,這里使用GET方式,自己構(gòu)造一個(gè)。注意,如果已經(jīng)有了客戶端那么,可以通過(guò)客戶端APP自行構(gòu)造一個(gè)請(qǐng)求,可以是post,也可以是另外一個(gè)action然后進(jìn)行驗(yàn)證什么的?傊趺窗踩,怎么方便怎么來(lái)。)下面這個(gè)是我手機(jī)通過(guò)掃二維碼,然后手動(dòng)構(gòu)造一個(gè)get請(qǐng)求得到的。(請(qǐng)求如下: http://192.168.198.157:8080/qc/GL199v8zsHV2bu7R7Qad?username=admin&code=GL199v8zsHV2bu7R7Qad)

        (4)好了,我們可以在那個(gè)login界面上點(diǎn)擊登錄就可以登錄進(jìn)去了。(這里為什么不像微信那樣,APP客戶端一掃描確認(rèn),瀏覽器就直接跳轉(zhuǎn),而是要手動(dòng)點(diǎn)擊提交按鈕呢?那是因?yàn)槲覍?duì)前端的技術(shù)不是很了解,不知道怎么構(gòu)建一個(gè)長(zhǎng)連接,和跳轉(zhuǎn)什么的。所以就弄成簡(jiǎn)單的,手動(dòng)點(diǎn)擊了,不過(guò)這些都不是重點(diǎn))

        (5)下面這些是服務(wù)器的一些信息

        還有一個(gè)問(wèn)題就是如果訪問(wèn)的次數(shù)多了,那些中間文件就太多了,這時(shí)可以通過(guò)一個(gè)腳本,按時(shí)間進(jìn)行清理。

        處理的流程圖

        終于完成了。心情有點(diǎn)小激動(dòng)了。

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門(mén)評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)