今天同事說他reCAPTCHA都搞不定,看他說了好幾天,我就想來試試看問題在哪,結果我開始try沒多久他就下班了(翻桌)
回正題
不知何時 reCAPTCHA 被google買去了,也許是這樣文件跟資源都還蠻多的,先到 reCAPTCHA 官網註冊取得你的 Public 跟 Private Key 後,就可以開始了,我是用沒Plugin的方式去做的,後端是 ASP.NET 去 Post 到 google 判斷是否正確,所以沒辦法直接玩到結果,等我有空來研究看看只用JavaScript能不能直接做完,不過這樣好像 Private Key 就會被看到了...
reCAPTCHA長得像這樣,用過吧。
因為我還在加班,所以直接貼code
reCAPTCHA.aspx<%@ Page Language="C#" AutoEventWireup="true" CodeFile="reCAPTCHA.aspx.cs" Inherits="reCAPTCHA" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script src='http://www.google.com/jsapi' type='text/javascript'></script> <script language='javascript' type='text/javascript'> google.load("jquery", "1.6.2");</script> <script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=你的Public Key"> </script> <script type='text/javascript'> function dopost() { $('#<%=HiddenField1.ClientID %>').val($('#recaptcha_challenge_field').val()); $('#<%=HiddenField2.ClientID %>').val($('#recaptcha_response_field').val()); } </script> </head> <body> <form id="form1" runat="server"> <div> <noscript> <iframe src="http://www.google.com/recaptcha/api/noscript?k=你的Public Key" height="300" width="500" frameborder="0"></iframe><br/> <textarea id="recaptcha_challenge_field" name="recaptcha_challenge_field" rows="3" cols="40"></textarea> <input id="recaptcha_response_field" type="hidden" name="recaptcha_response_field" value="manual_challenge"/> </noscript> <asp:Button ID="Button1" runat="server" Text="Submit" onclick="Button1_Click" OnClientClick="dopost()"/> <br />status: <asp:Label ID="Label1" runat="server" Text=""></asp:Label> <br />post link: <asp:Label ID="Label2" runat="server" Text=""></asp:Label> <asp:HiddenField ID="HiddenField1" runat="server" /> <asp:HiddenField ID="HiddenField2" runat="server" /> </div> </form> </body> </html>
reCAPTCHA.aspx.cs
using System; using System.IO; using System.Net; using System.Text; public partial class reCAPTCHA : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { string Link = "http://www.google.com/recaptcha/api/verify?privatekey=你的Private Key&remoteip=127.0.0.1&challenge=" + HiddenField1.Value + "&response=" + HiddenField2.Value; Label2.Text = Link; HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(Link); myReq.Method = "POST"; myReq.ContentLength = 0; HttpWebResponse myRes = (HttpWebResponse)myReq.GetResponse(); if (myRes.StatusCode.ToString() == "OK") { Stream receiveStream = myRes.GetResponseStream(); Encoding encode = Encoding.GetEncoding("utf-8"); StreamReader readStream = new StreamReader(receiveStream, encode); Label1.Text = readStream.ReadToEnd(); } } }
Post到google的時候,要注意的東西可以看Verifying the User's Answer Without Plugins,其實就是把privatekey,remoteip,challenge,response這四個參數Post到http://www.google.com/recaptcha/api/verify,然後接回傳的值就好。
privatekey : 申請到的Private Key
remoteip : 使用者的IP
challenge : recaptcha_challenge_field 這欄位的值
response : recaptcha_response_field 這欄位的值
不知為啥我在網頁後端接不到reCAPTCHA那兩個欄位的值,所以只好用在onClientClick的時候先把值丟到HiddenField,在後端才能取到值。
若想用reCAPTCHA又不想用別人的API可以參考看看。
No comments:
Post a Comment