网站整合discuz!nt论坛

在网上参考了很多资料后,终于完美实现了网站和discuz!nt论坛的双向整合,整合后网站和论坛之间可以同步注册、登录、退出和修改登录密码操作。

本系统的实现形式是新云CMS网站(ASP)和Discuz!NT3.1论坛(ASP.NET)的同步,使用的API(应用程序编程接口)是新云CMS提供的api(做较大修改)和Discuz!NT提供的API(不做修改)。API使用REST形式的接口,这就意味着Discuz!NT API方法可以用HTTP GET 或 POST方式来调用,几乎每一种计算机语言都可以通过HTTP来与REST服务器进行通讯,REST Server的地址是 [论坛地址/services/restserver.aspx]。

如果主网站是ASP.NET做的,参考本文方法也能轻松实现ASP.NET网站和Discuz!NT论坛的同步。

第一节 从网站同步到论坛的实现

主要功能:

用户在网站注册会员、登录、注销或修改登录密码后,将相关数据以HTTP方式传递到论坛API中,然后论坛执行相应的操作与网站同步(反过来的操作在第二节)。

实现步骤:

一、在论坛后台“扩展”项的“通行证设置”中添加整合程序设置,可参考http://nt.discuz.net/showtopic-62656.html。

二、在论坛后台“全局”项的“基本设置”-“身份验证Cookie域”中设置域名。

三、添加实现同步的代码。

md5_utf8文件:md5的UTF-8版本加密函数,这个网上很多,注意生成的是32为的MD5密码

RestClient.asp文件:

<!– #include file = “md5_utf8.asp” –> <% ‘rabtor 2010-8修改完善 Class DNTRestClient Private parserPrivate use_paramsPrivate REST_URI’Sample functionPublic Function createtoken() Dim redirectURI redirectURI = replace(REST_URI,”services/restserver.aspx”,”login.aspx?api_key=” & ApiKey) response.Redirect redirectURIEnd FunctionPublic Function auth_getsession(auth_token)

use_params.removealluse_params.add “auth_token”,auth_tokenresult = callapimethod(“auth.getSession”,use_params)

parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>getsession FAILED???<br>”Set auth_getsession = NothingElseSet to_ret = server.createobject(“scripting.dictionary”)

sessionkey=parser.documentelement.getElementsByTagName(“session_key”).item(0).firstchild.nodevalue

Set docu=parser.documentelementto_ret.add “session_key”,node_value(docu,”session_key”)’response.write sessionkey&”:::”&node_value(docu,”uid”)&”<br>”to_ret.add “uid”,node_value(docu,”uid”)expire=node_value(docu,”expires”)If expire = 0 Thento_ret.add “expires”,”never”Elseto_ret.add “expires”,unix2asp(expire)End If

Set docu = Nothing

Set auth_getsession = to_retSet to_ret = NothingEnd IfEnd FunctionPublic Function auth_register(username,password,email,passwordformat) ‘如果passwordformat为空,则使用md5加密 use_params.removealluse_params.add “user_name”,usernameuse_params.add “password”,passworduse_params.add “email”,emailuse_params.add “password_format”,passwordformatresult = callapimethod(“auth.register”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>auth_register FAILED!<br>”Set auth_register = NothingResponse.end’停止运行,输出错误信息Else Dim tokentoken = parser.documentelement.selectSingleNode(“/”).textSet docu = parser.documentelementSet docu = Nothingauth_register = tokenEnd IfEnd FunctionPublic Function auth_encodepassword(password,passwordformat) ‘如果passwordformat为空,则使用md5加密 use_params.removealluse_params.add “password”,passworduse_params.add “password_format”,passwordformatresult = callapimethod(“auth.encodepassword”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>auth_encodepassword FAILED???<br>”Set auth_encodepassword = NothingElse Dim tokentoken = parser.documentelement.selectSingleNode(“/”).textSet docu = parser.documentelementSet docu = Nothingauth_encodepassword = tokenEnd IfEnd Function’添加论坛版块Public Function forums_create(forum_info) use_params.removealluse_params.add “forum_info”,forum_inforesult = callapimethod(“forums.create”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>forums_create FAILED???<br>”Set forums_create = NothingElse Dim to_ret,docuSet to_ret = server.createobject(“scripting.dictionary”)Set docu = parser.documentelementto_ret.add “fid”,node_value(docu,”fid”)to_ret.add “url”,node_value(docu,”url”)Set docu = NothingSet forums_create = to_retSet to_ret = NothingEnd IfEnd Function’获取指定ID版块的信息Public Function forums_get(fid) use_params.removealluse_params.add “fid”,fidresult = callapimethod(“forums.get”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>forums_get FAILED???<br>”Set forums_get = NothingResponse.end’停止运行,输出错误信息Else Dim to_ret,docuSet to_ret = server.createobject(“scripting.dictionary”)Set docu = parser.documentElementto_ret.add “fid”,node_value(docu,”fid”)to_ret.add “url”,node_value(docu,”url”)to_ret.add “topics”,node_value(docu,”topics”)to_ret.add “current_topics”,node_value(docu,”current_topics”)to_ret.add “posts”,node_value(docu,”posts”)to_ret.add “today_posts”,node_value(docu,”today_posts”)to_ret.add “last_post”,node_value(docu,”last_post”)to_ret.add “last_poster”,node_value(docu,”last_poster”)to_ret.add “last_poster_id”,node_value(docu,”last_poster_id”)to_ret.add “last_tid”,node_value(docu,”last_tid”)to_ret.add “last_title”,node_value(docu,”last_title”)to_ret.add “description”,node_value(docu,”description”)to_ret.add “icon”,node_value(docu,”icon”)to_ret.add “moderators”,node_value(docu,”moderators”)to_ret.add “rules”,node_value(docu,”rules”)to_ret.add “parent_id”,node_value(docu,”parent_id”)to_ret.add “path_list”,node_value(docu,”path_list”)to_ret.add “parent_id_list”,node_value(docu,”parent_id_list”)to_ret.add “sub_forum_count”,node_value(docu,”sub_forum_count”)to_ret.add “name”,node_value(docu,”name”)to_ret.add “status”,node_value(docu,”status”)Set docu = NothingSet forums_get = to_retSet to_ret = NothingEnd IfEnd Function’向指定ID用户发送通知Public Function notifications_send(to_ids,notification) use_params.removealluse_params.add “to_ids”,to_idsuse_params.add “notification”,notificationresult = callapimethod(“notifications.send”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>notifications_send FAILED???<br>”Set notifications_send = NothingElse If parser.documentelement.selectSingleNode(“/”).text = “1” Then notifications_send = True Else notifications_send = False End IfEnd IfEnd FunctionPublic Function notifications_sendemail(recipients,subject,text) use_params.removealluse_params.add “recipients”,recipientsuse_params.add “subject”,subjectuse_params.add “text”,textresult = callapimethod(“notifications.sendemail”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>notifications_sendemail FAILED???<br>”Set notifications_sendemail = NothingElse notifications_sendemail = parser.documentelement.selectSingleNode(“/”).textEnd IfEnd Function’获取指定ID用户的个人信息Public Function users_getinfo(uids,fields,sessionkey) use_params.removealluse_params.add “uids”,uidsIf fields = “” Then fields = “uid,user_name,nick_name,” If sessionkey <> “” Then fields = fields & “password,secques,” End If fields = fields & “space_id,gender,admin_id,group_id,group_expiry,reg_ip,join_date,” fields = fields & “last_ip,last_visit,last_activity,last_post,last_post_id,post_count,digest_post_count,online_time,” fields = fields & “page_view_count,credits,ext_credits_1,ext_credits_2,ext_credits_3,ext_credits_4,ext_credits_5,ext_credits_6,ext_credits_7,” fields = fields & “ext_credits_8,email,birthday,tpp,ppp,template_id,pm_sound,show_email,invisible,has_new_pm,new_pm_count,access_masks,” fields = fields & “online_state,web_site,icq,qq,yahoo,msn,skype,location,custom_status,avatar,avatar_width,avatar_height,medals,about_me,” fields = fields & “sign_html,real_name,id_card,mobile,telephone”End Ifuse_params.add “fields”,fieldsresult = callapimethod(“users.getinfo”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>users_getinfo FAILED???<br>”Set users_getinfo = NothingResponse.end’停止运行,输出错误信息Else Dim to_ret,docu,users,i set users = server.createobject(“scripting.dictionary”)Set docu = parser.documentElementi = 0For Each node In parser.documentelement.childnodesSet to_ret = server.createobject(“scripting.dictionary”) For Each field In Split(fields,”,”) to_ret.add field,node_value(node,field) Next users.add i,to_ret i = i + 1NextSet docu = NothingSet users_getinfo = usersSet to_ret = NothingEnd IfEnd FunctionPublic Function users_setinfo(uid,user_info) use_params.removealluse_params.add “uid”,uiduse_params.add “user_info”,user_inforesult = callapimethod(“users.setinfo”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>users_setinfo FAILED???<br>”Set users_setinfo = NothingResponse.end’停止运行,输出错误信息Else If parser.documentelement.selectSingleNode(“/”).text = “1” Then users_setinfo = True Else users_setinfo = False End IfEnd IfEnd FunctionPublic Function ChangePassword(uid,original_password,new_password,confirm_new_password) ‘修改用户密码 use_params.removealluse_params.add “uid”,uiduse_params.add “original_password”,original_passworduse_params.add “new_password”,new_passworduse_params.add “confirm_new_password”,confirm_new_passwordresult = callapimethod(“users.ChangePassword”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>users_ChangePassword FAILED!<br>”Set ChangePassword = NothingResponse.end’停止运行,输出错误信息ElseChangePassword = parser.documentelement.selectSingleNode(“/”).textEnd IfEnd FunctionPublic Function users_getid(user_name) use_params.removealluse_params.add “user_name”,user_nameresult = callapimethod(“users.getid”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>users_getid FAILED!<br>”Set users_getid = NothingResponse.end’停止运行,输出错误信息Elseusers_getid = parser.documentelement.selectSingleNode(“/”).textEnd IfEnd FunctionPublic Function users_getloggedinuser() use_params.removeallresult = callapimethod(“users.getloggedinuser”,use_params) parser.loadxml(result)If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>users_getloggedinuser FAILED???<br>”Set users_getloggedinuser = NothingResponse.end’停止运行,输出错误信息Else users_getloggedinuser = parser.documentelement.selectSingleNode(“/”).textEnd IfEnd FunctionPublic Function users_setextcredits(additional_values) use_params.removeall use_params.add “additional_values”,additional_valuesresult = callapimethod(“users.setextcredits”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>users_setextcredits FAILED???<br>”Set users_setextcredits = NothingElse users_setextcredits = parser.documentelement.selectSingleNode(“/”).textEnd IfEnd Function’发布帖子,须指定用户ID、论坛版块ID等内容Public Function topics_create(topic_info) use_params.removeall use_params.add “topic_info”,topic_inforesult = callapimethod(“topics.create”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>topics_create FAILED???<br>”Set topics_create = NothingElse Dim to_ret,docuSet to_ret = server.createobject(“scripting.dictionary”)Set docu = parser.documentElementto_ret.add “topic_id”,node_value(docu,”topic_id”)to_ret.add “url”,node_value(docu,”url”)to_ret.add “need_audit”,node_value(docu,”need_audit”)Set docu = NothingSet topics_create = to_retSet to_ret = NothingEnd IfEnd FunctionPublic Function topics_reply(reply_info) use_params.removeall use_params.add “reply_info”,reply_inforesult = callapimethod(“topics.reply”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>topics_reply FAILED???<br>”Set topics_reply = NothingResponse.end’停止运行,输出错误信息Else Dim to_ret,docuSet to_ret = server.createobject(“scripting.dictionary”)Set docu = parser.documentElementto_ret.add “post_id”,node_value(docu,”post_id”)to_ret.add “url”,node_value(docu,”url”)to_ret.add “need_audit”,node_value(docu,”need_audit”)Set docu = NothingSet topics_reply = to_retSet to_ret = NothingEnd IfEnd FunctionPublic Function topics_getrecentreplies(fid,tid,page_size,page_index) use_params.removeall use_params.add “fid”,fid use_params.add “tid”,tid use_params.add “page_size”,page_size use_params.add “page_index”,page_indexresult = callapimethod(“topics.getrecentreplies”,use_params) parser.loadxml(result)

If instr(result,”error_response”) <> 0 Thenhandle_error parserresponse.write “<br>topics_getrecentreplies FAILED???<br>”Set topics_getrecentreplies = NothingResponse.end’停止运行,输出错误信息Else Dim to_ret,docu,posts,iSet posts = server.createobject(“scripting.dictionary”)Set docu = parser.documentElementi = 0For Each node In parser.documentelement.childnodes Set to_ret = server.createobject(“scripting.dictionary”) Dim fields fields = “pid,layer,poster_id,poster_name,title,message,post_date_time,invisible,rate,rate_times,use_signature,” fields = fields & “poster_email,poster_show_email,poster_avator,poster_avator_width,poster_avator_height,” fields = fields & “poster_signature,poster_location,ad_index” For Each field In Split(fields,”,”) to_ret.add field,node_value(node,field) Next posts.add i,to_ret i = i + 1NextSet docu = NothingSet topics_getrecentreplies = postsSet to_ret = NothingEnd IfEnd FunctionPublic Function unix2asp(unix)unix2asp = DateAdd(“s”, unix, “01/01/1970 00:00:00”)End Function

Private Sub handle_error(rootnode)response.write “Error “&node_value(rootnode,”error_code”)&”: “&node_value(rootnode,”error_msg”)&”<br>”End Sub

Private Function node_value(rootnode,tagname)’node_value = rootnode.getElementsByTagName(tagname).item(0).firstchild.nodevalueif rootnode.getElementsByTagName(tagname).length>=1 then ‘rabtor添加 避免出现错误:缺少对象: ‘rootnode.getElementsByTagName(…).item(…)’node_value = rootnode.getElementsByTagName(tagname).item(0).textelsenode_value = “”end ifEnd Function

Public ApiKey Public SessionKey Public SecretKey ‘ This allows you to call a facebook method (e.g. auth.getSession) with the specified parameters ‘ You do not need to pass in the following parameters as they are appended automatically, ‘ – session_key ‘ – api_key ‘ – call_id ‘ – v Public Function CallApiMethod( strMethod, oParams ) oParams( “method” ) = strMethod Dim oXMLHTTP Set oXMLHTTP = Server.CreateObject( “MSXML2.ServerXMLHTTP” ) oXMLHTTP.Open “POST”, REST_URI, False, “”, “” oXMLHTTP.setRequestHeader “Content-Type”, “application/x-www-form-urlencoded” oXMLHTTP.Send(GenerateRequestURI( oParams)) CallApiMethod = oXMLHTTP.ResponseText Set oXMLHTTP = Nothing End Function ‘Call for initializing Public Sub Initialize(api_key,secret_key,rest_url)ApiKey=api_keySecretKey=secret_keyREST_URI = rest_url End Sub

Public Sub Initialize2(api_key,secret_key,session_key)ApiKey=api_keySecretKey=secret_keySessionKey=session_keyREST_URI = rest_url End Sub

Private Sub Class_Initialize()Set parser = Server.CreateObject(“Microsoft.XMLDOM”)Set use_params = server.createobject(“Scripting.Dictionary”)end subprivate sub Class_Terminate()Set parser = NothingSet use_params = Nothingend sub ‘ Creates the content for a POST to the REST server Private Function GenerateRequestURI( oParams ) If (Len( Application( “DNT_CallID” ) ) = 0 ) Then Application( “DNT_CallID” ) = 100005 ‘For auth.getSession (only function to not use session_key?)if oParams(“session_key”)=”none” Or oParams( “method” ) = “auth.getSession” thenoParams.remove “session_key”elseoParams( “session_key” ) = SessionKeyend if oParams( “api_key” ) = ApiKey oParams( “call_id” ) = Application( “DNT_CallID” ) ‘oParams( “v” ) = “1.0” ‘This is useless for POSTs.’ GenerateRequestURI = REST_URI & “?” Dim strItem For Each strItem In oParams.Keys If oParams(strItem) <> “” Then GenerateRequestURI = GenerateRequestURI & strItem & “=” & Server.UrlEncode(oParams(strItem)) & “&” End If Next GenerateRequestURI = GenerateRequestURI & “sig=” & GenerateSig( oParams ) ‘response.write GenerateRequestURI ‘response.end Application( “DNT_CallID” ) = Application( “DNT_CallID” ) + 205 End Function ‘ This creates an signature of the supplied parameters Private Function GenerateSig( oParams ) Set oParams = SortDictionary( oParams ) Dim strSig, strItem For Each strItem In oParams If oParams( strItem ) <> “” Then strSig = strSig & strItem & “=” & oParams( strItem ) End If Next strSig = strSig & SecretKey ‘response.Write strsig & “<br />” ‘response.End ‘Dim oMD5 ‘Set oMD5 = New MD5 ‘oMD5.Text = strSig ‘GenerateSig = oMD5.HexMD5 GenerateSig = MD5(strSig) ‘response.Write GenerateSig & “<br>” ‘GenerateSig = MD5(strSig) End Function

‘Wrapper of generatesig for cookiespublic function generatesig_cookies(cookies)set dict=server.createobject(“scripting.dictionary”)for each item in cookiesdict.add item,cookies(item)nextgeneratesig_cookies=generatesig(dict)set dict=nothingend function ‘ SortDictionary function courtesy of MSDN Private Function SortDictionary(objDict) Dim strDict() Dim objKey Dim strKey,strItem Dim X,Y,Z Z = objDict.Count If Z > 1 Then ReDim strDict(Z,2) X = 0 For Each objKey In objDict strDict(X,1) = CStr(objKey) strDict(X,2) = CStr(objDict(objKey)) X = X + 1 Next For X = 0 to (Z – 2) For Y = X to (Z – 1) If StrComp(strDict(X,1),strDict(Y,1),vbTextCompare) > 0 Then strKey = strDict(X,1) strItem = strDict(X,2) strDict(X,1) = strDict(Y,1) strDict(X,2) = strDict(Y,2) strDict(Y,1) = strKey strDict(Y,2) = strItem End If Next Next objDict.RemoveAll For X = 0 to (Z – 1) objDict.Add strDict(X,1), strDict(X,2) Next End If Set SortDictionary = objDict End Function’URLDecode编码替换’rabtor在2010-8-27添加 URLDecode函数将密码编码后中的所有特殊符号编码替换回来Function URLDecode(enStr) dim deStr dim c,i,v deStr=”” for i=1 to len(enStr) c=Mid(enStr,i,1) if c=”%” then v=eval(“&h”+Mid(enStr,i+1,2)) if v<128 then deStr=deStr&chr(v) i=i+2 else if isvalidhex(mid(enstr,i,3)) then if isvalidhex(mid(enstr,i+3,3)) then v=eval(“&h”+Mid(enStr,i+1,2)+Mid(enStr,i+4,2)) deStr=deStr&chr(v) i=i+5 else v=eval(“&h”+Mid(enStr,i+1,2)+cstr(hex(asc(Mid(enStr,i+3,1))))) deStr=deStr&chr(v) i=i+3 end if else destr=destr&c end if end if else if c=”+” then deStr=deStr&” ” else deStr=deStr&c end if end if next URLDecode=deStr end function function isvalidhex(str) isvalidhex=true str=ucase(str) if len(str)<>3 then isvalidhex=false:exit function if left(str,1)<>”%” then isvalidhex=false:exit function c=mid(str,2,1) if not (((c>=”0″) and (c<=”9″)) or ((c>=”A”) and (c<=”Z”))) then isvalidhex=false:exit function c=mid(str,3,1) if not (((c>=”0″) and (c<=”9″)) or ((c>=”A”) and (c<=”Z”))) then isvalidhex=false:exit function end function ‘End URLDecode编码替换

End Class%>

api_bbs.asp文件:

<!–#include file=”RestClient.asp” –><%’rabtor2010-9-7添加Dim client’创建APISet client = New DNTRestClient’■■■■■■替换为你在论坛后台设置的API Key、密钥和应用程序地址■■■■■■client.Initialize “a69066a81d9e5ddc8747c29c94bb6895″,”67a203044c0bb87250ff09a4a4a8d31b”,”http://bbs.zkshouji.com/services/restserver.aspx”

if request(“action”)=”login” and request(“key”)<>”” then’传入要登录的用户名和密码,即可实现该用户的登录。get_username=request(“username”)get_password=request(“password”)call bbs_login(get_username,get_password)end if

if request(“action”)=”register” and request(“key”)<>”” then’注册论坛会员get_username=request(“username”)get_password=request(“password”)get_email=request(“email”)call client.auth_register(get_username,get_password,get_email,””)end if

if request(“action”)=”updatepwd” and request(“key”)<>”” then’修改用户密码get_username=request(“username”)get_password=request(“password”)get_password1=request(“password1”)get_password2=request(“password2”)

Dim bbs_useridbbs_userid = client.users_getid(get_username)’response.write(bbs_userid)’response.endcall client.ChangePassword(bbs_userid,get_password,get_password1,get_password2)end if

if request(“action”)=”logout” and request(“key”)<>”” thencall logout()end if

sub bbs_login(byval username,byval password)’rabtor2010-9-7加 dim uid,infos,pass

‘根据username获取UID uid=client.users_getid(username)

‘这里获取一些登录后写入cookie的相关用户信息 ‘包括:密码,每页主题数,每页贴数,短消息铃声,是否隐身 ‘PS:users_getinfo方法无法获取sigstatus字段的内容(是否显示签名),所以下面的cookie直接写入1(显示签名)了,无所谓,没什么大影响 set infos=client.users_getinfo(uid,”password,tpp,ppp,pm_sound,invisible”,””)

‘加密密码 ‘auth_encodepassword方法能对密码进行des加密,用于cookie验证 ‘第一个参数是密码,可以是md5过的,也可以是原始密码

‘第二个参数,如果密码是md5的,这里填“md5”,否则留空即可 ‘pass=client.auth_encodepassword(infos(0)(“password”),”md5″)’读取密码方式一:直接读取用户的md5密码 pass=client.auth_encodepassword(password,””)’读取密码方式二:由用户输入密码 ‘替换编码 ‘这个比较重要,曾经被这个问题纠结了好半天,一直无法成功登录 ‘由于auth_encodepassword生成的加密后的密码是编码过的,直接写入cookie的话,百分号会被再次编码成%25,导致重复编码,所以要先把编码替换回来。’替换编码方法一,这种方法是针对于常见特殊符号,本系统中使用该方法’rabtor在2010-8-27添加 URLDecode函数将密码编码后中的所有特殊符号编码替换回来pass=client.URLDecode(pass)’替换编码方法二,这种方法是针对于个别特殊符号,容易遗漏’pass=replace(pass,”%2f”,”/”) ‘pass=replace(pass,”%3d”,”=”) ‘pass=replace(pass,”%2b”,”+”)

‘生成cookie

response.cookies(“dnt”)(“userid”)=uid response.cookies(“dnt”)(“password”)=pass response.cookies(“dnt”)(“tpp”)=infos(0)(“tpp”) response.cookies(“dnt”)(“ppp”)=infos(0)(“ppp”) response.cookies(“dnt”)(“pmsound”)=infos(0)(“pm_sound”) response.cookies(“dnt”)(“invisible”)=infos(0)(“invisible”) response.cookies(“dnt”)(“referer”)=”index.aspx” response.cookies(“dnt”)(“sigstatus”)=1 response.cookies(“dnt”)(“expires”)=120 ‘过期时间(120分钟) response.cookies(“dnt”).expires=dateadd(“n”,120,now()) ‘设置过期时间(120分钟) response.cookies(“dnt”).domain=”.zkshouji.com” ‘■■■■■■修改为网站的域名,注意前面带.(点)■■■■■■ response.cookies(“dnt”).secure=false

set infos=nothing set dnt=nothing

end sub

sub logout()’退出论坛 response.cookies(“dnt”)(“userid”)=”” response.cookies(“dnt”)(“password”)=”” response.cookies(“dnt”)(“tpp”)=”” response.cookies(“dnt”)(“ppp”)=”” response.cookies(“dnt”)(“pmsound”)=”” response.cookies(“dnt”)(“invisible”)=”” response.cookies(“dnt”)(“referer”)=”” response.cookies(“dnt”)(“sigstatus”)=”” response.cookies(“dnt”)(“expires”)=”” ‘过期时间(120分钟) response.cookies(“dnt”).domain=”.in-en.com” ‘■■■■■■修改为网站的域名,注意前面带.(点)■■■■■■

end sub%>

最后在网站相关的代码文件中加入如下代码即可:

‘同步注册论坛会员 rabtor2010-9-7添加response.write(“<script language=””JavaScript”” src=””../api/api_bbs.asp?action=register&username=”&Server.URLEncode(strUserName)&”&password=”&Server.URLEncode(UserPassWord)&”&email=”&Server.URLEncode(usermail)&”&key=z235x6h5c456hv78p05q3w2eopfaw71v””></script>”)

‘同步登录论坛response.write(“<script language=””JavaScript”” src=””../api/api_bbs.asp?action=login&username=”&Server.URLEncode(username)&”&password=”&Server.URLEncode(Request(“password”))&”&key=z235x6h5c456hv78p05q3w2eopfaw71v””></script>”)

‘同步退出论坛’response.write(“<script language=””JavaScript”” src=””../api/api_bbs.asp?action=logout&key=z235x6h5c456hv78p05q3w2eopfaw71v””></script>”)

‘同步更新论坛用户的密码response.write(“<script language=””JavaScript”” src=””../api/api_bbs.asp?action=updatepwd&username=”&Server.URLEncode(username)&”&password=”&Server.URLEncode(Trim(Request.Form(“password”)))&”&password1=”&Server.URLEncode(Trim(Request.Form(“password1”)))&”&password2=”&Server.URLEncode(Trim(Request.Form(“password2″)))&”&key=z235x6h5c456hv78p05q3w2eopfaw71v””></script>”)

第二节 从论坛同步到网站的应用

主要步骤:

一、开启Discuz!NT论坛的“同步数据模式”功能

在Discuz!NT论坛的后台“扩展”菜单项里单击[通行证设置],设置如下:

应用程序类型:web

应用程序:Url 地址:http://www.Discuz!NT.com/bbs/services/restserver.aspx

同步数据模式:开启

同步数据的 URL 地址:http://www.Discuz!NT.com/api/api_reponse.asp

(红色网址部分改成你自己的)。

操作界面图:

二、编写处理同步数据文件

这里以asp网站程序为例,其他语言与此类似。本系统中用到的处理论坛同步数据文件为改写新云CMS的api_reponse.asp以便与已有的asp网站整合。

api_reponse.asp主要代码部分:

(由于本系统要求会员注册比较严格,论坛的注册跳转至主网站的会员注册页面)

If Request.QueryString<>”” Then Act=Request.QueryString(“action”)Select Case Act Case “login” ‘同步会员登录 SaveUserCookie() Case “logout” ‘同步会员退出 LogoutUser() Case “updatepwd” ‘同步更改会员修改密码 UpdatePWD()End SelectElse

Sub SaveUserCookie()Dim S_syskey,Password,usercookies,TruePassWord,userclass,UserhiddenDim sigsig = Request.QueryString(“sig”)UserName = Inen.CheckBadstr(Request.QueryString(“user_name”))usercookies = Request.QueryString(“savecookie”)

If UserName=”” or sig=”” Then Exit SubIf usercookies=”” or Not IsNumeric(usercookies) Then usercookies = 0ChkUserLogin username,usercookiesEnd Sub

Function ChkUserLogin(username,usercookies)ChkUserLogin = FalseDim Rs,SQL,Group_SettingIf Not IsObject(Conn) Then ConnectionDatabaseSet Rs = Server.CreateObject(“ADODB.Recordset”)SQL = “SELECT * FROM [IE_User] WHERE username='” & UserName & “‘”Rs.Open SQL, Conn, 1, 3If Not (Rs.BOF And Rs.EOF) Then If Rs(“UserLock”) <> 0 Then ChkUserLogin = False Exit Function End If Response.Cookies(Inen.Cookies_Name)(“LastTimeDate”) = Rs(“LastTime”) Response.Cookies(Inen.Cookies_Name)(“LastTimeIP”) = Rs(“userlastip”) Response.Cookies(Inen.Cookies_Name)(“LastTime”) = Rs(“LastTime”) Group_Setting=Split(Inen.UserGroupSetting(Rs(“UserGrade”)), “|||”) If Rs(“userpoint”) < 0 Then Rs(“userpoint”) = CLng(Group_Setting(25)) Else Rs(“userpoint”) = Rs(“userpoint”) + CLng(Group_Setting(25)) End If If Rs(“experience”) < 0 Then Rs(“experience”) = CLng(Group_Setting(32)) Else Rs(“experience”) = Rs(“experience”) + CLng(Group_Setting(32)) End If If Rs(“charm”) < 0 Then Rs(“charm”) = CLng(Group_Setting(33)) Else Rs(“charm”) = Rs(“charm”) + CLng(Group_Setting(33)) End If Rs(“LastTime”) = Now() Rs(“userlastip”) = Inen.GetUserip Rs(“UserLogin”) = Rs(“UserLogin”) + 1 Rs.Update Select Case usercookies Case 0 Response.Cookies(Inen.Cookies_Name)(“usercookies”) = usercookies Case 1 Response.Cookies(Inen.Cookies_Name).Expires=Date+1 Response.Cookies(Inen.Cookies_Name)(“usercookies”) = usercookies Case 2 Response.Cookies(Inen.Cookies_Name).Expires=Date+31 Response.Cookies(Inen.Cookies_Name)(“usercookies”) = usercookies Case 3 Response.Cookies(Inen.Cookies_Name).Expires=Date+365 Response.Cookies(Inen.Cookies_Name)(“usercookies”) = usercookies End Select Response.Cookies(Inen.Cookies_Name).path = “/” Response.Cookies(Inen.Cookies_Name)(“userid”) = Rs(“userid”) Response.Cookies(Inen.Cookies_Name)(“username”) = Rs(“username”) Response.Cookies(Inen.Cookies_Name)(“password”) = Rs(“password”) Response.Cookies(Inen.Cookies_Name)(“nickname”) = Rs(“nickname”) Response.Cookies(Inen.Cookies_Name)(“UserGrade”) = Rs(“UserGrade”) Response.Cookies(Inen.Cookies_Name)(“UserGroup”) = Rs(“UserGroup”) Response.Cookies(Inen.Cookies_Name)(“UserClass”) = Rs(“UserClass”) Response.Cookies(Inen.Cookies_Name)(“UserToday”) = Rs(“UserToday”) ChkUserLogin = TrueEnd IfRs.CloseSet Rs = NothingEnd Function

Sub UpdatePWD()Dim Rs,SQLDim UserName, UserPassUserName = Inen.CheckBadstr(Request.QueryString(“user_name”))UserPass = mid(Inen.CheckBadstr(Request.QueryString(“password”)),9,16)Status = 1If UserName = “” or UserPass = “” Then Exit SubSet Rs = Server.CreateObject(“Adodb.RecordSet”)SQL = “SELECT TOP 1 * FROM [IE_User] WHERE Username='” & UserName & “‘”If Not IsObject(Conn) Then ConnectionDatabaseRs.Open SQL,Conn,1,3If Not Rs.Eof And Not Rs.Bof Then Rs(“password”) = UserPass Rs.update Status = 0End IfRs.CloseSet Rs = NothingIf UserPass <> “” And Status = 0 Then Response.Cookies(Inen.Cookies_Name)(“password”) = UserPassEnd IfEnd Sub

Sub LogoutUser()Response.Cookies(Inen.Cookies_Name).path = “/”Response.Cookies(Inen.Cookies_Name)(“userid”) = “”Response.Cookies(Inen.Cookies_Name)(“username”) = “”Response.Cookies(Inen.Cookies_Name)(“password”) = “”Response.Cookies(Inen.Cookies_Name)(“nickname”) = “”Response.Cookies(Inen.Cookies_Name)(“UserGrade”) = “”Response.Cookies(Inen.Cookies_Name)(“UserGroup”) = “”Response.Cookies(Inen.Cookies_Name)(“UserClass”) = “”Response.Cookies(Inen.Cookies_Name)(“UserToday”) = “”Response.Cookies(Inen.Cookies_Name)(“usercookies”) = “”Response.Cookies(Inen.Cookies_Name)(“LastTimeDate”) = “”Response.Cookies(Inen.Cookies_Name)(“LastTimeIP”) = “”Response.Cookies(Inen.Cookies_Name)(“LastTime”) = “”Response.Cookies(Inen.Cookies_Name) = “”End Sub

这几年大多是昆明空运来的,

网站整合discuz!nt论坛

相关文章:

你感兴趣的文章:

标签云: