用php提交ajax表单

时间:2011-07-11 20:54:52

标签: php ajax forms html-parsing

我正在构建一个php程序,从网站获取3个变量并计算它们然后发布结果,我可以读取变量,计算它们,但发布部分对我来说很难,因为它使用Ajax表单(我认为)可以使用XMLhttprequest发布php吗?

这是提交按钮:

<a href="#" class="formSubmit" tabindex="3">

这是消息框:

<textarea name="message" id="messageContent" rows="18" wrap="virtual" tabindex="2"></textarea>

我试图像常规表单一样处理它,但它没有用,我追踪了ajax函数发布:

function formSubmitFunction(e,action, target){
    e.stopPropagation();
    e.preventDefault();
    if ($("#messageContent").attr("value") == undefined || $("#messageContent").attr("value").length < 2){
        alert("A mensagem precisa ter no mínimo 2 caracteres.");
        $("#messageContent").focus();
        return false;
    }else {
        $("#formSubmit").html('<img src="http://website.com/'+desTheme+'/images/send_post.gif');
        if(action == "post"){
            $("#formAjax").append('<div id="carregando"></div>');
            PostFunctions.insertPost(topicId,$("#messageContent").val(), callbackInsertPost);
        } else {
            var postId = target.replace("#","");
            $("#formAjax").append('<div id="carregando"></div>');           
            PostFunctions.editPost(postId,$("#messageContent").val(), callbackEditPost);
        }
        return false;
    }
}

帮助

@edit:

找到了另一个insertPost函数

function callbackInsertPost(response){
        var result = eval("("+response+")");
        if($("#popup").length){
            $("#popup").remove();
        }
        if(!result.error){
            var returnMessage = "";
            if(result.isForumModerated){
                returnMessage = '<div id="popup" class="autoClear simple">'
                                    +'Sua mensagem está aguardando a aprovação da moderação.'
                                    +'</div>';
                $("#carregando").remove();
                $(actualPostId).prepend(returnMessage);
                window.setTimeout(function(){
                    $("#popup").fadeOut("slow", function(){
                        $("#popup").remove();
                    });
                },5000);
            $("#formAjax").remove();
            } else {
                //console.log(result);
                window.setTimeout(function(){
                    document.location = "_t_lastpost_"+topicId+"_"+forumId+"?postId="+result.postId;
                },1500);
                /*returnMessage = '<div id="popup" class="autoClear simple">'
                                    +'Mensagem enviada com sucesso! Clique neste <a href="_t_lastpost_'+topicId+'_'+forumId+'">link</a> para ver sua mensagem'
                                    +'</div>';*/
            }
        } else {
            if(result.nickname_reproved){
                document.location = "changenickname.jbb";
            } else {
                $("#carregando").remove();
                for(i = 0; i < result.messages.length; i++){
                    $("#formAjax").prepend('<div id="popup" class="autoClear error-post">'
                                        +result.messages[i]+'<br/>'
                                        +'</div>'); 
                    }
                $.scrollTo("#popup",500);
                $("#formSubmit").html('<a href="#" class="formSubmit" tabindex="3"><img src="'+baseImages+'/themes/'+desTheme+'/images/pm_send.gif"/></a>');
                $(".formSubmit").bind("click",function(e){
                    formSubmitFunction(e,"post")
                });
            }
        }
}

@ EDIT2:

PostFunctions.insertPost = function(p0, p1, callback) {
    DWREngine._execute(PostFunctions._path, 'PostFunctions', 'insertPost', p0, p1, callback);
}

1 个答案:

答案 0 :(得分:0)

忘掉你正在看的所有JavaScript内容。在模拟浏览器时,您只需重新创建发送到服务器的请求。

  1. 打开小提琴手或萤火虫的网络面板。
  2. 在浏览器中填写帖子。
  3. 在fiddler / firebug中查找ajax帖子。
  4. 使用您看到的相同参数,使用PHP curl创建常规帖子 在fiddler。
  5. 如果javascript设置了一些Cookie,请务必检查标题。

    修改

    • Cookie文件由curl创建,格式与fiddler不同。删除它,让curl创建它。

    • c0-id是隐藏的表单字段吗?查看来源。如果在另一个浏览器中查看它时它会发生变化,您需要抓取表单,然后根据该值编写您编写的帖子。

      • 发布到显示表单的页面。使用CURL_OPT_COOKIEJAR

      • CURL_OPT_COOKIEJAR如果您发布到两个不同的网页,它会很有用,因为它会记住上次请求设置的Cookie,就像浏览器一样。

    • 确保您的用户代理是真正的浏览器。

    • 观察浏览器和脚本通过fiddler点击服务器。您希望脚本的行为与浏览器完全相同。因此,请不断调整脚本以使其更接近。最终它会起作用。

    • 首先,抓取网站非常令人沮丧和耗时。坚持下去吧。

      • 将代码组织到函数和类中。以这种方式做多个帖子会更容易。